Skip to content

Commit 3cef7a8

Browse files
Fix missing apiVersion for NS obj and linter
Signed-off-by: Danil-Grigorev <[email protected]>
1 parent eb32425 commit 3cef7a8

File tree

3 files changed

+62
-42
lines changed

3 files changed

+62
-42
lines changed

internal/controller/genericprovider_controller.go

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -361,16 +361,14 @@ func calculateHash(ctx context.Context, k8sClient client.Client, provider generi
361361
func applyFromCache(ctx context.Context, cl client.Client, provider genericprovider.GenericProvider) (bool, error) {
362362
log := log.FromContext(ctx)
363363

364-
configMap, err := providerCacheConfigMap(ctx, cl, provider)
365-
if err != nil {
364+
configMap := &corev1.ConfigMap{}
365+
if err := cl.Get(ctx, client.ObjectKey{Name: ProviderCacheName(provider), Namespace: provider.GetNamespace()}, configMap); apierrors.IsNotFound(err) {
366+
// config map does not exist, nothing to apply
367+
return false, nil
368+
} else if err != nil {
366369
log.Error(err, "failed to get provider config map")
367370

368-
return false, err
369-
}
370-
371-
// config map does not exist, nothing to apply
372-
if configMap == nil {
373-
return false, nil
371+
return false, fmt.Errorf("failed to get cache ConfigMap: %w", err)
374372
}
375373

376374
// calculate combined hash for provider and config map cache
@@ -395,6 +393,7 @@ func applyFromCache(ctx context.Context, cl client.Client, provider genericprovi
395393
}
396394

397395
log.Info("Applying provider configuration from cache")
396+
398397
errs := []error{}
399398

400399
mr := configclient.NewMemoryReader()
@@ -404,7 +403,9 @@ func applyFromCache(ctx context.Context, cl client.Client, provider genericprovi
404403
}
405404

406405
// Fetch configuration variables from the secret. See API field docs for more info.
407-
initReaderVariables(ctx, cl, mr, provider)
406+
if err := initReaderVariables(ctx, cl, mr, provider); err != nil {
407+
return false, err
408+
}
408409

409410
processor := yamlprocessor.NewSimpleProcessor()
410411
for _, manifest := range configMap.Data {
@@ -422,7 +423,7 @@ func applyFromCache(ctx context.Context, cl client.Client, provider genericprovi
422423
return false, err
423424
}
424425

425-
if len(manifest) > 1 {
426+
if len(manifests) > 1 {
426427
return false, fmt.Errorf("multiple manifests found: %d", len(manifests))
427428
} else if len(manifests) == 0 {
428429
continue
@@ -441,20 +442,21 @@ func applyFromCache(ctx context.Context, cl client.Client, provider genericprovi
441442
return false, err
442443
}
443444

444-
manifest, err = processor.Process([]byte(manifest), mr.Get)
445+
manifest, err = processor.Process(manifest, mr.Get)
445446
if err != nil {
446447
log.Error(err, "failed to process manifest")
447448

448449
return false, err
449450
}
450-
manifests, err := utilyaml.ToUnstructured([]byte(manifest))
451+
452+
manifests, err := utilyaml.ToUnstructured(manifest)
451453
if err != nil {
452454
log.Error(err, "failed to convert yaml to unstructured")
453455

454456
return false, err
455457
}
456458

457-
if len(manifest) > 1 {
459+
if len(manifests) > 1 {
458460
return false, fmt.Errorf("multiple manifests found: %d", len(manifests))
459461
} else if len(manifests) == 0 {
460462
continue
@@ -478,9 +480,9 @@ func applyFromCache(ctx context.Context, cl client.Client, provider genericprovi
478480

479481
// setCacheHash calculates current provider and configMap hash, and updates it on the configMap.
480482
func setCacheHash(ctx context.Context, cl client.Client, provider genericprovider.GenericProvider) error {
481-
configMap, err := providerCacheConfigMap(ctx, cl, provider)
482-
if err != nil {
483-
return err
483+
configMap := &corev1.ConfigMap{}
484+
if err := cl.Get(ctx, client.ObjectKey{Name: ProviderCacheName(provider), Namespace: provider.GetNamespace()}, configMap); err != nil {
485+
return fmt.Errorf("failed to get cache ConfigMaps: %w", err)
484486
}
485487

486488
helper, err := patch.NewHelper(configMap, cl)

internal/controller/manifests_downloader.go

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424
"io"
2525

2626
corev1 "k8s.io/api/core/v1"
27-
apierrors "k8s.io/apimachinery/pkg/api/errors"
2827
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2928
"k8s.io/apimachinery/pkg/labels"
3029
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
@@ -44,10 +43,6 @@ const (
4443
operatorManagedLabel = "managed-by.operator.cluster.x-k8s.io"
4544
operatorCacheLabel = "cached-by.operator.cluster.x-k8s.io"
4645

47-
cacheVersionLabelName = "provider-cache.cluster.x-k8s.io/version"
48-
cacheTypeLabel = "provider-cache.cluster.x-k8s.io/type"
49-
cacheNameLabel = "provider-cache.cluster.x-k8s.io/name"
50-
5146
maxConfigMapSize = 1 * 1024 * 1024
5247
ociSource = "oci"
5348
)
@@ -330,18 +325,6 @@ func providerLabelSelector(provider operatorv1.GenericProvider) *metav1.LabelSel
330325
}
331326
}
332327

333-
// providerCacheConfigMap finds a cached ConfigMap the given provider label selector.
334-
func providerCacheConfigMap(ctx context.Context, cl client.Client, provider operatorv1.GenericProvider) (*corev1.ConfigMap, error) {
335-
configMap := &corev1.ConfigMap{}
336-
if err := cl.Get(ctx, client.ObjectKey{Name: ProviderCacheName(provider), Namespace: provider.GetNamespace()}, configMap); apierrors.IsNotFound(err) {
337-
return nil, nil
338-
} else if err != nil {
339-
return nil, fmt.Errorf("failed to list ConfigMaps: %w", err)
340-
}
341-
342-
return configMap, nil
343-
}
344-
345328
// ProviderLabels returns default set of labels that identify a config map with downloaded manifests.
346329
func ProviderLabels(provider operatorv1.GenericProvider) map[string]string {
347330
labels := map[string]string{

internal/controller/phases.go

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,13 @@ import (
2626

2727
corev1 "k8s.io/api/core/v1"
2828
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
29+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2930
"k8s.io/apimachinery/pkg/runtime"
3031
"k8s.io/apimachinery/pkg/runtime/serializer"
3132
"k8s.io/apimachinery/pkg/types"
3233
versionutil "k8s.io/apimachinery/pkg/util/version"
3334
"k8s.io/apimachinery/pkg/util/wait"
3435
"k8s.io/client-go/kubernetes/scheme"
35-
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
3636
"k8s.io/client-go/rest"
3737
operatorv1 "sigs.k8s.io/cluster-api-operator/api/v1alpha2"
3838
"sigs.k8s.io/cluster-api-operator/internal/controller/genericprovider"
@@ -48,6 +48,8 @@ import (
4848
"sigs.k8s.io/controller-runtime/pkg/client"
4949
"sigs.k8s.io/controller-runtime/pkg/log"
5050
"sigs.k8s.io/controller-runtime/pkg/reconcile"
51+
52+
utilyaml "sigs.k8s.io/cluster-api/util/yaml"
5153
)
5254

5355
// fakeURL is the stub url for custom providers, missing from clusterctl repository.
@@ -322,7 +324,9 @@ func (p *PhaseReconciler) secretReader(ctx context.Context, providers ...configc
322324
}
323325

324326
// Fetch configuration variables from the secret. See API field docs for more info.
325-
initReaderVariables(ctx, p.ctrlClient, mr, p.provider)
327+
if err := initReaderVariables(ctx, p.ctrlClient, mr, p.provider); err != nil {
328+
return nil, err
329+
}
326330

327331
isCustom := true
328332

@@ -564,12 +568,14 @@ func (p *phaseReconciler) store(ctx context.Context) (reconcile.Result, error) {
564568
log := ctrl.LoggerFrom(ctx)
565569
log.Info("Storing provider in cache")
566570

567-
componentsFile, err := p.components.Yaml()
571+
components := addNamespaceIfMissing(p.components.Objs(), p.provider.GetNamespace())
572+
573+
componentsFile, err := utilyaml.FromUnstructured(components)
568574
if err != nil {
569575
return reconcile.Result{}, wrapPhaseError(err, operatorv1.ComponentsCustomizationErrorReason, operatorv1.ProviderInstalledCondition)
570576
}
571577

572-
kinds, _, err := clientgoscheme.Scheme.ObjectKinds(&corev1.ConfigMap{})
578+
kinds, _, err := scheme.Scheme.ObjectKinds(&corev1.ConfigMap{})
573579
if err != nil || len(kinds) == 0 {
574580
log.Error(err, "cannot fetch kind of the ConfigMap resource")
575581
err = fmt.Errorf("cannot fetch kind of the ConfigMap resource: %w", err)
@@ -587,7 +593,8 @@ func (p *phaseReconciler) store(ctx context.Context) (reconcile.Result, error) {
587593
Namespace: p.provider.GetNamespace(),
588594
Annotations: map[string]string{},
589595
},
590-
Data: map[string]string{},
596+
Data: map[string]string{},
597+
BinaryData: map[string][]byte{},
591598
}
592599

593600
gvk := p.provider.GetObjectKind().GroupVersionKind()
@@ -606,7 +613,7 @@ func (p *phaseReconciler) store(ctx context.Context) (reconcile.Result, error) {
606613
configMap.Annotations[operatorv1.CompressedAnnotation] = "true"
607614
}
608615

609-
for i, manifest := range strings.Split(string(componentsFile), "---") {
616+
for i, manifest := range strings.Split(string(componentsFile), "\n---") {
610617
manifest = strings.TrimSpace(manifest)
611618

612619
if compress {
@@ -620,7 +627,7 @@ func (p *phaseReconciler) store(ctx context.Context) (reconcile.Result, error) {
620627
continue
621628
}
622629

623-
configMap.Data[fmt.Sprintf("%d", i)] = string(manifest)
630+
configMap.Data[fmt.Sprintf("%d", i)] = manifest
624631
}
625632

626633
if err := p.ctrlClient.Patch(ctx, configMap, client.Apply, client.ForceOwnership, client.FieldOwner(cacheOwner)); err != nil {
@@ -631,6 +638,7 @@ func (p *phaseReconciler) store(ctx context.Context) (reconcile.Result, error) {
631638

632639
// Perform template processing with variable replacement.
633640
p.options.SkipTemplateProcess = false
641+
634642
p.components, err = repository.NewComponents(repository.ComponentsInput{
635643
Provider: p.providerConfig,
636644
ConfigClient: p.configClient,
@@ -645,7 +653,34 @@ func (p *phaseReconciler) store(ctx context.Context) (reconcile.Result, error) {
645653
return reconcile.Result{}, nil
646654
}
647655

648-
// Upgrade ensure all the clusterctl CRDs are available before installing the provider,
656+
// addNamespaceIfMissing adda a Namespace object if missing (this ensure the targetNamespace will be created).
657+
func addNamespaceIfMissing(objs []unstructured.Unstructured, targetNamespace string) []unstructured.Unstructured {
658+
namespaceObjectFound := false
659+
660+
for _, o := range objs {
661+
// if the object has Kind Namespace, fix the namespace name
662+
if o.GetKind() == namespaceKind {
663+
namespaceObjectFound = true
664+
}
665+
}
666+
667+
// if there isn't an object with Kind Namespace, add it
668+
if !namespaceObjectFound {
669+
objs = append(objs, unstructured.Unstructured{
670+
Object: map[string]interface{}{
671+
"apiVersion": "v1",
672+
"kind": namespaceKind,
673+
"metadata": map[string]interface{}{
674+
"name": targetNamespace,
675+
},
676+
},
677+
})
678+
}
679+
680+
return objs
681+
}
682+
683+
// upgrade ensure all the clusterctl CRDs are available before installing the provider,
649684
// and update existing components if required.
650685
func (p *PhaseReconciler) Upgrade(ctx context.Context) (*Result, error) {
651686
log := ctrl.LoggerFrom(ctx)
@@ -689,7 +724,7 @@ func (p *PhaseReconciler) Install(ctx context.Context) (*Result, error) {
689724
log.Info("Installing provider")
690725

691726
if err := clusterClient.ProviderComponents().Create(ctx, p.components.Objs()); err != nil {
692-
reason := "Install failed!"
727+
reason := "Install failed"
693728
if wait.Interrupted(err) {
694729
reason = "Timed out waiting for deployment to become ready"
695730
}

0 commit comments

Comments
 (0)