diff --git a/BUILD.bazel b/BUILD.bazel index 46c80b2d74f6..2d4e244f8622 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -176,27 +176,27 @@ container_bundle( name = "build-images", images = { # cmd images - "$(container_prefix)/example-hook-sidecar:$(container_tag)": "//cmd/example-hook-sidecar:example-hook-sidecar-image", - "$(container_prefix)/example-cloudinit-hook-sidecar:$(container_tag)": "//cmd/example-cloudinit-hook-sidecar:example-cloudinit-hook-sidecar-image", - "$(container_prefix)/subresource-access-test:$(container_tag)": "//cmd/subresource-access-test:subresource-access-test-image", - "$(container_prefix)/virt-controller:$(container_tag)": "//cmd/virt-controller:virt-controller-image", - "$(container_prefix)/virt-launcher:$(container_tag)": "//cmd/virt-launcher:virt-launcher-image", - "$(container_prefix)/virt-handler:$(container_tag)": "//cmd/virt-handler:virt-handler-image", - "$(container_prefix)/virt-api:$(container_tag)": "//cmd/virt-api:virt-api-image", - "$(container_prefix)/virt-operator:$(container_tag)": "//cmd/virt-operator:virt-operator-image", + "$(container_prefix)/$(image_prefix)example-hook-sidecar:$(container_tag)": "//cmd/example-hook-sidecar:example-hook-sidecar-image", + "$(container_prefix)/$(image_prefix)example-cloudinit-hook-sidecar:$(container_tag)": "//cmd/example-cloudinit-hook-sidecar:example-cloudinit-hook-sidecar-image", + "$(container_prefix)/$(image_prefix)subresource-access-test:$(container_tag)": "//cmd/subresource-access-test:subresource-access-test-image", + "$(container_prefix)/$(image_prefix)virt-controller:$(container_tag)": "//cmd/virt-controller:virt-controller-image", + "$(container_prefix)/$(image_prefix)virt-launcher:$(container_tag)": "//cmd/virt-launcher:virt-launcher-image", + "$(container_prefix)/$(image_prefix)virt-handler:$(container_tag)": "//cmd/virt-handler:virt-handler-image", + "$(container_prefix)/$(image_prefix)virt-api:$(container_tag)": "//cmd/virt-api:virt-api-image", + "$(container_prefix)/$(image_prefix)virt-operator:$(container_tag)": "//cmd/virt-operator:virt-operator-image", # container-disk images - "$(container_prefix)/alpine-container-disk-demo:$(container_tag)": "//cmd/container-disk-v2alpha:alpine-container-disk-image", - "$(container_prefix)/cirros-container-disk-demo:$(container_tag)": "//cmd/container-disk-v2alpha:cirros-container-disk-image", - "$(container_prefix)/cirros-custom-container-disk-demo:$(container_tag)": "//cmd/container-disk-v2alpha:cirros-custom-container-disk-image", - "$(container_prefix)/fedora-cloud-container-disk-demo:$(container_tag)": "//cmd/container-disk-v2alpha:fedora-cloud-container-disk-image", - "$(container_prefix)/fedora30-cloud-container-disk-demo:$(container_tag)": "//cmd/container-disk-v2alpha:fedora30-cloud-container-disk-image", - "$(container_prefix)/virtio-container-disk:$(container_tag)": "//cmd/container-disk-v2alpha:virtio-container-disk-image", + "$(container_prefix)/$(image_prefix)alpine-container-disk-demo:$(container_tag)": "//cmd/container-disk-v2alpha:alpine-container-disk-image", + "$(container_prefix)/$(image_prefix)cirros-container-disk-demo:$(container_tag)": "//cmd/container-disk-v2alpha:cirros-container-disk-image", + "$(container_prefix)/$(image_prefix)cirros-custom-container-disk-demo:$(container_tag)": "//cmd/container-disk-v2alpha:cirros-custom-container-disk-image", + "$(container_prefix)/$(image_prefix)fedora-cloud-container-disk-demo:$(container_tag)": "//cmd/container-disk-v2alpha:fedora-cloud-container-disk-image", + "$(container_prefix)/$(image_prefix)fedora30-cloud-container-disk-demo:$(container_tag)": "//cmd/container-disk-v2alpha:fedora30-cloud-container-disk-image", + "$(container_prefix)/$(image_prefix)virtio-container-disk:$(container_tag)": "//cmd/container-disk-v2alpha:virtio-container-disk-image", # testing images - "$(container_prefix)/disks-images-provider:$(container_tag)": "//images/disks-images-provider:disks-images-provider-image", - "$(container_prefix)/cdi-http-import-server:$(container_tag)": "//images/cdi-http-import-server:cdi-http-import-server-image", - "$(container_prefix)/nfs-server:$(container_tag)": "//images/nfs-server:nfs-server-image", - "$(container_prefix)/vm-killer:$(container_tag)": "//images/vm-killer:vm-killer-image", - "$(container_prefix)/winrmcli:$(container_tag)": "//images/winrmcli:winrmcli-image", + "$(container_prefix)/$(image_prefix)disks-images-provider:$(container_tag)": "//images/disks-images-provider:disks-images-provider-image", + "$(container_prefix)/$(image_prefix)cdi-http-import-server:$(container_tag)": "//images/cdi-http-import-server:cdi-http-import-server-image", + "$(container_prefix)/$(image_prefix)nfs-server:$(container_tag)": "//images/nfs-server:nfs-server-image", + "$(container_prefix)/$(image_prefix)vm-killer:$(container_tag)": "//images/vm-killer:vm-killer-image", + "$(container_prefix)/$(image_prefix)winrmcli:$(container_tag)": "//images/winrmcli:winrmcli-image", }, ) diff --git a/Makefile b/Makefile index a1f822ea834f..40e91b302ed8 100644 --- a/Makefile +++ b/Makefile @@ -15,10 +15,10 @@ bazel-build: hack/dockerized "hack/bazel-fmt.sh && hack/bazel-build.sh" bazel-build-images: - hack/dockerized "DOCKER_PREFIX=${DOCKER_PREFIX} DOCKER_TAG=${DOCKER_TAG} DOCKER_TAG_ALT=${DOCKER_TAG_ALT} ./hack/bazel-build-images.sh" + hack/dockerized "DOCKER_PREFIX=${DOCKER_PREFIX} DOCKER_TAG=${DOCKER_TAG} DOCKER_TAG_ALT=${DOCKER_TAG_ALT} IMAGE_PREFIX=${IMAGE_PREFIX} IMAGE_PREFIX_ALT=${IMAGE_PREFIX_ALT} ./hack/bazel-build-images.sh" bazel-push-images: - hack/dockerized "hack/bazel-fmt.sh && DOCKER_PREFIX=${DOCKER_PREFIX} DOCKER_TAG=${DOCKER_TAG} DOCKER_TAG_ALT=${DOCKER_TAG_ALT} PUSH_LOG_FILE=${PUSH_LOG_FILE} KUBEVIRT_PROVIDER=${KUBEVIRT_PROVIDER} ./hack/bazel-push-images.sh" + hack/dockerized "hack/bazel-fmt.sh && DOCKER_PREFIX=${DOCKER_PREFIX} DOCKER_TAG=${DOCKER_TAG} DOCKER_TAG_ALT=${DOCKER_TAG_ALT} IMAGE_PREFIX=${IMAGE_PREFIX} IMAGE_PREFIX_ALT=${IMAGE_PREFIX_ALT} PUSH_LOG_FILE=${PUSH_LOG_FILE} KUBEVIRT_PROVIDER=${KUBEVIRT_PROVIDER} ./hack/bazel-push-images.sh" push: bazel-push-images @@ -103,7 +103,7 @@ cluster-down: ./cluster-up/down.sh cluster-build: - PUSH_LOG_FILE=${PUSH_LOG_FILE} ./hack/cluster-build.sh + ./hack/cluster-build.sh cluster-clean: ./hack/cluster-clean.sh diff --git a/hack/bazel-build-images.sh b/hack/bazel-build-images.sh index 2e76eb94b6bf..8503a6b91fe8 100755 --- a/hack/bazel-build-images.sh +++ b/hack/bazel-build-images.sh @@ -27,6 +27,18 @@ for tag in ${docker_tag} ${docker_tag_alt}; do --platforms=@io_bazel_rules_go//go/toolchain:linux_amd64 \ --workspace_status_command=./hack/print-workspace-status.sh \ --define container_prefix=${docker_prefix} \ + --define image_prefix=${image_prefix} \ --define container_tag=${tag} \ //:build-images done + +# for the imagePrefix operator test +if [[ $image_prefix_alt ]]; then + bazel build \ + --platforms=@io_bazel_rules_go//go/toolchain:linux_amd64 \ + --workspace_status_command=./hack/print-workspace-status.sh \ + --define container_prefix=${docker_prefix} \ + --define image_prefix=${image_prefix_alt} \ + --define container_tag=${docker_tag} \ + //:build-images +fi diff --git a/hack/bazel-push-images.sh b/hack/bazel-push-images.sh index ce52067fc41e..7ded3a84a8e2 100755 --- a/hack/bazel-push-images.sh +++ b/hack/bazel-push-images.sh @@ -27,6 +27,18 @@ for tag in ${docker_tag} ${docker_tag_alt}; do --platforms=@io_bazel_rules_go//go/toolchain:linux_amd64 \ --workspace_status_command=./hack/print-workspace-status.sh \ --define container_prefix=${docker_prefix} \ + --define image_prefix=${image_prefix} \ --define container_tag=${tag} \ //:push-images | tee $push_log_file done + +# for the imagePrefix operator test +if [[ $image_prefix_alt ]]; then + bazel run \ + --platforms=@io_bazel_rules_go//go/toolchain:linux_amd64 \ + --workspace_status_command=./hack/print-workspace-status.sh \ + --define container_prefix=${docker_prefix} \ + --define image_prefix=${image_prefix_alt} \ + --define container_tag=${docker_tag} \ + //:push-images +fi diff --git a/hack/build-manifests.sh b/hack/build-manifests.sh index 0e26cb8663bd..2ccb12e057f0 100755 --- a/hack/build-manifests.sh +++ b/hack/build-manifests.sh @@ -76,6 +76,7 @@ for arg in $args; do --cdi-namespace=${cdi_namespace} \ --csv-namespace=${csv_namespace} \ --container-prefix=${manifest_docker_prefix} \ + --image-prefix=${image_prefix} \ --container-tag=${docker_tag} \ --image-pull-policy=${image_pull_policy} \ --verbosity=${verbosity} \ diff --git a/hack/cluster-build.sh b/hack/cluster-build.sh index 5c1e4b2f0118..0f0afd73dedf 100755 --- a/hack/cluster-build.sh +++ b/hack/cluster-build.sh @@ -34,18 +34,26 @@ echo "Building ..." # Build everyting and publish it ${KUBEVIRT_PATH}hack/dockerized "DOCKER_PREFIX=${DOCKER_PREFIX} DOCKER_TAG=${DOCKER_TAG} KUBEVIRT_PROVIDER=${KUBEVIRT_PROVIDER} ./hack/bazel-build.sh" -${KUBEVIRT_PATH}hack/dockerized "DOCKER_PREFIX=${DOCKER_PREFIX} DOCKER_TAG=${DOCKER_TAG} DOCKER_TAG_ALT=${DOCKER_TAG_ALT} KUBEVIRT_PROVIDER=${KUBEVIRT_PROVIDER} PUSH_LOG_FILE=${PUSH_LOG_FILE} ./hack/bazel-push-images.sh" -${KUBEVIRT_PATH}hack/dockerized "DOCKER_PREFIX=${DOCKER_PREFIX} DOCKER_TAG=${DOCKER_TAG} KUBEVIRT_PROVIDER=${KUBEVIRT_PROVIDER} IMAGE_PULL_POLICY=${IMAGE_PULL_POLICY} VERBOSITY=${VERBOSITY} PUSH_LOG_FILE=${PUSH_LOG_FILE} ./hack/build-manifests.sh" +${KUBEVIRT_PATH}hack/dockerized "DOCKER_PREFIX=${DOCKER_PREFIX} DOCKER_TAG=${DOCKER_TAG} DOCKER_TAG_ALT=${DOCKER_TAG_ALT} KUBEVIRT_PROVIDER=${KUBEVIRT_PROVIDER} PUSH_LOG_FILE=${PUSH_LOG_FILE} IMAGE_PREFIX=${IMAGE_PREFIX} IMAGE_PREFIX_ALT=${IMAGE_PREFIX_ALT} ./hack/bazel-push-images.sh" +${KUBEVIRT_PATH}hack/dockerized "DOCKER_PREFIX=${DOCKER_PREFIX} DOCKER_TAG=${DOCKER_TAG} KUBEVIRT_PROVIDER=${KUBEVIRT_PROVIDER} IMAGE_PULL_POLICY=${IMAGE_PULL_POLICY} VERBOSITY=${VERBOSITY} PUSH_LOG_FILE=${PUSH_LOG_FILE} IMAGE_PREFIX=${IMAGE_PREFIX} IMAGE_PREFIX_ALT=${IMAGE_PREFIX_ALT} ./hack/build-manifests.sh" # Make sure that all nodes use the newest images container="" container_alias="" for arg in ${docker_images}; do - name=$(basename $arg) + name=${image_prefix}$(basename $arg) container="${container} ${manifest_docker_prefix}/${name}:${docker_tag} ${manifest_docker_prefix}/${name}:${docker_tag_alt}" container_alias="${container_alias} ${manifest_docker_prefix}/${name}:${docker_tag} kubevirt/${name}:${docker_tag}" done +if [[ $image_prefix_alt ]]; then + for arg in ${docker_images}; do + name=${image_prefix_alt}$(basename $arg) + container="${container} ${manifest_docker_prefix}/${name}:${docker_tag}" + container_alias="${container_alias} ${manifest_docker_prefix}/${name}:${docker_tag} kubevirt/${name}:${docker_tag}" + done +fi + # OKD provider has different node names and does not have docker if [[ $KUBEVIRT_PROVIDER =~ okd.* ]]; then nodes=("master-0" "worker-0") diff --git a/hack/config-default.sh b/hack/config-default.sh index a6462faebe9c..ea4229b4802d 100644 --- a/hack/config-default.sh +++ b/hack/config-default.sh @@ -2,6 +2,8 @@ binaries="cmd/virt-operator cmd/virt-controller cmd/virt-launcher cmd/virt-handl docker_images="cmd/virt-operator cmd/virt-controller cmd/virt-launcher cmd/virt-handler cmd/virt-api images/disks-images-provider images/vm-killer images/nfs-server cmd/subresource-access-test images/winrmcli cmd/example-hook-sidecar cmd/example-cloudinit-hook-sidecar images/cdi-http-import-server" docker_tag=${DOCKER_TAG:-latest} docker_tag_alt=${DOCKER_TAG_ALT} +image_prefix=${IMAGE_PREFIX} +image_prefix_alt=${IMAGE_PREFIX_ALT:-kv-} namespace=kubevirt csv_namespace=placeholder cdi_namespace=cdi diff --git a/hack/config.sh b/hack/config.sh index 500bee523644..a52f78e395e5 100644 --- a/hack/config.sh +++ b/hack/config.sh @@ -1,10 +1,10 @@ -unset binaries docker_images docker_tag docker_tag_alt manifest_templates \ +unset binaries docker_images docker_tag docker_tag_alt image_prefix image_prefix_alt manifest_templates \ namespace image_pull_policy verbosity \ csv_version package_name push_log_file source ${KUBEVIRT_PATH}hack/config-default.sh source ${KUBEVIRT_PATH}cluster-up/hack/config.sh -export binaries docker_images docker_tag docker_tag_alt manifest_templates \ +export binaries docker_images docker_tag docker_tag_alt image_prefix image_prefix_alt manifest_templates \ namespace image_pull_policy verbosity \ csv_version package_name push_log_file diff --git a/hack/functests.sh b/hack/functests.sh index 645b582f85a7..ef1e9e2d2f9a 100755 --- a/hack/functests.sh +++ b/hack/functests.sh @@ -21,6 +21,7 @@ set -e DOCKER_TAG=${DOCKER_TAG:-devel} DOCKER_TAG_ALT=${DOCKER_TAG_ALT:-devel_alt} + export ARTIFACTS=${ARTIFACTS:-_out/artifacts} source hack/common.sh @@ -44,4 +45,4 @@ if [[ ${KUBEVIRT_PROVIDER} == os-* ]] || [[ ${KUBEVIRT_PROVIDER} == okd-* ]]; th oc=${kubectl} fi -${TESTS_OUT_DIR}/tests.test -kubeconfig=${kubeconfig} -container-tag=${docker_tag} -container-tag-alt=${docker_tag_alt} -container-prefix=${functest_docker_prefix} -oc-path=${oc} -kubectl-path=${kubectl} -test.timeout 360m ${FUNC_TEST_ARGS} -installed-namespace=${namespace} -previous-release-tag=${previous_release_tag} -previous-release-registry=${previous_release_registry} +${TESTS_OUT_DIR}/tests.test -kubeconfig=${kubeconfig} -container-tag=${docker_tag} -container-tag-alt=${docker_tag_alt} -container-prefix=${functest_docker_prefix} -image-prefix-alt=${image_prefix_alt} -oc-path=${oc} -kubectl-path=${kubectl} -test.timeout 360m ${FUNC_TEST_ARGS} -installed-namespace=${namespace} -previous-release-tag=${previous_release_tag} -previous-release-registry=${previous_release_registry} diff --git a/pkg/virt-operator/creation/components/BUILD.bazel b/pkg/virt-operator/creation/components/BUILD.bazel index c3683d9b7e0e..1762038ed0b8 100644 --- a/pkg/virt-operator/creation/components/BUILD.bazel +++ b/pkg/virt-operator/creation/components/BUILD.bazel @@ -16,7 +16,6 @@ go_library( "//vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring:go_default_library", "//vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1:go_default_library", "//vendor/github.com/openshift/api/security/v1:go_default_library", - "//vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1:go_default_library", "//vendor/k8s.io/api/apps/v1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/policy/v1beta1:go_default_library", diff --git a/pkg/virt-operator/creation/components/deployments.go b/pkg/virt-operator/creation/components/deployments.go index 3408dcc5196b..74b9ad9f450d 100644 --- a/pkg/virt-operator/creation/components/deployments.go +++ b/pkg/virt-operator/creation/components/deployments.go @@ -22,10 +22,6 @@ import ( "fmt" "strings" - csvv1 "github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1" - - "kubevirt.io/kubevirt/pkg/virt-operator/creation/rbac" - appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" "k8s.io/api/policy/v1beta1" @@ -34,6 +30,7 @@ import ( "k8s.io/apimachinery/pkg/util/json" virtv1 "kubevirt.io/client-go/api/v1" + "kubevirt.io/kubevirt/pkg/virt-operator/creation/rbac" operatorutil "kubevirt.io/kubevirt/pkg/virt-operator/util" ) @@ -103,11 +100,7 @@ func NewApiServerService(namespace string) *corev1.Service { } } -func something() *csvv1.ClusterServiceVersion { - return &csvv1.ClusterServiceVersion{} -} - -func newPodTemplateSpec(name string, repository string, version string, pullPolicy corev1.PullPolicy, podAffinity *corev1.Affinity) (*corev1.PodTemplateSpec, error) { +func newPodTemplateSpec(podName string, imageName string, repository string, version string, pullPolicy corev1.PullPolicy, podAffinity *corev1.Affinity) (*corev1.PodTemplateSpec, error) { version = AddVersionSeparatorPrefix(version) @@ -119,21 +112,21 @@ func newPodTemplateSpec(name string, repository string, version string, pullPoli return &corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{ - virtv1.AppLabel: name, + virtv1.AppLabel: podName, "prometheus.kubevirt.io": "", }, Annotations: map[string]string{ "scheduler.alpha.kubernetes.io/critical-pod": "", "scheduler.alpha.kubernetes.io/tolerations": string(tolerations), }, - Name: name, + Name: podName, }, Spec: corev1.PodSpec{ Affinity: podAffinity, Containers: []corev1.Container{ { - Name: name, - Image: fmt.Sprintf("%s/%s%s", repository, name, version), + Name: podName, + Image: fmt.Sprintf("%s/%s%s", repository, imageName, version), ImagePullPolicy: pullPolicy, }, }, @@ -141,9 +134,9 @@ func newPodTemplateSpec(name string, repository string, version string, pullPoli }, nil } -func newBaseDeployment(name string, namespace string, repository string, version string, pullPolicy corev1.PullPolicy, podAffinity *corev1.Affinity) (*appsv1.Deployment, error) { +func newBaseDeployment(deploymentName string, imageName string, namespace string, repository string, version string, pullPolicy corev1.PullPolicy, podAffinity *corev1.Affinity) (*appsv1.Deployment, error) { - podTemplateSpec, err := newPodTemplateSpec(name, repository, version, pullPolicy, podAffinity) + podTemplateSpec, err := newPodTemplateSpec(deploymentName, imageName, repository, version, pullPolicy, podAffinity) if err != nil { return nil, err } @@ -155,16 +148,16 @@ func newBaseDeployment(name string, namespace string, repository string, version }, ObjectMeta: metav1.ObjectMeta{ Namespace: namespace, - Name: name, + Name: deploymentName, Labels: map[string]string{ - virtv1.AppLabel: name, + virtv1.AppLabel: deploymentName, }, }, Spec: appsv1.DeploymentSpec{ Replicas: int32Ptr(2), Selector: &metav1.LabelSelector{ MatchLabels: map[string]string{ - "kubevirt.io": name, + "kubevirt.io": deploymentName, }, }, Template: *podTemplateSpec, @@ -196,9 +189,11 @@ func newPodAntiAffinity(key, topologyKey string, operator metav1.LabelSelectorOp } } -func NewApiServerDeployment(namespace string, repository string, version string, pullPolicy corev1.PullPolicy, verbosity string) (*appsv1.Deployment, error) { +func NewApiServerDeployment(namespace string, repository string, imagePrefix string, version string, pullPolicy corev1.PullPolicy, verbosity string) (*appsv1.Deployment, error) { podAntiAffinity := newPodAntiAffinity("kubevirt.io", "kubernetes.io/hostname", metav1.LabelSelectorOpIn, []string{"virt-api"}) - deployment, err := newBaseDeployment("virt-api", namespace, repository, version, pullPolicy, podAntiAffinity) + deploymentName := "virt-api" + imageName := fmt.Sprintf("%s%s", imagePrefix, deploymentName) + deployment, err := newBaseDeployment(deploymentName, imageName, namespace, repository, version, pullPolicy, podAntiAffinity) if err != nil { return nil, err } @@ -249,9 +244,11 @@ func NewApiServerDeployment(namespace string, repository string, version string, return deployment, nil } -func NewControllerDeployment(namespace string, repository string, controllerVersion string, launcherVersion string, pullPolicy corev1.PullPolicy, verbosity string) (*appsv1.Deployment, error) { +func NewControllerDeployment(namespace string, repository string, imagePrefix string, controllerVersion string, launcherVersion string, pullPolicy corev1.PullPolicy, verbosity string) (*appsv1.Deployment, error) { podAntiAffinity := newPodAntiAffinity("kubevirt.io", "kubernetes.io/hostname", metav1.LabelSelectorOpIn, []string{"virt-controller"}) - deployment, err := newBaseDeployment("virt-controller", namespace, repository, controllerVersion, pullPolicy, podAntiAffinity) + deploymentName := "virt-controller" + imageName := fmt.Sprintf("%s%s", imagePrefix, deploymentName) + deployment, err := newBaseDeployment(deploymentName, imageName, namespace, repository, controllerVersion, pullPolicy, podAntiAffinity) if err != nil { return nil, err } @@ -268,7 +265,7 @@ func NewControllerDeployment(namespace string, repository string, controllerVers container.Command = []string{ "virt-controller", "--launcher-image", - fmt.Sprintf("%s/%s%s", repository, "virt-launcher", launcherVersion), + fmt.Sprintf("%s/%s%s%s", repository, imagePrefix, "virt-launcher", launcherVersion), "--port", "8443", "-v", @@ -313,8 +310,11 @@ func NewControllerDeployment(namespace string, repository string, controllerVers return deployment, nil } -func NewHandlerDaemonSet(namespace string, repository string, version string, pullPolicy corev1.PullPolicy, verbosity string) (*appsv1.DaemonSet, error) { - podTemplateSpec, err := newPodTemplateSpec("virt-handler", repository, version, pullPolicy, nil) +func NewHandlerDaemonSet(namespace string, repository string, imagePrefix string, version string, pullPolicy corev1.PullPolicy, verbosity string) (*appsv1.DaemonSet, error) { + + deploymentName := "virt-handler" + imageName := fmt.Sprintf("%s%s", imagePrefix, deploymentName) + podTemplateSpec, err := newPodTemplateSpec(deploymentName, imageName, repository, version, pullPolicy, nil) if err != nil { return nil, err } @@ -432,14 +432,14 @@ func NewHandlerDaemonSet(namespace string, repository string, version string, pu } // Used for manifest generation only -func NewOperatorDeployment(namespace string, repository string, version string, +func NewOperatorDeployment(namespace string, repository string, imagePrefix string, version string, pullPolicy corev1.PullPolicy, verbosity string, kubeVirtVersionEnv string, virtApiShaEnv string, virtControllerShaEnv string, virtHandlerShaEnv string, virtLauncherShaEnv string) (*appsv1.Deployment, error) { name := "virt-operator" version = AddVersionSeparatorPrefix(version) - image := fmt.Sprintf("%s/%s%s", repository, name, version) + image := fmt.Sprintf("%s/%s%s%s", repository, imagePrefix, name, version) tolerations, err := criticalAddonsToleration() if err != nil { @@ -517,7 +517,7 @@ func NewOperatorDeployment(namespace string, repository string, version string, }, Env: []corev1.EnvVar{ { - Name: "OPERATOR_IMAGE", + Name: operatorutil.OperatorImageEnvName, Value: image, }, { diff --git a/pkg/virt-operator/creation/csv/csv.go b/pkg/virt-operator/creation/csv/csv.go index 473f78e82ffd..af9cd7a8162b 100644 --- a/pkg/virt-operator/creation/csv/csv.go +++ b/pkg/virt-operator/creation/csv/csv.go @@ -37,6 +37,7 @@ type NewClusterServiceVersionData struct { KubeVirtVersion string OperatorImageVersion string DockerPrefix string + ImagePrefix string ImagePullPolicy string Verbosity string CsvVersion string @@ -132,6 +133,7 @@ func NewClusterServiceVersion(data *NewClusterServiceVersionData) (*csvv1.Cluste deployment, err := components.NewOperatorDeployment( data.Namespace, data.DockerPrefix, + data.ImagePrefix, data.OperatorImageVersion, v1.PullPolicy(data.ImagePullPolicy), data.Verbosity, diff --git a/pkg/virt-operator/install-strategy/create_test.go b/pkg/virt-operator/install-strategy/create_test.go index 1c832e0d7e1b..4f8e7a28f58a 100644 --- a/pkg/virt-operator/install-strategy/create_test.go +++ b/pkg/virt-operator/install-strategy/create_test.go @@ -111,7 +111,7 @@ var _ = Describe("Create", func() { clientset.EXPECT().PolicyV1beta1().Return(kubeClient.PolicyV1beta1()).AnyTimes() kv = &v1.KubeVirt{} - deployment, err = components.NewApiServerDeployment(Namespace, Registry, Version, corev1.PullIfNotPresent, "verbosity") + deployment, err = components.NewApiServerDeployment(Namespace, Registry, "", Version, corev1.PullIfNotPresent, "verbosity") Expect(err).ToNot(HaveOccurred()) cachedPodDisruptionBudget = components.NewPodDisruptionBudgetForDeployment(deployment) diff --git a/pkg/virt-operator/install-strategy/strategy.go b/pkg/virt-operator/install-strategy/strategy.go index 83b25985e02f..6604840f163b 100644 --- a/pkg/virt-operator/install-strategy/strategy.go +++ b/pkg/virt-operator/install-strategy/strategy.go @@ -246,19 +246,19 @@ func GenerateCurrentInstallStrategy(config *operatorutil.KubeVirtDeploymentConfi strategy.services = append(strategy.services, components.NewPrometheusService(config.GetNamespace())) strategy.services = append(strategy.services, components.NewApiServerService(config.GetNamespace())) - apiDeployment, err := components.NewApiServerDeployment(config.GetNamespace(), config.GetImageRegistry(), config.GetApiVersion(), config.GetImagePullPolicy(), config.GetVerbosity()) + apiDeployment, err := components.NewApiServerDeployment(config.GetNamespace(), config.GetImageRegistry(), config.GetImagePrefix(), config.GetApiVersion(), config.GetImagePullPolicy(), config.GetVerbosity()) if err != nil { return nil, fmt.Errorf("error generating virt-apiserver deployment %v", err) } strategy.deployments = append(strategy.deployments, apiDeployment) - controller, err := components.NewControllerDeployment(config.GetNamespace(), config.GetImageRegistry(), config.GetControllerVersion(), config.GetLauncherVersion(), config.GetImagePullPolicy(), config.GetVerbosity()) + controller, err := components.NewControllerDeployment(config.GetNamespace(), config.GetImageRegistry(), config.GetImagePrefix(), config.GetControllerVersion(), config.GetLauncherVersion(), config.GetImagePullPolicy(), config.GetVerbosity()) if err != nil { return nil, fmt.Errorf("error generating virt-controller deployment %v", err) } strategy.deployments = append(strategy.deployments, controller) - handler, err := components.NewHandlerDaemonSet(config.GetNamespace(), config.GetImageRegistry(), config.GetHandlerVersion(), config.GetImagePullPolicy(), config.GetVerbosity()) + handler, err := components.NewHandlerDaemonSet(config.GetNamespace(), config.GetImageRegistry(), config.GetImagePrefix(), config.GetHandlerVersion(), config.GetImagePullPolicy(), config.GetVerbosity()) if err != nil { return nil, fmt.Errorf("error generating virt-handler deployment %v", err) } diff --git a/pkg/virt-operator/kubevirt.go b/pkg/virt-operator/kubevirt.go index 315dfbeb9def..846a8529b6c9 100644 --- a/pkg/virt-operator/kubevirt.go +++ b/pkg/virt-operator/kubevirt.go @@ -568,7 +568,7 @@ func (c *KubeVirtController) execute(key string) error { func (c *KubeVirtController) generateInstallStrategyJob(config *operatorutil.KubeVirtDeploymentConfig) (*batchv1.Job, error) { - operatorImage := fmt.Sprintf("%s/%s%s", config.GetImageRegistry(), "virt-operator", components.AddVersionSeparatorPrefix(config.GetOperatorVersion())) + operatorImage := fmt.Sprintf("%s/%s%s%s", config.GetImageRegistry(), config.GetImagePrefix(), "virt-operator", components.AddVersionSeparatorPrefix(config.GetOperatorVersion())) deploymentConfigJson, err := config.GetJson() if err != nil { return nil, err diff --git a/pkg/virt-operator/kubevirt_test.go b/pkg/virt-operator/kubevirt_test.go index 44014eb07cb7..13e7ed1411ca 100644 --- a/pkg/virt-operator/kubevirt_test.go +++ b/pkg/virt-operator/kubevirt_test.go @@ -548,7 +548,7 @@ var _ = Describe("KubeVirt Operator", func() { // virt-api // virt-controller // virt-handler - apiDeployment, _ := components.NewApiServerDeployment(NAMESPACE, config.GetImageRegistry(), config.GetApiVersion(), config.GetImagePullPolicy(), config.GetVerbosity()) + apiDeployment, _ := components.NewApiServerDeployment(NAMESPACE, config.GetImageRegistry(), config.GetImagePrefix(), config.GetApiVersion(), config.GetImagePullPolicy(), config.GetVerbosity()) pod := &k8sv1.Pod{ ObjectMeta: apiDeployment.Spec.Template.ObjectMeta, @@ -564,7 +564,7 @@ var _ = Describe("KubeVirt Operator", func() { pod.Name = "virt-api-xxxx" addPod(pod) - controller, _ := components.NewControllerDeployment(NAMESPACE, config.GetImageRegistry(), config.GetControllerVersion(), config.GetLauncherVersion(), config.GetImagePullPolicy(), config.GetVerbosity()) + controller, _ := components.NewControllerDeployment(NAMESPACE, config.GetImageRegistry(), config.GetImagePrefix(), config.GetControllerVersion(), config.GetLauncherVersion(), config.GetImagePullPolicy(), config.GetVerbosity()) pod = &k8sv1.Pod{ ObjectMeta: controller.Spec.Template.ObjectMeta, Spec: controller.Spec.Template.Spec, @@ -579,7 +579,7 @@ var _ = Describe("KubeVirt Operator", func() { injectMetadata(&pod.ObjectMeta, config) addPod(pod) - handler, _ := components.NewHandlerDaemonSet(NAMESPACE, config.GetImageRegistry(), config.GetHandlerVersion(), config.GetImagePullPolicy(), config.GetVerbosity()) + handler, _ := components.NewHandlerDaemonSet(NAMESPACE, config.GetImageRegistry(), config.GetImagePrefix(), config.GetHandlerVersion(), config.GetImagePullPolicy(), config.GetVerbosity()) pod = &k8sv1.Pod{ ObjectMeta: handler.Spec.Template.ObjectMeta, Spec: handler.Spec.Template.Spec, @@ -746,11 +746,11 @@ var _ = Describe("KubeVirt Operator", func() { // services and deployments all = append(all, components.NewPrometheusService(NAMESPACE)) all = append(all, components.NewApiServerService(NAMESPACE)) - apiDeployment, _ := components.NewApiServerDeployment(NAMESPACE, config.GetImageRegistry(), config.GetApiVersion(), config.GetImagePullPolicy(), config.GetVerbosity()) + apiDeployment, _ := components.NewApiServerDeployment(NAMESPACE, config.GetImageRegistry(), config.GetImagePrefix(), config.GetApiVersion(), config.GetImagePullPolicy(), config.GetVerbosity()) apiDeploymentPdb := components.NewPodDisruptionBudgetForDeployment(apiDeployment) - controller, _ := components.NewControllerDeployment(NAMESPACE, config.GetImageRegistry(), config.GetControllerVersion(), config.GetLauncherVersion(), config.GetImagePullPolicy(), config.GetVerbosity()) + controller, _ := components.NewControllerDeployment(NAMESPACE, config.GetImageRegistry(), config.GetImagePrefix(), config.GetControllerVersion(), config.GetLauncherVersion(), config.GetImagePullPolicy(), config.GetVerbosity()) controllerPdb := components.NewPodDisruptionBudgetForDeployment(controller) - handler, _ := components.NewHandlerDaemonSet(NAMESPACE, config.GetImageRegistry(), config.GetApiVersion(), config.GetImagePullPolicy(), config.GetVerbosity()) + handler, _ := components.NewHandlerDaemonSet(NAMESPACE, config.GetImageRegistry(), config.GetImagePrefix(), config.GetHandlerVersion(), config.GetImagePullPolicy(), config.GetVerbosity()) all = append(all, apiDeployment, apiDeploymentPdb, controller, controllerPdb, handler) all = append(all, rbac.GetAllServiceMonitor(NAMESPACE, config.GetMonitorNamespace(), config.GetMonitorServiceAccount())...) diff --git a/pkg/virt-operator/util/config.go b/pkg/virt-operator/util/config.go index 2f8ede04e1ec..dcafeafb40ff 100644 --- a/pkg/virt-operator/util/config.go +++ b/pkg/virt-operator/util/config.go @@ -67,13 +67,14 @@ const ( DefaultMonitorAccount = "prometheus-k8s" // the regex used to parse the operator image - operatorImageRegex = "^(.*)/virt-operator([@:].*)?$" + operatorImageRegex = "^(.*)/(.*)virt-operator([@:].*)?$" ) type KubeVirtDeploymentConfig struct { - ID string `json:"id,omitempty" optional:"true"` - Namespace string `json:"namespace,omitempty" optional:"true"` - Registry string `json:"registry,omitempty" optional:"true"` + ID string `json:"id,omitempty" optional:"true"` + Namespace string `json:"namespace,omitempty" optional:"true"` + Registry string `json:"registry,omitempty" optional:"true"` + ImagePrefix string `json:"imagePrefix,omitempty" optional:"true"` // the KubeVirt version // matches the image tag, if tags are used, either by the manifest, or by the KubeVirt CR @@ -155,14 +156,16 @@ func getConfig(registry, tag, namespace string, additionalProperties map[string] tagFromOperator := "" operatorSha := "" skipShasums := false + imagePrefix := "" if len(matches) == 1 { // only use registry from operator image if it was not given yet if registry == "" { registry = matches[0][1] } + imagePrefix = matches[0][2] - version := matches[0][2] + version := matches[0][3] if version == "" { tagFromOperator = "latest" } else if strings.HasPrefix(version, ":") { @@ -183,7 +186,7 @@ func getConfig(registry, tag, namespace string, additionalProperties map[string] } } - config := newDeploymentConfigWithTag(registry, tag, namespace, additionalProperties) + config := newDeploymentConfigWithTag(registry, imagePrefix, tag, namespace, additionalProperties) if skipShasums { return config } @@ -195,7 +198,7 @@ func getConfig(registry, tag, namespace string, additionalProperties map[string] launcherSha := os.Getenv(VirtLauncherShasumEnvName) kubeVirtVersion := os.Getenv(KubeVirtVersionEnvName) if operatorSha != "" && apiSha != "" && controllerSha != "" && handlerSha != "" && launcherSha != "" && kubeVirtVersion != "" { - config = newDeploymentConfigWithShasums(registry, kubeVirtVersion, operatorSha, apiSha, controllerSha, handlerSha, launcherSha, namespace, additionalProperties) + config = newDeploymentConfigWithShasums(registry, imagePrefix, kubeVirtVersion, operatorSha, apiSha, controllerSha, handlerSha, launcherSha, namespace, additionalProperties) } return config @@ -209,7 +212,7 @@ func VerifyEnv() error { } imageRegEx := regexp.MustCompile(operatorImageRegex) matches := imageRegEx.FindAllStringSubmatch(imageString, 1) - if len(matches) != 1 || len(matches[0]) != 3 { + if len(matches) != 1 || len(matches[0]) != 4 { return fmt.Errorf("can not parse operator image env var %s", imageString) } @@ -230,9 +233,10 @@ func VerifyEnv() error { return nil } -func newDeploymentConfigWithTag(registry, tag, namespace string, kvSpec map[string]string) *KubeVirtDeploymentConfig { +func newDeploymentConfigWithTag(registry, imagePrefix, tag, namespace string, kvSpec map[string]string) *KubeVirtDeploymentConfig { c := &KubeVirtDeploymentConfig{ Registry: registry, + ImagePrefix: imagePrefix, KubeVirtVersion: tag, Namespace: namespace, AdditionalProperties: kvSpec, @@ -241,9 +245,10 @@ func newDeploymentConfigWithTag(registry, tag, namespace string, kvSpec map[stri return c } -func newDeploymentConfigWithShasums(registry, kubeVirtVersion, operatorSha, apiSha, controllerSha, handlerSha, launcherSha, namespace string, additionalProperties map[string]string) *KubeVirtDeploymentConfig { +func newDeploymentConfigWithShasums(registry, imagePrefix, kubeVirtVersion, operatorSha, apiSha, controllerSha, handlerSha, launcherSha, namespace string, additionalProperties map[string]string) *KubeVirtDeploymentConfig { c := &KubeVirtDeploymentConfig{ Registry: registry, + ImagePrefix: imagePrefix, KubeVirtVersion: kubeVirtVersion, VirtOperatorSha: operatorSha, VirtApiSha: apiSha, @@ -300,6 +305,10 @@ func (c *KubeVirtDeploymentConfig) GetImageRegistry() string { return c.Registry } +func (c *KubeVirtDeploymentConfig) GetImagePrefix() string { + return c.ImagePrefix +} + func (c *KubeVirtDeploymentConfig) UseShasums() bool { return c.VirtOperatorSha != "" && c.VirtApiSha != "" && c.VirtControllerSha != "" && c.VirtHandlerSha != "" && c.VirtLauncherSha != "" } diff --git a/pkg/virt-operator/util/config_test.go b/pkg/virt-operator/util/config_test.go index 5043aa676893..a6918212fe6b 100644 --- a/pkg/virt-operator/util/config_test.go +++ b/pkg/virt-operator/util/config_test.go @@ -134,13 +134,14 @@ var _ = Describe("Operator Config", func() { Describe("Config json from env var", func() { It("should be parsed", func() { - json := `{"id":"9ca7273e4d5f1bee842f64a8baabc15cbbf1ce59","namespace":"kubevirt","registry":"registry:5000/kubevirt","kubeVirtVersion":"devel","additionalProperties":{"ImagePullPolicy":"IfNotPresent"}}` + json := `{"id":"9ca7273e4d5f1bee842f64a8baabc15cbbf1ce59","namespace":"kubevirt","registry":"registry:5000/kubevirt","imagePrefix":"somePrefix","kubeVirtVersion":"devel","additionalProperties":{"ImagePullPolicy":"IfNotPresent"}}` os.Setenv(TargetDeploymentConfig, json) parsedConfig, err := GetConfigFromEnv() Expect(err).ToNot(HaveOccurred()) Expect(parsedConfig.GetDeploymentID()).To(Equal("9ca7273e4d5f1bee842f64a8baabc15cbbf1ce59")) Expect(parsedConfig.GetNamespace()).To(Equal("kubevirt")) Expect(parsedConfig.GetImageRegistry()).To(Equal("registry:5000/kubevirt")) + Expect(parsedConfig.GetImagePrefix()).To(Equal("somePrefix")) Expect(parsedConfig.GetKubeVirtVersion()).To(Equal("devel")) Expect(parsedConfig.GetImagePullPolicy()).To(Equal(k8sv1.PullIfNotPresent)) }) diff --git a/tests/BUILD.bazel b/tests/BUILD.bazel index cf467c5b1a54..d5b005d9c1a0 100644 --- a/tests/BUILD.bazel +++ b/tests/BUILD.bazel @@ -118,6 +118,7 @@ go_test( "//pkg/virt-handler/device-manager:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", "//pkg/virt-operator/creation/components:go_default_library", + "//pkg/virt-operator/util:go_default_library", "//pkg/virtctl/expose:go_default_library", "//pkg/virtctl/vm:go_default_library", "//staging/src/kubevirt.io/client-go/api/v1:go_default_library", diff --git a/tests/operator_test.go b/tests/operator_test.go index 0f96b3fc6bfd..fe430a9e9279 100644 --- a/tests/operator_test.go +++ b/tests/operator_test.go @@ -29,6 +29,8 @@ import ( "strings" "time" + v12 "k8s.io/api/apps/v1" + . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" k8sv1 "k8s.io/api/core/v1" @@ -43,6 +45,7 @@ import ( cdiv1 "kubevirt.io/containerized-data-importer/pkg/apis/core/v1alpha1" "kubevirt.io/kubevirt/pkg/controller" "kubevirt.io/kubevirt/pkg/virt-operator/creation/components" + "kubevirt.io/kubevirt/pkg/virt-operator/util" "kubevirt.io/kubevirt/tests" ) @@ -322,19 +325,64 @@ var _ = Describe("Operator", func() { }, 10*time.Second, 1*time.Second).ShouldNot(HaveOccurred()) } - patchOperatorVersion := func(version string) bool { + parseDaemonset := func(name string) (daemonSet *v12.DaemonSet, image, registry, imagePrefix, version string) { + var err error + daemonSet, err = virtClient.AppsV1().DaemonSets(tests.KubeVirtInstallNamespace).Get(name, metav1.GetOptions{}) + Expect(err).ToNot(HaveOccurred()) + image = daemonSet.Spec.Template.Spec.Containers[0].Image + imageRegEx := regexp.MustCompile(fmt.Sprintf("%s%s%s", `^(.*)/(.*)`, name, `([@:].*)?$`)) + matches := imageRegEx.FindAllStringSubmatch(image, 1) + Expect(len(matches)).To(Equal(1)) + Expect(len(matches[0])).To(Equal(4)) + registry = matches[0][1] + imagePrefix = matches[0][2] + version = matches[0][3] + return + } + + parseImage := func(name, image string) (registry, imagePrefix, version string) { + imageRegEx := regexp.MustCompile(fmt.Sprintf("%s%s%s", `^(.*)/(.*)`, name, `([@:].*)?$`)) + matches := imageRegEx.FindAllStringSubmatch(image, 1) + Expect(len(matches)).To(Equal(1)) + Expect(len(matches[0])).To(Equal(4)) + registry = matches[0][1] + imagePrefix = matches[0][2] + version = matches[0][3] + return + } + + parseDeployment := func(name string) (deployment *v12.Deployment, image, registry, imagePrefix, version string) { + var err error + deployment, err = virtClient.AppsV1().Deployments(tests.KubeVirtInstallNamespace).Get(name, metav1.GetOptions{}) + Expect(err).ToNot(HaveOccurred()) + image = deployment.Spec.Template.Spec.Containers[0].Image + registry, imagePrefix, version = parseImage(name, image) + return + } + + parseOperatorImage := func() (operator *v12.Deployment, image, registry, imagePrefix, version string) { + return parseDeployment("virt-operator") + } + + patchOperator := func(imagePrefix, version *string) bool { modified := true Eventually(func() error { - operator, err := virtClient.AppsV1().Deployments(tests.KubeVirtInstallNamespace).Get("virt-operator", metav1.GetOptions{}) - - imageRegEx := regexp.MustCompile(`^(.*)/virt-operator([@:].*)?$`) - oldImage := operator.Spec.Template.Spec.Containers[0].Image - matches := imageRegEx.FindAllStringSubmatch(oldImage, 1) - registry := matches[0][1] - newImage := fmt.Sprintf("%s/virt-operator%s", registry, components.AddVersionSeparatorPrefix(version)) + operator, oldImage, registry, oldPrefix, oldVersion := parseOperatorImage() + if imagePrefix == nil { + // keep old prefix + imagePrefix = &oldPrefix + } + if version == nil { + // keep old version + version = &oldVersion + } else { + newVersion := components.AddVersionSeparatorPrefix(*version) + version = &newVersion + } + newImage := fmt.Sprintf("%s/%svirt-operator%s", registry, *imagePrefix, *version) if oldImage == newImage { modified = false @@ -343,7 +391,7 @@ var _ = Describe("Operator", func() { operator.Spec.Template.Spec.Containers[0].Image = newImage for idx, env := range operator.Spec.Template.Spec.Containers[0].Env { - if env.Name == "OPERATOR_IMAGE" { + if env.Name == util.OperatorImageEnvName { env.Value = newImage operator.Spec.Template.Spec.Containers[0].Env[idx] = env break @@ -433,13 +481,7 @@ var _ = Describe("Operator", func() { } // save the operator sha - operator, err := virtClient.AppsV1().Deployments(tests.KubeVirtInstallNamespace).Get("virt-operator", metav1.GetOptions{}) - Expect(err).ToNot(HaveOccurred()) - imageRegEx := regexp.MustCompile(`^(.*)/virt-operator([@:].*)?$`) - matches := imageRegEx.FindAllStringSubmatch(operator.Spec.Template.Spec.Containers[0].Image, 1) - Expect(len(matches)).To(Equal(1)) - Expect(len(matches[0])).To(Equal(3)) - version := matches[0][2] + _, _, _, _, version := parseOperatorImage() Expect(strings.HasPrefix(version, "@")).To(BeTrue()) originalOperatorVersion = strings.TrimPrefix(version, "@") @@ -562,7 +604,7 @@ spec: createKv(copyOriginalKv()) } - modified := patchOperatorVersion(originalOperatorVersion) + modified := patchOperator(nil, &originalOperatorVersion) if modified { // make sure we wait until redeploymemt started waitForUpdateCondition(originalKv) @@ -897,6 +939,73 @@ spec: deleteAllKvAndWait(false) }) + // this test ensures that we can deal with image prefixes in case they are not used for tests already + It("should be able to create kubevirt install with image prefix", func() { + + if tests.ImagePrefixAlt == "" { + Skip("Skip operator imagePrefix test because imagePrefixAlt is not present") + } + + kv := copyOriginalKv() + + allPodsAreReady(originalKv) + sanityCheckDeploymentsExist() + + _, _, _, oldPrefix, _ := parseOperatorImage() + + By("Update Operator using imagePrefixAlt") + patchOperator(&tests.ImagePrefixAlt, nil) + + // should result in kubevirt cr entering updating state + By("Wait for Updating Condition") + waitForUpdateCondition(kv) + + By("Waiting for KV to stabilize") + waitForKv(kv) + + By("Verifying infrastructure Is Updated") + allPodsAreReady(kv) + + By("Verifying deployments have prefix") + for _, name := range []string{"virt-operator", "virt-api", "virt-controller"} { + _, _, _, prefix, _ := parseDeployment(name) + Expect(prefix).To(Equal(tests.ImagePrefixAlt), fmt.Sprintf("%s should have correct image prefix", name)) + } + _, _, _, prefix, _ := parseDaemonset("virt-handler") + Expect(prefix).To(Equal(tests.ImagePrefixAlt), "virt-handler should have correct image prefix") + + By("Verifying VMs are working") + vmi := tests.NewRandomVMIWithEphemeralDisk(tests.ContainerDiskFor(tests.ContainerDiskAlpine)) + vmi, err := virtClient.VirtualMachineInstance(tests.NamespaceTestDefault).Create(vmi) + Expect(err).ShouldNot(HaveOccurred(), "Create VMI successfully") + tests.WaitForSuccessfulVMIStart(vmi) + + By("Verifying virt-launcher image is also prefixed") + pod := tests.GetRunningPodByVirtualMachineInstance(vmi, vmi.Namespace) + for _, container := range pod.Spec.Containers { + if container.Name == "compute" { + _, prefix, _ := parseImage("virt-launcher", container.Image) + Expect(prefix).To(Equal(tests.ImagePrefixAlt), "launcher image should have prefix") + } + } + + By("Deleting VM") + err = virtClient.VirtualMachineInstance(tests.NamespaceTestDefault).Delete(vmi.Name, &metav1.DeleteOptions{}) + Expect(err).ShouldNot(HaveOccurred(), "Delete VMI successfully") + + By("Restore Operator using original imagePrefix ") + patchOperator(&oldPrefix, nil) + + By("Wait for Updating Condition") + waitForUpdateCondition(kv) + + By("Waiting for KV to stabilize") + waitForKv(kv) + + By("Verifying infrastructure Is Restored to original version") + allPodsAreReady(kv) + }) + It("should be able to update kubevirt install with custom image tag", func() { if tests.KubeVirtVersionTagAlt == "" { @@ -959,7 +1068,7 @@ spec: sanityCheckDeploymentsExist() By("Update Virt-Operator using Alt Tag") - patchOperatorVersion(tests.KubeVirtVersionTagAlt) + patchOperator(nil, &tests.KubeVirtVersionTagAlt) // should result in kubevirt cr entering updating state By("Wait for Updating Condition") @@ -973,7 +1082,7 @@ spec: // by using the tag, we also test if resetting (in AfterEach) from tag to sha for the same "version" works By("Restore Operator Version using original tag. ") - patchOperatorVersion(tests.KubeVirtVersionTag) + patchOperator(nil, &tests.KubeVirtVersionTag) By("Wait for Updating Condition") waitForUpdateCondition(kv) diff --git a/tests/utils.go b/tests/utils.go index 8be11178ff50..78d4ad29af99 100644 --- a/tests/utils.go +++ b/tests/utils.go @@ -90,6 +90,7 @@ var KubeVirtVersionTag = "latest" var KubeVirtVersionTagAlt = "" var KubeVirtUtilityRepoPrefix = "" var KubeVirtRepoPrefix = "kubevirt" +var ImagePrefixAlt = "" var ContainerizedDataImporterNamespace = "cdi" var KubeVirtKubectlPath = "" var KubeVirtOcPath = "" @@ -110,6 +111,7 @@ func init() { flag.StringVar(&KubeVirtVersionTagAlt, "container-tag-alt", "", "An alternate tag that can be used to test operator deployments") flag.StringVar(&KubeVirtUtilityRepoPrefix, "utility-container-prefix", "", "Set the repository prefix for all images") flag.StringVar(&KubeVirtRepoPrefix, "container-prefix", "kubevirt", "Set the repository prefix for all images") + flag.StringVar(&ImagePrefixAlt, "image-prefix-alt", "", "Optional prefix for virt-* image names for additional imagePrefix operator test") flag.StringVar(&ContainerizedDataImporterNamespace, "cdi-namespace", "cdi", "Set the repository prefix for CDI components") flag.StringVar(&KubeVirtKubectlPath, "kubectl-path", "", "Set path to kubectl binary") flag.StringVar(&KubeVirtOcPath, "oc-path", "", "Set path to oc binary") diff --git a/tools/csv-generator/csv-generator.go b/tools/csv-generator/csv-generator.go index dba31947009c..b82d4c31c0a0 100644 --- a/tools/csv-generator/csv-generator.go +++ b/tools/csv-generator/csv-generator.go @@ -31,6 +31,7 @@ import ( func main() { namespace := flag.String("namespace", "placeholder", "Namespace to use.") operatorImageVersion := flag.String("operatorImageVersion", "latest", "Image sha256 hash or image tag used to uniquely identify the operator container image to use in the CSV") + imagePrefix := flag.String("imagePrefix", "", "Optional prefix for virt-* image names.") dockerPrefix := flag.String("dockerPrefix", "kubevirt", "Image Repository to use.") kubeVirtVersion := flag.String("kubeVirtVersion", "", "represents the KubeVirt releaseassociated with this CSV. Required when image SHAs are used.") pullPolicy := flag.String("pullPolicy", "IfNotPresent", "ImagePullPolicy to use.") @@ -52,6 +53,7 @@ func main() { KubeVirtVersion: *kubeVirtVersion, OperatorImageVersion: *operatorImageVersion, DockerPrefix: *dockerPrefix, + ImagePrefix: *imagePrefix, ImagePullPolicy: *pullPolicy, Verbosity: *verbosity, CsvVersion: *csvVersion, diff --git a/tools/manifest-templator/manifest-templator.go b/tools/manifest-templator/manifest-templator.go index 38f7f363bea3..2e6d42321d8b 100644 --- a/tools/manifest-templator/manifest-templator.go +++ b/tools/manifest-templator/manifest-templator.go @@ -47,6 +47,7 @@ type templateData struct { CSVNamespace string DockerTag string DockerPrefix string + ImagePrefix string ImagePullPolicy string Verbosity string CsvVersion string @@ -71,6 +72,7 @@ func main() { csvNamespace := flag.String("csv-namespace", "placeholder", "") cdiNamespace := flag.String("cdi-namespace", "", "") dockerPrefix := flag.String("container-prefix", "", "") + imagePrefix := flag.String("image-prefix", "", "") dockerTag := flag.String("container-tag", "", "") csvVersion := flag.String("csv-version", "", "") imagePullPolicy := flag.String("image-pull-policy", "IfNotPresent", "") @@ -107,6 +109,7 @@ func main() { data.CDINamespace = *cdiNamespace data.DockerTag = *dockerTag data.DockerPrefix = *dockerPrefix + data.ImagePrefix = *imagePrefix data.ImagePullPolicy = *imagePullPolicy data.Verbosity = fmt.Sprintf("\"%s\"", *verbosity) data.CsvVersion = *csvVersion @@ -150,6 +153,7 @@ func main() { data.CDINamespace = "{{.CDINamespace}}" data.DockerTag = "{{.DockerTag}}" data.DockerPrefix = "{{.DockerPrefix}}" + data.ImagePrefix = "{{.ImagePrefix}}" data.ImagePullPolicy = "{{.ImagePullPolicy}}" data.Verbosity = "{{.Verbosity}}" data.CsvVersion = "{{.CsvVersion}}" @@ -211,8 +215,10 @@ func getOperatorDeploymentSpec(data templateData, indentation int) string { version = data.VirtOperatorSha } - deployment, err := components.NewOperatorDeployment(data.Namespace, + deployment, err := components.NewOperatorDeployment( + data.Namespace, data.DockerPrefix, + data.ImagePrefix, version, v1.PullPolicy(data.ImagePullPolicy), data.Verbosity, diff --git a/tools/resource-generator/resource-generator.go b/tools/resource-generator/resource-generator.go index 73abb706013d..0164a9459aed 100644 --- a/tools/resource-generator/resource-generator.go +++ b/tools/resource-generator/resource-generator.go @@ -35,6 +35,7 @@ func main() { resourceType := flag.String("type", "", "Type of resource to generate. vmi | vmipreset | vmirs | vm | vmim | kv | rbac") namespace := flag.String("namespace", "kube-system", "Namespace to use.") repository := flag.String("repository", "kubevirt", "Image Repository to use.") + imagePrefix := flag.String("imagePrefix", "", "Optional prefix for virt-* image names.") version := flag.String("version", "latest", "Version to use.") launcherVersion := flag.String("launcherVersion", "latest", "Version to use for virt-launcher. Only relevant for controller manifest.") pullPolicy := flag.String("pullPolicy", "IfNotPresent", "ImagePullPolicy to use.") @@ -83,25 +84,25 @@ func main() { case "prometheus": util.MarshallObject(components.NewPrometheusService(*namespace), os.Stdout) case "virt-api": - apisService := components.NewApiServerService(*namespace) - apiDeployment, err := components.NewApiServerDeployment(*namespace, *repository, *version, imagePullPolicy, *verbosity) + apiService := components.NewApiServerService(*namespace) + apiDeployment, err := components.NewApiServerDeployment(*namespace, *repository, *imagePrefix, *version, imagePullPolicy, *verbosity) if err != nil { panic(fmt.Errorf("error generating virt-apiserver deployment %v", err)) } - all := []interface{}{apisService, apiDeployment} + all := []interface{}{apiService, apiDeployment} for _, r := range all { util.MarshallObject(r, os.Stdout) } case "virt-controller": - controller, err := components.NewControllerDeployment(*namespace, *repository, *version, *launcherVersion, imagePullPolicy, *verbosity) + controller, err := components.NewControllerDeployment(*namespace, *repository, *imagePrefix, *version, *launcherVersion, imagePullPolicy, *verbosity) if err != nil { panic(fmt.Errorf("error generating virt-controller deployment %v", err)) } util.MarshallObject(controller, os.Stdout) case "virt-handler": - handler, err := components.NewHandlerDaemonSet(*namespace, *repository, *version, imagePullPolicy, *verbosity) + handler, err := components.NewHandlerDaemonSet(*namespace, *repository, *imagePrefix, *version, imagePullPolicy, *verbosity) if err != nil { panic(fmt.Errorf("error generating virt-handler deployment %v", err)) }