From b68188ad3eb4ef53ca9e5c8f0a4aa34f223b409d Mon Sep 17 00:00:00 2001 From: Cameron Garrison Date: Fri, 5 Jan 2024 17:36:44 -0500 Subject: [PATCH 01/15] initial add tracker spec --- apis/features/v1/features_types.go | 10 +++++++ components/dashboard/servicemesh_setup.go | 8 ++++-- components/kserve/kserve.go | 13 ++++++--- components/kserve/serverless_setup.go | 4 +-- .../dscinitialization/servicemesh_setup.go | 27 ++++++++++++------- pkg/feature/builder.go | 4 ++- pkg/feature/feature.go | 4 +++ pkg/feature/initializer.go | 5 +++- pkg/feature/types.go | 1 + 9 files changed, 57 insertions(+), 19 deletions(-) diff --git a/apis/features/v1/features_types.go b/apis/features/v1/features_types.go index a1becbc3641..150f5b9ad14 100644 --- a/apis/features/v1/features_types.go +++ b/apis/features/v1/features_types.go @@ -29,6 +29,8 @@ const ( ConditionPhaseProcessTemplates = "ProcessTemplates" ConditionPhaseApplyManifests = "ApplyManifests" ConditionPhasePostConditions = "FeaturePostConditions" + ComponentType = "Component" + DSCIType = "DSCI" ) func (s *FeatureTracker) ToOwnerReference() metav1.OwnerReference { @@ -40,8 +42,16 @@ func (s *FeatureTracker) ToOwnerReference() metav1.OwnerReference { } } +// Origin describes the type of object that created the related Feature to this FeatureTracker +type Origin struct { + Type string + Name string +} + // FeatureTrackerSpec defines the desired state of FeatureTracker. type FeatureTrackerSpec struct { + Origin Origin + AppNamespace string } // FeatureTrackerStatus defines the observed state of FeatureTracker. diff --git a/components/dashboard/servicemesh_setup.go b/components/dashboard/servicemesh_setup.go index 83365dcd14e..a9d047cafca 100644 --- a/components/dashboard/servicemesh_setup.go +++ b/components/dashboard/servicemesh_setup.go @@ -1,6 +1,7 @@ package dashboard import ( + featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" "path" operatorv1 "github.com/openshift/api/operator/v1" @@ -21,7 +22,10 @@ func (d *Dashboard) configureServiceMesh(cli client.Client, owner metav1.Object, } if shouldConfigureServiceMesh { - serviceMeshInitializer := feature.NewFeaturesInitializer(dscispec, d.defineServiceMeshFeatures(dscispec)) + serviceMeshInitializer := feature.NewFeaturesInitializer(dscispec, d.defineServiceMeshFeatures(dscispec), featurev1.Origin{ + Type: featurev1.ComponentType, + Name: d.GetComponentName(), + }) if err := serviceMeshInitializer.Prepare(); err != nil { return err @@ -43,7 +47,7 @@ func (d *Dashboard) configureServiceMesh(cli client.Client, owner metav1.Object, func (d *Dashboard) defineServiceMeshFeatures(dscispec *dsci.DSCInitializationSpec) feature.DefinedFeatures { return func(s *feature.FeaturesInitializer) error { createMeshResources, err := feature.CreateFeature("dashboard-create-service-mesh-routing-resources"). - For(dscispec). + For(dscispec, s.Origin). Manifests( path.Join(feature.ControlPlaneDir, "components", d.GetComponentName()), ). diff --git a/components/kserve/kserve.go b/components/kserve/kserve.go index b793211c6e0..83718d9d9ac 100644 --- a/components/kserve/kserve.go +++ b/components/kserve/kserve.go @@ -4,6 +4,7 @@ package kserve import ( "context" "fmt" + featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" "path/filepath" "strings" @@ -185,9 +186,12 @@ func (k *Kserve) configureServerless(instance *dsciv1.DSCInitializationSpec) err case operatorv1.Managed: // standard workflow to create CR switch instance.ServiceMesh.ManagementState { case operatorv1.Unmanaged, operatorv1.Removed: - return fmt.Errorf("ServiceMesh is need to set to 'Managaed' in DSCI CR, it is required by KServe serving field") + return fmt.Errorf("ServiceMesh is need to set to 'Managed' in DSCI CR, it is required by KServe serving field") } - serverlessInitializer := feature.NewFeaturesInitializer(instance, k.configureServerlessFeatures) + serverlessInitializer := feature.NewFeaturesInitializer(instance, k.configureServerlessFeatures, featurev1.Origin{ + Type: featurev1.ComponentType, + Name: k.GetComponentName(), + }) if err := serverlessInitializer.Prepare(); err != nil { return err @@ -201,7 +205,10 @@ func (k *Kserve) configureServerless(instance *dsciv1.DSCInitializationSpec) err } func (k *Kserve) removeServerlessFeatures(instance *dsciv1.DSCInitializationSpec) error { - serverlessInitializer := feature.NewFeaturesInitializer(instance, k.configureServerlessFeatures) + serverlessInitializer := feature.NewFeaturesInitializer(instance, k.configureServerlessFeatures, featurev1.Origin{ + Type: featurev1.ComponentType, + Name: k.GetComponentName(), + }) if err := serverlessInitializer.Prepare(); err != nil { return err diff --git a/components/kserve/serverless_setup.go b/components/kserve/serverless_setup.go index 83d2b6cf877..643e5be1441 100644 --- a/components/kserve/serverless_setup.go +++ b/components/kserve/serverless_setup.go @@ -16,7 +16,7 @@ const ( func (k *Kserve) configureServerlessFeatures(s *feature.FeaturesInitializer) error { servingDeployment, err := feature.CreateFeature("serverless-serving-deployment"). - For(s.DSCInitializationSpec). + For(s.DSCInitializationSpec, s.Origin). Manifests( path.Join(templatesDir, "serving-install"), ). @@ -37,7 +37,7 @@ func (k *Kserve) configureServerlessFeatures(s *feature.FeaturesInitializer) err s.Features = append(s.Features, servingDeployment) servingIstioGateways, err := feature.CreateFeature("serverless-serving-gateways"). - For(s.DSCInitializationSpec). + For(s.DSCInitializationSpec, s.Origin). PreConditions( // Check serverless is installed feature.WaitForResourceToBeCreated(knativeServingNamespace, gvr.KnativeServing), diff --git a/controllers/dscinitialization/servicemesh_setup.go b/controllers/dscinitialization/servicemesh_setup.go index cd810a5c699..4eb6c219c9b 100644 --- a/controllers/dscinitialization/servicemesh_setup.go +++ b/controllers/dscinitialization/servicemesh_setup.go @@ -1,6 +1,7 @@ package dscinitialization import ( + featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" "path" operatorv1 "github.com/openshift/api/operator/v1" @@ -16,7 +17,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { serviceMeshSpec := f.ServiceMesh smcpCreation, errSmcp := feature.CreateFeature("service-mesh-control-plane-creation"). - For(f.DSCInitializationSpec). + For(f.DSCInitializationSpec, f.Origin). Manifests( path.Join(feature.ControlPlaneDir, "base", "control-plane.tmpl"), ). @@ -35,7 +36,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { if serviceMeshSpec.ControlPlane.MetricsCollection == "Istio" { metricsCollection, errMetrics := feature.CreateFeature("service-mesh-monitoring"). - For(f.DSCInitializationSpec). + For(f.DSCInitializationSpec, f.Origin). Manifests( path.Join(feature.MonitoringDir), ). @@ -51,7 +52,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { } if oauth, err := feature.CreateFeature("service-mesh-control-plane-configure-oauth"). - For(f.DSCInitializationSpec). + For(f.DSCInitializationSpec, f.Origin). Manifests( path.Join(feature.ControlPlaneDir, "base"), path.Join(feature.ControlPlaneDir, "oauth"), @@ -79,7 +80,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { } if cfMaps, err := feature.CreateFeature("shared-config-maps"). - For(f.DSCInitializationSpec). + For(f.DSCInitializationSpec, f.Origin). WithResources(servicemesh.ConfigMaps). Load(); err != nil { return err @@ -88,7 +89,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { } if serviceMesh, err := feature.CreateFeature("app-add-namespace-to-service-mesh"). - For(f.DSCInitializationSpec). + For(f.DSCInitializationSpec, f.Origin). Manifests( path.Join(feature.ControlPlaneDir, "smm.tmpl"), path.Join(feature.ControlPlaneDir, "namespace.patch.tmpl"), @@ -101,7 +102,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { } if gatewayRoute, err := feature.CreateFeature("service-mesh-create-gateway-route"). - For(f.DSCInitializationSpec). + For(f.DSCInitializationSpec, f.Origin). Manifests( path.Join(feature.ControlPlaneDir, "routing"), ). @@ -116,7 +117,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { } if dataScienceProjects, err := feature.CreateFeature("app-migrate-data-science-projects"). - For(f.DSCInitializationSpec). + For(f.DSCInitializationSpec, f.Origin). WithResources(servicemesh.MigratedDataScienceProjects). Load(); err != nil { return err @@ -125,7 +126,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { } if extAuthz, err := feature.CreateFeature("service-mesh-control-plane-setup-external-authorization"). - For(f.DSCInitializationSpec). + For(f.DSCInitializationSpec, f.Origin). Manifests( path.Join(feature.AuthDir, "auth-smm.tmpl"), path.Join(feature.AuthDir, "base"), @@ -168,7 +169,10 @@ func (r *DSCInitializationReconciler) configureServiceMesh(instance *dsciv1.DSCI switch instance.Spec.ServiceMesh.ManagementState { case operatorv1.Managed: - serviceMeshInitializer := feature.NewFeaturesInitializer(&instance.Spec, defineServiceMeshFeatures) + serviceMeshInitializer := feature.NewFeaturesInitializer(&instance.Spec, defineServiceMeshFeatures, featurev1.Origin{ + Type: featurev1.DSCIType, + Name: instance.Name, + }) if err := serviceMeshInitializer.Prepare(); err != nil { r.Log.Error(err, "failed configuring service mesh resources") r.Recorder.Eventf(instance, corev1.EventTypeWarning, "DSCInitializationReconcileError", "failed configuring service mesh resources") @@ -195,7 +199,10 @@ func (r *DSCInitializationReconciler) configureServiceMesh(instance *dsciv1.DSCI func (r *DSCInitializationReconciler) removeServiceMesh(instance *dsciv1.DSCInitialization) error { // on condition of Managed, do not handle Removed when set to Removed it tigger DSCI reconcile to cleanup if instance.Spec.ServiceMesh.ManagementState == operatorv1.Managed { - serviceMeshInitializer := feature.NewFeaturesInitializer(&instance.Spec, defineServiceMeshFeatures) + serviceMeshInitializer := feature.NewFeaturesInitializer(&instance.Spec, defineServiceMeshFeatures, featurev1.Origin{ + Type: featurev1.DSCIType, + Name: instance.Name, + }) if err := serviceMeshInitializer.Prepare(); err != nil { r.Log.Error(err, "failed configuring service mesh resources") diff --git a/pkg/feature/builder.go b/pkg/feature/builder.go index 0d5a5fce5e0..dcdd1177edf 100644 --- a/pkg/feature/builder.go +++ b/pkg/feature/builder.go @@ -1,6 +1,7 @@ package feature import ( + featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" "io/fs" "github.com/pkg/errors" @@ -26,12 +27,13 @@ func CreateFeature(name string) *featureBuilder { return &featureBuilder{name: name} } -func (fb *featureBuilder) For(spec *v1.DSCInitializationSpec) *featureBuilder { +func (fb *featureBuilder) For(spec *v1.DSCInitializationSpec, origin featurev1.Origin) *featureBuilder { createSpec := func(f *Feature) error { f.Spec = &Spec{ AppNamespace: spec.ApplicationsNamespace, ServiceMeshSpec: &spec.ServiceMesh, Serving: &infrav1.ServingSpec{}, + Origin: &origin, } return nil diff --git a/pkg/feature/feature.go b/pkg/feature/feature.go index 3240e1a0121..7e6342c9b90 100644 --- a/pkg/feature/feature.go +++ b/pkg/feature/feature.go @@ -230,6 +230,10 @@ func (f *Feature) createFeatureTracker() error { ObjectMeta: metav1.ObjectMeta{ Name: f.Spec.AppNamespace + "-" + common.TrimToRFC1123Name(f.Name), }, + Spec: featurev1.FeatureTrackerSpec{ + Origin: *f.Spec.Origin, + AppNamespace: f.Spec.AppNamespace, + }, } foundTracker, err := f.DynamicClient.Resource(gvr.FeatureTracker).Get(context.TODO(), tracker.Name, metav1.GetOptions{}) diff --git a/pkg/feature/initializer.go b/pkg/feature/initializer.go index 7a1f437152d..5654a164bfe 100644 --- a/pkg/feature/initializer.go +++ b/pkg/feature/initializer.go @@ -2,6 +2,7 @@ package feature import ( "github.com/hashicorp/go-multierror" + featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" v1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/dscinitialization/v1" ) @@ -10,14 +11,16 @@ type FeaturesInitializer struct { *v1.DSCInitializationSpec definedFeatures DefinedFeatures Features []*Feature + Origin featurev1.Origin } type DefinedFeatures func(featuresInitializer *FeaturesInitializer) error -func NewFeaturesInitializer(spec *v1.DSCInitializationSpec, def DefinedFeatures) *FeaturesInitializer { +func NewFeaturesInitializer(spec *v1.DSCInitializationSpec, def DefinedFeatures, origin featurev1.Origin) *FeaturesInitializer { return &FeaturesInitializer{ DSCInitializationSpec: spec, definedFeatures: def, + Origin: origin, } } diff --git a/pkg/feature/types.go b/pkg/feature/types.go index 7b5da4cc7b8..48c8aa36f0f 100644 --- a/pkg/feature/types.go +++ b/pkg/feature/types.go @@ -16,6 +16,7 @@ type Spec struct { KnativeCertificateSecret string KnativeIngressDomain string Tracker *featurev1.FeatureTracker + Origin *featurev1.Origin } type OAuth struct { From d527e05e3afd25256f210f702f8a7afa8a5176e0 Mon Sep 17 00:00:00 2001 From: Cameron Garrison Date: Tue, 9 Jan 2024 09:44:11 -0500 Subject: [PATCH 02/15] update tests, update crd --- apis/features/v1/features_types.go | 8 ++-- components/dashboard/dashboard.go | 6 ++- components/dashboard/servicemesh_setup.go | 2 +- components/kserve/serverless_setup.go | 4 +- ...atures.opendatahub.io_featuretrackers.yaml | 15 +++++++ config/manager/kustomization.yaml | 3 +- .../dscinitialization/servicemesh_setup.go | 16 ++++---- pkg/feature/builder.go | 4 +- .../integration/features/features_int_test.go | 25 +++++++++--- .../features/serverless_feature_test.go | 4 +- .../features/servicemesh_feature_test.go | 4 +- .../service_mesh_setup_features_int_test.go | 39 ++++++++++++++----- 12 files changed, 93 insertions(+), 37 deletions(-) diff --git a/apis/features/v1/features_types.go b/apis/features/v1/features_types.go index 150f5b9ad14..51bf332c3fe 100644 --- a/apis/features/v1/features_types.go +++ b/apis/features/v1/features_types.go @@ -44,14 +44,14 @@ func (s *FeatureTracker) ToOwnerReference() metav1.OwnerReference { // Origin describes the type of object that created the related Feature to this FeatureTracker type Origin struct { - Type string - Name string + Type string `json:"type"` + Name string `json:"name"` } // FeatureTrackerSpec defines the desired state of FeatureTracker. type FeatureTrackerSpec struct { - Origin Origin - AppNamespace string + Origin Origin `json:"origin,omitempty"` + AppNamespace string `json:"appNamespace,omitempty"` } // FeatureTrackerStatus defines the observed state of FeatureTracker. diff --git a/components/dashboard/dashboard.go b/components/dashboard/dashboard.go index 927f1788d4a..0be8fe1eff9 100644 --- a/components/dashboard/dashboard.go +++ b/components/dashboard/dashboard.go @@ -5,6 +5,7 @@ package dashboard import ( "context" "fmt" + featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" "path/filepath" "strings" @@ -217,7 +218,10 @@ func (d *Dashboard) Cleanup(cli client.Client, dscispec *dsciv1.DSCInitializatio } if shouldConfigureServiceMesh { - serviceMeshInitializer := feature.NewFeaturesInitializer(dscispec, d.defineServiceMeshFeatures(dscispec)) + serviceMeshInitializer := feature.NewFeaturesInitializer(dscispec, d.defineServiceMeshFeatures(dscispec), featurev1.Origin{ + Type: featurev1.ComponentType, + Name: d.GetComponentName(), + }) if err := serviceMeshInitializer.Prepare(); err != nil { return err diff --git a/components/dashboard/servicemesh_setup.go b/components/dashboard/servicemesh_setup.go index a9d047cafca..ae6c8a4d6e1 100644 --- a/components/dashboard/servicemesh_setup.go +++ b/components/dashboard/servicemesh_setup.go @@ -47,7 +47,7 @@ func (d *Dashboard) configureServiceMesh(cli client.Client, owner metav1.Object, func (d *Dashboard) defineServiceMeshFeatures(dscispec *dsci.DSCInitializationSpec) feature.DefinedFeatures { return func(s *feature.FeaturesInitializer) error { createMeshResources, err := feature.CreateFeature("dashboard-create-service-mesh-routing-resources"). - For(dscispec, s.Origin). + For(dscispec, &s.Origin). Manifests( path.Join(feature.ControlPlaneDir, "components", d.GetComponentName()), ). diff --git a/components/kserve/serverless_setup.go b/components/kserve/serverless_setup.go index 643e5be1441..fcad203f091 100644 --- a/components/kserve/serverless_setup.go +++ b/components/kserve/serverless_setup.go @@ -16,7 +16,7 @@ const ( func (k *Kserve) configureServerlessFeatures(s *feature.FeaturesInitializer) error { servingDeployment, err := feature.CreateFeature("serverless-serving-deployment"). - For(s.DSCInitializationSpec, s.Origin). + For(s.DSCInitializationSpec, &s.Origin). Manifests( path.Join(templatesDir, "serving-install"), ). @@ -37,7 +37,7 @@ func (k *Kserve) configureServerlessFeatures(s *feature.FeaturesInitializer) err s.Features = append(s.Features, servingDeployment) servingIstioGateways, err := feature.CreateFeature("serverless-serving-gateways"). - For(s.DSCInitializationSpec, s.Origin). + For(s.DSCInitializationSpec, &s.Origin). PreConditions( // Check serverless is installed feature.WaitForResourceToBeCreated(knativeServingNamespace, gvr.KnativeServing), diff --git a/config/crd/bases/features.opendatahub.io_featuretrackers.yaml b/config/crd/bases/features.opendatahub.io_featuretrackers.yaml index d66715ffa70..b3ccae9066c 100644 --- a/config/crd/bases/features.opendatahub.io_featuretrackers.yaml +++ b/config/crd/bases/features.opendatahub.io_featuretrackers.yaml @@ -41,6 +41,21 @@ spec: type: object spec: description: FeatureTrackerSpec defines the desired state of FeatureTracker. + properties: + appNamespace: + type: string + origin: + description: Origin describes the type of object that created the + related Feature to this FeatureTracker + properties: + name: + type: string + type: + type: string + required: + - name + - type + type: object type: object status: description: FeatureTrackerStatus defines the observed state of FeatureTracker. diff --git a/config/manager/kustomization.yaml b/config/manager/kustomization.yaml index f956c36fbe6..b793e74f7de 100644 --- a/config/manager/kustomization.yaml +++ b/config/manager/kustomization.yaml @@ -12,4 +12,5 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization images: - name: controller - newName: REPLACE_IMAGE + newName: quay.io/cgarriso/opendatahub-operator + newTag: add-conditions diff --git a/controllers/dscinitialization/servicemesh_setup.go b/controllers/dscinitialization/servicemesh_setup.go index 4eb6c219c9b..38594b38eee 100644 --- a/controllers/dscinitialization/servicemesh_setup.go +++ b/controllers/dscinitialization/servicemesh_setup.go @@ -17,7 +17,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { serviceMeshSpec := f.ServiceMesh smcpCreation, errSmcp := feature.CreateFeature("service-mesh-control-plane-creation"). - For(f.DSCInitializationSpec, f.Origin). + For(f.DSCInitializationSpec, &f.Origin). Manifests( path.Join(feature.ControlPlaneDir, "base", "control-plane.tmpl"), ). @@ -36,7 +36,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { if serviceMeshSpec.ControlPlane.MetricsCollection == "Istio" { metricsCollection, errMetrics := feature.CreateFeature("service-mesh-monitoring"). - For(f.DSCInitializationSpec, f.Origin). + For(f.DSCInitializationSpec, &f.Origin). Manifests( path.Join(feature.MonitoringDir), ). @@ -52,7 +52,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { } if oauth, err := feature.CreateFeature("service-mesh-control-plane-configure-oauth"). - For(f.DSCInitializationSpec, f.Origin). + For(f.DSCInitializationSpec, &f.Origin). Manifests( path.Join(feature.ControlPlaneDir, "base"), path.Join(feature.ControlPlaneDir, "oauth"), @@ -80,7 +80,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { } if cfMaps, err := feature.CreateFeature("shared-config-maps"). - For(f.DSCInitializationSpec, f.Origin). + For(f.DSCInitializationSpec, &f.Origin). WithResources(servicemesh.ConfigMaps). Load(); err != nil { return err @@ -89,7 +89,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { } if serviceMesh, err := feature.CreateFeature("app-add-namespace-to-service-mesh"). - For(f.DSCInitializationSpec, f.Origin). + For(f.DSCInitializationSpec, &f.Origin). Manifests( path.Join(feature.ControlPlaneDir, "smm.tmpl"), path.Join(feature.ControlPlaneDir, "namespace.patch.tmpl"), @@ -102,7 +102,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { } if gatewayRoute, err := feature.CreateFeature("service-mesh-create-gateway-route"). - For(f.DSCInitializationSpec, f.Origin). + For(f.DSCInitializationSpec, &f.Origin). Manifests( path.Join(feature.ControlPlaneDir, "routing"), ). @@ -117,7 +117,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { } if dataScienceProjects, err := feature.CreateFeature("app-migrate-data-science-projects"). - For(f.DSCInitializationSpec, f.Origin). + For(f.DSCInitializationSpec, &f.Origin). WithResources(servicemesh.MigratedDataScienceProjects). Load(); err != nil { return err @@ -126,7 +126,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { } if extAuthz, err := feature.CreateFeature("service-mesh-control-plane-setup-external-authorization"). - For(f.DSCInitializationSpec, f.Origin). + For(f.DSCInitializationSpec, &f.Origin). Manifests( path.Join(feature.AuthDir, "auth-smm.tmpl"), path.Join(feature.AuthDir, "base"), diff --git a/pkg/feature/builder.go b/pkg/feature/builder.go index dcdd1177edf..0d8c89655b7 100644 --- a/pkg/feature/builder.go +++ b/pkg/feature/builder.go @@ -27,13 +27,13 @@ func CreateFeature(name string) *featureBuilder { return &featureBuilder{name: name} } -func (fb *featureBuilder) For(spec *v1.DSCInitializationSpec, origin featurev1.Origin) *featureBuilder { +func (fb *featureBuilder) For(spec *v1.DSCInitializationSpec, origin *featurev1.Origin) *featureBuilder { createSpec := func(f *Feature) error { f.Spec = &Spec{ AppNamespace: spec.ApplicationsNamespace, ServiceMeshSpec: &spec.ServiceMesh, Serving: &infrav1.ServingSpec{}, - Origin: &origin, + Origin: origin, } return nil diff --git a/tests/integration/features/features_int_test.go b/tests/integration/features/features_int_test.go index ad8727f7788..0bf96780a27 100644 --- a/tests/integration/features/features_int_test.go +++ b/tests/integration/features/features_int_test.go @@ -44,9 +44,10 @@ var _ = Describe("preconditions", func() { namespace = envtestutil.AppendRandomNameTo(testFeatureName) dsciSpec := newDSCInitializationSpec(namespace) + origin := newOrigin(featurev1.DSCIType, "default") var err error testFeature, err = feature.CreateFeature(testFeatureName). - For(dsciSpec). + For(dsciSpec, &origin). UsingConfig(envTest.Config). Load() Expect(err).ToNot(HaveOccurred()) @@ -84,10 +85,12 @@ var _ = Describe("preconditions", func() { var ( dsciSpec *dscv1.DSCInitializationSpec verificationFeature *feature.Feature + origin featurev1.Origin ) BeforeEach(func() { dsciSpec = newDSCInitializationSpec("default") + origin = newOrigin(featurev1.DSCIType, "default") }) It("should successfully check for existing CRD", func() { @@ -96,7 +99,7 @@ var _ = Describe("preconditions", func() { var err error verificationFeature, err = feature.CreateFeature("CRD verification"). - For(dsciSpec). + For(dsciSpec, &origin). UsingConfig(envTest.Config). PreConditions(feature.EnsureCRDIsInstalled(name)). Load() @@ -115,7 +118,7 @@ var _ = Describe("preconditions", func() { var err error verificationFeature, err = feature.CreateFeature("CRD verification"). - For(dsciSpec). + For(dsciSpec, &origin). UsingConfig(envTest.Config). PreConditions(feature.EnsureCRDIsInstalled(name)). Load() @@ -137,17 +140,19 @@ var _ = Describe("feature trackers", func() { var ( dsciSpec *dscv1.DSCInitializationSpec + origin featurev1.Origin ) BeforeEach(func() { dsciSpec = newDSCInitializationSpec("default") + origin = newOrigin(featurev1.DSCIType, "default") }) It("should indicate successful installation in FeatureTracker", func() { // given example CRD installed into env name := "test-resources.openshift.io" verificationFeature, err := feature.CreateFeature("crd-verification"). - For(dsciSpec). + For(dsciSpec, &origin). UsingConfig(envTest.Config). PreConditions(feature.EnsureCRDIsInstalled(name)). Load() @@ -165,7 +170,7 @@ var _ = Describe("feature trackers", func() { // given name := "non-existing-resource.non-existing-group.io" verificationFeature, err := feature.CreateFeature("crd-verification"). - For(dsciSpec). + For(dsciSpec, &origin). UsingConfig(envTest.Config). PreConditions(feature.EnsureCRDIsInstalled(name)). Load() @@ -182,7 +187,7 @@ var _ = Describe("feature trackers", func() { It("should indicate failure in post-conditions", func() { // given verificationFeature, err := feature.CreateFeature("post-condition-failure"). - For(dsciSpec). + For(dsciSpec, &origin). UsingConfig(envTest.Config). PostConditions(func(f *feature.Feature) error { return fmt.Errorf("always fail") @@ -215,6 +220,14 @@ func newDSCInitializationSpec(ns string) *dscv1.DSCInitializationSpec { return &spec } +func newOrigin(source, name string) featurev1.Origin { + origin := featurev1.Origin{ + Type: source, + Name: name, + } + return origin +} + func getNamespace(namespace string) (*v1.Namespace, error) { ns := createNamespace(namespace) err := envTestClient.Get(context.Background(), k8stypes.NamespacedName{Name: namespace}, ns) diff --git a/tests/integration/features/serverless_feature_test.go b/tests/integration/features/serverless_feature_test.go index 26d7b4192f1..f2ea974f80f 100644 --- a/tests/integration/features/serverless_feature_test.go +++ b/tests/integration/features/serverless_feature_test.go @@ -2,6 +2,7 @@ package features_test import ( "context" + featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -77,8 +78,9 @@ var _ = Describe("Serverless feature", func() { namespace := envtestutil.AppendRandomNameTo(testFeatureName) dsciSpec := newDSCInitializationSpec(namespace) + origin := newOrigin(featurev1.ComponentType, "kserve") testFeature, err = feature.CreateFeature(testFeatureName). - For(dsciSpec). + For(dsciSpec, &origin). UsingConfig(envTest.Config). Load() diff --git a/tests/integration/features/servicemesh_feature_test.go b/tests/integration/features/servicemesh_feature_test.go index a0f5161e77b..bd077ec65d5 100644 --- a/tests/integration/features/servicemesh_feature_test.go +++ b/tests/integration/features/servicemesh_feature_test.go @@ -2,6 +2,7 @@ package features_test import ( "context" + featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -77,8 +78,9 @@ var _ = Describe("Service Mesh feature", func() { namespace := envtestutil.AppendRandomNameTo(testFeatureName) dsciSpec := newDSCInitializationSpec(namespace) + origin := newOrigin(featurev1.DSCIType, "default") testFeature, err = feature.CreateFeature(testFeatureName). - For(dsciSpec). + For(dsciSpec, &origin). UsingConfig(envTest.Config). Load() diff --git a/tests/integration/servicemesh/service_mesh_setup_features_int_test.go b/tests/integration/servicemesh/service_mesh_setup_features_int_test.go index 40c23507cab..585df943b82 100644 --- a/tests/integration/servicemesh/service_mesh_setup_features_int_test.go +++ b/tests/integration/servicemesh/service_mesh_setup_features_int_test.go @@ -3,6 +3,7 @@ package servicemesh_test import ( "context" "embed" + featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" "io" "os" "path" @@ -55,9 +56,10 @@ var _ = Describe("preconditions", func() { namespace = envtestutil.AppendRandomNameTo(testFeatureName) dsciSpec := newDSCInitializationSpec(namespace) + origin := newOrigin(featurev1.DSCIType, "default") var err error testFeature, err = feature.CreateFeature(testFeatureName). - For(dsciSpec). + For(dsciSpec, &origin). UsingConfig(envTest.Config). Load() Expect(err).ToNot(HaveOccurred()) @@ -95,10 +97,12 @@ var _ = Describe("preconditions", func() { var ( dsciSpec *dscv1.DSCInitializationSpec verificationFeature *feature.Feature + origin featurev1.Origin ) BeforeEach(func() { dsciSpec = newDSCInitializationSpec("default") + origin = newOrigin(featurev1.DSCIType, "default") }) It("should successfully check for existing CRD", func() { @@ -107,7 +111,7 @@ var _ = Describe("preconditions", func() { var err error verificationFeature, err = feature.CreateFeature("CRD verification"). - For(dsciSpec). + For(dsciSpec, &origin). UsingConfig(envTest.Config). PreConditions(feature.EnsureCRDIsInstalled(name)). Load() @@ -126,7 +130,7 @@ var _ = Describe("preconditions", func() { var err error verificationFeature, err = feature.CreateFeature("CRD verification"). - For(dsciSpec). + For(dsciSpec, &origin). UsingConfig(envTest.Config). PreConditions(feature.EnsureCRDIsInstalled(name)). Load() @@ -150,6 +154,7 @@ var _ = Describe("Ensuring service mesh is set up correctly", func() { dsciSpec *dscv1.DSCInitializationSpec serviceMeshSpec *infrav1.ServiceMeshSpec serviceMeshCheck *feature.Feature + origin featurev1.Origin name = "test-name" namespace = "test-namespace" ) @@ -161,9 +166,9 @@ var _ = Describe("Ensuring service mesh is set up correctly", func() { serviceMeshSpec.ControlPlane.Name = name serviceMeshSpec.ControlPlane.Namespace = namespace - + origin = newOrigin(featurev1.DSCIType, "default") serviceMeshCheck, err = feature.CreateFeature("datascience-project-migration"). - For(dsciSpec). + For(dsciSpec, &origin). UsingConfig(envTest.Config). PreConditions(servicemesh.EnsureServiceMeshInstalled).Load() @@ -198,16 +203,18 @@ var _ = Describe("Data Science Project Migration", func() { objectCleaner *envtestutil.Cleaner dsciSpec *dscv1.DSCInitializationSpec migrationFeature *feature.Feature + origin featurev1.Origin ) BeforeEach(func() { objectCleaner = envtestutil.CreateCleaner(envTestClient, envTest.Config, timeout, interval) dsciSpec = newDSCInitializationSpec("default") + origin = newOrigin(featurev1.DSCIType, "default") var err error migrationFeature, err = feature.CreateFeature("datascience-project-migration"). - For(dsciSpec). + For(dsciSpec, &origin). UsingConfig(envTest.Config). WithResources(servicemesh.MigratedDataScienceProjects).Load() @@ -282,6 +289,7 @@ var _ = Describe("Cleanup operations", func() { objectCleaner *envtestutil.Cleaner dsciSpec *dscv1.DSCInitializationSpec serviceMeshSpec *infrav1.ServiceMeshSpec + origin featurev1.Origin namespace = "test" name = "minimal" ) @@ -290,6 +298,7 @@ var _ = Describe("Cleanup operations", func() { objectCleaner = envtestutil.CreateCleaner(envTestClient, envTest.Config, timeout, interval) dsciSpec = newDSCInitializationSpec(namespace) + origin = newOrigin(featurev1.DSCIType, "default") serviceMeshSpec = &dsciSpec.ServiceMesh @@ -306,7 +315,7 @@ var _ = Describe("Cleanup operations", func() { createServiceMeshControlPlane(name, namespace) controlPlaneWithSecretVolumes, err := feature.CreateFeature("control-plane-with-secret-volumes"). - For(dsciSpec). + For(dsciSpec, &origin). Manifests(path.Join(feature.ControlPlaneDir, "base/control-plane-ingress.patch.tmpl")). UsingConfig(envTest.Config). Load() @@ -340,7 +349,7 @@ var _ = Describe("Cleanup operations", func() { createServiceMeshControlPlane(name, namespace) controlPlaneWithExtAuthzProvider, err := feature.CreateFeature("control-plane-with-external-authz-provider"). - For(dsciSpec). + For(dsciSpec, &origin). Manifests(path.Join(feature.AuthDir, "mesh-authz-ext-provider.patch.tmpl")). UsingConfig(envTest.Config). Load() @@ -388,6 +397,7 @@ var _ = Describe("Alternate Manifest source", func() { objectCleaner *envtestutil.Cleaner dsciSpec *dscv1.DSCInitializationSpec serviceMeshSpec *infrav1.ServiceMeshSpec + origin featurev1.Origin namespace = "test" name = "minimal" ) @@ -396,6 +406,7 @@ var _ = Describe("Alternate Manifest source", func() { objectCleaner = envtestutil.CreateCleaner(envTestClient, envTest.Config, timeout, interval) dsciSpec = newDSCInitializationSpec(namespace) + origin = newOrigin(featurev1.DSCIType, "default") serviceMeshSpec = &dsciSpec.ServiceMesh @@ -415,7 +426,7 @@ var _ = Describe("Alternate Manifest source", func() { createServiceMeshControlPlane(name, namespace) controlPlaneWithExtAuthzProvider, err := feature.CreateFeature("external-manifests-control-plane-with-external-authz-provider"). - For(dsciSpec). + For(dsciSpec, &origin). ManifestSource(testEmbeddedFiles). Manifests(path.Join("test-templates", "authorino", "mesh-authz-ext-provider.patch.tmpl")). UsingConfig(envTest.Config). @@ -457,7 +468,7 @@ var _ = Describe("Alternate Manifest source", func() { createServiceMeshControlPlane(name, namespace) controlPlaneWithExtAuthzProvider, err := feature.CreateFeature("external-manifests-control-plane-with-external-authz-provider"). - For(dsciSpec). + For(dsciSpec, &origin). ManifestSource(os.DirFS(tempDir)). Manifests(patchTemplate). // must be relative to root DirFS defined above UsingConfig(envTest.Config). @@ -535,6 +546,14 @@ func newDSCInitializationSpec(ns string) *dscv1.DSCInitializationSpec { return &spec } +func newOrigin(source, name string) featurev1.Origin { + origin := featurev1.Origin{ + Type: source, + Name: name, + } + return origin +} + // createSMCPInCluster uses dynamic client to create a dummy SMCP resource for testing func createSMCPInCluster(cfg *rest.Config, smcpObj *unstructured.Unstructured, namespace string) error { dynamicClient, err := dynamic.NewForConfig(cfg) From a75c1274c3bb7efbaf9ae8edbf93a8ad07a13451 Mon Sep 17 00:00:00 2001 From: Cameron Garrison Date: Tue, 9 Jan 2024 13:29:58 -0500 Subject: [PATCH 03/15] add omitempty to origin struct --- apis/features/v1/features_types.go | 4 ++-- config/crd/bases/features.opendatahub.io_featuretrackers.yaml | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/apis/features/v1/features_types.go b/apis/features/v1/features_types.go index 51bf332c3fe..a0e8ac50649 100644 --- a/apis/features/v1/features_types.go +++ b/apis/features/v1/features_types.go @@ -44,8 +44,8 @@ func (s *FeatureTracker) ToOwnerReference() metav1.OwnerReference { // Origin describes the type of object that created the related Feature to this FeatureTracker type Origin struct { - Type string `json:"type"` - Name string `json:"name"` + Type string `json:"type,omitempty"` + Name string `json:"name,omitempty"` } // FeatureTrackerSpec defines the desired state of FeatureTracker. diff --git a/config/crd/bases/features.opendatahub.io_featuretrackers.yaml b/config/crd/bases/features.opendatahub.io_featuretrackers.yaml index b3ccae9066c..378b0bd23f8 100644 --- a/config/crd/bases/features.opendatahub.io_featuretrackers.yaml +++ b/config/crd/bases/features.opendatahub.io_featuretrackers.yaml @@ -52,9 +52,6 @@ spec: type: string type: type: string - required: - - name - - type type: object type: object status: From aa7dd82cfcd9b1cba8a3fa82639cf4cb63026f00 Mon Sep 17 00:00:00 2001 From: Cameron Garrison Date: Tue, 9 Jan 2024 13:34:41 -0500 Subject: [PATCH 04/15] undo accidental tag change --- config/manager/kustomization.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config/manager/kustomization.yaml b/config/manager/kustomization.yaml index b793e74f7de..a52e041dab8 100644 --- a/config/manager/kustomization.yaml +++ b/config/manager/kustomization.yaml @@ -12,5 +12,4 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization images: - name: controller - newName: quay.io/cgarriso/opendatahub-operator - newTag: add-conditions + newName: REPLACE_IMAGE \ No newline at end of file From b9e0f99b2fc3923f00f3a074a605dc50a8eab021 Mon Sep 17 00:00:00 2001 From: Cameron Garrison Date: Tue, 9 Jan 2024 13:36:51 -0500 Subject: [PATCH 05/15] re add empty line --- config/manager/kustomization.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/manager/kustomization.yaml b/config/manager/kustomization.yaml index a52e041dab8..f956c36fbe6 100644 --- a/config/manager/kustomization.yaml +++ b/config/manager/kustomization.yaml @@ -12,4 +12,4 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization images: - name: controller - newName: REPLACE_IMAGE \ No newline at end of file + newName: REPLACE_IMAGE From 4ae4406adc7bae7789605a44b3153d84a1c4a50e Mon Sep 17 00:00:00 2001 From: Cameron Garrison Date: Tue, 9 Jan 2024 14:24:42 -0500 Subject: [PATCH 06/15] move pointer operator --- components/dashboard/servicemesh_setup.go | 2 +- components/kserve/serverless_setup.go | 4 ++-- .../dscinitialization/servicemesh_setup.go | 16 ++++++++-------- pkg/feature/builder.go | 4 ++-- .../integration/features/features_int_test.go | 12 ++++++------ .../features/serverless_feature_test.go | 2 +- .../features/servicemesh_feature_test.go | 2 +- .../service_mesh_setup_features_int_test.go | 18 +++++++++--------- 8 files changed, 30 insertions(+), 30 deletions(-) diff --git a/components/dashboard/servicemesh_setup.go b/components/dashboard/servicemesh_setup.go index ae6c8a4d6e1..a9d047cafca 100644 --- a/components/dashboard/servicemesh_setup.go +++ b/components/dashboard/servicemesh_setup.go @@ -47,7 +47,7 @@ func (d *Dashboard) configureServiceMesh(cli client.Client, owner metav1.Object, func (d *Dashboard) defineServiceMeshFeatures(dscispec *dsci.DSCInitializationSpec) feature.DefinedFeatures { return func(s *feature.FeaturesInitializer) error { createMeshResources, err := feature.CreateFeature("dashboard-create-service-mesh-routing-resources"). - For(dscispec, &s.Origin). + For(dscispec, s.Origin). Manifests( path.Join(feature.ControlPlaneDir, "components", d.GetComponentName()), ). diff --git a/components/kserve/serverless_setup.go b/components/kserve/serverless_setup.go index fcad203f091..643e5be1441 100644 --- a/components/kserve/serverless_setup.go +++ b/components/kserve/serverless_setup.go @@ -16,7 +16,7 @@ const ( func (k *Kserve) configureServerlessFeatures(s *feature.FeaturesInitializer) error { servingDeployment, err := feature.CreateFeature("serverless-serving-deployment"). - For(s.DSCInitializationSpec, &s.Origin). + For(s.DSCInitializationSpec, s.Origin). Manifests( path.Join(templatesDir, "serving-install"), ). @@ -37,7 +37,7 @@ func (k *Kserve) configureServerlessFeatures(s *feature.FeaturesInitializer) err s.Features = append(s.Features, servingDeployment) servingIstioGateways, err := feature.CreateFeature("serverless-serving-gateways"). - For(s.DSCInitializationSpec, &s.Origin). + For(s.DSCInitializationSpec, s.Origin). PreConditions( // Check serverless is installed feature.WaitForResourceToBeCreated(knativeServingNamespace, gvr.KnativeServing), diff --git a/controllers/dscinitialization/servicemesh_setup.go b/controllers/dscinitialization/servicemesh_setup.go index 38594b38eee..4eb6c219c9b 100644 --- a/controllers/dscinitialization/servicemesh_setup.go +++ b/controllers/dscinitialization/servicemesh_setup.go @@ -17,7 +17,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { serviceMeshSpec := f.ServiceMesh smcpCreation, errSmcp := feature.CreateFeature("service-mesh-control-plane-creation"). - For(f.DSCInitializationSpec, &f.Origin). + For(f.DSCInitializationSpec, f.Origin). Manifests( path.Join(feature.ControlPlaneDir, "base", "control-plane.tmpl"), ). @@ -36,7 +36,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { if serviceMeshSpec.ControlPlane.MetricsCollection == "Istio" { metricsCollection, errMetrics := feature.CreateFeature("service-mesh-monitoring"). - For(f.DSCInitializationSpec, &f.Origin). + For(f.DSCInitializationSpec, f.Origin). Manifests( path.Join(feature.MonitoringDir), ). @@ -52,7 +52,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { } if oauth, err := feature.CreateFeature("service-mesh-control-plane-configure-oauth"). - For(f.DSCInitializationSpec, &f.Origin). + For(f.DSCInitializationSpec, f.Origin). Manifests( path.Join(feature.ControlPlaneDir, "base"), path.Join(feature.ControlPlaneDir, "oauth"), @@ -80,7 +80,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { } if cfMaps, err := feature.CreateFeature("shared-config-maps"). - For(f.DSCInitializationSpec, &f.Origin). + For(f.DSCInitializationSpec, f.Origin). WithResources(servicemesh.ConfigMaps). Load(); err != nil { return err @@ -89,7 +89,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { } if serviceMesh, err := feature.CreateFeature("app-add-namespace-to-service-mesh"). - For(f.DSCInitializationSpec, &f.Origin). + For(f.DSCInitializationSpec, f.Origin). Manifests( path.Join(feature.ControlPlaneDir, "smm.tmpl"), path.Join(feature.ControlPlaneDir, "namespace.patch.tmpl"), @@ -102,7 +102,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { } if gatewayRoute, err := feature.CreateFeature("service-mesh-create-gateway-route"). - For(f.DSCInitializationSpec, &f.Origin). + For(f.DSCInitializationSpec, f.Origin). Manifests( path.Join(feature.ControlPlaneDir, "routing"), ). @@ -117,7 +117,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { } if dataScienceProjects, err := feature.CreateFeature("app-migrate-data-science-projects"). - For(f.DSCInitializationSpec, &f.Origin). + For(f.DSCInitializationSpec, f.Origin). WithResources(servicemesh.MigratedDataScienceProjects). Load(); err != nil { return err @@ -126,7 +126,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { } if extAuthz, err := feature.CreateFeature("service-mesh-control-plane-setup-external-authorization"). - For(f.DSCInitializationSpec, &f.Origin). + For(f.DSCInitializationSpec, f.Origin). Manifests( path.Join(feature.AuthDir, "auth-smm.tmpl"), path.Join(feature.AuthDir, "base"), diff --git a/pkg/feature/builder.go b/pkg/feature/builder.go index 0d8c89655b7..dcdd1177edf 100644 --- a/pkg/feature/builder.go +++ b/pkg/feature/builder.go @@ -27,13 +27,13 @@ func CreateFeature(name string) *featureBuilder { return &featureBuilder{name: name} } -func (fb *featureBuilder) For(spec *v1.DSCInitializationSpec, origin *featurev1.Origin) *featureBuilder { +func (fb *featureBuilder) For(spec *v1.DSCInitializationSpec, origin featurev1.Origin) *featureBuilder { createSpec := func(f *Feature) error { f.Spec = &Spec{ AppNamespace: spec.ApplicationsNamespace, ServiceMeshSpec: &spec.ServiceMesh, Serving: &infrav1.ServingSpec{}, - Origin: origin, + Origin: &origin, } return nil diff --git a/tests/integration/features/features_int_test.go b/tests/integration/features/features_int_test.go index 0bf96780a27..4277ad96580 100644 --- a/tests/integration/features/features_int_test.go +++ b/tests/integration/features/features_int_test.go @@ -47,7 +47,7 @@ var _ = Describe("preconditions", func() { origin := newOrigin(featurev1.DSCIType, "default") var err error testFeature, err = feature.CreateFeature(testFeatureName). - For(dsciSpec, &origin). + For(dsciSpec, origin). UsingConfig(envTest.Config). Load() Expect(err).ToNot(HaveOccurred()) @@ -99,7 +99,7 @@ var _ = Describe("preconditions", func() { var err error verificationFeature, err = feature.CreateFeature("CRD verification"). - For(dsciSpec, &origin). + For(dsciSpec, origin). UsingConfig(envTest.Config). PreConditions(feature.EnsureCRDIsInstalled(name)). Load() @@ -118,7 +118,7 @@ var _ = Describe("preconditions", func() { var err error verificationFeature, err = feature.CreateFeature("CRD verification"). - For(dsciSpec, &origin). + For(dsciSpec, origin). UsingConfig(envTest.Config). PreConditions(feature.EnsureCRDIsInstalled(name)). Load() @@ -152,7 +152,7 @@ var _ = Describe("feature trackers", func() { // given example CRD installed into env name := "test-resources.openshift.io" verificationFeature, err := feature.CreateFeature("crd-verification"). - For(dsciSpec, &origin). + For(dsciSpec, origin). UsingConfig(envTest.Config). PreConditions(feature.EnsureCRDIsInstalled(name)). Load() @@ -170,7 +170,7 @@ var _ = Describe("feature trackers", func() { // given name := "non-existing-resource.non-existing-group.io" verificationFeature, err := feature.CreateFeature("crd-verification"). - For(dsciSpec, &origin). + For(dsciSpec, origin). UsingConfig(envTest.Config). PreConditions(feature.EnsureCRDIsInstalled(name)). Load() @@ -187,7 +187,7 @@ var _ = Describe("feature trackers", func() { It("should indicate failure in post-conditions", func() { // given verificationFeature, err := feature.CreateFeature("post-condition-failure"). - For(dsciSpec, &origin). + For(dsciSpec, origin). UsingConfig(envTest.Config). PostConditions(func(f *feature.Feature) error { return fmt.Errorf("always fail") diff --git a/tests/integration/features/serverless_feature_test.go b/tests/integration/features/serverless_feature_test.go index f2ea974f80f..bfe610a89a1 100644 --- a/tests/integration/features/serverless_feature_test.go +++ b/tests/integration/features/serverless_feature_test.go @@ -80,7 +80,7 @@ var _ = Describe("Serverless feature", func() { dsciSpec := newDSCInitializationSpec(namespace) origin := newOrigin(featurev1.ComponentType, "kserve") testFeature, err = feature.CreateFeature(testFeatureName). - For(dsciSpec, &origin). + For(dsciSpec, origin). UsingConfig(envTest.Config). Load() diff --git a/tests/integration/features/servicemesh_feature_test.go b/tests/integration/features/servicemesh_feature_test.go index bd077ec65d5..02d2575b623 100644 --- a/tests/integration/features/servicemesh_feature_test.go +++ b/tests/integration/features/servicemesh_feature_test.go @@ -80,7 +80,7 @@ var _ = Describe("Service Mesh feature", func() { dsciSpec := newDSCInitializationSpec(namespace) origin := newOrigin(featurev1.DSCIType, "default") testFeature, err = feature.CreateFeature(testFeatureName). - For(dsciSpec, &origin). + For(dsciSpec, origin). UsingConfig(envTest.Config). Load() diff --git a/tests/integration/servicemesh/service_mesh_setup_features_int_test.go b/tests/integration/servicemesh/service_mesh_setup_features_int_test.go index 585df943b82..38582d368b7 100644 --- a/tests/integration/servicemesh/service_mesh_setup_features_int_test.go +++ b/tests/integration/servicemesh/service_mesh_setup_features_int_test.go @@ -59,7 +59,7 @@ var _ = Describe("preconditions", func() { origin := newOrigin(featurev1.DSCIType, "default") var err error testFeature, err = feature.CreateFeature(testFeatureName). - For(dsciSpec, &origin). + For(dsciSpec, origin). UsingConfig(envTest.Config). Load() Expect(err).ToNot(HaveOccurred()) @@ -111,7 +111,7 @@ var _ = Describe("preconditions", func() { var err error verificationFeature, err = feature.CreateFeature("CRD verification"). - For(dsciSpec, &origin). + For(dsciSpec, origin). UsingConfig(envTest.Config). PreConditions(feature.EnsureCRDIsInstalled(name)). Load() @@ -130,7 +130,7 @@ var _ = Describe("preconditions", func() { var err error verificationFeature, err = feature.CreateFeature("CRD verification"). - For(dsciSpec, &origin). + For(dsciSpec, origin). UsingConfig(envTest.Config). PreConditions(feature.EnsureCRDIsInstalled(name)). Load() @@ -168,7 +168,7 @@ var _ = Describe("Ensuring service mesh is set up correctly", func() { serviceMeshSpec.ControlPlane.Namespace = namespace origin = newOrigin(featurev1.DSCIType, "default") serviceMeshCheck, err = feature.CreateFeature("datascience-project-migration"). - For(dsciSpec, &origin). + For(dsciSpec, origin). UsingConfig(envTest.Config). PreConditions(servicemesh.EnsureServiceMeshInstalled).Load() @@ -214,7 +214,7 @@ var _ = Describe("Data Science Project Migration", func() { var err error migrationFeature, err = feature.CreateFeature("datascience-project-migration"). - For(dsciSpec, &origin). + For(dsciSpec, origin). UsingConfig(envTest.Config). WithResources(servicemesh.MigratedDataScienceProjects).Load() @@ -315,7 +315,7 @@ var _ = Describe("Cleanup operations", func() { createServiceMeshControlPlane(name, namespace) controlPlaneWithSecretVolumes, err := feature.CreateFeature("control-plane-with-secret-volumes"). - For(dsciSpec, &origin). + For(dsciSpec, origin). Manifests(path.Join(feature.ControlPlaneDir, "base/control-plane-ingress.patch.tmpl")). UsingConfig(envTest.Config). Load() @@ -349,7 +349,7 @@ var _ = Describe("Cleanup operations", func() { createServiceMeshControlPlane(name, namespace) controlPlaneWithExtAuthzProvider, err := feature.CreateFeature("control-plane-with-external-authz-provider"). - For(dsciSpec, &origin). + For(dsciSpec, origin). Manifests(path.Join(feature.AuthDir, "mesh-authz-ext-provider.patch.tmpl")). UsingConfig(envTest.Config). Load() @@ -426,7 +426,7 @@ var _ = Describe("Alternate Manifest source", func() { createServiceMeshControlPlane(name, namespace) controlPlaneWithExtAuthzProvider, err := feature.CreateFeature("external-manifests-control-plane-with-external-authz-provider"). - For(dsciSpec, &origin). + For(dsciSpec, origin). ManifestSource(testEmbeddedFiles). Manifests(path.Join("test-templates", "authorino", "mesh-authz-ext-provider.patch.tmpl")). UsingConfig(envTest.Config). @@ -468,7 +468,7 @@ var _ = Describe("Alternate Manifest source", func() { createServiceMeshControlPlane(name, namespace) controlPlaneWithExtAuthzProvider, err := feature.CreateFeature("external-manifests-control-plane-with-external-authz-provider"). - For(dsciSpec, &origin). + For(dsciSpec, origin). ManifestSource(os.DirFS(tempDir)). Manifests(patchTemplate). // must be relative to root DirFS defined above UsingConfig(envTest.Config). From 622d5560f3f43c63a694ce38ec1e8e65840d2b88 Mon Sep 17 00:00:00 2001 From: Cameron Garrison Date: Tue, 9 Jan 2024 15:45:54 -0500 Subject: [PATCH 07/15] add testing --- .../integration/features/features_int_test.go | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/tests/integration/features/features_int_test.go b/tests/integration/features/features_int_test.go index 4277ad96580..29bfcb59b93 100644 --- a/tests/integration/features/features_int_test.go +++ b/tests/integration/features/features_int_test.go @@ -202,6 +202,37 @@ var _ = Describe("feature trackers", func() { featureTracker := getFeatureTracker("default-post-condition-failure") Expect(featureTracker.Status.Conditions).To(HaveCondition(conditionsv1.ConditionDegraded, v1.ConditionTrue, featurev1.ConditionPhasePostConditions)) }) + + It("should correctly indicate origin in the feature tracker", func() { + verificationFeature, err := feature.CreateFeature("empty-feature"). + For(dsciSpec, origin). + UsingConfig(envTest.Config). + Load() + Expect(err).ToNot(HaveOccurred()) + + // when + Expect(verificationFeature.Apply()).To(Succeed()) + + // then + featureTracker := getFeatureTracker("default-empty-feature") + Expect(featureTracker.Spec.Origin.Name).To(Equal("default")) + Expect(featureTracker.Spec.Origin.Type).To(Equal(featurev1.DSCIType)) + }) + + It("should correctly indicate app namespace in the feature tracker", func() { + verificationFeature, err := feature.CreateFeature("empty-feature"). + For(dsciSpec, origin). + UsingConfig(envTest.Config). + Load() + Expect(err).ToNot(HaveOccurred()) + + // when + Expect(verificationFeature.Apply()).To(Succeed()) + + // then + featureTracker := getFeatureTracker("default-empty-feature") + Expect(featureTracker.Spec.AppNamespace).To(Equal("default")) + }) }) }) From c2f7b71f051a9660c1e4aeb5aee8d73266e0dad3 Mon Sep 17 00:00:00 2001 From: Cameron Garrison Date: Tue, 9 Jan 2024 15:47:32 -0500 Subject: [PATCH 08/15] lint --- components/dashboard/dashboard.go | 2 +- components/dashboard/servicemesh_setup.go | 2 +- components/kserve/kserve.go | 2 +- controllers/dscinitialization/servicemesh_setup.go | 2 +- pkg/feature/builder.go | 2 +- pkg/feature/initializer.go | 2 +- tests/integration/features/features_int_test.go | 10 +++++----- tests/integration/features/serverless_feature_test.go | 2 +- tests/integration/features/servicemesh_feature_test.go | 2 +- .../service_mesh_setup_features_int_test.go | 2 +- 10 files changed, 14 insertions(+), 14 deletions(-) diff --git a/components/dashboard/dashboard.go b/components/dashboard/dashboard.go index 0be8fe1eff9..5808e0adede 100644 --- a/components/dashboard/dashboard.go +++ b/components/dashboard/dashboard.go @@ -5,7 +5,6 @@ package dashboard import ( "context" "fmt" - featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" "path/filepath" "strings" @@ -18,6 +17,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" dsciv1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/dscinitialization/v1" + featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" "github.com/opendatahub-io/opendatahub-operator/v2/components" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/cluster" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/common" diff --git a/components/dashboard/servicemesh_setup.go b/components/dashboard/servicemesh_setup.go index a9d047cafca..9d525ab4a65 100644 --- a/components/dashboard/servicemesh_setup.go +++ b/components/dashboard/servicemesh_setup.go @@ -1,7 +1,6 @@ package dashboard import ( - featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" "path" operatorv1 "github.com/openshift/api/operator/v1" @@ -9,6 +8,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" dsci "github.com/opendatahub-io/opendatahub-operator/v2/apis/dscinitialization/v1" + featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/deploy" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature/servicemesh" diff --git a/components/kserve/kserve.go b/components/kserve/kserve.go index 83718d9d9ac..e9ce9be3912 100644 --- a/components/kserve/kserve.go +++ b/components/kserve/kserve.go @@ -4,7 +4,6 @@ package kserve import ( "context" "fmt" - featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" "path/filepath" "strings" @@ -15,6 +14,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" dsciv1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/dscinitialization/v1" + featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" "github.com/opendatahub-io/opendatahub-operator/v2/components" infrav1 "github.com/opendatahub-io/opendatahub-operator/v2/infrastructure/v1" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/cluster" diff --git a/controllers/dscinitialization/servicemesh_setup.go b/controllers/dscinitialization/servicemesh_setup.go index 4eb6c219c9b..adadcd4f1c2 100644 --- a/controllers/dscinitialization/servicemesh_setup.go +++ b/controllers/dscinitialization/servicemesh_setup.go @@ -1,13 +1,13 @@ package dscinitialization import ( - featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" "path" operatorv1 "github.com/openshift/api/operator/v1" corev1 "k8s.io/api/core/v1" dsciv1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/dscinitialization/v1" + featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/deploy" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature/servicemesh" diff --git a/pkg/feature/builder.go b/pkg/feature/builder.go index dcdd1177edf..c7f0c547319 100644 --- a/pkg/feature/builder.go +++ b/pkg/feature/builder.go @@ -1,7 +1,6 @@ package feature import ( - featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" "io/fs" "github.com/pkg/errors" @@ -13,6 +12,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client/config" v1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/dscinitialization/v1" + featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" infrav1 "github.com/opendatahub-io/opendatahub-operator/v2/infrastructure/v1" ) diff --git a/pkg/feature/initializer.go b/pkg/feature/initializer.go index 5654a164bfe..7a7a564549a 100644 --- a/pkg/feature/initializer.go +++ b/pkg/feature/initializer.go @@ -2,9 +2,9 @@ package feature import ( "github.com/hashicorp/go-multierror" - featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" v1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/dscinitialization/v1" + featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" ) type FeaturesInitializer struct { diff --git a/tests/integration/features/features_int_test.go b/tests/integration/features/features_int_test.go index 29bfcb59b93..b35b3becac0 100644 --- a/tests/integration/features/features_int_test.go +++ b/tests/integration/features/features_int_test.go @@ -44,7 +44,7 @@ var _ = Describe("preconditions", func() { namespace = envtestutil.AppendRandomNameTo(testFeatureName) dsciSpec := newDSCInitializationSpec(namespace) - origin := newOrigin(featurev1.DSCIType, "default") + origin := newOrigin("default") var err error testFeature, err = feature.CreateFeature(testFeatureName). For(dsciSpec, origin). @@ -90,7 +90,7 @@ var _ = Describe("preconditions", func() { BeforeEach(func() { dsciSpec = newDSCInitializationSpec("default") - origin = newOrigin(featurev1.DSCIType, "default") + origin = newOrigin("default") }) It("should successfully check for existing CRD", func() { @@ -145,7 +145,7 @@ var _ = Describe("feature trackers", func() { BeforeEach(func() { dsciSpec = newDSCInitializationSpec("default") - origin = newOrigin(featurev1.DSCIType, "default") + origin = newOrigin("default") }) It("should indicate successful installation in FeatureTracker", func() { @@ -251,9 +251,9 @@ func newDSCInitializationSpec(ns string) *dscv1.DSCInitializationSpec { return &spec } -func newOrigin(source, name string) featurev1.Origin { +func newOrigin(name string) featurev1.Origin { origin := featurev1.Origin{ - Type: source, + Type: featurev1.DSCIType, Name: name, } return origin diff --git a/tests/integration/features/serverless_feature_test.go b/tests/integration/features/serverless_feature_test.go index bfe610a89a1..1d9535cf2d5 100644 --- a/tests/integration/features/serverless_feature_test.go +++ b/tests/integration/features/serverless_feature_test.go @@ -2,7 +2,6 @@ package features_test import ( "context" - featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -11,6 +10,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/envtest" + featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" infrav1 "github.com/opendatahub-io/opendatahub-operator/v2/infrastructure/v1" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature/serverless" diff --git a/tests/integration/features/servicemesh_feature_test.go b/tests/integration/features/servicemesh_feature_test.go index 02d2575b623..d3f3aaf70bc 100644 --- a/tests/integration/features/servicemesh_feature_test.go +++ b/tests/integration/features/servicemesh_feature_test.go @@ -2,7 +2,6 @@ package features_test import ( "context" - featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -13,6 +12,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/envtest" + featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature/servicemesh" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/gvr" diff --git a/tests/integration/servicemesh/service_mesh_setup_features_int_test.go b/tests/integration/servicemesh/service_mesh_setup_features_int_test.go index 38582d368b7..53d53e763db 100644 --- a/tests/integration/servicemesh/service_mesh_setup_features_int_test.go +++ b/tests/integration/servicemesh/service_mesh_setup_features_int_test.go @@ -3,7 +3,6 @@ package servicemesh_test import ( "context" "embed" - featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" "io" "os" "path" @@ -19,6 +18,7 @@ import ( "k8s.io/client-go/rest" dscv1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/dscinitialization/v1" + featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" infrav1 "github.com/opendatahub-io/opendatahub-operator/v2/infrastructure/v1" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature/servicemesh" From 1e87b53b79615693bfb88469c009d5e4a3437e01 Mon Sep 17 00:00:00 2001 From: Cameron Garrison Date: Wed, 10 Jan 2024 09:22:26 -0500 Subject: [PATCH 09/15] re-lint changes --- .../features/serverless_feature_test.go | 3 +-- .../features/servicemesh_feature_test.go | 3 +-- .../service_mesh_setup_features_int_test.go | 18 +++++++++--------- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/tests/integration/features/serverless_feature_test.go b/tests/integration/features/serverless_feature_test.go index 1d9535cf2d5..861eef680d1 100644 --- a/tests/integration/features/serverless_feature_test.go +++ b/tests/integration/features/serverless_feature_test.go @@ -10,7 +10,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/envtest" - featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" infrav1 "github.com/opendatahub-io/opendatahub-operator/v2/infrastructure/v1" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature/serverless" @@ -78,7 +77,7 @@ var _ = Describe("Serverless feature", func() { namespace := envtestutil.AppendRandomNameTo(testFeatureName) dsciSpec := newDSCInitializationSpec(namespace) - origin := newOrigin(featurev1.ComponentType, "kserve") + origin := newOrigin("kserve") testFeature, err = feature.CreateFeature(testFeatureName). For(dsciSpec, origin). UsingConfig(envTest.Config). diff --git a/tests/integration/features/servicemesh_feature_test.go b/tests/integration/features/servicemesh_feature_test.go index d3f3aaf70bc..19b0edf8cc1 100644 --- a/tests/integration/features/servicemesh_feature_test.go +++ b/tests/integration/features/servicemesh_feature_test.go @@ -12,7 +12,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/envtest" - featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature/servicemesh" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/gvr" @@ -78,7 +77,7 @@ var _ = Describe("Service Mesh feature", func() { namespace := envtestutil.AppendRandomNameTo(testFeatureName) dsciSpec := newDSCInitializationSpec(namespace) - origin := newOrigin(featurev1.DSCIType, "default") + origin := newOrigin("default") testFeature, err = feature.CreateFeature(testFeatureName). For(dsciSpec, origin). UsingConfig(envTest.Config). diff --git a/tests/integration/servicemesh/service_mesh_setup_features_int_test.go b/tests/integration/servicemesh/service_mesh_setup_features_int_test.go index 53d53e763db..7dd1aa5c691 100644 --- a/tests/integration/servicemesh/service_mesh_setup_features_int_test.go +++ b/tests/integration/servicemesh/service_mesh_setup_features_int_test.go @@ -56,7 +56,7 @@ var _ = Describe("preconditions", func() { namespace = envtestutil.AppendRandomNameTo(testFeatureName) dsciSpec := newDSCInitializationSpec(namespace) - origin := newOrigin(featurev1.DSCIType, "default") + origin := newDefaultOrigin() var err error testFeature, err = feature.CreateFeature(testFeatureName). For(dsciSpec, origin). @@ -102,7 +102,7 @@ var _ = Describe("preconditions", func() { BeforeEach(func() { dsciSpec = newDSCInitializationSpec("default") - origin = newOrigin(featurev1.DSCIType, "default") + origin = newDefaultOrigin() }) It("should successfully check for existing CRD", func() { @@ -166,7 +166,7 @@ var _ = Describe("Ensuring service mesh is set up correctly", func() { serviceMeshSpec.ControlPlane.Name = name serviceMeshSpec.ControlPlane.Namespace = namespace - origin = newOrigin(featurev1.DSCIType, "default") + origin = newDefaultOrigin() serviceMeshCheck, err = feature.CreateFeature("datascience-project-migration"). For(dsciSpec, origin). UsingConfig(envTest.Config). @@ -210,7 +210,7 @@ var _ = Describe("Data Science Project Migration", func() { objectCleaner = envtestutil.CreateCleaner(envTestClient, envTest.Config, timeout, interval) dsciSpec = newDSCInitializationSpec("default") - origin = newOrigin(featurev1.DSCIType, "default") + origin = newDefaultOrigin() var err error migrationFeature, err = feature.CreateFeature("datascience-project-migration"). @@ -298,7 +298,7 @@ var _ = Describe("Cleanup operations", func() { objectCleaner = envtestutil.CreateCleaner(envTestClient, envTest.Config, timeout, interval) dsciSpec = newDSCInitializationSpec(namespace) - origin = newOrigin(featurev1.DSCIType, "default") + origin = newDefaultOrigin() serviceMeshSpec = &dsciSpec.ServiceMesh @@ -406,7 +406,7 @@ var _ = Describe("Alternate Manifest source", func() { objectCleaner = envtestutil.CreateCleaner(envTestClient, envTest.Config, timeout, interval) dsciSpec = newDSCInitializationSpec(namespace) - origin = newOrigin(featurev1.DSCIType, "default") + origin = newDefaultOrigin() serviceMeshSpec = &dsciSpec.ServiceMesh @@ -546,10 +546,10 @@ func newDSCInitializationSpec(ns string) *dscv1.DSCInitializationSpec { return &spec } -func newOrigin(source, name string) featurev1.Origin { +func newDefaultOrigin() featurev1.Origin { origin := featurev1.Origin{ - Type: source, - Name: name, + Type: featurev1.DSCIType, + Name: "default", } return origin } From 103593f01d204ded9ae413064bddcd5b8e9a5131 Mon Sep 17 00:00:00 2001 From: Cameron Garrison Date: Wed, 10 Jan 2024 15:16:47 -0500 Subject: [PATCH 10/15] add ownertype, move newOrigin() to shared util --- apis/features/v1/features_types.go | 24 ++++++++++--------- tests/envtestutil/utils.go | 10 ++++++++ .../integration/features/features_int_test.go | 14 +++-------- .../features/serverless_feature_test.go | 3 ++- .../features/servicemesh_feature_test.go | 3 ++- .../service_mesh_setup_features_int_test.go | 20 +++++----------- 6 files changed, 36 insertions(+), 38 deletions(-) diff --git a/apis/features/v1/features_types.go b/apis/features/v1/features_types.go index a0e8ac50649..c42f05bd25c 100644 --- a/apis/features/v1/features_types.go +++ b/apis/features/v1/features_types.go @@ -21,16 +21,18 @@ type FeatureTracker struct { Status FeatureTrackerStatus `json:"status,omitempty"` } +type OwnerType string + const ( - ConditionPhaseFeatureCreated = "FeatureCreated" - ConditionPhasePreConditions = "FeaturePreConditions" - ConditionPhaseResourceCreation = "ResourceCreation" - ConditionPhaseLoadTemplateData = "LoadTemplateData" - ConditionPhaseProcessTemplates = "ProcessTemplates" - ConditionPhaseApplyManifests = "ApplyManifests" - ConditionPhasePostConditions = "FeaturePostConditions" - ComponentType = "Component" - DSCIType = "DSCI" + ConditionPhaseFeatureCreated = "FeatureCreated" + ConditionPhasePreConditions = "FeaturePreConditions" + ConditionPhaseResourceCreation = "ResourceCreation" + ConditionPhaseLoadTemplateData = "LoadTemplateData" + ConditionPhaseProcessTemplates = "ProcessTemplates" + ConditionPhaseApplyManifests = "ApplyManifests" + ConditionPhasePostConditions = "FeaturePostConditions" + ComponentType OwnerType = "Component" + DSCIType OwnerType = "DSCI" ) func (s *FeatureTracker) ToOwnerReference() metav1.OwnerReference { @@ -44,8 +46,8 @@ func (s *FeatureTracker) ToOwnerReference() metav1.OwnerReference { // Origin describes the type of object that created the related Feature to this FeatureTracker type Origin struct { - Type string `json:"type,omitempty"` - Name string `json:"name,omitempty"` + Type OwnerType `json:"type,omitempty"` + Name string `json:"name,omitempty"` } // FeatureTrackerSpec defines the desired state of FeatureTracker. diff --git a/tests/envtestutil/utils.go b/tests/envtestutil/utils.go index 3a6d2396479..8ce4487ae0b 100644 --- a/tests/envtestutil/utils.go +++ b/tests/envtestutil/utils.go @@ -4,6 +4,8 @@ import ( "fmt" "os" "path/filepath" + + featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" ) func FindProjectRoot() (string, error) { @@ -27,3 +29,11 @@ func FindProjectRoot() (string, error) { return "", fmt.Errorf("project root not found") } + +// NewOrigin creates an origin object with specified component and name +func NewOrigin(component featurev1.OwnerType, name string) featurev1.Origin { + return featurev1.Origin{ + Type: component, + Name: name, + } +} diff --git a/tests/integration/features/features_int_test.go b/tests/integration/features/features_int_test.go index b35b3becac0..7dcbc8e09bc 100644 --- a/tests/integration/features/features_int_test.go +++ b/tests/integration/features/features_int_test.go @@ -44,7 +44,7 @@ var _ = Describe("preconditions", func() { namespace = envtestutil.AppendRandomNameTo(testFeatureName) dsciSpec := newDSCInitializationSpec(namespace) - origin := newOrigin("default") + origin := envtestutil.NewOrigin(featurev1.DSCIType, "default") var err error testFeature, err = feature.CreateFeature(testFeatureName). For(dsciSpec, origin). @@ -90,7 +90,7 @@ var _ = Describe("preconditions", func() { BeforeEach(func() { dsciSpec = newDSCInitializationSpec("default") - origin = newOrigin("default") + origin = envtestutil.NewOrigin(featurev1.DSCIType, "default") }) It("should successfully check for existing CRD", func() { @@ -145,7 +145,7 @@ var _ = Describe("feature trackers", func() { BeforeEach(func() { dsciSpec = newDSCInitializationSpec("default") - origin = newOrigin("default") + origin = envtestutil.NewOrigin(featurev1.DSCIType, "default") }) It("should indicate successful installation in FeatureTracker", func() { @@ -251,14 +251,6 @@ func newDSCInitializationSpec(ns string) *dscv1.DSCInitializationSpec { return &spec } -func newOrigin(name string) featurev1.Origin { - origin := featurev1.Origin{ - Type: featurev1.DSCIType, - Name: name, - } - return origin -} - func getNamespace(namespace string) (*v1.Namespace, error) { ns := createNamespace(namespace) err := envTestClient.Get(context.Background(), k8stypes.NamespacedName{Name: namespace}, ns) diff --git a/tests/integration/features/serverless_feature_test.go b/tests/integration/features/serverless_feature_test.go index 861eef680d1..50a076b91ee 100644 --- a/tests/integration/features/serverless_feature_test.go +++ b/tests/integration/features/serverless_feature_test.go @@ -10,6 +10,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/envtest" + featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" infrav1 "github.com/opendatahub-io/opendatahub-operator/v2/infrastructure/v1" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature/serverless" @@ -77,7 +78,7 @@ var _ = Describe("Serverless feature", func() { namespace := envtestutil.AppendRandomNameTo(testFeatureName) dsciSpec := newDSCInitializationSpec(namespace) - origin := newOrigin("kserve") + origin := envtestutil.NewOrigin(featurev1.ComponentType, "kserve") testFeature, err = feature.CreateFeature(testFeatureName). For(dsciSpec, origin). UsingConfig(envTest.Config). diff --git a/tests/integration/features/servicemesh_feature_test.go b/tests/integration/features/servicemesh_feature_test.go index 19b0edf8cc1..33f36120cc0 100644 --- a/tests/integration/features/servicemesh_feature_test.go +++ b/tests/integration/features/servicemesh_feature_test.go @@ -12,6 +12,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/envtest" + featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature/servicemesh" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/gvr" @@ -77,7 +78,7 @@ var _ = Describe("Service Mesh feature", func() { namespace := envtestutil.AppendRandomNameTo(testFeatureName) dsciSpec := newDSCInitializationSpec(namespace) - origin := newOrigin("default") + origin := envtestutil.NewOrigin(featurev1.DSCIType, "default") testFeature, err = feature.CreateFeature(testFeatureName). For(dsciSpec, origin). UsingConfig(envTest.Config). diff --git a/tests/integration/servicemesh/service_mesh_setup_features_int_test.go b/tests/integration/servicemesh/service_mesh_setup_features_int_test.go index 7dd1aa5c691..6edfdd57be3 100644 --- a/tests/integration/servicemesh/service_mesh_setup_features_int_test.go +++ b/tests/integration/servicemesh/service_mesh_setup_features_int_test.go @@ -56,7 +56,7 @@ var _ = Describe("preconditions", func() { namespace = envtestutil.AppendRandomNameTo(testFeatureName) dsciSpec := newDSCInitializationSpec(namespace) - origin := newDefaultOrigin() + origin := envtestutil.NewOrigin(featurev1.DSCIType, "default") var err error testFeature, err = feature.CreateFeature(testFeatureName). For(dsciSpec, origin). @@ -102,7 +102,7 @@ var _ = Describe("preconditions", func() { BeforeEach(func() { dsciSpec = newDSCInitializationSpec("default") - origin = newDefaultOrigin() + origin = envtestutil.NewOrigin(featurev1.DSCIType, "default") }) It("should successfully check for existing CRD", func() { @@ -166,7 +166,7 @@ var _ = Describe("Ensuring service mesh is set up correctly", func() { serviceMeshSpec.ControlPlane.Name = name serviceMeshSpec.ControlPlane.Namespace = namespace - origin = newDefaultOrigin() + origin = envtestutil.NewOrigin(featurev1.DSCIType, "default") serviceMeshCheck, err = feature.CreateFeature("datascience-project-migration"). For(dsciSpec, origin). UsingConfig(envTest.Config). @@ -210,7 +210,7 @@ var _ = Describe("Data Science Project Migration", func() { objectCleaner = envtestutil.CreateCleaner(envTestClient, envTest.Config, timeout, interval) dsciSpec = newDSCInitializationSpec("default") - origin = newDefaultOrigin() + origin = envtestutil.NewOrigin(featurev1.DSCIType, "default") var err error migrationFeature, err = feature.CreateFeature("datascience-project-migration"). @@ -298,7 +298,7 @@ var _ = Describe("Cleanup operations", func() { objectCleaner = envtestutil.CreateCleaner(envTestClient, envTest.Config, timeout, interval) dsciSpec = newDSCInitializationSpec(namespace) - origin = newDefaultOrigin() + origin = envtestutil.NewOrigin(featurev1.DSCIType, "default") serviceMeshSpec = &dsciSpec.ServiceMesh @@ -406,7 +406,7 @@ var _ = Describe("Alternate Manifest source", func() { objectCleaner = envtestutil.CreateCleaner(envTestClient, envTest.Config, timeout, interval) dsciSpec = newDSCInitializationSpec(namespace) - origin = newDefaultOrigin() + origin = envtestutil.NewOrigin(featurev1.DSCIType, "default") serviceMeshSpec = &dsciSpec.ServiceMesh @@ -546,14 +546,6 @@ func newDSCInitializationSpec(ns string) *dscv1.DSCInitializationSpec { return &spec } -func newDefaultOrigin() featurev1.Origin { - origin := featurev1.Origin{ - Type: featurev1.DSCIType, - Name: "default", - } - return origin -} - // createSMCPInCluster uses dynamic client to create a dummy SMCP resource for testing func createSMCPInCluster(cfg *rest.Config, smcpObj *unstructured.Unstructured, namespace string) error { dynamicClient, err := dynamic.NewForConfig(cfg) From 387b013eca01f7130b32868bc7ef6dccb01d86e3 Mon Sep 17 00:00:00 2001 From: Cameron Garrison Date: Wed, 10 Jan 2024 15:24:00 -0500 Subject: [PATCH 11/15] Update apis/features/v1/features_types.go Co-authored-by: Bartosz Majsak --- apis/features/v1/features_types.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apis/features/v1/features_types.go b/apis/features/v1/features_types.go index c42f05bd25c..55cf2c0d089 100644 --- a/apis/features/v1/features_types.go +++ b/apis/features/v1/features_types.go @@ -44,7 +44,7 @@ func (s *FeatureTracker) ToOwnerReference() metav1.OwnerReference { } } -// Origin describes the type of object that created the related Feature to this FeatureTracker +// Origin describes the type of object that created the related Feature to this FeatureTracker. type Origin struct { Type OwnerType `json:"type,omitempty"` Name string `json:"name,omitempty"` From 0571826162662f7274ee3531f15d62a11b6e9483 Mon Sep 17 00:00:00 2001 From: Cameron Garrison Date: Wed, 10 Jan 2024 17:29:58 -0500 Subject: [PATCH 12/15] remove origin from featureinitializer --- components/dashboard/dashboard.go | 13 +++++-- components/dashboard/servicemesh_setup.go | 11 +++--- components/kserve/kserve.go | 18 +++++++--- components/kserve/serverless_setup.go | 7 ++-- ...atures.opendatahub.io_featuretrackers.yaml | 2 +- .../dscinitialization/servicemesh_setup.go | 35 ++++++++++++------- pkg/feature/initializer.go | 5 +-- 7 files changed, 56 insertions(+), 35 deletions(-) diff --git a/components/dashboard/dashboard.go b/components/dashboard/dashboard.go index 5808e0adede..9b607980f17 100644 --- a/components/dashboard/dashboard.go +++ b/components/dashboard/dashboard.go @@ -159,7 +159,12 @@ func (d *Dashboard) ReconcileComponent(ctx context.Context, return err } - if err := d.configureServiceMesh(cli, owner, dscispec); err != nil { + origin := featurev1.Origin{ + Type: featurev1.ComponentType, + Name: d.GetComponentName(), + } + + if err := d.configureServiceMesh(cli, owner, dscispec, origin); err != nil { return err } @@ -218,10 +223,12 @@ func (d *Dashboard) Cleanup(cli client.Client, dscispec *dsciv1.DSCInitializatio } if shouldConfigureServiceMesh { - serviceMeshInitializer := feature.NewFeaturesInitializer(dscispec, d.defineServiceMeshFeatures(dscispec), featurev1.Origin{ + origin := featurev1.Origin{ Type: featurev1.ComponentType, Name: d.GetComponentName(), - }) + } + + serviceMeshInitializer := feature.NewFeaturesInitializer(dscispec, d.defineServiceMeshFeatures(dscispec, origin)) if err := serviceMeshInitializer.Prepare(); err != nil { return err diff --git a/components/dashboard/servicemesh_setup.go b/components/dashboard/servicemesh_setup.go index 9d525ab4a65..193f02914c9 100644 --- a/components/dashboard/servicemesh_setup.go +++ b/components/dashboard/servicemesh_setup.go @@ -15,17 +15,14 @@ import ( "github.com/opendatahub-io/opendatahub-operator/v2/pkg/gvr" ) -func (d *Dashboard) configureServiceMesh(cli client.Client, owner metav1.Object, dscispec *dsci.DSCInitializationSpec) error { +func (d *Dashboard) configureServiceMesh(cli client.Client, owner metav1.Object, dscispec *dsci.DSCInitializationSpec, origin featurev1.Origin) error { shouldConfigureServiceMesh, err := deploy.ShouldConfigureServiceMesh(cli, dscispec) if err != nil { return err } if shouldConfigureServiceMesh { - serviceMeshInitializer := feature.NewFeaturesInitializer(dscispec, d.defineServiceMeshFeatures(dscispec), featurev1.Origin{ - Type: featurev1.ComponentType, - Name: d.GetComponentName(), - }) + serviceMeshInitializer := feature.NewFeaturesInitializer(dscispec, d.defineServiceMeshFeatures(dscispec, origin)) if err := serviceMeshInitializer.Prepare(); err != nil { return err @@ -44,10 +41,10 @@ func (d *Dashboard) configureServiceMesh(cli client.Client, owner metav1.Object, return nil } -func (d *Dashboard) defineServiceMeshFeatures(dscispec *dsci.DSCInitializationSpec) feature.DefinedFeatures { +func (d *Dashboard) defineServiceMeshFeatures(dscispec *dsci.DSCInitializationSpec, origin featurev1.Origin) feature.DefinedFeatures { return func(s *feature.FeaturesInitializer) error { createMeshResources, err := feature.CreateFeature("dashboard-create-service-mesh-routing-resources"). - For(dscispec, s.Origin). + For(dscispec, origin). Manifests( path.Join(feature.ControlPlaneDir, "components", d.GetComponentName()), ). diff --git a/components/kserve/kserve.go b/components/kserve/kserve.go index e9ce9be3912..e559ddf34a0 100644 --- a/components/kserve/kserve.go +++ b/components/kserve/kserve.go @@ -188,10 +188,15 @@ func (k *Kserve) configureServerless(instance *dsciv1.DSCInitializationSpec) err case operatorv1.Unmanaged, operatorv1.Removed: return fmt.Errorf("ServiceMesh is need to set to 'Managed' in DSCI CR, it is required by KServe serving field") } - serverlessInitializer := feature.NewFeaturesInitializer(instance, k.configureServerlessFeatures, featurev1.Origin{ + origin := featurev1.Origin{ Type: featurev1.ComponentType, Name: k.GetComponentName(), - }) + } + configureServerless := func(s *feature.FeaturesInitializer) error { + return k.configureServerlessFeatures(s, origin) + } + + serverlessInitializer := feature.NewFeaturesInitializer(instance, configureServerless) if err := serverlessInitializer.Prepare(); err != nil { return err @@ -205,10 +210,15 @@ func (k *Kserve) configureServerless(instance *dsciv1.DSCInitializationSpec) err } func (k *Kserve) removeServerlessFeatures(instance *dsciv1.DSCInitializationSpec) error { - serverlessInitializer := feature.NewFeaturesInitializer(instance, k.configureServerlessFeatures, featurev1.Origin{ + origin := featurev1.Origin{ Type: featurev1.ComponentType, Name: k.GetComponentName(), - }) + } + configureServerless := func(s *feature.FeaturesInitializer) error { + return k.configureServerlessFeatures(s, origin) + } + + serverlessInitializer := feature.NewFeaturesInitializer(instance, configureServerless) if err := serverlessInitializer.Prepare(); err != nil { return err diff --git a/components/kserve/serverless_setup.go b/components/kserve/serverless_setup.go index 643e5be1441..f9ef2e71d11 100644 --- a/components/kserve/serverless_setup.go +++ b/components/kserve/serverless_setup.go @@ -3,6 +3,7 @@ package kserve import ( "path" + featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature/serverless" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature/servicemesh" @@ -14,9 +15,9 @@ const ( templatesDir = "templates/serverless" ) -func (k *Kserve) configureServerlessFeatures(s *feature.FeaturesInitializer) error { +func (k *Kserve) configureServerlessFeatures(s *feature.FeaturesInitializer, origin featurev1.Origin) error { servingDeployment, err := feature.CreateFeature("serverless-serving-deployment"). - For(s.DSCInitializationSpec, s.Origin). + For(s.DSCInitializationSpec, origin). Manifests( path.Join(templatesDir, "serving-install"), ). @@ -37,7 +38,7 @@ func (k *Kserve) configureServerlessFeatures(s *feature.FeaturesInitializer) err s.Features = append(s.Features, servingDeployment) servingIstioGateways, err := feature.CreateFeature("serverless-serving-gateways"). - For(s.DSCInitializationSpec, s.Origin). + For(s.DSCInitializationSpec, origin). PreConditions( // Check serverless is installed feature.WaitForResourceToBeCreated(knativeServingNamespace, gvr.KnativeServing), diff --git a/config/crd/bases/features.opendatahub.io_featuretrackers.yaml b/config/crd/bases/features.opendatahub.io_featuretrackers.yaml index 378b0bd23f8..899f5b821a6 100644 --- a/config/crd/bases/features.opendatahub.io_featuretrackers.yaml +++ b/config/crd/bases/features.opendatahub.io_featuretrackers.yaml @@ -46,7 +46,7 @@ spec: type: string origin: description: Origin describes the type of object that created the - related Feature to this FeatureTracker + related Feature to this FeatureTracker. properties: name: type: string diff --git a/controllers/dscinitialization/servicemesh_setup.go b/controllers/dscinitialization/servicemesh_setup.go index adadcd4f1c2..b713b7c08e8 100644 --- a/controllers/dscinitialization/servicemesh_setup.go +++ b/controllers/dscinitialization/servicemesh_setup.go @@ -13,11 +13,11 @@ import ( "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature/servicemesh" ) -func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { +func defineServiceMeshFeatures(f *feature.FeaturesInitializer, origin featurev1.Origin) error { serviceMeshSpec := f.ServiceMesh smcpCreation, errSmcp := feature.CreateFeature("service-mesh-control-plane-creation"). - For(f.DSCInitializationSpec, f.Origin). + For(f.DSCInitializationSpec, origin). Manifests( path.Join(feature.ControlPlaneDir, "base", "control-plane.tmpl"), ). @@ -36,7 +36,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { if serviceMeshSpec.ControlPlane.MetricsCollection == "Istio" { metricsCollection, errMetrics := feature.CreateFeature("service-mesh-monitoring"). - For(f.DSCInitializationSpec, f.Origin). + For(f.DSCInitializationSpec, origin). Manifests( path.Join(feature.MonitoringDir), ). @@ -52,7 +52,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { } if oauth, err := feature.CreateFeature("service-mesh-control-plane-configure-oauth"). - For(f.DSCInitializationSpec, f.Origin). + For(f.DSCInitializationSpec, origin). Manifests( path.Join(feature.ControlPlaneDir, "base"), path.Join(feature.ControlPlaneDir, "oauth"), @@ -80,7 +80,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { } if cfMaps, err := feature.CreateFeature("shared-config-maps"). - For(f.DSCInitializationSpec, f.Origin). + For(f.DSCInitializationSpec, origin). WithResources(servicemesh.ConfigMaps). Load(); err != nil { return err @@ -89,7 +89,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { } if serviceMesh, err := feature.CreateFeature("app-add-namespace-to-service-mesh"). - For(f.DSCInitializationSpec, f.Origin). + For(f.DSCInitializationSpec, origin). Manifests( path.Join(feature.ControlPlaneDir, "smm.tmpl"), path.Join(feature.ControlPlaneDir, "namespace.patch.tmpl"), @@ -102,7 +102,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { } if gatewayRoute, err := feature.CreateFeature("service-mesh-create-gateway-route"). - For(f.DSCInitializationSpec, f.Origin). + For(f.DSCInitializationSpec, origin). Manifests( path.Join(feature.ControlPlaneDir, "routing"), ). @@ -117,7 +117,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { } if dataScienceProjects, err := feature.CreateFeature("app-migrate-data-science-projects"). - For(f.DSCInitializationSpec, f.Origin). + For(f.DSCInitializationSpec, origin). WithResources(servicemesh.MigratedDataScienceProjects). Load(); err != nil { return err @@ -126,7 +126,7 @@ func defineServiceMeshFeatures(f *feature.FeaturesInitializer) error { } if extAuthz, err := feature.CreateFeature("service-mesh-control-plane-setup-external-authorization"). - For(f.DSCInitializationSpec, f.Origin). + For(f.DSCInitializationSpec, origin). Manifests( path.Join(feature.AuthDir, "auth-smm.tmpl"), path.Join(feature.AuthDir, "base"), @@ -169,10 +169,15 @@ func (r *DSCInitializationReconciler) configureServiceMesh(instance *dsciv1.DSCI switch instance.Spec.ServiceMesh.ManagementState { case operatorv1.Managed: - serviceMeshInitializer := feature.NewFeaturesInitializer(&instance.Spec, defineServiceMeshFeatures, featurev1.Origin{ + origin := featurev1.Origin{ Type: featurev1.DSCIType, Name: instance.Name, - }) + } + defineServiceMesh := func(s *feature.FeaturesInitializer) error { + return defineServiceMeshFeatures(s, origin) + } + + serviceMeshInitializer := feature.NewFeaturesInitializer(&instance.Spec, defineServiceMesh) if err := serviceMeshInitializer.Prepare(); err != nil { r.Log.Error(err, "failed configuring service mesh resources") r.Recorder.Eventf(instance, corev1.EventTypeWarning, "DSCInitializationReconcileError", "failed configuring service mesh resources") @@ -199,11 +204,15 @@ func (r *DSCInitializationReconciler) configureServiceMesh(instance *dsciv1.DSCI func (r *DSCInitializationReconciler) removeServiceMesh(instance *dsciv1.DSCInitialization) error { // on condition of Managed, do not handle Removed when set to Removed it tigger DSCI reconcile to cleanup if instance.Spec.ServiceMesh.ManagementState == operatorv1.Managed { - serviceMeshInitializer := feature.NewFeaturesInitializer(&instance.Spec, defineServiceMeshFeatures, featurev1.Origin{ + origin := featurev1.Origin{ Type: featurev1.DSCIType, Name: instance.Name, - }) + } + defineServiceMesh := func(s *feature.FeaturesInitializer) error { + return defineServiceMeshFeatures(s, origin) + } + serviceMeshInitializer := feature.NewFeaturesInitializer(&instance.Spec, defineServiceMesh) if err := serviceMeshInitializer.Prepare(); err != nil { r.Log.Error(err, "failed configuring service mesh resources") r.Recorder.Eventf(instance, corev1.EventTypeWarning, "DSCInitializationReconcileError", "failed configuring service mesh resources") diff --git a/pkg/feature/initializer.go b/pkg/feature/initializer.go index 7a7a564549a..7a1f437152d 100644 --- a/pkg/feature/initializer.go +++ b/pkg/feature/initializer.go @@ -4,23 +4,20 @@ import ( "github.com/hashicorp/go-multierror" v1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/dscinitialization/v1" - featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" ) type FeaturesInitializer struct { *v1.DSCInitializationSpec definedFeatures DefinedFeatures Features []*Feature - Origin featurev1.Origin } type DefinedFeatures func(featuresInitializer *FeaturesInitializer) error -func NewFeaturesInitializer(spec *v1.DSCInitializationSpec, def DefinedFeatures, origin featurev1.Origin) *FeaturesInitializer { +func NewFeaturesInitializer(spec *v1.DSCInitializationSpec, def DefinedFeatures) *FeaturesInitializer { return &FeaturesInitializer{ DSCInitializationSpec: spec, definedFeatures: def, - Origin: origin, } } From b10d36f7af082d7a563a4db5345b216f90551b9e Mon Sep 17 00:00:00 2001 From: Cameron Garrison Date: Thu, 11 Jan 2024 10:05:26 -0500 Subject: [PATCH 13/15] modify kserve sm step to match dashboard's --- components/kserve/kserve.go | 12 +--- components/kserve/serverless_setup.go | 87 ++++++++++++++------------- 2 files changed, 47 insertions(+), 52 deletions(-) diff --git a/components/kserve/kserve.go b/components/kserve/kserve.go index e559ddf34a0..0d6a38a9f9e 100644 --- a/components/kserve/kserve.go +++ b/components/kserve/kserve.go @@ -192,11 +192,7 @@ func (k *Kserve) configureServerless(instance *dsciv1.DSCInitializationSpec) err Type: featurev1.ComponentType, Name: k.GetComponentName(), } - configureServerless := func(s *feature.FeaturesInitializer) error { - return k.configureServerlessFeatures(s, origin) - } - - serverlessInitializer := feature.NewFeaturesInitializer(instance, configureServerless) + serverlessInitializer := feature.NewFeaturesInitializer(instance, k.configureServerlessFeatures(instance, origin)) if err := serverlessInitializer.Prepare(); err != nil { return err @@ -214,11 +210,7 @@ func (k *Kserve) removeServerlessFeatures(instance *dsciv1.DSCInitializationSpec Type: featurev1.ComponentType, Name: k.GetComponentName(), } - configureServerless := func(s *feature.FeaturesInitializer) error { - return k.configureServerlessFeatures(s, origin) - } - - serverlessInitializer := feature.NewFeaturesInitializer(instance, configureServerless) + serverlessInitializer := feature.NewFeaturesInitializer(instance, k.configureServerlessFeatures(instance, origin)) if err := serverlessInitializer.Prepare(); err != nil { return err diff --git a/components/kserve/serverless_setup.go b/components/kserve/serverless_setup.go index f9ef2e71d11..76bbd70b7f5 100644 --- a/components/kserve/serverless_setup.go +++ b/components/kserve/serverless_setup.go @@ -1,6 +1,7 @@ package kserve import ( + dsci "github.com/opendatahub-io/opendatahub-operator/v2/apis/dscinitialization/v1" "path" featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" @@ -15,50 +16,52 @@ const ( templatesDir = "templates/serverless" ) -func (k *Kserve) configureServerlessFeatures(s *feature.FeaturesInitializer, origin featurev1.Origin) error { - servingDeployment, err := feature.CreateFeature("serverless-serving-deployment"). - For(s.DSCInitializationSpec, origin). - Manifests( - path.Join(templatesDir, "serving-install"), - ). - WithData(PopulateComponentSettings(k)). - PreConditions( - serverless.EnsureServerlessOperatorInstalled, - serverless.EnsureServerlessAbsent, - servicemesh.EnsureServiceMeshInstalled, - feature.CreateNamespaceIfNotExists(knativeServingNamespace), - ). - PostConditions( - feature.WaitForPodsToBeReady(knativeServingNamespace), - ). - Load() - if err != nil { - return err - } - s.Features = append(s.Features, servingDeployment) +func (k *Kserve) configureServerlessFeatures(dscispec *dsci.DSCInitializationSpec, origin featurev1.Origin) feature.DefinedFeatures { + return func(s *feature.FeaturesInitializer) error { - servingIstioGateways, err := feature.CreateFeature("serverless-serving-gateways"). - For(s.DSCInitializationSpec, origin). - PreConditions( - // Check serverless is installed - feature.WaitForResourceToBeCreated(knativeServingNamespace, gvr.KnativeServing), - ). - WithData( - serverless.ServingDefaultValues, - serverless.ServingIngressDomain, - PopulateComponentSettings(k), - ). - WithResources(serverless.ServingCertificateResource). - Manifests( - path.Join(templatesDir, "serving-istio-gateways"), - ). - Load() - if err != nil { - return err - } - s.Features = append(s.Features, servingIstioGateways) + servingDeployment, err := feature.CreateFeature("serverless-serving-deployment"). + For(dscispec, origin). + Manifests( + path.Join(templatesDir, "serving-install"), + ). + WithData(PopulateComponentSettings(k)). + PreConditions( + serverless.EnsureServerlessOperatorInstalled, + serverless.EnsureServerlessAbsent, + servicemesh.EnsureServiceMeshInstalled, + feature.CreateNamespaceIfNotExists(knativeServingNamespace), + ). + PostConditions( + feature.WaitForPodsToBeReady(knativeServingNamespace), + ). + Load() + if err != nil { + return err + } + s.Features = append(s.Features, servingDeployment) - return nil + servingIstioGateways, err := feature.CreateFeature("serverless-serving-gateways"). + For(dscispec, origin). + PreConditions( + // Check serverless is installed + feature.WaitForResourceToBeCreated(knativeServingNamespace, gvr.KnativeServing), + ). + WithData( + serverless.ServingDefaultValues, + serverless.ServingIngressDomain, + PopulateComponentSettings(k), + ). + WithResources(serverless.ServingCertificateResource). + Manifests( + path.Join(templatesDir, "serving-istio-gateways"), + ). + Load() + if err != nil { + return err + } + s.Features = append(s.Features, servingIstioGateways) + return nil + } } func PopulateComponentSettings(k *Kserve) feature.Action { From b6c18cc65c67b117b01df2cb908e0ef2129cac8c Mon Sep 17 00:00:00 2001 From: Cameron Garrison Date: Thu, 11 Jan 2024 17:39:41 -0500 Subject: [PATCH 14/15] make dsci servicemesh setup like dashboard's --- apis/features/v1/zz_generated.deepcopy.go | 16 + components/kserve/serverless_setup.go | 3 +- .../dscinitialization/servicemesh_setup.go | 276 +++++++++--------- 3 files changed, 152 insertions(+), 143 deletions(-) diff --git a/apis/features/v1/zz_generated.deepcopy.go b/apis/features/v1/zz_generated.deepcopy.go index 8ff53c68285..7af093880d9 100644 --- a/apis/features/v1/zz_generated.deepcopy.go +++ b/apis/features/v1/zz_generated.deepcopy.go @@ -88,6 +88,7 @@ func (in *FeatureTrackerList) DeepCopyObject() runtime.Object { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *FeatureTrackerSpec) DeepCopyInto(out *FeatureTrackerSpec) { *out = *in + out.Origin = in.Origin } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureTrackerSpec. @@ -125,3 +126,18 @@ func (in *FeatureTrackerStatus) DeepCopy() *FeatureTrackerStatus { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Origin) DeepCopyInto(out *Origin) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Origin. +func (in *Origin) DeepCopy() *Origin { + if in == nil { + return nil + } + out := new(Origin) + in.DeepCopyInto(out) + return out +} diff --git a/components/kserve/serverless_setup.go b/components/kserve/serverless_setup.go index 76bbd70b7f5..f767d62774b 100644 --- a/components/kserve/serverless_setup.go +++ b/components/kserve/serverless_setup.go @@ -1,9 +1,9 @@ package kserve import ( - dsci "github.com/opendatahub-io/opendatahub-operator/v2/apis/dscinitialization/v1" "path" + dsci "github.com/opendatahub-io/opendatahub-operator/v2/apis/dscinitialization/v1" featurev1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/features/v1" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature" "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature/serverless" @@ -18,7 +18,6 @@ const ( func (k *Kserve) configureServerlessFeatures(dscispec *dsci.DSCInitializationSpec, origin featurev1.Origin) feature.DefinedFeatures { return func(s *feature.FeaturesInitializer) error { - servingDeployment, err := feature.CreateFeature("serverless-serving-deployment"). For(dscispec, origin). Manifests( diff --git a/controllers/dscinitialization/servicemesh_setup.go b/controllers/dscinitialization/servicemesh_setup.go index b713b7c08e8..5ff677aa2da 100644 --- a/controllers/dscinitialization/servicemesh_setup.go +++ b/controllers/dscinitialization/servicemesh_setup.go @@ -13,152 +13,154 @@ import ( "github.com/opendatahub-io/opendatahub-operator/v2/pkg/feature/servicemesh" ) -func defineServiceMeshFeatures(f *feature.FeaturesInitializer, origin featurev1.Origin) error { - serviceMeshSpec := f.ServiceMesh - - smcpCreation, errSmcp := feature.CreateFeature("service-mesh-control-plane-creation"). - For(f.DSCInitializationSpec, origin). - Manifests( - path.Join(feature.ControlPlaneDir, "base", "control-plane.tmpl"), - ). - PreConditions( - servicemesh.EnsureServiceMeshOperatorInstalled, - feature.CreateNamespaceIfNotExists(serviceMeshSpec.ControlPlane.Namespace), - ). - PostConditions( - feature.WaitForPodsToBeReady(serviceMeshSpec.ControlPlane.Namespace), - ). - Load() - if errSmcp != nil { - return errSmcp - } - f.Features = append(f.Features, smcpCreation) +func defineServiceMeshFeatures(dscispec *dsciv1.DSCInitializationSpec, origin featurev1.Origin) feature.DefinedFeatures { + return func(s *feature.FeaturesInitializer) error { + serviceMeshSpec := dscispec.ServiceMesh - if serviceMeshSpec.ControlPlane.MetricsCollection == "Istio" { - metricsCollection, errMetrics := feature.CreateFeature("service-mesh-monitoring"). - For(f.DSCInitializationSpec, origin). + smcpCreation, errSmcp := feature.CreateFeature("service-mesh-control-plane-creation"). + For(dscispec, origin). Manifests( - path.Join(feature.MonitoringDir), + path.Join(feature.ControlPlaneDir, "base", "control-plane.tmpl"), ). PreConditions( - servicemesh.EnsureServiceMeshInstalled, + servicemesh.EnsureServiceMeshOperatorInstalled, + feature.CreateNamespaceIfNotExists(serviceMeshSpec.ControlPlane.Namespace), + ). + PostConditions( + feature.WaitForPodsToBeReady(serviceMeshSpec.ControlPlane.Namespace), ). Load() - if errMetrics != nil { - return errMetrics + if errSmcp != nil { + return errSmcp + } + s.Features = append(s.Features, smcpCreation) + + if serviceMeshSpec.ControlPlane.MetricsCollection == "Istio" { + metricsCollection, errMetrics := feature.CreateFeature("service-mesh-monitoring"). + For(dscispec, origin). + Manifests( + path.Join(feature.MonitoringDir), + ). + PreConditions( + servicemesh.EnsureServiceMeshInstalled, + ). + Load() + if errMetrics != nil { + return errMetrics + } + + s.Features = append(s.Features, metricsCollection) } - f.Features = append(f.Features, metricsCollection) - } + if oauth, err := feature.CreateFeature("service-mesh-control-plane-configure-oauth"). + For(dscispec, origin). + Manifests( + path.Join(feature.ControlPlaneDir, "base"), + path.Join(feature.ControlPlaneDir, "oauth"), + path.Join(feature.ControlPlaneDir, "filters"), + ). + WithResources( + servicemesh.DefaultValues, + servicemesh.SelfSignedCertificate, + servicemesh.EnvoyOAuthSecrets, + ). + WithData(servicemesh.ClusterDetails, servicemesh.OAuthConfig). + PreConditions( + servicemesh.EnsureServiceMeshInstalled, + ). + PostConditions( + feature.WaitForPodsToBeReady(serviceMeshSpec.ControlPlane.Namespace), + ). + OnDelete( + servicemesh.RemoveOAuthClient, + servicemesh.RemoveTokenVolumes, + ).Load(); err != nil { + return err + } else { + s.Features = append(s.Features, oauth) + } - if oauth, err := feature.CreateFeature("service-mesh-control-plane-configure-oauth"). - For(f.DSCInitializationSpec, origin). - Manifests( - path.Join(feature.ControlPlaneDir, "base"), - path.Join(feature.ControlPlaneDir, "oauth"), - path.Join(feature.ControlPlaneDir, "filters"), - ). - WithResources( - servicemesh.DefaultValues, - servicemesh.SelfSignedCertificate, - servicemesh.EnvoyOAuthSecrets, - ). - WithData(servicemesh.ClusterDetails, servicemesh.OAuthConfig). - PreConditions( - servicemesh.EnsureServiceMeshInstalled, - ). - PostConditions( - feature.WaitForPodsToBeReady(serviceMeshSpec.ControlPlane.Namespace), - ). - OnDelete( - servicemesh.RemoveOAuthClient, - servicemesh.RemoveTokenVolumes, - ).Load(); err != nil { - return err - } else { - f.Features = append(f.Features, oauth) - } + if cfMaps, err := feature.CreateFeature("shared-config-maps"). + For(dscispec, origin). + WithResources(servicemesh.ConfigMaps). + Load(); err != nil { + return err + } else { + s.Features = append(s.Features, cfMaps) + } - if cfMaps, err := feature.CreateFeature("shared-config-maps"). - For(f.DSCInitializationSpec, origin). - WithResources(servicemesh.ConfigMaps). - Load(); err != nil { - return err - } else { - f.Features = append(f.Features, cfMaps) - } + if serviceMesh, err := feature.CreateFeature("app-add-namespace-to-service-mesh"). + For(dscispec, origin). + Manifests( + path.Join(feature.ControlPlaneDir, "smm.tmpl"), + path.Join(feature.ControlPlaneDir, "namespace.patch.tmpl"), + ). + WithData(servicemesh.ClusterDetails). + Load(); err != nil { + return err + } else { + s.Features = append(s.Features, serviceMesh) + } - if serviceMesh, err := feature.CreateFeature("app-add-namespace-to-service-mesh"). - For(f.DSCInitializationSpec, origin). - Manifests( - path.Join(feature.ControlPlaneDir, "smm.tmpl"), - path.Join(feature.ControlPlaneDir, "namespace.patch.tmpl"), - ). - WithData(servicemesh.ClusterDetails). - Load(); err != nil { - return err - } else { - f.Features = append(f.Features, serviceMesh) - } + if gatewayRoute, err := feature.CreateFeature("service-mesh-create-gateway-route"). + For(dscispec, origin). + Manifests( + path.Join(feature.ControlPlaneDir, "routing"), + ). + WithData(servicemesh.ClusterDetails). + PostConditions( + feature.WaitForPodsToBeReady(serviceMeshSpec.ControlPlane.Namespace), + ). + Load(); err != nil { + return err + } else { + s.Features = append(s.Features, gatewayRoute) + } - if gatewayRoute, err := feature.CreateFeature("service-mesh-create-gateway-route"). - For(f.DSCInitializationSpec, origin). - Manifests( - path.Join(feature.ControlPlaneDir, "routing"), - ). - WithData(servicemesh.ClusterDetails). - PostConditions( - feature.WaitForPodsToBeReady(serviceMeshSpec.ControlPlane.Namespace), - ). - Load(); err != nil { - return err - } else { - f.Features = append(f.Features, gatewayRoute) - } + if dataScienceProjects, err := feature.CreateFeature("app-migrate-data-science-projects"). + For(dscispec, origin). + WithResources(servicemesh.MigratedDataScienceProjects). + Load(); err != nil { + return err + } else { + s.Features = append(s.Features, dataScienceProjects) + } - if dataScienceProjects, err := feature.CreateFeature("app-migrate-data-science-projects"). - For(f.DSCInitializationSpec, origin). - WithResources(servicemesh.MigratedDataScienceProjects). - Load(); err != nil { - return err - } else { - f.Features = append(f.Features, dataScienceProjects) - } + if extAuthz, err := feature.CreateFeature("service-mesh-control-plane-setup-external-authorization"). + For(s.DSCInitializationSpec, origin). + Manifests( + path.Join(feature.AuthDir, "auth-smm.tmpl"), + path.Join(feature.AuthDir, "base"), + path.Join(feature.AuthDir, "rbac"), + path.Join(feature.AuthDir, "mesh-authz-ext-provider.patch.tmpl"), + ). + WithData(servicemesh.ClusterDetails). + PreConditions( + feature.EnsureCRDIsInstalled("authconfigs.authorino.kuadrant.io"), + servicemesh.EnsureServiceMeshInstalled, + feature.CreateNamespaceIfNotExists(serviceMeshSpec.Auth.Namespace), + ). + PostConditions( + feature.WaitForPodsToBeReady(serviceMeshSpec.ControlPlane.Namespace), + feature.WaitForPodsToBeReady(serviceMeshSpec.Auth.Namespace), + func(f *feature.Feature) error { + // We do not have the control over deployment resource creation. + // It is created by Authorino operator using Authorino CR + // + // To make it part of Service Mesh we have to patch it with injection + // enabled instead, otherwise it will not have proxy pod injected. + return f.ApplyManifest(path.Join(feature.AuthDir, "deployment.injection.patch.tmpl")) + }, + ). + OnDelete(servicemesh.RemoveExtensionProvider). + Load(); err != nil { + return err + } else { + s.Features = append(s.Features, extAuthz) + } - if extAuthz, err := feature.CreateFeature("service-mesh-control-plane-setup-external-authorization"). - For(f.DSCInitializationSpec, origin). - Manifests( - path.Join(feature.AuthDir, "auth-smm.tmpl"), - path.Join(feature.AuthDir, "base"), - path.Join(feature.AuthDir, "rbac"), - path.Join(feature.AuthDir, "mesh-authz-ext-provider.patch.tmpl"), - ). - WithData(servicemesh.ClusterDetails). - PreConditions( - feature.EnsureCRDIsInstalled("authconfigs.authorino.kuadrant.io"), - servicemesh.EnsureServiceMeshInstalled, - feature.CreateNamespaceIfNotExists(serviceMeshSpec.Auth.Namespace), - ). - PostConditions( - feature.WaitForPodsToBeReady(serviceMeshSpec.ControlPlane.Namespace), - feature.WaitForPodsToBeReady(serviceMeshSpec.Auth.Namespace), - func(f *feature.Feature) error { - // We do not have the control over deployment resource creation. - // It is created by Authorino operator using Authorino CR - // - // To make it part of Service Mesh we have to patch it with injection - // enabled instead, otherwise it will not have proxy pod injected. - return f.ApplyManifest(path.Join(feature.AuthDir, "deployment.injection.patch.tmpl")) - }, - ). - OnDelete(servicemesh.RemoveExtensionProvider). - Load(); err != nil { - return err - } else { - f.Features = append(f.Features, extAuthz) + return nil } - - return nil } func (r *DSCInitializationReconciler) configureServiceMesh(instance *dsciv1.DSCInitialization) error { @@ -173,11 +175,7 @@ func (r *DSCInitializationReconciler) configureServiceMesh(instance *dsciv1.DSCI Type: featurev1.DSCIType, Name: instance.Name, } - defineServiceMesh := func(s *feature.FeaturesInitializer) error { - return defineServiceMeshFeatures(s, origin) - } - - serviceMeshInitializer := feature.NewFeaturesInitializer(&instance.Spec, defineServiceMesh) + serviceMeshInitializer := feature.NewFeaturesInitializer(&instance.Spec, defineServiceMeshFeatures(&instance.Spec, origin)) if err := serviceMeshInitializer.Prepare(); err != nil { r.Log.Error(err, "failed configuring service mesh resources") r.Recorder.Eventf(instance, corev1.EventTypeWarning, "DSCInitializationReconcileError", "failed configuring service mesh resources") @@ -208,11 +206,7 @@ func (r *DSCInitializationReconciler) removeServiceMesh(instance *dsciv1.DSCInit Type: featurev1.DSCIType, Name: instance.Name, } - defineServiceMesh := func(s *feature.FeaturesInitializer) error { - return defineServiceMeshFeatures(s, origin) - } - - serviceMeshInitializer := feature.NewFeaturesInitializer(&instance.Spec, defineServiceMesh) + serviceMeshInitializer := feature.NewFeaturesInitializer(&instance.Spec, defineServiceMeshFeatures(&instance.Spec, origin)) if err := serviceMeshInitializer.Prepare(); err != nil { r.Log.Error(err, "failed configuring service mesh resources") r.Recorder.Eventf(instance, corev1.EventTypeWarning, "DSCInitializationReconcileError", "failed configuring service mesh resources") From 320725068a2c0dba3917b56376844f6e156b8abe Mon Sep 17 00:00:00 2001 From: Cameron Garrison Date: Fri, 12 Jan 2024 12:31:41 -0500 Subject: [PATCH 15/15] fix merge issues, lint --- .../dscinitialization/servicemesh_setup.go | 215 +++++++++--------- tests/assertions/gomega_matchers.go | 2 +- tests/envtestutil/utils.go | 2 +- 3 files changed, 110 insertions(+), 109 deletions(-) diff --git a/controllers/dscinitialization/servicemesh_setup.go b/controllers/dscinitialization/servicemesh_setup.go index 80792c556d8..4d773b9d27d 100644 --- a/controllers/dscinitialization/servicemesh_setup.go +++ b/controllers/dscinitialization/servicemesh_setup.go @@ -52,124 +52,125 @@ func defineServiceMeshFeatures(dscispec *dsciv1.DSCInitializationSpec, origin fe s.Features = append(s.Features, metricsCollection) } - oauth, err := feature.CreateFeature("service-mesh-control-plane-configure-oauth"). - For(dscispec, origin). - Manifests( - path.Join(feature.ControlPlaneDir, "base"), - path.Join(feature.ControlPlaneDir, "oauth"), - path.Join(feature.ControlPlaneDir, "filters"), - ). - WithResources( - servicemesh.DefaultValues, - servicemesh.SelfSignedCertificate, - servicemesh.EnvoyOAuthSecrets, - ). - WithData(servicemesh.ClusterDetails, servicemesh.OAuthConfig). - PreConditions( - servicemesh.EnsureServiceMeshInstalled, - ). - PostConditions( - feature.WaitForPodsToBeReady(serviceMeshSpec.ControlPlane.Namespace), - ). - OnDelete( - servicemesh.RemoveOAuthClient, - servicemesh.RemoveTokenVolumes, - ).Load() - - if err != nil { - return err - } + oauth, err := feature.CreateFeature("service-mesh-control-plane-configure-oauth"). + For(dscispec, origin). + Manifests( + path.Join(feature.ControlPlaneDir, "base"), + path.Join(feature.ControlPlaneDir, "oauth"), + path.Join(feature.ControlPlaneDir, "filters"), + ). + WithResources( + servicemesh.DefaultValues, + servicemesh.SelfSignedCertificate, + servicemesh.EnvoyOAuthSecrets, + ). + WithData(servicemesh.ClusterDetails, servicemesh.OAuthConfig). + PreConditions( + servicemesh.EnsureServiceMeshInstalled, + ). + PostConditions( + feature.WaitForPodsToBeReady(serviceMeshSpec.ControlPlane.Namespace), + ). + OnDelete( + servicemesh.RemoveOAuthClient, + servicemesh.RemoveTokenVolumes, + ).Load() - f.Features = append(f.Features, oauth) + if err != nil { + return err + } - cfMaps, err := feature.CreateFeature("shared-config-maps"). - For(dscispec, origin). - WithResources(servicemesh.ConfigMaps). - Load() + s.Features = append(s.Features, oauth) - if err != nil { - return err - } + cfMaps, err := feature.CreateFeature("shared-config-maps"). + For(dscispec, origin). + WithResources(servicemesh.ConfigMaps). + Load() - f.Features = append(f.Features, cfMaps) - - serviceMesh, err := feature.CreateFeature("app-add-namespace-to-service-mesh"). - For(dscispec, origin). - Manifests( - path.Join(feature.ControlPlaneDir, "smm.tmpl"), - path.Join(feature.ControlPlaneDir, "namespace.patch.tmpl"), - ). - WithData(servicemesh.ClusterDetails). - Load() - if err != nil { - return err - } + if err != nil { + return err + } - f.Features = append(f.Features, serviceMesh) - - gatewayRoute, err := feature.CreateFeature("service-mesh-create-gateway-route"). - For(dscispec, origin). - Manifests( - path.Join(feature.ControlPlaneDir, "routing"), - ). - WithData(servicemesh.ClusterDetails). - PostConditions( - feature.WaitForPodsToBeReady(serviceMeshSpec.ControlPlane.Namespace), - ). - Load() - if err != nil { - return err - } + s.Features = append(s.Features, cfMaps) - f.Features = append(f.Features, gatewayRoute) + serviceMesh, err := feature.CreateFeature("app-add-namespace-to-service-mesh"). + For(dscispec, origin). + Manifests( + path.Join(feature.ControlPlaneDir, "smm.tmpl"), + path.Join(feature.ControlPlaneDir, "namespace.patch.tmpl"), + ). + WithData(servicemesh.ClusterDetails). + Load() + if err != nil { + return err + } - dataScienceProjects, err := feature.CreateFeature("app-migrate-data-science-projects"). - For(dscispec, origin). - WithResources(servicemesh.MigratedDataScienceProjects). - Load() + s.Features = append(s.Features, serviceMesh) - if err != nil { - return err - } + gatewayRoute, err := feature.CreateFeature("service-mesh-create-gateway-route"). + For(dscispec, origin). + Manifests( + path.Join(feature.ControlPlaneDir, "routing"), + ). + WithData(servicemesh.ClusterDetails). + PostConditions( + feature.WaitForPodsToBeReady(serviceMeshSpec.ControlPlane.Namespace), + ). + Load() + if err != nil { + return err + } - f.Features = append(f.Features, dataScienceProjects) - - extAuthz, err := feature.CreateFeature("service-mesh-control-plane-setup-external-authorization"). - For(dscispec, origin). - Manifests( - path.Join(feature.AuthDir, "auth-smm.tmpl"), - path.Join(feature.AuthDir, "base"), - path.Join(feature.AuthDir, "rbac"), - path.Join(feature.AuthDir, "mesh-authz-ext-provider.patch.tmpl"), - ). - WithData(servicemesh.ClusterDetails). - PreConditions( - feature.EnsureCRDIsInstalled("authconfigs.authorino.kuadrant.io"), - servicemesh.EnsureServiceMeshInstalled, - feature.CreateNamespaceIfNotExists(serviceMeshSpec.Auth.Namespace), - ). - PostConditions( - feature.WaitForPodsToBeReady(serviceMeshSpec.ControlPlane.Namespace), - feature.WaitForPodsToBeReady(serviceMeshSpec.Auth.Namespace), - func(f *feature.Feature) error { - // We do not have the control over deployment resource creation. - // It is created by Authorino operator using Authorino CR - // - // To make it part of Service Mesh we have to patch it with injection - // enabled instead, otherwise it will not have proxy pod injected. - return f.ApplyManifest(path.Join(feature.AuthDir, "deployment.injection.patch.tmpl")) - }, - ). - OnDelete(servicemesh.RemoveExtensionProvider). - Load() - - if err != nil { - return err - } + s.Features = append(s.Features, gatewayRoute) + + dataScienceProjects, err := feature.CreateFeature("app-migrate-data-science-projects"). + For(dscispec, origin). + WithResources(servicemesh.MigratedDataScienceProjects). + Load() - f.Features = append(f.Features, extAuthz) + if err != nil { + return err + } - return nil + s.Features = append(s.Features, dataScienceProjects) + + extAuthz, err := feature.CreateFeature("service-mesh-control-plane-setup-external-authorization"). + For(dscispec, origin). + Manifests( + path.Join(feature.AuthDir, "auth-smm.tmpl"), + path.Join(feature.AuthDir, "base"), + path.Join(feature.AuthDir, "rbac"), + path.Join(feature.AuthDir, "mesh-authz-ext-provider.patch.tmpl"), + ). + WithData(servicemesh.ClusterDetails). + PreConditions( + feature.EnsureCRDIsInstalled("authconfigs.authorino.kuadrant.io"), + servicemesh.EnsureServiceMeshInstalled, + feature.CreateNamespaceIfNotExists(serviceMeshSpec.Auth.Namespace), + ). + PostConditions( + feature.WaitForPodsToBeReady(serviceMeshSpec.ControlPlane.Namespace), + feature.WaitForPodsToBeReady(serviceMeshSpec.Auth.Namespace), + func(f *feature.Feature) error { + // We do not have the control over deployment resource creation. + // It is created by Authorino operator using Authorino CR + // + // To make it part of Service Mesh we have to patch it with injection + // enabled instead, otherwise it will not have proxy pod injected. + return f.ApplyManifest(path.Join(feature.AuthDir, "deployment.injection.patch.tmpl")) + }, + ). + OnDelete(servicemesh.RemoveExtensionProvider). + Load() + + if err != nil { + return err + } + + s.Features = append(s.Features, extAuthz) + + return nil + } } func (r *DSCInitializationReconciler) configureServiceMesh(instance *dsciv1.DSCInitialization) error { diff --git a/tests/assertions/gomega_matchers.go b/tests/assertions/gomega_matchers.go index b6b3fed67fd..32f53cfed14 100644 --- a/tests/assertions/gomega_matchers.go +++ b/tests/assertions/gomega_matchers.go @@ -9,7 +9,7 @@ import ( corev1 "k8s.io/api/core/v1" ) -var _ types.GomegaMatcher = (*HaveConditionMatcher)(nil) //nolint:ireturn //reason false-positive. HaveConditionMatcher is a struct, not an interface. +var _ types.GomegaMatcher = (*HaveConditionMatcher)(nil) func HaveCondition(conditionType conditionsv1.ConditionType, conditionStatus corev1.ConditionStatus, reason string) *HaveConditionMatcher { return &HaveConditionMatcher{ diff --git a/tests/envtestutil/utils.go b/tests/envtestutil/utils.go index 8ce4487ae0b..367b690b706 100644 --- a/tests/envtestutil/utils.go +++ b/tests/envtestutil/utils.go @@ -30,7 +30,7 @@ func FindProjectRoot() (string, error) { return "", fmt.Errorf("project root not found") } -// NewOrigin creates an origin object with specified component and name +// NewOrigin creates an origin object with specified component and name. func NewOrigin(component featurev1.OwnerType, name string) featurev1.Origin { return featurev1.Origin{ Type: component,