diff --git a/hack/build/build-manifests.sh b/hack/build/build-manifests.sh index 6c7496ec2..9dda04df3 100755 --- a/hack/build/build-manifests.sh +++ b/hack/build/build-manifests.sh @@ -49,6 +49,7 @@ generateResourceManifest $generator $MANIFEST_GENERATED_DIR "operator-rbac" "rba generateResourceManifest $generator $MANIFEST_GENERATED_DIR "operator-deployment" "cdi-operator-deployment.yaml" generateResourceManifest $generator $MANIFEST_GENERATED_DIR "operator-cdi-crd" "cdi-crd.yaml" generateResourceManifest $generator $MANIFEST_GENERATED_DIR "operator-configmap-cr" "cdi-configmap-cr.yaml" +generateResourceManifest $generator $MANIFEST_GENERATED_DIR "operator-csv" "cdi-operator-csv.yaml" #process templated manifests and populate them with generated manifests tempDir=${MANIFEST_TEMPLATE_DIR} diff --git a/manifests/templates/release/olm/bundle/cdioperator.VERSION.csv.yaml.in b/manifests/templates/release/olm/bundle/cdioperator.VERSION.csv.yaml.in index 56231eb8d..f5d52bea7 100644 --- a/manifests/templates/release/olm/bundle/cdioperator.VERSION.csv.yaml.in +++ b/manifests/templates/release/olm/bundle/cdioperator.VERSION.csv.yaml.in @@ -1,126 +1 @@ -apiVersion: operators.coreos.com/v1alpha1 -kind: ClusterServiceVersion -metadata: - name: cdioperator.{{.CsvVersion}} - namespace: placeholder - annotations: - capabilities: "Full Lifecycle" - categories: "Storage,Virtualization" - alm-examples: | - [ - { - "apiVersion":"cdi.kubevirt.io/v1alpha1", - "kind":"CDI", - "metadata": { - "name":"cdi", - "namespace":"cdi" - }, - "spec": { - "imagePullPolicy":"IfNotPresent" - } - } - ] - description: Creates and maintains CDI deployments -spec: - displayName: CDI - description: | - CDI is a kubernetes extension that provides the ability to populate PVCs with VM images upon creation. Multiple image formats and sources are supported - - _The CDI Operator does not support updates yet._ - keywords: - - CDI - - Virtualization - - Storage - version: {{.CsvVersion}} - maturity: alpha -{{.ReplacesCsvVersion}} - maintainers: - - name: KubeVirt project - email: kubevirt-dev@googlegroups.com - provider: - name: KubeVirt/CDI project - links: - - name: CDI - url: https://github.com/kubevirt/containerized-data-importer/blob/master/README.md - - name: Source Code - url: https://github.com/kubevirt/containerized-data-importer - icon: - - base64data: {{.CDILogo}} - mediatype: image/png - labels: - alm-owner-cdi: cdi-operator - operated-by: cdi-operator - selector: - matchLabels: - alm-owner-cdi: cdi-operator - operated-by: cdi-operator - installModes: - - type: OwnNamespace - supported: true - - type: SingleNamespace - supported: true - - type: MultiNamespace - supported: true - - type: AllNamespaces - supported: true - install: - strategy: deployment - spec: - clusterPermissions: - - serviceAccountName: cdi-operator - rules: -{{.OperatorRules}} - deployments: - - name: cdi-operator - spec: -{{.OperatorDeploymentSpec}} - customresourcedefinitions: - owned: - - name: cdis.cdi.kubevirt.io - version: v1alpha1 - kind: CDI - displayName: CDI deployment - description: Represents a CDI deployment. - resources: - - kind: ConfigMap - name: cdi-operator-leader-election-helper - version: v1 - specDescriptors: - - description: The ImageRegistry to use for the CDI components. - displayName: ImageRegistry - path: imageRegistry - x-descriptors: - - 'urn:alm:descriptor:text' - - description: The ImageTag to use for the CDI components. - displayName: ImageTag - path: imageTag - x-descriptors: - - 'urn:alm:descriptor:text' - - description: The ImagePullPolicy to use for the CDI components. - displayName: ImagePullPolicy - path: imagePullPolicy - x-descriptors: - - 'urn:alm:descriptor:io.kubernetes:imagePullPolicy' - statusDescriptors: - - description: The deployment phase. - displayName: Phase - path: phase - x-descriptors: - - 'urn:alm:descriptor:io.kubernetes.phase' - - description: Explanation for the current status of the CDI deployment. - displayName: Condition - path: CDICondition - x-descriptors: - - 'urn:alm:descriptor:io.kubernetes.conditions' - - description: The observed version of the CDI deployment. - displayName: Observed CDI Version - path: observedVersion - - 'urn:alm:descriptor:text' - - description: The targeted version of the CDI deployment. - displayName: Target CDI Version - path: targetVersion - - 'urn:alm:descriptor:text' - - description: The version of the CDI Operator. - displayName: CDI Operator Version - path: operatorVersion - - 'urn:alm:descriptor:text' +{{index .GeneratedManifests "cdi-operator-csv.yaml"}} diff --git a/pkg/operator/resources/operator/factory.go b/pkg/operator/resources/operator/factory.go index fdfb41084..086bf6bc3 100644 --- a/pkg/operator/resources/operator/factory.go +++ b/pkg/operator/resources/operator/factory.go @@ -39,6 +39,9 @@ type FactoryArgs struct { Verbosity string `required:"true"` PullPolicy string `required:"true" split_words:"true"` Namespace string + CsvVersion string `required:"true"` + ReplacesCsvVersion string + CDILogo string } type operatorFactoryFunc func(*FactoryArgs) []runtime.Object @@ -52,6 +55,8 @@ const ( OperatorCdiCRD string = "operator-cdi-crd" //OperatorConfigMapCR - operartor configmap OperatorConfigMapCR string = "operator-configmap-cr" + //OperatorCSV - operator csv + OperatorCSV string = "operator-csv" ) var operatorFactoryFunctions = map[string]operatorFactoryFunc{ @@ -59,6 +64,7 @@ var operatorFactoryFunctions = map[string]operatorFactoryFunc{ OperatorDeployment: createOperatorClusterDeployment, OperatorCdiCRD: createOperatorCDIClusterResource, OperatorConfigMapCR: createOperatorConfigMapClusterResource, + OperatorCSV: createOperatorClusterServiceVersion, } //IsFactoryResource returns true id codeGroupo belolngs to factory functions diff --git a/pkg/operator/resources/operator/operator.go b/pkg/operator/resources/operator/operator.go index 59ff171c1..2507f6b47 100644 --- a/pkg/operator/resources/operator/operator.go +++ b/pkg/operator/resources/operator/operator.go @@ -637,6 +637,39 @@ func createPrometheusPorts() *[]corev1.ContainerPort { } } +func createOperatorClusterServiceVersion(args *FactoryArgs) []runtime.Object { + + cdiImageNames := CdiImages{ + ControllerImage: args.ControllerImage, + ImporterImage: args.ImporterImage, + ClonerImage: args.ClonerImage, + APIServerImage: args.APIServerImage, + UplodaProxyImage: args.UploadProxyImage, + UplodaServerImage: args.UploadServerImage, + OperatorImage: args.OperatorImage, + } + + data := NewClusterServiceVersionData{ + CsvVersion: args.CsvVersion, + ReplacesCsvVersion: args.ReplacesCsvVersion, + Namespace: args.Namespace, + ImagePullPolicy: args.PullPolicy, + IconBase64: args.CDILogo, + Verbosity: args.Verbosity, + + DockerPrefix: args.DockerRepo, + DockerTag: args.DockerTag, + CdiImageNames: cdiImageNames.FillDefaults(), + } + + csv, err := createClusterServiceVersion(&data) + if err != nil { + panic(err) + } + return []runtime.Object{csv} + +} + type csvClusterPermissions struct { ServiceAccountName string `json:"serviceAccountName"` Rules []rbacv1.PolicyRule `json:"rules"` diff --git a/tools/manifest-generator/manifest-generator.go b/tools/manifest-generator/manifest-generator.go index ba8fccba1..2a25ddb6d 100644 --- a/tools/manifest-generator/manifest-generator.go +++ b/tools/manifest-generator/manifest-generator.go @@ -16,7 +16,6 @@ import ( "bufio" "encoding/base64" "flag" - "fmt" "io/ioutil" "os" "path/filepath" @@ -61,6 +60,7 @@ var ( dockerRepo = flag.String("docker-repo", "", "") dockertag = flag.String("docker-tag", "", "") csvVersion = flag.String("csv-version", "", "") + replacesCsvVersion = flag.String("replaces-csv-version", "", "") cdiLogoPath = flag.String("cdi-logo-path", "", "") genManifestsPath = flag.String("generated-manifests-path", "", "") bundleOut = flag.String("olm-bundle-dir", "", "") @@ -95,6 +95,13 @@ func main() { }) if *templFile != "" { + if *replacesCsvVersion == "" { + var err error + *replacesCsvVersion, err = evalOlmCsvUpdateVersion(*templFile, *csvVersion, *bundleOut, *quayNamespace, *quayRepository) + if err != nil { + klog.Fatalf("Failed to evaluate CSV Replaces Version! %s, %v", *csvVersion, err) + } + } generateFromFile(*templFile) return } @@ -130,6 +137,10 @@ func getOperatorDeploymentSpec() string { UploadServerImage: *uploadServerImage, PullPolicy: *pullPolicy, Namespace: *namespace, + + CsvVersion: *csvVersion, + ReplacesCsvVersion: *replacesCsvVersion, + CDILogo: getCdiLogo(*cdiLogoPath), } spec := cdioperator.GetOperatorDeploymentSpec(args) @@ -183,7 +194,7 @@ func evalOlmCsvUpdateVersion(inFile, csvVersion, bundleOutDir, quayNamespace, qu if strings.HasSuffix(latestVersion, csvVersion) { klog.Fatalf("CSV version %s is already published!", csvVersion) } - replacesCsvVersion = fmt.Sprintf(" replaces: %v", latestVersion) + replacesCsvVersion = latestVersion // also copy old manifests to out dir if *bundleOut != "" { bundleHelper.AddOldManifests(bundleOutDir, csvVersion) @@ -217,11 +228,7 @@ func generateFromFile(templFile string) { } defer file.Close() - data.ReplacesCsvVersion, err = evalOlmCsvUpdateVersion(templFile, *csvVersion, *bundleOut, *quayNamespace, *quayRepository) - if err != nil { - klog.Fatalf("Failed to evaluate CSV Replaces Version! %s, %v", *csvVersion, err) - } - + data.ReplacesCsvVersion = *replacesCsvVersion data.QuayRepository = *quayRepository data.QuayNamespace = *quayNamespace data.OperatorRules = getOperatorRules() @@ -340,6 +347,10 @@ func getOperatorClusterResources(codeGroup string) ([]runtime.Object, error) { UploadServerImage: *uploadServerImage, PullPolicy: *pullPolicy, Namespace: *namespace, + + CsvVersion: *csvVersion, + ReplacesCsvVersion: *replacesCsvVersion, + CDILogo: getCdiLogo(*cdiLogoPath), } if codeGroup == ClusterResourcesCodeOperatorGroupEverything {