diff --git a/api/v1alpha1/clusterextension_types.go b/api/v1alpha1/clusterextension_types.go index 557c0570d..907e762d1 100644 --- a/api/v1alpha1/clusterextension_types.go +++ b/api/v1alpha1/clusterextension_types.go @@ -110,7 +110,6 @@ const ( ReasonUnpackPending = "UnpackPending" ReasonUnpackSuccess = "UnpackSuccess" ReasonUnpackFailed = "UnpackFailed" - ReasonUnpacking = "Unpacking" ReasonErrorGettingReleaseState = "ErrorGettingReleaseState" ReasonCreateDynamicWatchFailed = "CreateDynamicWatchFailed" @@ -142,7 +141,6 @@ func init() { ReasonHasValidBundleUnknown, ReasonUnpackPending, ReasonUnpackSuccess, - ReasonUnpacking, ReasonUnpackFailed, ReasonErrorGettingReleaseState, ReasonCreateDynamicWatchFailed, diff --git a/cmd/manager/main.go b/cmd/manager/main.go index 1dc2724b6..5d2847b0b 100644 --- a/cmd/manager/main.go +++ b/cmd/manager/main.go @@ -41,6 +41,8 @@ import ( helmclient "github.com/operator-framework/helm-operator-plugins/pkg/client" "github.com/operator-framework/rukpak/pkg/finalizer" + registryv1handler "github.com/operator-framework/rukpak/pkg/handler" + "github.com/operator-framework/rukpak/pkg/provisioner/registry" "github.com/operator-framework/rukpak/pkg/source" "github.com/operator-framework/rukpak/pkg/storage" @@ -48,7 +50,6 @@ import ( "github.com/operator-framework/operator-controller/internal/catalogmetadata/cache" catalogclient "github.com/operator-framework/operator-controller/internal/catalogmetadata/client" "github.com/operator-framework/operator-controller/internal/controllers" - "github.com/operator-framework/operator-controller/internal/handler" "github.com/operator-framework/operator-controller/internal/labels" "github.com/operator-framework/operator-controller/internal/version" "github.com/operator-framework/operator-controller/pkg/features" @@ -198,8 +199,8 @@ func main() { ActionClientGetter: acg, Unpacker: unpacker, Storage: localStorage, - Handler: handler.HandlerFunc(handler.HandleClusterExtension), InstalledBundleGetter: &controllers.DefaultInstalledBundleGetter{ActionClientGetter: acg}, + Handler: registryv1handler.HandlerFunc(registry.HandleBundleDeployment), }).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "ClusterExtension") os.Exit(1) diff --git a/go.mod b/go.mod index af793b05e..7a60d5972 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/operator-framework/catalogd v0.12.0 github.com/operator-framework/helm-operator-plugins v0.2.2-0.20240520180534-f463c36fedf9 github.com/operator-framework/operator-registry v1.43.1 - github.com/operator-framework/rukpak v0.22.0 + github.com/operator-framework/rukpak v0.23.1 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.9.0 go.uber.org/zap v1.27.0 @@ -26,7 +26,6 @@ require ( k8s.io/component-base v0.30.1 k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 sigs.k8s.io/controller-runtime v0.18.3 - sigs.k8s.io/yaml v1.4.0 ) require ( @@ -248,4 +247,5 @@ require ( sigs.k8s.io/kustomize/api v0.15.0 // indirect sigs.k8s.io/kustomize/kyaml v0.15.0 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) diff --git a/go.sum b/go.sum index 66cf78fc8..1c6b05bce 100644 --- a/go.sum +++ b/go.sum @@ -483,8 +483,8 @@ github.com/operator-framework/operator-lib v0.14.0 h1:er+BgZymZD1im2wytLJiPLZpGA github.com/operator-framework/operator-lib v0.14.0/go.mod h1:wUu4Xb9xzXnIpglvaZ3yucTMSlqGXHIoUEH9+5gWiu0= github.com/operator-framework/operator-registry v1.43.1 h1:ACahVHGIL/hINBXd3RKWqSFR5SmSM6L5/n9xXqpR51s= github.com/operator-framework/operator-registry v1.43.1/go.mod h1:qhssAIYWXDIW+nTg0C5i4iD9zpMtiXtfXqGUuUmGz5c= -github.com/operator-framework/rukpak v0.22.0 h1:1Msvw6w833nDapAX9N9whoIqJ2p+BKCmPs1Sh/G+W3U= -github.com/operator-framework/rukpak v0.22.0/go.mod h1:DrQRNduAm0DWRSXpFhz8FA5g2GrJJ88sWpG5GiWmvPU= +github.com/operator-framework/rukpak v0.23.1 h1:lam6+wysaVjZVpMdtl7DUbc+8ibCdlCfp+nB62K0aSU= +github.com/operator-framework/rukpak v0.23.1/go.mod h1:DrQRNduAm0DWRSXpFhz8FA5g2GrJJ88sWpG5GiWmvPU= github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w= github.com/otiai10/mint v1.5.1 h1:XaPLeE+9vGbuyEHem1JNk3bYc7KKqyI/na0/mLd/Kks= diff --git a/internal/controllers/clusterextension_controller.go b/internal/controllers/clusterextension_controller.go index d1f35acfd..83d1fc8e8 100644 --- a/internal/controllers/clusterextension_controller.go +++ b/internal/controllers/clusterextension_controller.go @@ -63,6 +63,7 @@ import ( "github.com/operator-framework/operator-registry/alpha/declcfg" "github.com/operator-framework/operator-registry/alpha/property" rukpakv1alpha2 "github.com/operator-framework/rukpak/api/v1alpha2" + registryv1handler "github.com/operator-framework/rukpak/pkg/handler" helmpredicate "github.com/operator-framework/rukpak/pkg/helm-operator-plugins/predicate" rukpaksource "github.com/operator-framework/rukpak/pkg/source" "github.com/operator-framework/rukpak/pkg/storage" @@ -73,7 +74,6 @@ import ( catalogfilter "github.com/operator-framework/operator-controller/internal/catalogmetadata/filter" catalogsort "github.com/operator-framework/operator-controller/internal/catalogmetadata/sort" "github.com/operator-framework/operator-controller/internal/conditionsets" - "github.com/operator-framework/operator-controller/internal/handler" "github.com/operator-framework/operator-controller/internal/labels" ) @@ -85,7 +85,7 @@ type ClusterExtensionReconciler struct { Unpacker rukpaksource.Unpacker ActionClientGetter helmclient.ActionClientGetter Storage storage.Storage - Handler handler.Handler + Handler registryv1handler.Handler dynamicWatchMutex sync.RWMutex dynamicWatchGVKs map[schema.GroupVersionKind]struct{} controller crcontroller.Controller @@ -248,11 +248,6 @@ func (r *ClusterExtensionReconciler) reconcile(ctx context.Context, ext *ocv1alp setHasValidBundleUnknown(ext, "unpack pending") setInstalledStatusConditionUnknown(ext, "installation has not been attempted as unpack is pending") - return ctrl.Result{}, nil - case rukpaksource.StateUnpacking: - setStatusUnpacking(ext, unpackResult.Message) - setHasValidBundleUnknown(ext, "unpack pending") - setInstalledStatusConditionUnknown(ext, "installation has not been attempted as unpack is pending") return ctrl.Result{}, nil case rukpaksource.StateUnpacked: // TODO: Add finalizer to clean the stored bundles, after https://github.com/operator-framework/rukpak/pull/897 @@ -274,7 +269,7 @@ func (r *ClusterExtensionReconciler) reconcile(ctx context.Context, ext *ocv1alp return ctrl.Result{}, err } - chrt, values, err := r.Handler.Handle(ctx, bundleFS, ext) + chrt, values, err := r.Handler.Handle(ctx, bundleFS, bd) if err != nil { setInstalledStatusConditionFailed(ext, err.Error()) return ctrl.Result{}, err @@ -533,6 +528,7 @@ func (r *ClusterExtensionReconciler) generateBundleDeploymentForUnpack(bundlePat UID: ce.UID, }, Spec: rukpakv1alpha2.BundleDeploymentSpec{ + InstallNamespace: ce.Spec.InstallNamespace, Source: rukpakv1alpha2.BundleSource{ Type: rukpakv1alpha2.SourceTypeImage, Image: &rukpakv1alpha2.ImageSource{ diff --git a/internal/controllers/common_controller.go b/internal/controllers/common_controller.go index ab99574da..31c0d0685 100644 --- a/internal/controllers/common_controller.go +++ b/internal/controllers/common_controller.go @@ -152,18 +152,6 @@ func setStatusUnpackPending(ext *ocv1alpha1.ClusterExtension, message string) { }) } -// TODO: verify if we need to update the installBundle status or leave it as is. -func setStatusUnpacking(ext *ocv1alpha1.ClusterExtension, message string) { - ext.Status.InstalledBundle = nil - apimeta.SetStatusCondition(&ext.Status.Conditions, metav1.Condition{ - Type: ocv1alpha1.TypeUnpacked, - Status: metav1.ConditionFalse, - Reason: ocv1alpha1.ReasonUnpacking, - Message: message, - ObservedGeneration: ext.GetGeneration(), - }) -} - func setStatusUnpacked(ext *ocv1alpha1.ClusterExtension, message string) { apimeta.SetStatusCondition(&ext.Status.Conditions, metav1.Condition{ Type: ocv1alpha1.TypeUnpacked, diff --git a/internal/handler/interfaces.go b/internal/handler/interfaces.go deleted file mode 100644 index 2bdd502af..000000000 --- a/internal/handler/interfaces.go +++ /dev/null @@ -1,21 +0,0 @@ -package handler - -import ( - "context" - "io/fs" - - "helm.sh/helm/v3/pkg/chart" - "helm.sh/helm/v3/pkg/chartutil" - - ocv1alpha1 "github.com/operator-framework/operator-controller/api/v1alpha1" -) - -type Handler interface { - Handle(context.Context, fs.FS, *ocv1alpha1.ClusterExtension) (*chart.Chart, chartutil.Values, error) -} - -type HandlerFunc func(context.Context, fs.FS, *ocv1alpha1.ClusterExtension) (*chart.Chart, chartutil.Values, error) - -func (f HandlerFunc) Handle(ctx context.Context, fsys fs.FS, bd *ocv1alpha1.ClusterExtension) (*chart.Chart, chartutil.Values, error) { - return f(ctx, fsys, bd) -} diff --git a/internal/handler/registry.go b/internal/handler/registry.go deleted file mode 100644 index 9761358f8..000000000 --- a/internal/handler/registry.go +++ /dev/null @@ -1,105 +0,0 @@ -package handler - -import ( - "context" - "crypto/sha256" - "errors" - "fmt" - "io/fs" - "path/filepath" - - "helm.sh/helm/v3/pkg/chart" - "helm.sh/helm/v3/pkg/chartutil" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/yaml" - - "github.com/operator-framework/rukpak/pkg/convert" - "github.com/operator-framework/rukpak/pkg/util" - - ocv1alpha1 "github.com/operator-framework/operator-controller/api/v1alpha1" -) - -const ( - manifestsDir = "manifests" -) - -func HandleClusterExtension(_ context.Context, fsys fs.FS, ext *ocv1alpha1.ClusterExtension) (*chart.Chart, chartutil.Values, error) { - plainFS, err := convert.RegistryV1ToPlain(fsys, ext.Spec.InstallNamespace, nil) - if err != nil { - return nil, nil, fmt.Errorf("convert registry+v1 bundle to plain+v0 bundle: %v", err) - } - if err := ValidateBundle(plainFS); err != nil { - return nil, nil, err - } - - chrt, err := chartFromBundle(plainFS) - if err != nil { - return nil, nil, err - } - return chrt, nil, nil -} - -func ValidateBundle(fsys fs.FS) error { - objects, err := getBundleObjects(fsys) - if err != nil { - return fmt.Errorf("get objects from bundle manifests: %v", err) - } - if len(objects) == 0 { - return errors.New("invalid bundle: found zero objects: plain+v0 bundles are required to contain at least one object") - } - return nil -} - -func getBundleObjects(bundleFS fs.FS) ([]client.Object, error) { - entries, err := fs.ReadDir(bundleFS, manifestsDir) - if err != nil { - return nil, err - } - - var bundleObjects []client.Object - for _, e := range entries { - if e.IsDir() { - return nil, fmt.Errorf("subdirectories are not allowed within the %q directory of the bundle image filesystem: found %q", manifestsDir, filepath.Join(manifestsDir, e.Name())) - } - - manifestObjects, err := getObjects(bundleFS, e) - if err != nil { - return nil, err - } - bundleObjects = append(bundleObjects, manifestObjects...) - } - return bundleObjects, nil -} - -func getObjects(bundle fs.FS, manifest fs.DirEntry) ([]client.Object, error) { - manifestPath := filepath.Join(manifestsDir, manifest.Name()) - manifestReader, err := bundle.Open(manifestPath) - if err != nil { - return nil, err - } - defer manifestReader.Close() - return util.ManifestObjects(manifestReader, manifestPath) -} - -func chartFromBundle(fsys fs.FS) (*chart.Chart, error) { - objects, err := getBundleObjects(fsys) - if err != nil { - return nil, fmt.Errorf("read bundle objects from bundle: %v", err) - } - - chrt := &chart.Chart{ - Metadata: &chart.Metadata{}, - } - for _, obj := range objects { - yamlData, err := yaml.Marshal(obj) - if err != nil { - return nil, err - } - hash := sha256.Sum256(yamlData) - chrt.Templates = append(chrt.Templates, &chart.File{ - Name: fmt.Sprintf("object-%x.yaml", hash[0:8]), - Data: yamlData, - }) - } - return chrt, nil -}