From ca907c35c3423ba3c167d126d6e66cd9c1609fb6 Mon Sep 17 00:00:00 2001 From: Alper Rifat Ulucinar Date: Fri, 26 May 2023 21:25:33 +0300 Subject: [PATCH] Add support for Configuration.pkg converters Signed-off-by: Alper Rifat Ulucinar --- ...teps.go => configurationmetadata_steps.go} | 81 +++++++---- pkg/migration/configurationpackage_steps.go | 112 +++++++++++++++ pkg/migration/converter.go | 29 ++-- pkg/migration/interfaces.go | 21 ++- pkg/migration/plan_generator.go | 136 +++++------------- pkg/migration/plan_generator_test.go | 68 +++++---- pkg/migration/provider_package_steps.go | 38 ++++- pkg/migration/registry.go | 122 +++++++++++----- .../testdata/plan/configurationpkgv1.yaml | 6 + .../configurationv1_migration_plan.yaml | 11 +- ...igurationv1_providerv1_migration_plan.yaml | 22 ++- .../configurationv1alpha1_migration_plan.yaml | 11 +- ....configurations.pkg.crossplane.io_v1.yaml} | 2 +- ...figurations.meta.pkg.crossplane.io_v1.yaml | 0 ...tions.meta.pkg.crossplane.io_v1alpha1.yaml | 0 ...s.configurations.pkg.crossplane.io_v1.yaml | 6 + ...s.configurations.pkg.crossplane.io_v1.yaml | 6 + ...tions.meta.pkg.crossplane.io_v1alpha1.yaml | 6 - 18 files changed, 438 insertions(+), 239 deletions(-) rename pkg/migration/{configuration_steps.go => configurationmetadata_steps.go} (53%) create mode 100644 pkg/migration/configurationpackage_steps.go create mode 100644 pkg/migration/testdata/plan/configurationpkgv1.yaml rename pkg/migration/testdata/plan/generated/{skip-dependency-resolution/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1.yaml => disable-dependency-resolution/platform-ref-aws.configurations.pkg.crossplane.io_v1.yaml} (71%) rename pkg/migration/testdata/plan/generated/{edit-configurations => edit-configuration-metadata}/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1.yaml (100%) rename pkg/migration/testdata/plan/generated/{edit-configurations => edit-configuration-metadata}/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1alpha1.yaml (100%) create mode 100644 pkg/migration/testdata/plan/generated/edit-configuration-package/platform-ref-aws.configurations.pkg.crossplane.io_v1.yaml create mode 100644 pkg/migration/testdata/plan/generated/enable-dependency-resolution/platform-ref-aws.configurations.pkg.crossplane.io_v1.yaml delete mode 100644 pkg/migration/testdata/plan/generated/skip-dependency-resolution/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1alpha1.yaml diff --git a/pkg/migration/configuration_steps.go b/pkg/migration/configurationmetadata_steps.go similarity index 53% rename from pkg/migration/configuration_steps.go rename to pkg/migration/configurationmetadata_steps.go index 8812df69..b1c94d0b 100644 --- a/pkg/migration/configuration_steps.go +++ b/pkg/migration/configurationmetadata_steps.go @@ -18,6 +18,10 @@ import ( "fmt" "strconv" + xpmetav1 "github.com/crossplane/crossplane/apis/pkg/meta/v1" + xpmetav1alpha1 "github.com/crossplane/crossplane/apis/pkg/meta/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "github.com/pkg/errors" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" ) @@ -25,17 +29,53 @@ import ( const ( // configuration migration steps follow any existing API migration steps stepNewServiceScopedProvider = iota + stepAPIEnd + 1 - stepPatchSkipDependencyResolution + stepConfigurationPackageDisableDepResolution stepEditPackageLock stepDeleteMonolithicProvider stepActivateServiceScopedProviderRevision - stepEditConfigurations + stepEditConfigurationMetadata + stepEditConfigurationPackage + stepConfigurationPackageEnableDepResolution ) const ( - errConfigurationOutput = "failed to output configuration JSON merge document" + errConfigurationMetadataOutput = "failed to output configuration JSON merge document" ) +func (pg *PlanGenerator) convertConfigurationMetadata(o UnstructuredWithMetadata) (*UnstructuredWithMetadata, bool, error) { + isConverted := false + var conf metav1.Object + var err error + for _, confConv := range pg.registry.configurationConverters { + if confConv.re == nil || confConv.converter == nil || !confConv.re.MatchString(o.Object.GetName()) { + continue + } + + conf, err = toConfigurationMetadata(o.Object) + if err != nil { + return nil, false, err + } + switch o.Object.GroupVersionKind().Version { + case "v1alpha1": + err = confConv.converter.ConfigurationMetadataV1Alpha1(conf.(*xpmetav1alpha1.Configuration)) + default: + err = confConv.converter.ConfigurationMetadataV1(conf.(*xpmetav1.Configuration)) + } + if err != nil { + return nil, false, errors.Wrapf(err, "failed to call converter on Configuration: %s", conf.GetName()) + } + // TODO: if a configuration converter only converts a specific version, + // (or does not convert the given configuration), + // we will have a false positive. Better to compute and check + // a diff here. + isConverted = true + } + return &UnstructuredWithMetadata{ + Object: ToSanitizedUnstructured(conf), + Metadata: o.Metadata, + }, isConverted, nil +} + func (pg *PlanGenerator) stepConfiguration(s step) *Step { return pg.stepConfigurationWithSubStep(s, false) } @@ -66,41 +106,28 @@ func (pg *PlanGenerator) stepConfigurationWithSubStep(s step, newSubStep bool) * switch s { // nolint:gocritic,exhaustive case stepNewServiceScopedProvider: setApplyStep("new-ssop", pg.Plan.Spec.stepMap[stepKey]) - case stepPatchSkipDependencyResolution: - setPatchStep("skip-dependency-resolution", pg.Plan.Spec.stepMap[stepKey]) + case stepConfigurationPackageDisableDepResolution: + setPatchStep("disable-dependency-resolution", pg.Plan.Spec.stepMap[stepKey]) + case stepConfigurationPackageEnableDepResolution: + setPatchStep("enable-dependency-resolution", pg.Plan.Spec.stepMap[stepKey]) + case stepEditConfigurationPackage: + setPatchStep("edit-configuration-package", pg.Plan.Spec.stepMap[stepKey]) case stepEditPackageLock: setPatchStep("edit-package-lock", pg.Plan.Spec.stepMap[stepKey]) case stepDeleteMonolithicProvider: setDeleteStep("delete-monolithic-provider", pg.Plan.Spec.stepMap[stepKey]) case stepActivateServiceScopedProviderRevision: setPatchStep("activate-ssop", pg.Plan.Spec.stepMap[stepKey]) - case stepEditConfigurations: - setPatchStep("edit-configurations", pg.Plan.Spec.stepMap[stepKey]) + case stepEditConfigurationMetadata: + setPatchStep("edit-configuration-metadata", pg.Plan.Spec.stepMap[stepKey]) default: panic(fmt.Sprintf(errInvalidStepFmt, s)) } return pg.Plan.Spec.stepMap[stepKey] } -func (pg *PlanGenerator) stepEditConfiguration(source UnstructuredWithMetadata, target *UnstructuredWithMetadata) error { - // set spec.SkipDependencyResolution: true for the configuration - s := pg.stepConfiguration(stepPatchSkipDependencyResolution) - source.Metadata.Path = fmt.Sprintf("%s/%s.yaml", s.Name, getVersionedName(source.Object)) - s.Patch.Files = append(s.Patch.Files, source.Metadata.Path) - if err := pg.target.Put(UnstructuredWithMetadata{ - Object: unstructured.Unstructured{ - Object: addNameGVK(source.Object, map[string]any{ - "spec": map[string]any{ - "skipDependencyResolution": true, - }, - }), - }, - Metadata: source.Metadata, - }); err != nil { - return errors.Wrapf(err, errEditMonolithFmt, source.Metadata.Path) - } - - s = pg.stepConfiguration(stepEditConfigurations) +func (pg *PlanGenerator) stepEditConfigurationMetadata(source UnstructuredWithMetadata, target *UnstructuredWithMetadata) error { + s := pg.stepConfiguration(stepEditConfigurationMetadata) target.Metadata.Path = fmt.Sprintf("%s/%s.yaml", s.Name, getVersionedName(target.Object)) s.Patch.Files = append(s.Patch.Files, target.Metadata.Path) patchMap, err := computeJSONMergePathDoc(source.Object, target.Object) @@ -112,5 +139,5 @@ func (pg *PlanGenerator) stepEditConfiguration(source UnstructuredWithMetadata, Object: addNameGVK(target.Object, patchMap), }, Metadata: target.Metadata, - }), errConfigurationOutput) + }), errConfigurationMetadataOutput) } diff --git a/pkg/migration/configurationpackage_steps.go b/pkg/migration/configurationpackage_steps.go new file mode 100644 index 00000000..e5c5ad76 --- /dev/null +++ b/pkg/migration/configurationpackage_steps.go @@ -0,0 +1,112 @@ +// Copyright 2023 Upbound Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package migration + +import ( + "fmt" + + "github.com/pkg/errors" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" +) + +const ( + errEditConfigurationPackageFmt = `failed to put the edited Configuration package: %s` +) + +func (pg *PlanGenerator) convertConfigurationPackage(o UnstructuredWithMetadata) error { + pkg, err := toConfigurationPackageV1(o.Object) + if err != nil { + return err + } + + // add step for disabling the dependency resolution + // for the configuration package + s := pg.stepConfiguration(stepConfigurationPackageDisableDepResolution) + p := fmt.Sprintf("%s/%s.yaml", s.Name, getVersionedName(o.Object)) + s.Patch.Files = append(s.Patch.Files, p) + if err := pg.target.Put(UnstructuredWithMetadata{ + Object: unstructured.Unstructured{ + Object: addNameGVK(o.Object, map[string]any{ + "spec": map[string]any{ + "skipDependencyResolution": true, + }, + }), + }, + Metadata: Metadata{ + Path: p, + }, + }); err != nil { + return err + } + + // add step for enabling the dependency resolution + // for the configuration package + s = pg.stepConfiguration(stepConfigurationPackageEnableDepResolution) + p = fmt.Sprintf("%s/%s.yaml", s.Name, getVersionedName(o.Object)) + s.Patch.Files = append(s.Patch.Files, p) + if err := pg.target.Put(UnstructuredWithMetadata{ + Object: unstructured.Unstructured{ + Object: addNameGVK(o.Object, map[string]any{ + "spec": map[string]any{ + "skipDependencyResolution": false, + }, + }), + }, + Metadata: Metadata{ + Path: p, + }, + }); err != nil { + return err + } + + // add the step for editing the configuration package + for _, pkgConv := range pg.registry.configurationPackageConverters { + if pkgConv.re == nil || pkgConv.converter == nil || !pkgConv.re.MatchString(pkg.Spec.Package) { + continue + } + err := pkgConv.converter.ConfigurationPackageV1(pkg) + if err != nil { + return errors.Wrapf(err, "failed to call converter on Configuration package: %s", pkg.Spec.Package) + } + // TODO: if a converter only converts a specific version, + // (or does not convert the given configuration), + // we will have a false positive. Better to compute and check + // a diff here. + target := &UnstructuredWithMetadata{ + Object: ToSanitizedUnstructured(pkg), + Metadata: o.Metadata, + } + if err := pg.stepEditConfigurationPackage(o, target); err != nil { + return err + } + } + return nil +} + +func (pg *PlanGenerator) stepEditConfigurationPackage(source UnstructuredWithMetadata, t *UnstructuredWithMetadata) error { + s := pg.stepConfigurationWithSubStep(stepEditConfigurationPackage, true) + t.Metadata.Path = fmt.Sprintf("%s/%s.yaml", s.Name, getVersionedName(t.Object)) + s.Patch.Files = append(s.Patch.Files, t.Metadata.Path) + patchMap, err := computeJSONMergePathDoc(source.Object, t.Object) + if err != nil { + return err + } + return errors.Wrap(pg.target.Put(UnstructuredWithMetadata{ + Object: unstructured.Unstructured{ + Object: addNameGVK(t.Object, patchMap), + }, + Metadata: t.Metadata, + }), errEditConfigurationPackageFmt) +} diff --git a/pkg/migration/converter.go b/pkg/migration/converter.go index 407ce35d..e8c0526a 100644 --- a/pkg/migration/converter.go +++ b/pkg/migration/converter.go @@ -31,9 +31,10 @@ import ( ) const ( - errFromUnstructured = "failed to convert from unstructured.Unstructured to the managed resource type" - errFromUnstructuredConf = "failed to convert from unstructured.Unstructured to Crossplane Configuration metadata" - errFromUnstructuredProvider = "failed to convert from unstructured.Unstructured to Crossplane Provider package" + errFromUnstructured = "failed to convert from unstructured.Unstructured to the managed resource type" + errFromUnstructuredConfMeta = "failed to convert from unstructured.Unstructured to Crossplane Configuration metadata" + errFromUnstructuredConfPackage = "failed to convert from unstructured.Unstructured to Crossplane Configuration package" + errFromUnstructuredProvider = "failed to convert from unstructured.Unstructured to Crossplane Provider package" // errFromUnstructuredLock = "failed to convert from unstructured.Unstructured to Crossplane package lock" errToUnstructured = "failed to convert from the managed resource type to unstructured.Unstructured" errRawExtensionUnmarshal = "failed to unmarshal runtime.RawExtension" @@ -195,30 +196,38 @@ func toManagedResource(c runtime.ObjectCreater, u unstructured.Unstructured) (re return mg, ok, nil } -func toConfigurationV1(u unstructured.Unstructured) (*xpmetav1.Configuration, error) { +func toConfigurationPackageV1(u unstructured.Unstructured) (*xppkgv1.Configuration, error) { + conf := &xppkgv1.Configuration{} + if err := runtime.DefaultUnstructuredConverter.FromUnstructured(u.Object, conf); err != nil { + return nil, errors.Wrap(err, errFromUnstructuredConfPackage) + } + return conf, nil +} + +func toConfigurationMetadataV1(u unstructured.Unstructured) (*xpmetav1.Configuration, error) { conf := &xpmetav1.Configuration{} if err := runtime.DefaultUnstructuredConverter.FromUnstructured(u.Object, conf); err != nil { - return nil, errors.Wrap(err, errFromUnstructuredConf) + return nil, errors.Wrap(err, errFromUnstructuredConfMeta) } return conf, nil } -func toConfigurationV1Alpha1(u unstructured.Unstructured) (*xpmetav1alpha1.Configuration, error) { +func toConfigurationMetadataV1Alpha1(u unstructured.Unstructured) (*xpmetav1alpha1.Configuration, error) { conf := &xpmetav1alpha1.Configuration{} if err := runtime.DefaultUnstructuredConverter.FromUnstructured(u.Object, conf); err != nil { - return nil, errors.Wrap(err, errFromUnstructuredConf) + return nil, errors.Wrap(err, errFromUnstructuredConfMeta) } return conf, nil } -func toConfiguration(u unstructured.Unstructured) (metav1.Object, error) { +func toConfigurationMetadata(u unstructured.Unstructured) (metav1.Object, error) { var conf metav1.Object var err error switch u.GroupVersionKind().Version { case "v1alpha1": - conf, err = toConfigurationV1Alpha1(u) + conf, err = toConfigurationMetadataV1Alpha1(u) default: - conf, err = toConfigurationV1(u) + conf, err = toConfigurationMetadataV1(u) } return conf, err } diff --git a/pkg/migration/interfaces.go b/pkg/migration/interfaces.go index 3bb8c902..57aaf802 100644 --- a/pkg/migration/interfaces.go +++ b/pkg/migration/interfaces.go @@ -73,16 +73,25 @@ type PatchSetConverter interface { PatchSets(psMap map[string]*xpv1.PatchSet) error } -// ConfigurationConverter converts a Crossplane Configuration's metadata. -type ConfigurationConverter interface { - // ConfigurationV1 takes a Crossplane Configuration v1 metadata, +// ConfigurationMetadataConverter converts a Crossplane Configuration's metadata. +type ConfigurationMetadataConverter interface { + // ConfigurationMetadataV1 takes a Crossplane Configuration v1 metadata, // converts it, and stores the converted metadata in its argument. // Returns any errors encountered during the conversion. - ConfigurationV1(configuration *xpmetav1.Configuration) error - // ConfigurationV1Alpha1 takes a Crossplane Configuration v1alpha1 + ConfigurationMetadataV1(configuration *xpmetav1.Configuration) error + // ConfigurationMetadataV1Alpha1 takes a Crossplane Configuration v1alpha1 // metadata, converts it, and stores the converted metadata in its // argument. Returns any errors encountered during the conversion. - ConfigurationV1Alpha1(configuration *xpmetav1alpha1.Configuration) error + ConfigurationMetadataV1Alpha1(configuration *xpmetav1alpha1.Configuration) error +} + +// ConfigurationPackageConverter converts a Crossplane configuration package. +type ConfigurationPackageConverter interface { + // ConfigurationPackageV1 takes a Crossplane Configuration v1 package, + // converts it possibly to multiple packages and returns + // the converted configuration package. + // Returns any errors encountered during the conversion. + ConfigurationPackageV1(pkg *xppkgv1.Configuration) error } // ProviderPackageConverter converts a Crossplane provider package. diff --git a/pkg/migration/plan_generator.go b/pkg/migration/plan_generator.go index 1036941c..fc733350 100644 --- a/pkg/migration/plan_generator.go +++ b/pkg/migration/plan_generator.go @@ -19,17 +19,13 @@ import ( "reflect" "time" - xppkgv1 "github.com/crossplane/crossplane/apis/pkg/v1" - xppkgv1beta1 "github.com/crossplane/crossplane/apis/pkg/v1beta1" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - xpmetav1alpha1 "github.com/crossplane/crossplane/apis/pkg/meta/v1alpha1" - "github.com/crossplane/crossplane-runtime/pkg/fieldpath" "github.com/crossplane/crossplane-runtime/pkg/resource" xpv1 "github.com/crossplane/crossplane/apis/apiextensions/v1" xpmetav1 "github.com/crossplane/crossplane/apis/pkg/meta/v1" + xpmetav1alpha1 "github.com/crossplane/crossplane/apis/pkg/meta/v1alpha1" + xppkgv1 "github.com/crossplane/crossplane/apis/pkg/v1" + xppkgv1beta1 "github.com/crossplane/crossplane/apis/pkg/v1beta1" "github.com/pkg/errors" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime" @@ -38,28 +34,29 @@ import ( ) const ( - errSourceHasNext = "failed to generate migration plan: Could not check next object from source" - errSourceNext = "failed to generate migration plan: Could not get next object from source" - errUnstructuredConvert = "failed to convert from unstructured object to v1.Composition" - errUnstructuredMarshal = "failed to marshal unstructured object to JSON" - errResourceMigrate = "failed to migrate resource" - errCompositePause = "failed to pause composite resource" - errCompositesEdit = "failed to edit composite resources" - errCompositesStart = "failed to start composite resources" - errCompositionMigrateFmt = "failed to migrate the composition: %s" - errConfigurationMigrateFmt = "failed to migrate the configuration: %s" - errProviderMigrateFmt = "failed to migrate the Provider package: %s" - errComposedTemplateBase = "failed to migrate the base of a composed template" - errComposedTemplateMigrate = "failed to migrate the composed templates of the composition" - errResourceOutput = "failed to output migrated resource" - errResourceOrphan = "failed to orphan managed resource" - errCompositionOutput = "failed to output migrated composition" - errCompositeOutput = "failed to output migrated composite" - errClaimOutput = "failed to output migrated claim" - errClaimsEdit = "failed to edit claims" - errPlanGeneration = "failed to generate the migration plan" - errPause = "failed to store a paused manifest" - errMissingGVK = "managed resource is missing its GVK. Resource converters must set GVKs on any managed resources they newly generate." + errSourceHasNext = "failed to generate migration plan: Could not check next object from source" + errSourceNext = "failed to generate migration plan: Could not get next object from source" + errUnstructuredConvert = "failed to convert from unstructured object to v1.Composition" + errUnstructuredMarshal = "failed to marshal unstructured object to JSON" + errResourceMigrate = "failed to migrate resource" + errCompositePause = "failed to pause composite resource" + errCompositesEdit = "failed to edit composite resources" + errCompositesStart = "failed to start composite resources" + errCompositionMigrateFmt = "failed to migrate the composition: %s" + errConfigurationMetadataMigrateFmt = "failed to migrate the configuration metadata: %s" + errConfigurationPackageMigrateFmt = "failed to migrate the configuration package: %s" + errProviderMigrateFmt = "failed to migrate the Provider package: %s" + errComposedTemplateBase = "failed to migrate the base of a composed template" + errComposedTemplateMigrate = "failed to migrate the composed templates of the composition" + errResourceOutput = "failed to output migrated resource" + errResourceOrphan = "failed to orphan managed resource" + errCompositionOutput = "failed to output migrated composition" + errCompositeOutput = "failed to output migrated composite" + errClaimOutput = "failed to output migrated claim" + errClaimsEdit = "failed to edit claims" + errPlanGeneration = "failed to generate the migration plan" + errPause = "failed to store a paused manifest" + errMissingGVK = "managed resource is missing its GVK. Resource converters must set GVKs on any managed resources they newly generate." ) const ( @@ -189,13 +186,17 @@ func (pg *PlanGenerator) convert() error { //nolint: gocyclo return errors.Wrap(err, errSourceNext) } switch gvk := o.Object.GroupVersionKind(); gvk { + case xppkgv1.ConfigurationGroupVersionKind: + if err := pg.convertConfigurationPackage(o); err != nil { + return errors.Wrapf(err, errConfigurationPackageMigrateFmt, o.Object.GetName()) + } case xpmetav1.ConfigurationGroupVersionKind, xpmetav1alpha1.ConfigurationGroupVersionKind: - target, converted, err := pg.convertConfiguration(o) + target, converted, err := pg.convertConfigurationMetadata(o) if err != nil { - return errors.Wrapf(err, errConfigurationMigrateFmt, o.Object.GetName()) + return errors.Wrapf(err, errConfigurationMetadataMigrateFmt, o.Object.GetName()) } if converted { - if err := pg.stepEditConfiguration(o, target); err != nil { + if err := pg.stepEditConfigurationMetadata(o, target); err != nil { return err } } @@ -327,77 +328,6 @@ func assertMetadataName(parentName string, resources []resource.Managed) { } } -func (pg *PlanGenerator) convertConfiguration(o UnstructuredWithMetadata) (*UnstructuredWithMetadata, bool, error) { - isConverted := false - var conf metav1.Object - var err error - for _, confConv := range pg.registry.configurationConverters { - if confConv.re == nil || confConv.converter == nil || !confConv.re.MatchString(o.Object.GetName()) { - continue - } - - conf, err = toConfiguration(o.Object) - if err != nil { - return nil, false, err - } - switch o.Object.GroupVersionKind().Version { - case "v1alpha1": - err = confConv.converter.ConfigurationV1Alpha1(conf.(*xpmetav1alpha1.Configuration)) - default: - err = confConv.converter.ConfigurationV1(conf.(*xpmetav1.Configuration)) - } - if err != nil { - return nil, false, errors.Wrapf(err, "failed to call converter on Configuration: %s", conf.GetName()) - } - // TODO: if a configuration converter only converts a specific version, - // (or does not convert the given configuration), - // we will have a false positive. Better to compute and check - // a diff here. - isConverted = true - } - return &UnstructuredWithMetadata{ - Object: ToSanitizedUnstructured(conf), - Metadata: o.Metadata, - }, isConverted, nil -} - -func (pg *PlanGenerator) convertProviderPackage(o UnstructuredWithMetadata) (bool, error) { - pkg, err := toProviderPackage(o.Object) - if err != nil { - return false, err - } - isConverted := false - for _, pkgConv := range pg.registry.providerPackageConverters { - if pkgConv.re == nil || pkgConv.converter == nil || !pkgConv.re.MatchString(pkg.Spec.Package) { - continue - } - targetPkgs, err := pkgConv.converter.ProviderPackageV1(*pkg) - if err != nil { - return false, errors.Wrapf(err, "failed to call converter on Provider package: %s", pkg.Spec.Package) - } - // TODO: if a configuration converter only converts a specific version, - // (or does not convert the given configuration), - // we will have a false positive. Better to compute and check - // a diff here. - isConverted = true - converted := make([]*UnstructuredWithMetadata, 0, len(targetPkgs)) - for _, p := range targetPkgs { - p := p - converted = append(converted, &UnstructuredWithMetadata{ - Object: ToSanitizedUnstructured(&p), - Metadata: o.Metadata, - }) - } - if err := pg.stepNewSSOPs(o, converted); err != nil { - return false, err - } - if err := pg.stepActivateSSOPs(converted); err != nil { - return false, err - } - } - return isConverted, nil -} - func (pg *PlanGenerator) convertComposition(o UnstructuredWithMetadata) (*UnstructuredWithMetadata, bool, error) { // nolint:gocyclo convertedPS, err := pg.convertPatchSets(o) if err != nil { diff --git a/pkg/migration/plan_generator_test.go b/pkg/migration/plan_generator_test.go index d0bacbf9..7bce05c3 100644 --- a/pkg/migration/plan_generator_test.go +++ b/pkg/migration/plan_generator_test.go @@ -63,7 +63,7 @@ func TestGeneratePlan(t *testing.T) { fields: fields{ source: newTestSource(map[string]Metadata{}), target: newTestTarget(), - registry: getRegistryWithConverters(nil, nil, nil, nil), + registry: getRegistryWithConverters(nil, nil, nil, nil, nil), }, want: want{}, }, @@ -113,7 +113,7 @@ func TestGeneratePlan(t *testing.T) { re: AllCompositions, converter: &testConverter{}, }, - }, nil, nil), + }, nil, nil, nil), }, want: want{ migrationPlanPath: "testdata/plan/generated/migration_plan.yaml", @@ -135,18 +135,17 @@ func TestGeneratePlan(t *testing.T) { source: newTestSource(map[string]Metadata{ "testdata/plan/configurationv1.yaml": {}}), target: newTestTarget(), - registry: getRegistryWithConverters(nil, nil, []configurationConverter{ + registry: getRegistryWithConverters(nil, nil, []configurationMetadataConverter{ { re: AllConfigurations, - converter: &configurationTestConverter{}, + converter: &configurationMetaTestConverter{}, }, - }, nil), + }, nil, nil), }, want: want{ migrationPlanPath: "testdata/plan/generated/configurationv1_migration_plan.yaml", migratedResourceNames: []string{ - "skip-dependency-resolution/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1.yaml", - "edit-configurations/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1.yaml", + "edit-configuration-metadata/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1.yaml", }, }, }, @@ -155,18 +154,17 @@ func TestGeneratePlan(t *testing.T) { source: newTestSource(map[string]Metadata{ "testdata/plan/configurationv1alpha1.yaml": {}}), target: newTestTarget(), - registry: getRegistryWithConverters(nil, nil, []configurationConverter{ + registry: getRegistryWithConverters(nil, nil, []configurationMetadataConverter{ { re: AllConfigurations, - converter: &configurationTestConverter{}, + converter: &configurationMetaTestConverter{}, }, - }, nil), + }, nil, nil), }, want: want{ migrationPlanPath: "testdata/plan/generated/configurationv1alpha1_migration_plan.yaml", migratedResourceNames: []string{ - "skip-dependency-resolution/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1alpha1.yaml", - "edit-configurations/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1alpha1.yaml", + "edit-configuration-metadata/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1alpha1.yaml", }, }, }, @@ -175,7 +173,7 @@ func TestGeneratePlan(t *testing.T) { source: newTestSource(map[string]Metadata{ "testdata/plan/providerv1.yaml": {}}), target: newTestTarget(), - registry: getRegistryWithConverters(nil, nil, nil, + registry: getRegistryWithConverters(nil, nil, nil, nil, []providerPackageConverter{ { re: regexp.MustCompile(`xpkg.upbound.io/upbound/provider-aws:.+`), @@ -202,14 +200,21 @@ func TestGeneratePlan(t *testing.T) { "PlanWithProviderPackageV1AndConfigurationV1": { fields: fields{ source: newTestSource(map[string]Metadata{ - "testdata/plan/providerv1.yaml": {}, - "testdata/plan/configurationv1.yaml": {}}), + "testdata/plan/providerv1.yaml": {}, + "testdata/plan/configurationv1.yaml": {}, + "testdata/plan/configurationpkgv1.yaml": {}, + }), target: newTestTarget(), registry: getRegistryWithConverters(nil, nil, - []configurationConverter{ + []configurationMetadataConverter{ { re: AllConfigurations, - converter: &configurationTestConverter{}, + converter: &configurationMetaTestConverter{}, + }, + }, []configurationPackageConverter{ + { + re: regexp.MustCompile(`xpkg.upbound.io/upbound/provider-ref-aws:.+`), + converter: &configurationPackageTestConverter{}, }, }, []providerPackageConverter{ @@ -226,8 +231,10 @@ func TestGeneratePlan(t *testing.T) { want: want{ migrationPlanPath: "testdata/plan/generated/configurationv1_providerv1_migration_plan.yaml", migratedResourceNames: []string{ - "skip-dependency-resolution/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1.yaml", - "edit-configurations/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1.yaml", + "disable-dependency-resolution/platform-ref-aws.configurations.pkg.crossplane.io_v1.yaml", + "edit-configuration-package/platform-ref-aws.configurations.pkg.crossplane.io_v1.yaml", + "enable-dependency-resolution/platform-ref-aws.configurations.pkg.crossplane.io_v1.yaml", + "edit-configuration-metadata/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1.yaml", "new-ssop/provider-family-aws.providers.pkg.crossplane.io_v1.yaml", "new-ssop/provider-aws-ec2.providers.pkg.crossplane.io_v1.yaml", "new-ssop/provider-aws-eks.providers.pkg.crossplane.io_v1.yaml", @@ -374,7 +381,8 @@ func ptrFromString(s string) *string { return &s } -func getRegistryWithConverters(converters map[schema.GroupVersionKind]delegatingConverter, psConverters []patchSetConverter, confConverters []configurationConverter, pkgconverters []providerPackageConverter) *Registry { +func getRegistryWithConverters(converters map[schema.GroupVersionKind]delegatingConverter, psConverters []patchSetConverter, confMetaConverters []configurationMetadataConverter, confPackageConverters []configurationPackageConverter, + providerPkgConverters []providerPackageConverter) *Registry { scheme := runtime.NewScheme() scheme.AddKnownTypeWithName(fake.MigrationSourceGVK, &fake.MigrationSourceObject{}) scheme.AddKnownTypeWithName(fake.MigrationTargetGVK, &fake.MigrationTargetObject{}) @@ -382,10 +390,13 @@ func getRegistryWithConverters(converters map[schema.GroupVersionKind]delegating for _, c := range psConverters { r.RegisterPatchSetConverter(c.re, c.converter) } - for _, c := range confConverters { + for _, c := range confMetaConverters { r.RegisterConfigurationConverter(c.re, c.converter) } - for _, c := range pkgconverters { + for _, c := range confPackageConverters { + r.RegisterConfigurationPackageConverter(c.re, c.converter) + } + for _, c := range providerPkgConverters { r.RegisterProviderPackageConverter(c.re, c.converter) } for gvk, d := range converters { @@ -412,9 +423,16 @@ func emptyPlan() *Plan { } } -type configurationTestConverter struct{} +type configurationPackageTestConverter struct{} + +func (c *configurationPackageTestConverter) ConfigurationPackageV1(pkg *xppkgv1.Configuration) error { + pkg.Spec.Package = "xpkg.upbound.io/upbound/provider-ref-aws:v0.2.0-ssop" + return nil +} + +type configurationMetaTestConverter struct{} -func (cc *configurationTestConverter) ConfigurationV1(c *xpmetav1.Configuration) error { +func (cc *configurationMetaTestConverter) ConfigurationMetadataV1(c *xpmetav1.Configuration) error { c.Spec.DependsOn = []xpmetav1.Dependency{ { Provider: ptrFromString("xpkg.upbound.io/upbound/provider-aws-eks"), @@ -424,7 +442,7 @@ func (cc *configurationTestConverter) ConfigurationV1(c *xpmetav1.Configuration) return nil } -func (cc *configurationTestConverter) ConfigurationV1Alpha1(c *xpmetav1alpha1.Configuration) error { +func (cc *configurationMetaTestConverter) ConfigurationMetadataV1Alpha1(c *xpmetav1alpha1.Configuration) error { c.Spec.DependsOn = []xpmetav1alpha1.Dependency{ { Provider: ptrFromString("xpkg.upbound.io/upbound/provider-aws-eks"), diff --git a/pkg/migration/provider_package_steps.go b/pkg/migration/provider_package_steps.go index b5ddadec..1aa49d5e 100644 --- a/pkg/migration/provider_package_steps.go +++ b/pkg/migration/provider_package_steps.go @@ -23,10 +23,46 @@ import ( const ( errPutSSOPPackageFmt = "failed to put the SSOP package: %s" - errEditMonolithFmt = "failed to put the edited monolithic Provider package: %s" errActivateSSOP = "failed to put the activated SSOP package: %s" ) +func (pg *PlanGenerator) convertProviderPackage(o UnstructuredWithMetadata) (bool, error) { + pkg, err := toProviderPackage(o.Object) + if err != nil { + return false, err + } + isConverted := false + for _, pkgConv := range pg.registry.providerPackageConverters { + if pkgConv.re == nil || pkgConv.converter == nil || !pkgConv.re.MatchString(pkg.Spec.Package) { + continue + } + targetPkgs, err := pkgConv.converter.ProviderPackageV1(*pkg) + if err != nil { + return false, errors.Wrapf(err, "failed to call converter on Provider package: %s", pkg.Spec.Package) + } + // TODO: if a configuration converter only converts a specific version, + // (or does not convert the given configuration), + // we will have a false positive. Better to compute and check + // a diff here. + isConverted = true + converted := make([]*UnstructuredWithMetadata, 0, len(targetPkgs)) + for _, p := range targetPkgs { + p := p + converted = append(converted, &UnstructuredWithMetadata{ + Object: ToSanitizedUnstructured(&p), + Metadata: o.Metadata, + }) + } + if err := pg.stepNewSSOPs(o, converted); err != nil { + return false, err + } + if err := pg.stepActivateSSOPs(converted); err != nil { + return false, err + } + } + return isConverted, nil +} + func (pg *PlanGenerator) stepDeleteMonolith(source UnstructuredWithMetadata) error { // delete the monolithic provider package s := pg.stepConfiguration(stepDeleteMonolithicProvider) diff --git a/pkg/migration/registry.go b/pkg/migration/registry.go index b5c7bfd7..a27244ae 100644 --- a/pkg/migration/registry.go +++ b/pkg/migration/registry.go @@ -51,14 +51,24 @@ type patchSetConverter struct { converter PatchSetConverter } -type configurationConverter struct { +type configurationMetadataConverter struct { // re is the regular expression against which a Configuration's name // will be matched to determine whether the conversion function // will be invoked. re *regexp.Regexp - // converter is the ConfigurationConverter to be run on the Configuration's + // converter is the ConfigurationMetadataConverter to be run on the Configuration's // metadata. - converter ConfigurationConverter + converter ConfigurationMetadataConverter +} + +type configurationPackageConverter struct { + // re is the regular expression against which a Configuration package's + // reference will be matched to determine whether the conversion function + // will be invoked. + re *regexp.Regexp + // converter is the ConfigurationPackageConverter to be run on the + // Configuration package. + converter ConfigurationPackageConverter } type providerPackageConverter struct { @@ -75,15 +85,16 @@ type providerPackageConverter struct { // the associated `schema.GroupVersionKind`s and an associated // runtime.Scheme with which the corresponding types are registered. type Registry struct { - resourceConverters map[schema.GroupVersionKind]ResourceConverter - templateConverters map[schema.GroupVersionKind]ComposedTemplateConverter - patchSetConverters []patchSetConverter - configurationConverters []configurationConverter - providerPackageConverters []providerPackageConverter - packageLockConverters []PackageLockConverter - scheme *runtime.Scheme - claimTypes []schema.GroupVersionKind - compositeTypes []schema.GroupVersionKind + resourceConverters map[schema.GroupVersionKind]ResourceConverter + templateConverters map[schema.GroupVersionKind]ComposedTemplateConverter + patchSetConverters []patchSetConverter + configurationConverters []configurationMetadataConverter + configurationPackageConverters []configurationPackageConverter + providerPackageConverters []providerPackageConverter + packageLockConverters []PackageLockConverter + scheme *runtime.Scheme + claimTypes []schema.GroupVersionKind + compositeTypes []schema.GroupVersionKind } // NewRegistry returns a new Registry initialized with @@ -140,30 +151,49 @@ func (r *Registry) RegisterPatchSetConverter(re *regexp.Regexp, psConv PatchSetC }) } -// RegisterConfigurationConverter registers the given ConfigurationConverter +// RegisterConfigurationConverter registers the given ConfigurationMetadataConverter // for the configurations whose name match the given regular expression. -func (r *Registry) RegisterConfigurationConverter(re *regexp.Regexp, confConv ConfigurationConverter) { - r.configurationConverters = append(r.configurationConverters, configurationConverter{ +func (r *Registry) RegisterConfigurationConverter(re *regexp.Regexp, confConv ConfigurationMetadataConverter) { + r.configurationConverters = append(r.configurationConverters, configurationMetadataConverter{ re: re, converter: confConv, }) } -// RegisterConfigurationV1ConversionFunction registers the specified -// ConfigurationV1ConversionFn for the v1 configurations whose name match +// RegisterConfigurationMetadataV1ConversionFunction registers the specified +// ConfigurationMetadataV1ConversionFn for the v1 configurations whose name match // the given regular expression. -func (r *Registry) RegisterConfigurationV1ConversionFunction(re *regexp.Regexp, confConversionFn ConfigurationV1ConversionFn) { +func (r *Registry) RegisterConfigurationMetadataV1ConversionFunction(re *regexp.Regexp, confConversionFn ConfigurationMetadataV1ConversionFn) { r.RegisterConfigurationConverter(re, &delegatingConverter{ - confV1Fn: confConversionFn, + confMetaV1Fn: confConversionFn, }) } -// RegisterConfigurationV1Alpha1ConversionFunction registers the specified -// ConfigurationV1Alpha1ConversionFn for the v1alpha1 configurations +// RegisterConfigurationMetadataV1Alpha1ConversionFunction registers the specified +// ConfigurationMetadataV1Alpha1ConversionFn for the v1alpha1 configurations // whose name match the given regular expression. -func (r *Registry) RegisterConfigurationV1Alpha1ConversionFunction(re *regexp.Regexp, confConversionFn ConfigurationV1Alpha1ConversionFn) { +func (r *Registry) RegisterConfigurationMetadataV1Alpha1ConversionFunction(re *regexp.Regexp, confConversionFn ConfigurationMetadataV1Alpha1ConversionFn) { r.RegisterConfigurationConverter(re, &delegatingConverter{ - confV1Alpha1Fn: confConversionFn, + confMetaV1Alpha1Fn: confConversionFn, + }) +} + +// RegisterConfigurationPackageConverter registers the specified +// ConfigurationPackageConverter for the Configuration v1 packages whose reference +// match the given regular expression. +func (r *Registry) RegisterConfigurationPackageConverter(re *regexp.Regexp, pkgConv ConfigurationPackageConverter) { + r.configurationPackageConverters = append(r.configurationPackageConverters, configurationPackageConverter{ + re: re, + converter: pkgConv, + }) +} + +// RegisterConfigurationPackageV1ConversionFunction registers the specified +// ConfigurationPackageV1ConversionFn for the Configuration v1 packages whose reference +// match the given regular expression. +func (r *Registry) RegisterConfigurationPackageV1ConversionFunction(re *regexp.Regexp, confConversionFn ConfigurationPackageV1ConversionFn) { + r.RegisterConfigurationPackageConverter(re, &delegatingConverter{ + confPackageV1Fn: confConversionFn, }) } @@ -244,15 +274,18 @@ func (r *Registry) GetCompositionGVKs() []schema.GroupVersionKind { // GetAllRegisteredGVKs returns a list of registered GVKs // including v1.CompositionGroupVersionKind, -// metav1.ConfigurationGroupVersionKind and -// metav1alpha1.ConfigurationGroupVersionKind. +// metav1.ConfigurationGroupVersionKind, +// metav1alpha1.ConfigurationGroupVersionKind +// pkg.ConfigurationGroupVersionKind, +// pkg.ProviderGroupVersionKind, +// pkg.LockGroupVersionKind. func (r *Registry) GetAllRegisteredGVKs() []schema.GroupVersionKind { gvks := make([]schema.GroupVersionKind, 0, len(r.claimTypes)+len(r.compositeTypes)+len(r.resourceConverters)+len(r.templateConverters)+1) gvks = append(gvks, r.claimTypes...) gvks = append(gvks, r.compositeTypes...) gvks = append(gvks, r.GetManagedResourceGVKs()...) gvks = append(gvks, xpv1.CompositionGroupVersionKind, xpmetav1.ConfigurationGroupVersionKind, xpmetav1alpha1.ConfigurationGroupVersionKind, - xppkgv1.ProviderGroupVersionKind, xppkgv1beta1.LockGroupVersionKind) + xppkgv1.ConfigurationGroupVersionKind, xppkgv1.ProviderGroupVersionKind, xppkgv1beta1.LockGroupVersionKind) return gvks } @@ -270,21 +303,26 @@ type ComposedTemplateConversionFn func(sourceTemplate xpv1.ComposedTemplate, con // schema to the migration target provider's schema. type PatchSetsConversionFn func(psMap map[string]*xpv1.PatchSet) error -// ConfigurationV1ConversionFn is a function that converts the specified +// ConfigurationMetadataV1ConversionFn is a function that converts the specified // migration source Configuration v1 metadata to the migration target // Configuration metadata. -type ConfigurationV1ConversionFn func(configuration *xpmetav1.Configuration) error +type ConfigurationMetadataV1ConversionFn func(configuration *xpmetav1.Configuration) error -// ConfigurationV1Alpha1ConversionFn is a function that converts the specified +// ConfigurationMetadataV1Alpha1ConversionFn is a function that converts the specified // migration source Configuration v1alpha1 metadata to the migration target // Configuration metadata. -type ConfigurationV1Alpha1ConversionFn func(configuration *xpmetav1alpha1.Configuration) error +type ConfigurationMetadataV1Alpha1ConversionFn func(configuration *xpmetav1alpha1.Configuration) error // PackageLockV1Beta1ConversionFn is a function that converts the specified // migration source package v1beta1 lock to the migration target // package lock. type PackageLockV1Beta1ConversionFn func(pkg *xppkgv1beta1.Lock) error +// ConfigurationPackageV1ConversionFn is a function that converts the specified +// migration source Configuration v1 package to the migration target +// Configuration package(s). +type ConfigurationPackageV1ConversionFn func(pkg *xppkgv1.Configuration) error + // ProviderPackageV1ConversionFn is a function that converts the specified // migration source provider v1 package to the migration target // Provider package(s). @@ -294,12 +332,20 @@ type delegatingConverter struct { rFn ResourceConversionFn cmpFn ComposedTemplateConversionFn psFn PatchSetsConversionFn - confV1Fn ConfigurationV1ConversionFn - confV1Alpha1Fn ConfigurationV1Alpha1ConversionFn + confMetaV1Fn ConfigurationMetadataV1ConversionFn + confMetaV1Alpha1Fn ConfigurationMetadataV1Alpha1ConversionFn + confPackageV1Fn ConfigurationPackageV1ConversionFn providerPackageV1Fn ProviderPackageV1ConversionFn packageLockV1Beta1Fn PackageLockV1Beta1ConversionFn } +func (d *delegatingConverter) ConfigurationPackageV1(pkg *xppkgv1.Configuration) error { + if d.confPackageV1Fn == nil { + return nil + } + return d.confPackageV1Fn(pkg) +} + func (d *delegatingConverter) PackageLockV1Beta1(lock *xppkgv1beta1.Lock) error { if d.packageLockV1Beta1Fn == nil { return nil @@ -314,18 +360,18 @@ func (d *delegatingConverter) ProviderPackageV1(pkg xppkgv1.Provider) ([]xppkgv1 return d.providerPackageV1Fn(pkg) } -func (d *delegatingConverter) ConfigurationV1(c *xpmetav1.Configuration) error { - if d.confV1Fn == nil { +func (d *delegatingConverter) ConfigurationMetadataV1(c *xpmetav1.Configuration) error { + if d.confMetaV1Fn == nil { return nil } - return d.confV1Fn(c) + return d.confMetaV1Fn(c) } -func (d *delegatingConverter) ConfigurationV1Alpha1(c *xpmetav1alpha1.Configuration) error { - if d.confV1Alpha1Fn == nil { +func (d *delegatingConverter) ConfigurationMetadataV1Alpha1(c *xpmetav1alpha1.Configuration) error { + if d.confMetaV1Alpha1Fn == nil { return nil } - return d.confV1Alpha1Fn(c) + return d.confMetaV1Alpha1Fn(c) } func (d *delegatingConverter) PatchSets(psMap map[string]*xpv1.PatchSet) error { diff --git a/pkg/migration/testdata/plan/configurationpkgv1.yaml b/pkg/migration/testdata/plan/configurationpkgv1.yaml new file mode 100644 index 00000000..972b8c3d --- /dev/null +++ b/pkg/migration/testdata/plan/configurationpkgv1.yaml @@ -0,0 +1,6 @@ +apiVersion: pkg.crossplane.io/v1 +kind: Configuration +metadata: + name: platform-ref-aws +spec: + package: xpkg.upbound.io/upbound/provider-ref-aws:v0.1.0 \ No newline at end of file diff --git a/pkg/migration/testdata/plan/generated/configurationv1_migration_plan.yaml b/pkg/migration/testdata/plan/generated/configurationv1_migration_plan.yaml index 044bbcea..c8905d38 100644 --- a/pkg/migration/testdata/plan/generated/configurationv1_migration_plan.yaml +++ b/pkg/migration/testdata/plan/generated/configurationv1_migration_plan.yaml @@ -3,15 +3,8 @@ spec: - patch: type: merge files: - - skip-dependency-resolution/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1.yaml - name: skip-dependency-resolution - type: Patch - - - patch: - type: merge - files: - - edit-configurations/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1.yaml - name: edit-configurations + - edit-configuration-metadata/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1.yaml + name: edit-configuration-metadata type: Patch version: 0.1.0 diff --git a/pkg/migration/testdata/plan/generated/configurationv1_providerv1_migration_plan.yaml b/pkg/migration/testdata/plan/generated/configurationv1_providerv1_migration_plan.yaml index d5a3f736..a70677c1 100644 --- a/pkg/migration/testdata/plan/generated/configurationv1_providerv1_migration_plan.yaml +++ b/pkg/migration/testdata/plan/generated/configurationv1_providerv1_migration_plan.yaml @@ -16,8 +16,8 @@ spec: - patch: type: merge files: - - skip-dependency-resolution/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1.yaml - name: skip-dependency-resolution + - disable-dependency-resolution/platform-ref-aws.configurations.pkg.crossplane.io_v1.yaml + name: disable-dependency-resolution type: Patch - delete: @@ -49,8 +49,22 @@ spec: - patch: type: merge files: - - edit-configurations/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1.yaml - name: edit-configurations + - edit-configuration-metadata/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1.yaml + name: edit-configuration-metadata + type: Patch + + - patch: + type: merge + files: + - edit-configuration-package/platform-ref-aws.configurations.pkg.crossplane.io_v1.yaml + name: edit-configuration-package + type: Patch + + - patch: + type: merge + files: + - enable-dependency-resolution/platform-ref-aws.configurations.pkg.crossplane.io_v1.yaml + name: enable-dependency-resolution type: Patch version: 0.1.0 diff --git a/pkg/migration/testdata/plan/generated/configurationv1alpha1_migration_plan.yaml b/pkg/migration/testdata/plan/generated/configurationv1alpha1_migration_plan.yaml index d697e106..3b163939 100644 --- a/pkg/migration/testdata/plan/generated/configurationv1alpha1_migration_plan.yaml +++ b/pkg/migration/testdata/plan/generated/configurationv1alpha1_migration_plan.yaml @@ -3,15 +3,8 @@ spec: - patch: type: merge files: - - skip-dependency-resolution/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1alpha1.yaml - name: skip-dependency-resolution - type: Patch - - - patch: - type: merge - files: - - edit-configurations/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1alpha1.yaml - name: edit-configurations + - edit-configuration-metadata/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1alpha1.yaml + name: edit-configuration-metadata type: Patch version: 0.1.0 diff --git a/pkg/migration/testdata/plan/generated/skip-dependency-resolution/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1.yaml b/pkg/migration/testdata/plan/generated/disable-dependency-resolution/platform-ref-aws.configurations.pkg.crossplane.io_v1.yaml similarity index 71% rename from pkg/migration/testdata/plan/generated/skip-dependency-resolution/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1.yaml rename to pkg/migration/testdata/plan/generated/disable-dependency-resolution/platform-ref-aws.configurations.pkg.crossplane.io_v1.yaml index e20ec7a8..5c747b09 100644 --- a/pkg/migration/testdata/plan/generated/skip-dependency-resolution/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1.yaml +++ b/pkg/migration/testdata/plan/generated/disable-dependency-resolution/platform-ref-aws.configurations.pkg.crossplane.io_v1.yaml @@ -1,4 +1,4 @@ -apiVersion: meta.pkg.crossplane.io/v1 +apiVersion: pkg.crossplane.io/v1 kind: Configuration metadata: name: platform-ref-aws diff --git a/pkg/migration/testdata/plan/generated/edit-configurations/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1.yaml b/pkg/migration/testdata/plan/generated/edit-configuration-metadata/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1.yaml similarity index 100% rename from pkg/migration/testdata/plan/generated/edit-configurations/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1.yaml rename to pkg/migration/testdata/plan/generated/edit-configuration-metadata/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1.yaml diff --git a/pkg/migration/testdata/plan/generated/edit-configurations/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1alpha1.yaml b/pkg/migration/testdata/plan/generated/edit-configuration-metadata/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1alpha1.yaml similarity index 100% rename from pkg/migration/testdata/plan/generated/edit-configurations/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1alpha1.yaml rename to pkg/migration/testdata/plan/generated/edit-configuration-metadata/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1alpha1.yaml diff --git a/pkg/migration/testdata/plan/generated/edit-configuration-package/platform-ref-aws.configurations.pkg.crossplane.io_v1.yaml b/pkg/migration/testdata/plan/generated/edit-configuration-package/platform-ref-aws.configurations.pkg.crossplane.io_v1.yaml new file mode 100644 index 00000000..e74b8374 --- /dev/null +++ b/pkg/migration/testdata/plan/generated/edit-configuration-package/platform-ref-aws.configurations.pkg.crossplane.io_v1.yaml @@ -0,0 +1,6 @@ +apiVersion: pkg.crossplane.io/v1 +kind: Configuration +metadata: + name: platform-ref-aws +spec: + package: xpkg.upbound.io/upbound/provider-ref-aws:v0.2.0-ssop diff --git a/pkg/migration/testdata/plan/generated/enable-dependency-resolution/platform-ref-aws.configurations.pkg.crossplane.io_v1.yaml b/pkg/migration/testdata/plan/generated/enable-dependency-resolution/platform-ref-aws.configurations.pkg.crossplane.io_v1.yaml new file mode 100644 index 00000000..d0ee5a05 --- /dev/null +++ b/pkg/migration/testdata/plan/generated/enable-dependency-resolution/platform-ref-aws.configurations.pkg.crossplane.io_v1.yaml @@ -0,0 +1,6 @@ +apiVersion: pkg.crossplane.io/v1 +kind: Configuration +metadata: + name: platform-ref-aws +spec: + skipDependencyResolution: false diff --git a/pkg/migration/testdata/plan/generated/skip-dependency-resolution/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1alpha1.yaml b/pkg/migration/testdata/plan/generated/skip-dependency-resolution/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1alpha1.yaml deleted file mode 100644 index 6b3c2304..00000000 --- a/pkg/migration/testdata/plan/generated/skip-dependency-resolution/platform-ref-aws.configurations.meta.pkg.crossplane.io_v1alpha1.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: meta.pkg.crossplane.io/v1alpha1 -kind: Configuration -metadata: - name: platform-ref-aws -spec: - skipDependencyResolution: true