Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions pkg/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,8 +151,7 @@ func newClient(config *rest.Config, options Options) (*client, error) {
mapper: options.Mapper,
codecs: serializer.NewCodecFactory(options.Scheme),

structuredResourceByType: make(map[schema.GroupVersionKind]*resourceMeta),
unstructuredResourceByType: make(map[schema.GroupVersionKind]*resourceMeta),
resourceByType: make(map[cacheKey]*resourceMeta),
}

rawMetaClient, err := metadata.NewForConfigAndClient(metadata.ConfigFor(config), options.HTTPClient)
Expand Down
26 changes: 15 additions & 11 deletions pkg/client/client_rest_resources.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,15 @@ type clientRestResources struct {
// codecs are used to create a REST client for a gvk
codecs serializer.CodecFactory

// structuredResourceByType stores structured type metadata
structuredResourceByType map[schema.GroupVersionKind]*resourceMeta
// unstructuredResourceByType stores unstructured type metadata
unstructuredResourceByType map[schema.GroupVersionKind]*resourceMeta
mu sync.RWMutex
// resourceByType stores type metadata
resourceByType map[cacheKey]*resourceMeta

mu sync.RWMutex
}

type cacheKey struct {
gvk schema.GroupVersionKind
forceDisableProtoBuf bool
}

// newResource maps obj to a Kubernetes Resource and constructs a client for that Resource.
Expand Down Expand Up @@ -117,11 +121,11 @@ func (c *clientRestResources) getResource(obj any) (*resourceMeta, error) {
// It's better to do creation work twice than to not let multiple
// people make requests at once
c.mu.RLock()
resourceByType := c.structuredResourceByType
if isUnstructured {
resourceByType = c.unstructuredResourceByType
}
r, known := resourceByType[gvk]

cacheKey := cacheKey{gvk: gvk, forceDisableProtoBuf: forceDisableProtoBuf}

r, known := c.resourceByType[cacheKey]

c.mu.RUnlock()

if known {
Expand All @@ -140,7 +144,7 @@ func (c *clientRestResources) getResource(obj any) (*resourceMeta, error) {
if err != nil {
return nil, err
}
resourceByType[gvk] = r
c.resourceByType[cacheKey] = r
return r, err
}

Expand Down
46 changes: 46 additions & 0 deletions pkg/client/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -951,6 +951,52 @@ U5wwSivyi7vmegHKmblOzNVKA5qPO8zWzqBC
Expect(cm.Data).To(BeComparableTo(data))
Expect(cm.Data).To(BeComparableTo(obj.Data))
})

It("should create a secret without SSA and later create update a secret using SSA", func(ctx SpecContext) {
cl, err := client.New(cfg, client.Options{})
Expect(err).NotTo(HaveOccurred())
Expect(cl).NotTo(BeNil())
data := map[string][]byte{
"some-key": []byte("some-value"),
}
secretObject := &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
Name: "secret-one",
Namespace: "default",
},
Data: data,
}

secretApplyConfiguration := corev1applyconfigurations.
Secret("secret-two", "default").
WithData(data)

err = cl.Create(ctx, secretObject)
Expect(err).NotTo(HaveOccurred())

err = cl.Apply(ctx, secretApplyConfiguration, &client.ApplyOptions{FieldManager: "test-manager"})
Expect(err).NotTo(HaveOccurred())

secret, err := clientset.CoreV1().Secrets(ptr.Deref(secretApplyConfiguration.GetNamespace(), "")).Get(ctx, ptr.Deref(secretApplyConfiguration.GetName(), ""), metav1.GetOptions{})
Expect(err).NotTo(HaveOccurred())

Expect(secret.Data).To(BeComparableTo(data))
Expect(secret.Data).To(BeComparableTo(secretApplyConfiguration.Data))

data = map[string][]byte{
"some-key": []byte("some-new-value"),
}
secretApplyConfiguration.Data = data

err = cl.Apply(ctx, secretApplyConfiguration, &client.ApplyOptions{FieldManager: "test-manager"})
Expect(err).NotTo(HaveOccurred())

secret, err = clientset.CoreV1().Secrets(ptr.Deref(secretApplyConfiguration.GetNamespace(), "")).Get(ctx, ptr.Deref(secretApplyConfiguration.GetName(), ""), metav1.GetOptions{})
Expect(err).NotTo(HaveOccurred())

Expect(secret.Data).To(BeComparableTo(data))
Expect(secret.Data).To(BeComparableTo(secretApplyConfiguration.Data))
})
})
})

Expand Down