Skip to content

Commit dcf3ae6

Browse files
Store cache in secret to avoid added conversion
Signed-off-by: Danil-Grigorev <[email protected]>
1 parent fe25e53 commit dcf3ae6

File tree

5 files changed

+75
-112
lines changed

5 files changed

+75
-112
lines changed

api/v1alpha2/provider_types.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ const (
3030
ConfigMapNameLabel = "provider.cluster.x-k8s.io/name"
3131

3232
CompressedAnnotation = "provider.cluster.x-k8s.io/compressed"
33+
TrueValue = "true"
3334

3435
MetadataConfigMapKey = "metadata"
3536
ComponentsConfigMapKey = "components"

cmd/main.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,8 @@ import (
4040
ctrl "sigs.k8s.io/controller-runtime"
4141
"sigs.k8s.io/controller-runtime/pkg/cache"
4242
"sigs.k8s.io/controller-runtime/pkg/client"
43-
"sigs.k8s.io/controller-runtime/pkg/config"
4443
"sigs.k8s.io/controller-runtime/pkg/controller"
4544
"sigs.k8s.io/controller-runtime/pkg/healthz"
46-
4745
ctrlwebhook "sigs.k8s.io/controller-runtime/pkg/webhook"
4846

4947
operatorv1 "sigs.k8s.io/cluster-api-operator/api/v1alpha2"
@@ -176,9 +174,6 @@ func main() {
176174
},
177175
},
178176
},
179-
Controller: config.Controller{
180-
MaxConcurrentReconciles: concurrencyNumber,
181-
},
182177
WebhookServer: ctrlwebhook.NewServer(
183178
ctrlwebhook.Options{
184179
Port: webhookPort,

internal/controller/genericprovider_controller.go

Lines changed: 39 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,13 @@ import (
2828
corev1 "k8s.io/api/core/v1"
2929
apierrors "k8s.io/apimachinery/pkg/api/errors"
3030
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
31+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
3132
kerrors "k8s.io/apimachinery/pkg/util/errors"
3233
"k8s.io/client-go/rest"
3334
operatorv1 "sigs.k8s.io/cluster-api-operator/api/v1alpha2"
3435
"sigs.k8s.io/cluster-api-operator/internal/controller/genericprovider"
3536
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
3637
configclient "sigs.k8s.io/cluster-api/cmd/clusterctl/client/config"
37-
"sigs.k8s.io/cluster-api/cmd/clusterctl/client/yamlprocessor"
3838
"sigs.k8s.io/cluster-api/util/conditions"
3939
"sigs.k8s.io/cluster-api/util/patch"
4040
ctrl "sigs.k8s.io/controller-runtime"
@@ -44,8 +44,6 @@ import (
4444
"sigs.k8s.io/controller-runtime/pkg/handler"
4545
"sigs.k8s.io/controller-runtime/pkg/log"
4646
"sigs.k8s.io/controller-runtime/pkg/reconcile"
47-
48-
utilyaml "sigs.k8s.io/cluster-api/util/yaml"
4947
)
5048

5149
type GenericProviderReconciler struct {
@@ -335,14 +333,14 @@ func calculateHash(ctx context.Context, k8sClient client.Client, provider generi
335333
func applyFromCache(ctx context.Context, cl client.Client, provider genericprovider.GenericProvider) (bool, error) {
336334
log := log.FromContext(ctx)
337335

338-
configMap := &corev1.ConfigMap{}
339-
if err := cl.Get(ctx, client.ObjectKey{Name: ProviderCacheName(provider), Namespace: provider.GetNamespace()}, configMap); apierrors.IsNotFound(err) {
340-
// config map does not exist, nothing to apply
336+
secret := &corev1.Secret{}
337+
if err := cl.Get(ctx, client.ObjectKey{Name: ProviderCacheName(provider), Namespace: provider.GetNamespace()}, secret); apierrors.IsNotFound(err) {
338+
// secret does not exist, nothing to apply
341339
return false, nil
342340
} else if err != nil {
343-
log.Error(err, "failed to get provider config map")
341+
log.Error(err, "failed to get provider cache")
344342

345-
return false, fmt.Errorf("failed to get cache ConfigMap: %w", err)
343+
return false, fmt.Errorf("failed to get provider cache: %w", err)
346344
}
347345

348346
// calculate combined hash for provider and config map cache
@@ -353,15 +351,15 @@ func applyFromCache(ctx context.Context, cl client.Client, provider genericprovi
353351
return false, err
354352
}
355353

356-
if err := addObjectToHash(hash, configMap.Data); err != nil {
354+
if err := addObjectToHash(hash, secret.Data); err != nil {
357355
log.Error(err, "failed to calculate config map hash")
358356

359357
return false, err
360358
}
361359

362360
cacheHash := fmt.Sprintf("%x", hash.Sum(nil))
363-
if configMap.GetAnnotations()[appliedSpecHashAnnotation] != cacheHash {
364-
log.Info("Provider or cache state has changed", "cacheHash", cacheHash, "providerHash", configMap.GetAnnotations()[appliedSpecHashAnnotation])
361+
if secret.GetAnnotations()[appliedSpecHashAnnotation] != cacheHash {
362+
log.Info("Provider or cache state has changed", "cacheHash", cacheHash, "providerHash", secret.GetAnnotations()[appliedSpecHashAnnotation])
365363

366364
return false, nil
367365
}
@@ -381,63 +379,52 @@ func applyFromCache(ctx context.Context, cl client.Client, provider genericprovi
381379
return false, err
382380
}
383381

384-
processor := yamlprocessor.NewSimpleProcessor()
385-
for _, manifest := range configMap.Data {
386-
manifest, err := processor.Process([]byte(manifest), mr.Get)
387-
if err != nil {
388-
log.Error(err, "failed to process manifest")
389-
390-
return false, err
382+
for _, manifest := range secret.Data {
383+
if secret.GetAnnotations()[operatorv1.CompressedAnnotation] == operatorv1.TrueValue {
384+
break
391385
}
392386

393-
manifests, err := utilyaml.ToUnstructured(manifest)
387+
manifests := []unstructured.Unstructured{}
388+
389+
err := json.Unmarshal(manifest, &manifests)
394390
if err != nil {
395391
log.Error(err, "failed to convert yaml to unstructured")
396392

397393
return false, err
398394
}
399395

400-
if len(manifests) > 1 {
401-
return false, fmt.Errorf("multiple manifests found: %d", len(manifests))
402-
} else if len(manifests) == 0 {
403-
continue
396+
for _, manifest := range manifests {
397+
if err := cl.Patch(ctx, &manifest, client.Apply, client.ForceOwnership, client.FieldOwner(cacheOwner)); err != nil {
398+
errs = append(errs, err)
399+
}
404400
}
401+
}
405402

406-
if err := cl.Patch(ctx, &manifests[0], client.Apply, client.ForceOwnership, client.FieldOwner(cacheOwner)); err != nil {
407-
errs = append(errs, err)
403+
for _, binaryManifest := range secret.Data {
404+
if secret.GetAnnotations()[operatorv1.CompressedAnnotation] != operatorv1.TrueValue {
405+
break
408406
}
409-
}
410407

411-
for _, binaryManifest := range configMap.BinaryData {
412-
manifest, err := decompressYaml(binaryManifest)
408+
manifest, err := decompressData(binaryManifest)
413409
if err != nil {
414410
log.Error(err, "failed to decompress yaml")
415411

416412
return false, err
417413
}
418414

419-
manifest, err = processor.Process(manifest, mr.Get)
420-
if err != nil {
421-
log.Error(err, "failed to process manifest")
422-
423-
return false, err
424-
}
415+
manifests := []unstructured.Unstructured{}
425416

426-
manifests, err := utilyaml.ToUnstructured(manifest)
417+
err = json.Unmarshal(manifest, &manifests)
427418
if err != nil {
428419
log.Error(err, "failed to convert yaml to unstructured")
429420

430421
return false, err
431422
}
432423

433-
if len(manifests) > 1 {
434-
return false, fmt.Errorf("multiple manifests found: %d", len(manifests))
435-
} else if len(manifests) == 0 {
436-
continue
437-
}
438-
439-
if err := cl.Patch(ctx, &manifests[0], client.Apply, client.ForceOwnership, client.FieldOwner(cacheOwner)); err != nil {
440-
errs = append(errs, err)
424+
for _, manifest := range manifests {
425+
if err := cl.Patch(ctx, &manifest, client.Apply, client.ForceOwnership, client.FieldOwner(cacheOwner)); err != nil {
426+
errs = append(errs, err)
427+
}
441428
}
442429
}
443430

@@ -452,14 +439,14 @@ func applyFromCache(ctx context.Context, cl client.Client, provider genericprovi
452439
return true, nil
453440
}
454441

455-
// setCacheHash calculates current provider and configMap hash, and updates it on the configMap.
442+
// setCacheHash calculates current provider and secret hash, and updates it on the secret.
456443
func setCacheHash(ctx context.Context, cl client.Client, provider genericprovider.GenericProvider) error {
457-
configMap := &corev1.ConfigMap{}
458-
if err := cl.Get(ctx, client.ObjectKey{Name: ProviderCacheName(provider), Namespace: provider.GetNamespace()}, configMap); err != nil {
459-
return fmt.Errorf("failed to get cache ConfigMaps: %w", err)
444+
secret := &corev1.Secret{}
445+
if err := cl.Get(ctx, client.ObjectKey{Name: ProviderCacheName(provider), Namespace: provider.GetNamespace()}, secret); err != nil {
446+
return fmt.Errorf("failed to get cache secret: %w", err)
460447
}
461448

462-
helper, err := patch.NewHelper(configMap, cl)
449+
helper, err := patch.NewHelper(secret, cl)
463450
if err != nil {
464451
return err
465452
}
@@ -470,19 +457,19 @@ func setCacheHash(ctx context.Context, cl client.Client, provider genericprovide
470457
return err
471458
}
472459

473-
if err := addObjectToHash(hash, configMap.Data); err != nil {
460+
if err := addObjectToHash(hash, secret.Data); err != nil {
474461
return err
475462
}
476463

477464
cacheHash := fmt.Sprintf("%x", hash.Sum(nil))
478465

479-
annotations := configMap.GetAnnotations()
466+
annotations := secret.GetAnnotations()
480467
if annotations == nil {
481468
annotations = map[string]string{}
482469
}
483470

484471
annotations[appliedSpecHashAnnotation] = cacheHash
485-
configMap.SetAnnotations(annotations)
472+
secret.SetAnnotations(annotations)
486473

487-
return helper.Patch(ctx, configMap)
474+
return helper.Patch(ctx, secret)
488475
}

internal/controller/manifests_downloader.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ func TemplateManifestsConfigMap(provider operatorv1.GenericProvider, labels map[
191191
configMap.Data[operatorv1.ComponentsConfigMapKey] = string(components)
192192
} else {
193193
var componentsBuf bytes.Buffer
194-
if err := compressYaml(&componentsBuf, components); err != nil {
194+
if err := compressData(&componentsBuf, components); err != nil {
195195
return nil, fmt.Errorf("cannot compress data for provider %s/%s: %w", provider.GetNamespace(), provider.GetName(), err)
196196
}
197197

@@ -217,8 +217,8 @@ func TemplateManifestsConfigMap(provider operatorv1.GenericProvider, labels map[
217217
return configMap, nil
218218
}
219219

220-
// compressYaml takes a bytes.Buffer and data, and compresses data into it.
221-
func compressYaml(componentsBuf *bytes.Buffer, data []byte) (err error) {
220+
// compressData takes a bytes.Buffer and data, and compresses data into it.
221+
func compressData(componentsBuf *bytes.Buffer, data []byte) (err error) {
222222
zw := gzip.NewWriter(componentsBuf)
223223

224224
_, err = zw.Write(data)
@@ -233,8 +233,8 @@ func compressYaml(componentsBuf *bytes.Buffer, data []byte) (err error) {
233233
return
234234
}
235235

236-
// decompressYaml takes a compressed data, and decompresses it.
237-
func decompressYaml(compressedData []byte) (data []byte, err error) {
236+
// decompressData takes a compressed data, and decompresses it.
237+
func decompressData(compressedData []byte) (data []byte, err error) {
238238
zr, err := gzip.NewReader(bytes.NewReader(compressedData))
239239
if err != nil {
240240
return nil, fmt.Errorf("cannot open gzip reader from data: %w", err)

0 commit comments

Comments
 (0)