Skip to content

Commit 3e8b259

Browse files
[release-0.22] 🐛 Allow SSA after normal resource creation (#3348)
* fix: enable apply after normal create * improvements: cache now considers disable protobuf flag for lookup * feedback improvements --------- Co-authored-by: filipcirtog <[email protected]>
1 parent 7fb34b5 commit 3e8b259

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

0 commit comments

Comments
 (0)