Skip to content

Commit b9bccfd

Browse files
authored
🐛 Allow SSA after normal resource creation (#3346)
* fix: enable apply after normal create * improvements: cache now considers disable protobuf flag for lookup * feedback improvements
1 parent f48fe1c commit b9bccfd

File tree

3 files changed

+62
-13
lines changed

3 files changed

+62
-13
lines changed

pkg/client/client.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,7 @@ func newClient(config *rest.Config, options Options) (*client, error) {
151151
mapper: options.Mapper,
152152
codecs: serializer.NewCodecFactory(options.Scheme),
153153

154-
structuredResourceByType: make(map[schema.GroupVersionKind]*resourceMeta),
155-
unstructuredResourceByType: make(map[schema.GroupVersionKind]*resourceMeta),
154+
resourceByType: make(map[cacheKey]*resourceMeta),
156155
}
157156

158157
rawMetaClient, err := metadata.NewForConfigAndClient(metadata.ConfigFor(config), options.HTTPClient)

pkg/client/client_rest_resources.go

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,15 @@ type clientRestResources struct {
4848
// codecs are used to create a REST client for a gvk
4949
codecs serializer.CodecFactory
5050

51-
// structuredResourceByType stores structured type metadata
52-
structuredResourceByType map[schema.GroupVersionKind]*resourceMeta
53-
// unstructuredResourceByType stores unstructured type metadata
54-
unstructuredResourceByType map[schema.GroupVersionKind]*resourceMeta
55-
mu sync.RWMutex
51+
// resourceByType stores type metadata
52+
resourceByType map[cacheKey]*resourceMeta
53+
54+
mu sync.RWMutex
55+
}
56+
57+
type cacheKey struct {
58+
gvk schema.GroupVersionKind
59+
forceDisableProtoBuf bool
5660
}
5761

5862
// newResource maps obj to a Kubernetes Resource and constructs a client for that Resource.
@@ -117,11 +121,11 @@ func (c *clientRestResources) getResource(obj any) (*resourceMeta, error) {
117121
// It's better to do creation work twice than to not let multiple
118122
// people make requests at once
119123
c.mu.RLock()
120-
resourceByType := c.structuredResourceByType
121-
if isUnstructured {
122-
resourceByType = c.unstructuredResourceByType
123-
}
124-
r, known := resourceByType[gvk]
124+
125+
cacheKey := cacheKey{gvk: gvk, forceDisableProtoBuf: forceDisableProtoBuf}
126+
127+
r, known := c.resourceByType[cacheKey]
128+
125129
c.mu.RUnlock()
126130

127131
if known {
@@ -140,7 +144,7 @@ func (c *clientRestResources) getResource(obj any) (*resourceMeta, error) {
140144
if err != nil {
141145
return nil, err
142146
}
143-
resourceByType[gvk] = r
147+
c.resourceByType[cacheKey] = r
144148
return r, err
145149
}
146150

pkg/client/client_test.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -953,6 +953,52 @@ U5wwSivyi7vmegHKmblOzNVKA5qPO8zWzqBC
953953
Expect(cm.Data).To(BeComparableTo(data))
954954
Expect(cm.Data).To(BeComparableTo(obj.Data))
955955
})
956+
957+
It("should create a secret without SSA and later create update a secret using SSA", func(ctx SpecContext) {
958+
cl, err := client.New(cfg, client.Options{})
959+
Expect(err).NotTo(HaveOccurred())
960+
Expect(cl).NotTo(BeNil())
961+
data := map[string][]byte{
962+
"some-key": []byte("some-value"),
963+
}
964+
secretObject := &corev1.Secret{
965+
ObjectMeta: metav1.ObjectMeta{
966+
Name: "secret-one",
967+
Namespace: "default",
968+
},
969+
Data: data,
970+
}
971+
972+
secretApplyConfiguration := corev1applyconfigurations.
973+
Secret("secret-two", "default").
974+
WithData(data)
975+
976+
err = cl.Create(ctx, secretObject)
977+
Expect(err).NotTo(HaveOccurred())
978+
979+
err = cl.Apply(ctx, secretApplyConfiguration, &client.ApplyOptions{FieldManager: "test-manager"})
980+
Expect(err).NotTo(HaveOccurred())
981+
982+
secret, err := clientset.CoreV1().Secrets(ptr.Deref(secretApplyConfiguration.GetNamespace(), "")).Get(ctx, ptr.Deref(secretApplyConfiguration.GetName(), ""), metav1.GetOptions{})
983+
Expect(err).NotTo(HaveOccurred())
984+
985+
Expect(secret.Data).To(BeComparableTo(data))
986+
Expect(secret.Data).To(BeComparableTo(secretApplyConfiguration.Data))
987+
988+
data = map[string][]byte{
989+
"some-key": []byte("some-new-value"),
990+
}
991+
secretApplyConfiguration.Data = data
992+
993+
err = cl.Apply(ctx, secretApplyConfiguration, &client.ApplyOptions{FieldManager: "test-manager"})
994+
Expect(err).NotTo(HaveOccurred())
995+
996+
secret, err = clientset.CoreV1().Secrets(ptr.Deref(secretApplyConfiguration.GetNamespace(), "")).Get(ctx, ptr.Deref(secretApplyConfiguration.GetName(), ""), metav1.GetOptions{})
997+
Expect(err).NotTo(HaveOccurred())
998+
999+
Expect(secret.Data).To(BeComparableTo(data))
1000+
Expect(secret.Data).To(BeComparableTo(secretApplyConfiguration.Data))
1001+
})
9561002
})
9571003
})
9581004

0 commit comments

Comments
 (0)