From 77534a3c2ef8959ba7de93fc6f59122ec9152646 Mon Sep 17 00:00:00 2001 From: Joe Lanford Date: Wed, 10 Apr 2024 15:57:16 -0400 Subject: [PATCH] add installNamespace field, remove watchNamespaces --- api/v1alpha2/bundledeployment_types.go | 25 ++++++++----- api/v1alpha2/zz_generated.deepcopy.go | 5 --- cmd/core/main.go | 17 ++++++++- cmd/helm/main.go | 16 +++++++- go.mod | 12 +++--- go.sum | 24 ++++++------ .../bundledeployment/bundledeployment.go | 37 +++++++------------ internal/convert/registryv1.go | 10 ++--- internal/convert/registryv1_test.go | 8 ++-- internal/provisioner/registry/registry.go | 3 +- .../core.rukpak.io_bundledeployments.yaml | 27 ++++++-------- test/e2e/api_validation_test.go | 7 ++++ test/e2e/helm_provisioner_test.go | 19 +++++++--- test/e2e/plain_provisioner_test.go | 27 +++++++++++++- test/e2e/registry_provisioner_test.go | 5 ++- test/e2e/webhook_test.go | 3 ++ 16 files changed, 149 insertions(+), 96 deletions(-) diff --git a/api/v1alpha2/bundledeployment_types.go b/api/v1alpha2/bundledeployment_types.go index 2e44be59..150c6a9a 100644 --- a/api/v1alpha2/bundledeployment_types.go +++ b/api/v1alpha2/bundledeployment_types.go @@ -47,21 +47,28 @@ const ( ReasonUpgradeFailed = "UpgradeFailed" ) -// Add limit to the number of watchNamespaces allowed, as the estimated cost of this rule is linear per BD. -//+kubebuilder:validation:XValidation:rule="!has(self.watchNamespaces) || size(self.watchNamespaces) <= 1 || (size(self.watchNamespaces) > 1 && !self.watchNamespaces.exists(e, e == ''))",message="Empty string not accepted if length of watchNamespaces is more than 1." - // BundleDeploymentSpec defines the desired state of BundleDeployment type BundleDeploymentSpec struct { //+kubebuilder:validation:Pattern:=^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - // ProvisionerClassName sets the name of the provisioner that should reconcile this BundleDeployment. + //+kubebuilder:validation:MaxLength:=63 + // + // installNamespace is the namespace where the bundle should be installed. However, note that + // the bundle may contain resources that are cluster-scoped or that are + // installed in a different namespace. This namespace is expected to exist. + InstallNamespace string `json:"installNamespace"` + + //+kubebuilder:validation:Pattern:=^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ + // + // provisionerClassName sets the name of the provisioner that should reconcile this BundleDeployment. ProvisionerClassName string `json:"provisionerClassName"` - // Source defines the configuration for the underlying Bundle content. + + // source defines the configuration for the underlying Bundle content. Source BundleSource `json:"source"` - // Config is provisioner specific configurations - // +kubebuilder:pruning:PreserveUnknownFields + + //+kubebuilder:pruning:PreserveUnknownFields + // + // config is provisioner specific configurations Config runtime.RawExtension `json:"config,omitempty"` - // watchNamespaces indicates which namespaces the operator should watch. - WatchNamespaces []string `json:"watchNamespaces,omitempty"` } // BundleDeploymentStatus defines the observed state of BundleDeployment diff --git a/api/v1alpha2/zz_generated.deepcopy.go b/api/v1alpha2/zz_generated.deepcopy.go index 26ffb4b2..7c12c15d 100644 --- a/api/v1alpha2/zz_generated.deepcopy.go +++ b/api/v1alpha2/zz_generated.deepcopy.go @@ -105,11 +105,6 @@ func (in *BundleDeploymentSpec) DeepCopyInto(out *BundleDeploymentSpec) { *out = *in in.Source.DeepCopyInto(&out.Source) in.Config.DeepCopyInto(&out.Config) - if in.WatchNamespaces != nil { - in, out := &in.WatchNamespaces, &out.WatchNamespaces - *out = make([]string, len(*in)) - copy(*out, *in) - } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BundleDeploymentSpec. diff --git a/cmd/core/main.go b/cmd/core/main.go index 5890f46d..414bd044 100644 --- a/cmd/core/main.go +++ b/cmd/core/main.go @@ -202,18 +202,31 @@ func main() { os.Exit(1) } - cfgGetter, err := helmclient.NewActionConfigGetter(mgr.GetConfig(), mgr.GetRESTMapper(), mgr.GetLogger()) + bdNamespaceMapper := func(obj client.Object) (string, error) { + bd, ok := obj.(*rukpakv1alpha2.BundleDeployment) + if !ok { + return "", fmt.Errorf("cannot derive namespace from object of type %T", obj) + } + return bd.Spec.InstallNamespace, nil + } + systemNamespaceMapper := func(obj client.Object) (string, error) { + return systemNamespace, nil + } + cfgGetter, err := helmclient.NewActionConfigGetter(mgr.GetConfig(), mgr.GetRESTMapper(), + helmclient.ClientNamespaceMapper(bdNamespaceMapper), + helmclient.StorageNamespaceMapper(systemNamespaceMapper), + ) if err != nil { setupLog.Error(err, "unable to create action config getter") os.Exit(1) } + acg, err := helmclient.NewActionClientGetter(cfgGetter) if err != nil { setupLog.Error(err, "unable to create action client getter") os.Exit(1) } commonBDProvisionerOptions := []bundledeployment.Option{ - bundledeployment.WithReleaseNamespace(systemNamespace), bundledeployment.WithActionClientGetter(acg), bundledeployment.WithFinalizers(bundleFinalizers), bundledeployment.WithStorage(bundleStorage), diff --git a/cmd/helm/main.go b/cmd/helm/main.go index 4200f9a3..e59387e2 100644 --- a/cmd/helm/main.go +++ b/cmd/helm/main.go @@ -194,7 +194,20 @@ func main() { os.Exit(1) } - cfgGetter, err := helmclient.NewActionConfigGetter(mgr.GetConfig(), mgr.GetRESTMapper(), mgr.GetLogger()) + bdNamespaceMapper := func(obj client.Object) (string, error) { + bd, ok := obj.(*rukpakv1alpha2.BundleDeployment) + if !ok { + return "", fmt.Errorf("cannot derive namespace from object of type %T", obj) + } + return bd.Spec.InstallNamespace, nil + } + systemNamespaceMapper := func(obj client.Object) (string, error) { + return systemNamespace, nil + } + cfgGetter, err := helmclient.NewActionConfigGetter(mgr.GetConfig(), mgr.GetRESTMapper(), + helmclient.ClientNamespaceMapper(bdNamespaceMapper), + helmclient.StorageNamespaceMapper(systemNamespaceMapper), + ) if err != nil { setupLog.Error(err, "unable to create action config getter") os.Exit(1) @@ -205,7 +218,6 @@ func main() { os.Exit(1) } commonBDProvisionerOptions := []bundledeployment.Option{ - bundledeployment.WithReleaseNamespace(systemNamespace), bundledeployment.WithFinalizers(bundleFinalizers), bundledeployment.WithActionClientGetter(acg), bundledeployment.WithStorage(bundleStorage), diff --git a/go.mod b/go.mod index 2bc22f9e..e0838ec2 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/onsi/ginkgo/v2 v2.17.2 github.com/onsi/gomega v1.33.0 github.com/operator-framework/api v0.23.0 - github.com/operator-framework/helm-operator-plugins v0.1.3 + github.com/operator-framework/helm-operator-plugins v0.1.4-0.20240423180823-6e9815980fce github.com/operator-framework/operator-registry v1.40.0 github.com/spf13/cobra v1.8.0 github.com/spf13/pflag v1.0.5 @@ -24,10 +24,10 @@ require ( k8s.io/api v0.29.3 k8s.io/apiextensions-apiserver v0.29.3 k8s.io/apimachinery v0.29.3 - k8s.io/cli-runtime v0.29.2 + k8s.io/cli-runtime v0.29.3 k8s.io/client-go v0.29.3 k8s.io/component-base v0.29.3 - k8s.io/kube-aggregator v0.29.2 + k8s.io/kube-aggregator v0.29.3 k8s.io/utils v0.0.0-20240102154912-e7106e64919e sigs.k8s.io/cli-utils v0.35.0 sigs.k8s.io/controller-runtime v0.17.3 @@ -156,9 +156,9 @@ require ( github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.18.0 // indirect + github.com/prometheus/client_golang v1.19.0 // indirect github.com/prometheus/client_model v0.6.0 // indirect - github.com/prometheus/common v0.47.0 // indirect + github.com/prometheus/common v0.48.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/rubenv/sql-migrate v1.5.2 // indirect @@ -213,7 +213,7 @@ require ( k8s.io/apiserver v0.29.3 // indirect k8s.io/klog/v2 v2.120.1 // indirect k8s.io/kube-openapi v0.0.0-20240221221325-2ac9dc51f3f1 // indirect - k8s.io/kubectl v0.29.2 // indirect + k8s.io/kubectl v0.29.3 // indirect oras.land/oras-go v1.2.5 // indirect sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.29.0 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect diff --git a/go.sum b/go.sum index b1b8040c..1d3a8e59 100644 --- a/go.sum +++ b/go.sum @@ -390,8 +390,8 @@ github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/operator-framework/api v0.23.0 h1:kHymOwcHBpBVujT49SKOCd4EVG7Odwj4wl3NbOR2LLA= github.com/operator-framework/api v0.23.0/go.mod h1:oKcFOz+Xc1UhMi2Pzcp6qsO7wjS4r+yP7EQprQBXrfM= -github.com/operator-framework/helm-operator-plugins v0.1.3 h1:nwl9K1Pq0NZmanpEF/DYO00S7QO/iAmEdRIuLROrYpk= -github.com/operator-framework/helm-operator-plugins v0.1.3/go.mod h1:f/AR6r2DiSRK5zv9MD+NgWbayP6qDbQMw+unFuw0rPQ= +github.com/operator-framework/helm-operator-plugins v0.1.4-0.20240423180823-6e9815980fce h1:IaABfXnczuqLZ9um2vnDAEgU2hdw9kLUudxlJUnE8ag= +github.com/operator-framework/helm-operator-plugins v0.1.4-0.20240423180823-6e9815980fce/go.mod h1:SJyyAVYkl3tqiTJl16mz0KbGv89NhPOOGRBeQb8S4Nw= github.com/operator-framework/operator-lib v0.12.0 h1:OzpMU5N7mvFgg/uje8FUUeD24Ahq64R6TdN25uswCYA= github.com/operator-framework/operator-lib v0.12.0/go.mod h1:ClpLUI7hctEF7F5DBe/kg041dq/4NLR7XC5tArY7bG4= github.com/operator-framework/operator-registry v1.40.0 h1:CaYNE4F/jzahpC7UCILItaIHmB5/oE0sS066nK+5Glw= @@ -416,8 +416,8 @@ github.com/poy/onpar v1.1.2/go.mod h1:6X8FLNoxyr9kkmnlqpK6LSoiOtrO6MICtWwEuWkLjz github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= -github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= +github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -425,8 +425,8 @@ github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZ github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.47.0 h1:p5Cz0FNHo7SnWOmWmoRozVcjEp0bIVU8cV7OShpjL1k= -github.com/prometheus/common v0.47.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= +github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= +github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= @@ -739,20 +739,20 @@ k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= k8s.io/apiserver v0.29.3 h1:xR7ELlJ/BZSr2n4CnD3lfA4gzFivh0wwfNfz9L0WZcE= k8s.io/apiserver v0.29.3/go.mod h1:hrvXlwfRulbMbBgmWRQlFru2b/JySDpmzvQwwk4GUOs= -k8s.io/cli-runtime v0.29.2 h1:smfsOcT4QujeghsNjECKN3lwyX9AwcFU0nvJ7sFN3ro= -k8s.io/cli-runtime v0.29.2/go.mod h1:KLisYYfoqeNfO+MkTWvpqIyb1wpJmmFJhioA0xd4MW8= +k8s.io/cli-runtime v0.29.3 h1:r68rephmmytoywkw2MyJ+CxjpasJDQY7AGc3XY2iv1k= +k8s.io/cli-runtime v0.29.3/go.mod h1:aqVUsk86/RhaGJwDhHXH0jcdqBrgdF3bZWk4Z9D4mkM= k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= k8s.io/component-base v0.29.3 h1:Oq9/nddUxlnrCuuR2K/jp6aflVvc0uDvxMzAWxnGzAo= k8s.io/component-base v0.29.3/go.mod h1:Yuj33XXjuOk2BAaHsIGHhCKZQAgYKhqIxIjIr2UXYio= k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-aggregator v0.29.2 h1:z9qJn5wlGmGaX6EfM7OEhr6fq6SBjDKR6tPRZ/qgxeY= -k8s.io/kube-aggregator v0.29.2/go.mod h1:QEuwzmMJJsg0eg1Gv+u4cWcYeJG2+8vN8/nTXBzopUo= +k8s.io/kube-aggregator v0.29.3 h1:5KvTyFN8sQq2imq8tMAHWEKoE64Zg9WSMaGX78KV6ps= +k8s.io/kube-aggregator v0.29.3/go.mod h1:xGJqV/SJJ1fbwTGfQLAZfwgqX1EMoaqfotDTkDrqqSk= k8s.io/kube-openapi v0.0.0-20240221221325-2ac9dc51f3f1 h1:rtdnaWfP40MTKv7izH81gkWpZB45pZrwIxyZdPSn1mI= k8s.io/kube-openapi v0.0.0-20240221221325-2ac9dc51f3f1/go.mod h1:Pa1PvrP7ACSkuX6I7KYomY6cmMA0Tx86waBhDUgoKPw= -k8s.io/kubectl v0.29.2 h1:uaDYaBhumvkwz0S2XHt36fK0v5IdNgL7HyUniwb2IUo= -k8s.io/kubectl v0.29.2/go.mod h1:BhizuYBGcKaHWyq+G7txGw2fXg576QbPrrnQdQDZgqI= +k8s.io/kubectl v0.29.3 h1:RuwyyIU42MAISRIePaa8Q7A3U74Q9P4MoJbDFz9o3us= +k8s.io/kubectl v0.29.3/go.mod h1:yCxfY1dbwgVdEt2zkJ6d5NNLOhhWgTyrqACIoFhpdd4= k8s.io/utils v0.0.0-20240102154912-e7106e64919e h1:eQ/4ljkx21sObifjzXwlPKpdGLrCfRziVtos3ofG/sQ= k8s.io/utils v0.0.0-20240102154912-e7106e64919e/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= oras.land/oras-go v1.2.5 h1:XpYuAwAb0DfQsunIyMfeET92emK8km3W4yEzZvUbsTo= diff --git a/internal/controllers/bundledeployment/bundledeployment.go b/internal/controllers/bundledeployment/bundledeployment.go index 78d68efd..3e54a014 100644 --- a/internal/controllers/bundledeployment/bundledeployment.go +++ b/internal/controllers/bundledeployment/bundledeployment.go @@ -101,12 +101,6 @@ func WithActionClientGetter(acg helmclient.ActionClientGetter) Option { } } -func WithReleaseNamespace(releaseNamespace string) Option { - return func(c *controller) { - c.releaseNamespace = releaseNamespace - } -} - func SetupWithManager(mgr manager.Manager, systemNamespace string, opts ...Option) error { c := &controller{ cl: mgr.GetClient(), @@ -159,9 +153,6 @@ func (c *controller) validateConfig() error { if c.finalizers == nil { errs = append(errs, errors.New("finalizer handler is unset")) } - if c.releaseNamespace == "" { - errs = append(errs, errors.New("release namespace is unset")) - } return utilerrors.NewAggregate(errs) } @@ -170,11 +161,10 @@ type controller struct { cl client.Client cache cache.Cache - handler Handler - provisionerID string - acg helmclient.ActionClientGetter - storage storage.Storage - releaseNamespace string + handler Handler + provisionerID string + acg helmclient.ActionClientGetter + storage storage.Storage unpacker unpackersource.Unpacker controller crcontroller.Controller @@ -307,9 +297,7 @@ func (c *controller) reconcile(ctx context.Context, bd *rukpakv1alpha2.BundleDep return ctrl.Result{}, err } - bd.SetNamespace(c.releaseNamespace) - cl, err := c.acg.ActionClientFor(bd) - bd.SetNamespace("") + cl, err := c.acg.ActionClientFor(ctx, bd) if err != nil { setInstalledAndHealthyFalse(bd, rukpakv1alpha2.ReasonErrorGettingClient, err.Error()) return ctrl.Result{}, err @@ -330,7 +318,7 @@ func (c *controller) reconcile(ctx context.Context, bd *rukpakv1alpha2.BundleDep switch state { case stateNeedsInstall: - rel, err = cl.Install(bd.Name, c.releaseNamespace, chrt, values, func(install *action.Install) error { + rel, err = cl.Install(bd.Name, bd.Spec.InstallNamespace, chrt, values, func(install *action.Install) error { install.CreateNamespace = false return nil }, helmclient.AppendInstallPostRenderer(post)) @@ -342,7 +330,7 @@ func (c *controller) reconcile(ctx context.Context, bd *rukpakv1alpha2.BundleDep return ctrl.Result{}, err } case stateNeedsUpgrade: - rel, err = cl.Upgrade(bd.Name, c.releaseNamespace, chrt, values, helmclient.AppendUpgradePostRenderer(post)) + rel, err = cl.Upgrade(bd.Name, bd.Spec.InstallNamespace, chrt, values, helmclient.AppendUpgradePostRenderer(post)) if err != nil { if isResourceNotFoundErr(err) { err = errRequiredResourceNotFound{err} @@ -453,15 +441,15 @@ const ( stateError releaseState = "Error" ) -func (c *controller) getReleaseState(cl helmclient.ActionInterface, obj metav1.Object, chrt *chart.Chart, values chartutil.Values, post *postrenderer) (*release.Release, releaseState, error) { - currentRelease, err := cl.Get(obj.GetName()) +func (c *controller) getReleaseState(cl helmclient.ActionInterface, bd *rukpakv1alpha2.BundleDeployment, chrt *chart.Chart, values chartutil.Values, post *postrenderer) (*release.Release, releaseState, error) { + currentRelease, err := cl.Get(bd.GetName()) if err != nil && !errors.Is(err, driver.ErrReleaseNotFound) { return nil, stateError, err } if errors.Is(err, driver.ErrReleaseNotFound) { return nil, stateNeedsInstall, nil } - desiredRelease, err := cl.Upgrade(obj.GetName(), c.releaseNamespace, chrt, values, func(upgrade *action.Upgrade) error { + desiredRelease, err := cl.Upgrade(bd.GetName(), bd.Spec.InstallNamespace, chrt, values, func(upgrade *action.Upgrade) error { upgrade.DryRun = true return nil }, helmclient.AppendUpgradePostRenderer(post)) @@ -504,7 +492,10 @@ func isResourceNotFoundErr(err error) bool { // An error that is bubbled up from the k8s.io/cli-runtime library // does not wrap meta.NoKindMatchError, so we need to fallback to // the use of string comparisons for now. - return strings.Contains(err.Error(), "no matches for kind") + if strings.Contains(err.Error(), "no matches for kind") { + return true + } + return strings.Contains(err.Error(), "the server could not find the requested resource") } type postrenderer struct { diff --git a/internal/convert/registryv1.go b/internal/convert/registryv1.go index 88e13f60..2d995e51 100644 --- a/internal/convert/registryv1.go +++ b/internal/convert/registryv1.go @@ -41,7 +41,7 @@ type Plain struct { Objects []client.Object } -func RegistryV1ToPlain(rv1 fs.FS, watchNamespaces []string) (fs.FS, error) { +func RegistryV1ToPlain(rv1 fs.FS, installNamespace string, watchNamespaces []string) (fs.FS, error) { reg := RegistryV1{} fileData, err := fs.ReadFile(rv1, filepath.Join("metadata", "annotations.yaml")) if err != nil { @@ -103,7 +103,7 @@ func RegistryV1ToPlain(rv1 fs.FS, watchNamespaces []string) (fs.FS, error) { } } - plain, err := Convert(reg, "", watchNamespaces) + plain, err := Convert(reg, installNamespace, watchNamespaces) if err != nil { return nil, err } @@ -290,11 +290,7 @@ func Convert(in RegistryV1, installNamespace string, targetNamespaces []string) clusterRoleBindings = append(clusterRoleBindings, newClusterRoleBinding(name, name, installNamespace, saName)) } - ns := &corev1.Namespace{ - TypeMeta: metav1.TypeMeta{Kind: "Namespace", APIVersion: "v1"}, - ObjectMeta: metav1.ObjectMeta{Name: installNamespace}, - } - objs := []client.Object{ns} + objs := []client.Object{} for _, obj := range serviceAccounts { obj := obj if obj.GetName() != "default" { diff --git a/internal/convert/registryv1_test.go b/internal/convert/registryv1_test.go index fdaf5619..362d8a6f 100644 --- a/internal/convert/registryv1_test.go +++ b/internal/convert/registryv1_test.go @@ -68,7 +68,7 @@ var _ = Describe("RegistryV1 Suite", func() { By("verifying if plain bundle has required objects") Expect(plainBundle).NotTo(BeNil()) - Expect(len(plainBundle.Objects)).To(BeEquivalentTo(2)) + Expect(plainBundle.Objects).To(HaveLen(1)) By("verifying if ns has been set correctly") resObj := containsObject(unstructuredSvc, plainBundle.Objects) @@ -94,7 +94,7 @@ var _ = Describe("RegistryV1 Suite", func() { By("verifying if plain bundle has required objects") Expect(plainBundle).NotTo(BeNil()) - Expect(len(plainBundle.Objects)).To(BeEquivalentTo(2)) + Expect(plainBundle.Objects).To(HaveLen(1)) By("verifying if ns has been set correctly") resObj := containsObject(unstructuredSvc, plainBundle.Objects) @@ -152,7 +152,7 @@ var _ = Describe("RegistryV1 Suite", func() { By("verifying if plain bundle has required objects") Expect(plainBundle).NotTo(BeNil()) - Expect(len(plainBundle.Objects)).To(BeEquivalentTo(2)) + Expect(plainBundle.Objects).To(HaveLen(1)) By("verifying if ns has been set correctly") resObj := containsObject(unstructuredpriorityclass, plainBundle.Objects) @@ -219,7 +219,7 @@ var _ = Describe("RegistryV1 Suite", func() { By("verifying if plain bundle has required objects") Expect(plainBundle).ShouldNot(BeNil()) - Expect(len(plainBundle.Objects)).To(BeEquivalentTo(7)) + Expect(plainBundle.Objects).To(HaveLen(6)) }) It("should error when multinamespace mode is supported with an empty string in target namespaces", func() { diff --git a/internal/provisioner/registry/registry.go b/internal/provisioner/registry/registry.go index 2dcd39a0..4db3e6ec 100644 --- a/internal/provisioner/registry/registry.go +++ b/internal/provisioner/registry/registry.go @@ -7,6 +7,7 @@ import ( "helm.sh/helm/v3/pkg/chart" "helm.sh/helm/v3/pkg/chartutil" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" rukpakv1alpha2 "github.com/operator-framework/rukpak/api/v1alpha2" "github.com/operator-framework/rukpak/internal/convert" @@ -19,7 +20,7 @@ const ( ) func HandleBundleDeployment(ctx context.Context, fsys fs.FS, bd *rukpakv1alpha2.BundleDeployment) (*chart.Chart, chartutil.Values, error) { - plainFS, err := convert.RegistryV1ToPlain(fsys, bd.Spec.WatchNamespaces) + plainFS, err := convert.RegistryV1ToPlain(fsys, bd.Spec.InstallNamespace, []string{metav1.NamespaceAll}) if err != nil { return nil, nil, fmt.Errorf("convert registry+v1 bundle to plain+v0 bundle: %v", err) } diff --git a/manifests/base/apis/crds/core.rukpak.io_bundledeployments.yaml b/manifests/base/apis/crds/core.rukpak.io_bundledeployments.yaml index e6003bdc..41e2dbf2 100644 --- a/manifests/base/apis/crds/core.rukpak.io_bundledeployments.yaml +++ b/manifests/base/apis/crds/core.rukpak.io_bundledeployments.yaml @@ -54,16 +54,24 @@ spec: description: BundleDeploymentSpec defines the desired state of BundleDeployment properties: config: - description: Config is provisioner specific configurations + description: config is provisioner specific configurations type: object x-kubernetes-preserve-unknown-fields: true + installNamespace: + description: |- + installNamespace is the namespace where the bundle should be installed. However, note that + the bundle may contain resources that are cluster-scoped or that are + installed in a different namespace. This namespace is expected to exist. + maxLength: 63 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ + type: string provisionerClassName: - description: ProvisionerClassName sets the name of the provisioner + description: provisionerClassName sets the name of the provisioner that should reconcile this BundleDeployment. pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string source: - description: Source defines the configuration for the underlying Bundle + description: source defines the configuration for the underlying Bundle content. properties: configMaps: @@ -220,22 +228,11 @@ spec: required: - type type: object - watchNamespaces: - description: watchNamespaces indicates which namespaces the operator - should watch. - items: - type: string - type: array required: + - installNamespace - provisionerClassName - source type: object - x-kubernetes-validations: - - message: Empty string not accepted if length of watchNamespaces is more - than 1. - rule: '!has(self.watchNamespaces) || size(self.watchNamespaces) <= 1 - || (size(self.watchNamespaces) > 1 && !self.watchNamespaces.exists(e, - e == ''''))' status: description: BundleDeploymentStatus defines the observed state of BundleDeployment properties: diff --git a/test/e2e/api_validation_test.go b/test/e2e/api_validation_test.go index b12cecad..6866c6b5 100644 --- a/test/e2e/api_validation_test.go +++ b/test/e2e/api_validation_test.go @@ -31,6 +31,7 @@ var _ = Describe("bundle api validation", func() { Name: "olm-crds-too-long-name-for-the-bundle-1234567890-1234567890", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeImage, @@ -66,6 +67,7 @@ var _ = Describe("bundle api validation", func() { Name: "bundlenamegit", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: "invalid source", @@ -109,6 +111,7 @@ var _ = Describe("bundle api validation", func() { Name: "bundlenamegit", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: "invalid source", @@ -142,6 +145,7 @@ var _ = Describe("bundle api validation", func() { Name: "bundlenamemorerefs", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeGit, @@ -182,6 +186,7 @@ var _ = Describe("bundle api validation", func() { Name: "bundlenamemorerefs", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeGit, @@ -223,6 +228,7 @@ var _ = Describe("bundle api validation", func() { Name: fmt.Sprintf("bundle-invalid-%s", rand.String(6)), }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: "invalid/class-name", Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeImage, @@ -260,6 +266,7 @@ var _ = Describe("bundle api validation", func() { Name: fmt.Sprintf("bd-invalid-%s", rand.String(6)), }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: "invalid/class-name", Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeImage, diff --git a/test/e2e/helm_provisioner_test.go b/test/e2e/helm_provisioner_test.go index ac9c6504..6c9a01c4 100644 --- a/test/e2e/helm_provisioner_test.go +++ b/test/e2e/helm_provisioner_test.go @@ -35,6 +35,7 @@ var _ = Describe("helm provisioner bundledeployment", func() { }, }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: helm.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeHTTP, @@ -74,7 +75,7 @@ var _ = Describe("helm provisioner bundledeployment", func() { deployment := &appsv1.Deployment{} Eventually(func() (*appsv1.DeploymentCondition, error) { - if err := c.Get(ctx, types.NamespacedName{Name: bd.GetName() + "-hello-world", Namespace: defaultSystemNamespace}, deployment); err != nil { + if err := c.Get(ctx, types.NamespacedName{Name: bd.GetName() + "-hello-world", Namespace: "default"}, deployment); err != nil { return nil, err } for _, c := range deployment.Status.Conditions { @@ -95,7 +96,7 @@ var _ = Describe("helm provisioner bundledeployment", func() { deployment := &appsv1.Deployment{} Eventually(func() error { - return c.Get(ctx, types.NamespacedName{Name: bd.GetName() + "-hello-world", Namespace: defaultSystemNamespace}, deployment) + return c.Get(ctx, types.NamespacedName{Name: bd.GetName() + "-hello-world", Namespace: "default"}, deployment) }).Should(Succeed()) By("deleting the deployment resource in the helm chart") @@ -103,7 +104,7 @@ var _ = Describe("helm provisioner bundledeployment", func() { By("verifying the deleted deployment resource in the helm chart gets recreated") Eventually(func() (*appsv1.DeploymentCondition, error) { - if err := c.Get(ctx, types.NamespacedName{Name: bd.GetName() + "-hello-world", Namespace: defaultSystemNamespace}, deployment); err != nil { + if err := c.Get(ctx, types.NamespacedName{Name: bd.GetName() + "-hello-world", Namespace: "default"}, deployment); err != nil { return nil, err } for _, c := range deployment.Status.Conditions { @@ -139,6 +140,7 @@ var _ = Describe("helm provisioner bundledeployment", func() { }, }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: helm.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeHTTP, @@ -185,6 +187,7 @@ var _ = Describe("helm provisioner bundledeployment", func() { GenerateName: "ahoy-", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: helm.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeHTTP, @@ -234,6 +237,7 @@ var _ = Describe("helm provisioner bundledeployment", func() { }, }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: helm.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeHTTP, @@ -283,6 +287,7 @@ var _ = Describe("helm provisioner bundledeployment", func() { }, }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: helm.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeGit, @@ -326,7 +331,7 @@ var _ = Describe("helm provisioner bundledeployment", func() { deployment := &appsv1.Deployment{} Eventually(func() (*appsv1.DeploymentCondition, error) { - if err := c.Get(ctx, types.NamespacedName{Name: bd.GetName() + "-hello-world", Namespace: defaultSystemNamespace}, deployment); err != nil { + if err := c.Get(ctx, types.NamespacedName{Name: bd.GetName() + "-hello-world", Namespace: "default"}, deployment); err != nil { return nil, err } for _, c := range deployment.Status.Conditions { @@ -354,7 +359,7 @@ var _ = Describe("helm provisioner bundledeployment", func() { deployment := &appsv1.Deployment{} Eventually(func() error { - return c.Get(ctx, types.NamespacedName{Name: bd.GetName() + "-hello-world", Namespace: defaultSystemNamespace}, deployment) + return c.Get(ctx, types.NamespacedName{Name: bd.GetName() + "-hello-world", Namespace: "default"}, deployment) }).Should(Succeed()) By("deleting the deployment resource in the helm chart") @@ -397,6 +402,7 @@ var _ = Describe("helm provisioner bundledeployment", func() { }, }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: helm.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeGit, @@ -450,6 +456,7 @@ var _ = Describe("helm provisioner bundledeployment", func() { }, }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: helm.ProvisionerID, Config: runtime.RawExtension{Raw: []byte(`{"values": "# Default values for hello-world.\n# This is a YAML-formatted file.\n# Declare variables to be passed into your templates.\nreplicaCount: 1\nimage:\n repository: nginx\n pullPolicy: IfNotPresent\n # Overrides the image tag whose default is the chart appVersion.\n tag: \"\"\nnameOverride: \"fromvalues\"\nfullnameOverride: \"\"\nserviceAccount:\n # Specifies whether a service account should be created\n create: true\n # Annotations to add to the service account\n annotations: {}\n # The name of the service account to use.\n # If not set and create is true, a name is generated using the fullname template\n name: \"\"\nservice:\n type: ClusterIP\n port: 80\n"}`)}, Source: rukpakv1alpha2.BundleSource{ @@ -487,7 +494,7 @@ var _ = Describe("helm provisioner bundledeployment", func() { deployment := &appsv1.Deployment{} Eventually(func() (*appsv1.DeploymentCondition, error) { - if err := c.Get(ctx, types.NamespacedName{Name: bd.GetName() + "-fromvalues", Namespace: defaultSystemNamespace}, deployment); err != nil { + if err := c.Get(ctx, types.NamespacedName{Name: bd.GetName() + "-fromvalues", Namespace: "default"}, deployment); err != nil { return nil, err } for _, c := range deployment.Status.Conditions { diff --git a/test/e2e/plain_provisioner_test.go b/test/e2e/plain_provisioner_test.go index 495897b0..fba55fe6 100644 --- a/test/e2e/plain_provisioner_test.go +++ b/test/e2e/plain_provisioner_test.go @@ -61,6 +61,7 @@ var _ = Describe("plain provisioner bundle", func() { GenerateName: "olm-crds-valid", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: "non-existent-class-name", Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeImage, @@ -101,6 +102,7 @@ var _ = Describe("plain provisioner bundle", func() { GenerateName: "olm-crds-valid", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeImage, @@ -189,6 +191,7 @@ var _ = Describe("plain provisioner bundle", func() { GenerateName: "olm-crds-valid", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeImage, @@ -256,6 +259,7 @@ var _ = Describe("plain provisioner bundle", func() { GenerateName: "olm-crds-invalid", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeImage, @@ -327,6 +331,7 @@ var _ = Describe("plain provisioner bundle", func() { GenerateName: "olm-crds-unsupported", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeImage, @@ -376,6 +381,7 @@ var _ = Describe("plain provisioner bundle", func() { GenerateName: "olm-crds-unsupported", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeImage, @@ -430,6 +436,7 @@ var _ = Describe("plain provisioner bundle", func() { GenerateName: "combo-git-commit", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeGit, @@ -479,6 +486,7 @@ var _ = Describe("plain provisioner bundle", func() { GenerateName: "combo-git-tag", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeGit, @@ -547,6 +555,7 @@ var _ = Describe("plain provisioner bundle", func() { GenerateName: "combo-git-branch", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeGit, @@ -615,6 +624,7 @@ var _ = Describe("plain provisioner bundle", func() { GenerateName: "combo-git-custom-dir", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeGit, @@ -686,6 +696,7 @@ var _ = Describe("plain provisioner bundle", func() { GenerateName: "combo-git-branch", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeGit, @@ -745,6 +756,7 @@ var _ = Describe("plain provisioner bundle", func() { GenerateName: "combo-git-branch", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeGit, @@ -833,6 +845,7 @@ var _ = Describe("plain provisioner bundle", func() { GenerateName: "combo-local-", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeConfigMaps, @@ -874,6 +887,7 @@ var _ = Describe("plain provisioner bundle", func() { GenerateName: "combo-local-", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeConfigMaps, @@ -950,6 +964,7 @@ var _ = Describe("plain provisioner bundle", func() { GenerateName: "combo-local-", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeConfigMaps, @@ -1005,6 +1020,7 @@ var _ = Describe("plain provisioner bundle", func() { GenerateName: "namespace-subdirs", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeImage, @@ -1053,6 +1069,7 @@ var _ = Describe("plain provisioner bundle", func() { GenerateName: "combo-git-commit", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeGit, @@ -1216,6 +1233,7 @@ var _ = Describe("plain provisioner bundle", func() { GenerateName: "e2e-bd-dependent-", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeImage, @@ -1246,7 +1264,7 @@ var _ = Describe("plain provisioner bundle", func() { WithTransform(func(c *metav1.Condition) metav1.ConditionStatus { return c.Status }, Equal(metav1.ConditionFalse)), WithTransform(func(c *metav1.Condition) string { return c.Reason }, Equal(rukpakv1alpha2.ReasonInstallFailed)), WithTransform(func(c *metav1.Condition) string { return c.Message }, - ContainSubstring(`no matches for kind "OperatorGroup" in version "operators.coreos.com/v1"`)), + ContainSubstring(`required resource not found`)), )) }) }) @@ -1263,6 +1281,7 @@ var _ = Describe("plain provisioner bundle", func() { GenerateName: "e2e-bd-providing-", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeImage, @@ -1311,6 +1330,7 @@ var _ = Describe("plain provisioner bundle", func() { GenerateName: "e2e-bd-crds-and-crs-", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeImage, @@ -1338,7 +1358,9 @@ var _ = Describe("plain provisioner bundle", func() { WithTransform(func(c *metav1.Condition) string { return c.Type }, Equal(rukpakv1alpha2.TypeInstalled)), WithTransform(func(c *metav1.Condition) metav1.ConditionStatus { return c.Status }, Equal(metav1.ConditionFalse)), WithTransform(func(c *metav1.Condition) string { return c.Reason }, Equal(rukpakv1alpha2.ReasonInstallFailed)), - WithTransform(func(c *metav1.Condition) string { return c.Message }, ContainSubstring(`no matches for kind "CatalogSource" in version "operators.coreos.com/v1alpha1"`)), + WithTransform(func(c *metav1.Condition) string { return c.Message }, + ContainSubstring(`required resource not found`), + ), )) }) }) @@ -1363,6 +1385,7 @@ var _ = Describe("plain provisioner bundle", func() { }, }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeImage, diff --git a/test/e2e/registry_provisioner_test.go b/test/e2e/registry_provisioner_test.go index a0f452f3..e45eb3a9 100644 --- a/test/e2e/registry_provisioner_test.go +++ b/test/e2e/registry_provisioner_test.go @@ -32,6 +32,7 @@ var _ = Describe("registry provisioner bundle", func() { }, }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: registryprovisioner.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeImage, @@ -59,9 +60,9 @@ var _ = Describe("registry provisioner bundle", func() { }).Should(And( Not(BeNil()), WithTransform(func(c *metav1.Condition) string { return c.Type }, Equal(rukpakv1alpha2.TypeInstalled)), + WithTransform(func(c *metav1.Condition) string { return c.Message }, ContainSubstring("Instantiated bundle")), WithTransform(func(c *metav1.Condition) metav1.ConditionStatus { return c.Status }, Equal(metav1.ConditionTrue)), WithTransform(func(c *metav1.Condition) string { return c.Reason }, Equal(rukpakv1alpha2.ReasonInstallationSucceeded)), - WithTransform(func(c *metav1.Condition) string { return c.Message }, ContainSubstring("Instantiated bundle")), )) }) }) @@ -81,6 +82,7 @@ var _ = Describe("registry provisioner bundle", func() { }, }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: registryprovisioner.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeImage, @@ -88,7 +90,6 @@ var _ = Describe("registry provisioner bundle", func() { Ref: fmt.Sprintf("%v/%v", ImageRepo, "registry:invalid"), }, }, - WatchNamespaces: []string{"test1"}, }, } err := c.Create(ctx, bd) diff --git a/test/e2e/webhook_test.go b/test/e2e/webhook_test.go index 571922e4..1977b8f7 100644 --- a/test/e2e/webhook_test.go +++ b/test/e2e/webhook_test.go @@ -30,6 +30,7 @@ var _ = Describe("bundle deployment api validating webhook", func() { GenerateName: "valid-bundle-", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeImage, @@ -65,6 +66,7 @@ var _ = Describe("bundle deployment api validating webhook", func() { Name: "bundlenamegit", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeGit, @@ -100,6 +102,7 @@ var _ = Describe("bundle deployment api validating webhook", func() { Name: "bundlenameimage", }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: "default", ProvisionerClassName: plain.ProvisionerID, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeImage,