diff --git a/api/bases/core.openstack.org_openstackcontrolplanes.yaml b/api/bases/core.openstack.org_openstackcontrolplanes.yaml index 4050fe423..da31a22cc 100644 --- a/api/bases/core.openstack.org_openstackcontrolplanes.yaml +++ b/api/bases/core.openstack.org_openstackcontrolplanes.yaml @@ -19939,10 +19939,14 @@ spec: type: string ironicConductorImage: type: string + ironicGraphicalConsoleImage: + type: string ironicInspectorImage: type: string ironicNeutronAgentImage: type: string + ironicNovncImage: + type: string ironicPxeImage: type: string ironicPythonAgentImage: diff --git a/api/bases/core.openstack.org_openstackversions.yaml b/api/bases/core.openstack.org_openstackversions.yaml index 78d77d755..c639d4083 100644 --- a/api/bases/core.openstack.org_openstackversions.yaml +++ b/api/bases/core.openstack.org_openstackversions.yaml @@ -151,10 +151,14 @@ spec: type: string ironicConductorImage: type: string + ironicGraphicalConsoleImage: + type: string ironicInspectorImage: type: string ironicNeutronAgentImage: type: string + ironicNovncImage: + type: string ironicPxeImage: type: string ironicPythonAgentImage: @@ -405,10 +409,14 @@ spec: type: string ironicConductorImage: type: string + ironicGraphicalConsoleImage: + type: string ironicInspectorImage: type: string ironicNeutronAgentImage: type: string + ironicNovncImage: + type: string ironicPxeImage: type: string ironicPythonAgentImage: @@ -609,10 +617,14 @@ spec: type: string ironicConductorImage: type: string + ironicGraphicalConsoleImage: + type: string ironicInspectorImage: type: string ironicNeutronAgentImage: type: string + ironicNovncImage: + type: string ironicPxeImage: type: string ironicPythonAgentImage: @@ -839,10 +851,14 @@ spec: type: string ironicConductorImage: type: string + ironicGraphicalConsoleImage: + type: string ironicInspectorImage: type: string ironicNeutronAgentImage: type: string + ironicNovncImage: + type: string ironicPxeImage: type: string ironicPythonAgentImage: diff --git a/api/core/v1beta1/openstackversion_types.go b/api/core/v1beta1/openstackversion_types.go index 12c05f746..b80a87b75 100644 --- a/api/core/v1beta1/openstackversion_types.go +++ b/api/core/v1beta1/openstackversion_types.go @@ -254,8 +254,10 @@ type ContainerTemplate struct { InfraRedisImage *string `json:"infraRedisImage,omitempty"` IronicAPIImage *string `json:"ironicAPIImage,omitempty"` IronicConductorImage *string `json:"ironicConductorImage,omitempty"` + IronicGraphicalConsoleImage *string `json:"ironicGraphicalConsoleImage,omitempty"` IronicInspectorImage *string `json:"ironicInspectorImage,omitempty"` IronicNeutronAgentImage *string `json:"ironicNeutronAgentImage,omitempty"` + IronicNovncImage *string `json:"ironicNovncImage,omitempty"` IronicPxeImage *string `json:"ironicPxeImage,omitempty"` IronicPythonAgentImage *string `json:"ironicPythonAgentImage,omitempty"` KeystoneAPIImage *string `json:"keystoneAPIImage,omitempty"` diff --git a/api/core/v1beta1/zz_generated.deepcopy.go b/api/core/v1beta1/zz_generated.deepcopy.go index 93572bd61..ad9e94b2e 100644 --- a/api/core/v1beta1/zz_generated.deepcopy.go +++ b/api/core/v1beta1/zz_generated.deepcopy.go @@ -577,6 +577,11 @@ func (in *ContainerTemplate) DeepCopyInto(out *ContainerTemplate) { *out = new(string) **out = **in } + if in.IronicGraphicalConsoleImage != nil { + in, out := &in.IronicGraphicalConsoleImage, &out.IronicGraphicalConsoleImage + *out = new(string) + **out = **in + } if in.IronicInspectorImage != nil { in, out := &in.IronicInspectorImage, &out.IronicInspectorImage *out = new(string) @@ -587,6 +592,11 @@ func (in *ContainerTemplate) DeepCopyInto(out *ContainerTemplate) { *out = new(string) **out = **in } + if in.IronicNovncImage != nil { + in, out := &in.IronicNovncImage, &out.IronicNovncImage + *out = new(string) + **out = **in + } if in.IronicPxeImage != nil { in, out := &in.IronicPxeImage, &out.IronicPxeImage *out = new(string) diff --git a/bindata/crds/crds.yaml b/bindata/crds/crds.yaml index 4b6fcfad2..fe9e05ced 100644 --- a/bindata/crds/crds.yaml +++ b/bindata/crds/crds.yaml @@ -20968,10 +20968,14 @@ spec: type: string ironicConductorImage: type: string + ironicGraphicalConsoleImage: + type: string ironicInspectorImage: type: string ironicNeutronAgentImage: type: string + ironicNovncImage: + type: string ironicPxeImage: type: string ironicPythonAgentImage: @@ -23598,10 +23602,14 @@ spec: type: string ironicConductorImage: type: string + ironicGraphicalConsoleImage: + type: string ironicInspectorImage: type: string ironicNeutronAgentImage: type: string + ironicNovncImage: + type: string ironicPxeImage: type: string ironicPythonAgentImage: @@ -23852,10 +23860,14 @@ spec: type: string ironicConductorImage: type: string + ironicGraphicalConsoleImage: + type: string ironicInspectorImage: type: string ironicNeutronAgentImage: type: string + ironicNovncImage: + type: string ironicPxeImage: type: string ironicPythonAgentImage: @@ -24056,10 +24068,14 @@ spec: type: string ironicConductorImage: type: string + ironicGraphicalConsoleImage: + type: string ironicInspectorImage: type: string ironicNeutronAgentImage: type: string + ironicNovncImage: + type: string ironicPxeImage: type: string ironicPythonAgentImage: @@ -24286,10 +24302,14 @@ spec: type: string ironicConductorImage: type: string + ironicGraphicalConsoleImage: + type: string ironicInspectorImage: type: string ironicNeutronAgentImage: type: string + ironicNovncImage: + type: string ironicPxeImage: type: string ironicPythonAgentImage: diff --git a/config/crd/bases/core.openstack.org_openstackcontrolplanes.yaml b/config/crd/bases/core.openstack.org_openstackcontrolplanes.yaml index 4050fe423..da31a22cc 100644 --- a/config/crd/bases/core.openstack.org_openstackcontrolplanes.yaml +++ b/config/crd/bases/core.openstack.org_openstackcontrolplanes.yaml @@ -19939,10 +19939,14 @@ spec: type: string ironicConductorImage: type: string + ironicGraphicalConsoleImage: + type: string ironicInspectorImage: type: string ironicNeutronAgentImage: type: string + ironicNovncImage: + type: string ironicPxeImage: type: string ironicPythonAgentImage: diff --git a/config/crd/bases/core.openstack.org_openstackversions.yaml b/config/crd/bases/core.openstack.org_openstackversions.yaml index 78d77d755..c639d4083 100644 --- a/config/crd/bases/core.openstack.org_openstackversions.yaml +++ b/config/crd/bases/core.openstack.org_openstackversions.yaml @@ -151,10 +151,14 @@ spec: type: string ironicConductorImage: type: string + ironicGraphicalConsoleImage: + type: string ironicInspectorImage: type: string ironicNeutronAgentImage: type: string + ironicNovncImage: + type: string ironicPxeImage: type: string ironicPythonAgentImage: @@ -405,10 +409,14 @@ spec: type: string ironicConductorImage: type: string + ironicGraphicalConsoleImage: + type: string ironicInspectorImage: type: string ironicNeutronAgentImage: type: string + ironicNovncImage: + type: string ironicPxeImage: type: string ironicPythonAgentImage: @@ -609,10 +617,14 @@ spec: type: string ironicConductorImage: type: string + ironicGraphicalConsoleImage: + type: string ironicInspectorImage: type: string ironicNeutronAgentImage: type: string + ironicNovncImage: + type: string ironicPxeImage: type: string ironicPythonAgentImage: @@ -839,10 +851,14 @@ spec: type: string ironicConductorImage: type: string + ironicGraphicalConsoleImage: + type: string ironicInspectorImage: type: string ironicNeutronAgentImage: type: string + ironicNovncImage: + type: string ironicPxeImage: type: string ironicPythonAgentImage: diff --git a/config/operator/default_images.yaml b/config/operator/default_images.yaml index 544992eec..6cd6ff76d 100644 --- a/config/operator/default_images.yaml +++ b/config/operator/default_images.yaml @@ -87,6 +87,8 @@ spec: value: quay.io/openstack-s2i-containers/openstack-ironic-api:master-latest - name: RELATED_IMAGE_IRONIC_CONDUCTOR_IMAGE_URL_DEFAULT value: quay.io/openstack-s2i-containers/openstack-ironic-conductor:master-latest + - name: RELATED_IMAGE_IRONIC_GRAPHICAL_CONSOLE_IMAGE_URL_DEFAULT + value: quay.io/openstack-s2i-containers/openstack-ironic-graphical-console:master-latest - name: RELATED_IMAGE_IRONIC_INSPECTOR_IMAGE_URL_DEFAULT value: quay.io/podified-antelope-centos9/openstack-ironic-inspector:current-podified - name: RELATED_IMAGE_IRONIC_NEUTRON_AGENT_IMAGE_URL_DEFAULT diff --git a/hack/export_related_images.sh b/hack/export_related_images.sh index 62140a894..5c1a5fc7f 100755 --- a/hack/export_related_images.sh +++ b/hack/export_related_images.sh @@ -20,6 +20,7 @@ export RELATED_IMAGE_MANILA_SHARE_IMAGE_URL_DEFAULT=quay.io/openstack-s2i-contai export RELATED_IMAGE_GLANCE_API_IMAGE_URL_DEFAULT=quay.io/openstack-s2i-containers/openstack-glance-api:master-latest export RELATED_IMAGE_IRONIC_API_IMAGE_URL_DEFAULT=quay.io/openstack-s2i-containers/openstack-ironic-api:master-latest export RELATED_IMAGE_IRONIC_CONDUCTOR_IMAGE_URL_DEFAULT=quay.io/openstack-s2i-containers/openstack-ironic-conductor:master-latest +export RELATED_IMAGE_IRONIC_GRAPHICAL_CONSOLE_IMAGE_URL_DEFAULT=quay.io/openstack-s2i-containers/openstack-ironic-graphical-console:master-latest export RELATED_IMAGE_IRONIC_INSPECTOR_IMAGE_URL_DEFAULT=quay.io/podified-antelope-centos9/openstack-ironic-inspector:current-podified export RELATED_IMAGE_IRONIC_NEUTRON_AGENT_IMAGE_URL_DEFAULT=quay.io/openstack-s2i-containers/openstack-ironic-neutron-agent:master-latest export RELATED_IMAGE_IRONIC_PYTHON_AGENT_IMAGE_URL_DEFAULT=quay.io/podified-antelope-centos9/ironic-python-agent:current-podified diff --git a/internal/openstack/ironic.go b/internal/openstack/ironic.go index 6ef2af327..0dad61b0d 100644 --- a/internal/openstack/ironic.go +++ b/internal/openstack/ironic.go @@ -36,8 +36,10 @@ func ReconcileIronic(ctx context.Context, instance *corev1beta1.OpenStackControl instance.Status.Conditions.Remove(corev1beta1.OpenStackControlPlaneExposeIronicReadyCondition) instance.Status.ContainerImages.IronicAPIImage = nil instance.Status.ContainerImages.IronicConductorImage = nil + instance.Status.ContainerImages.IronicGraphicalConsoleImage = nil instance.Status.ContainerImages.IronicInspectorImage = nil instance.Status.ContainerImages.IronicNeutronAgentImage = nil + instance.Status.ContainerImages.IronicNovncImage = nil instance.Status.ContainerImages.IronicPxeImage = nil instance.Status.ContainerImages.IronicPythonAgentImage = nil // Clean up AC CRs when service is disabled (ironic has two: ironic and ironic-inspector) @@ -273,12 +275,17 @@ func ReconcileIronic(ctx context.Context, instance *corev1beta1.OpenStackControl op, err := controllerutil.CreateOrPatch(ctx, helper.GetClient(), ironic, func() error { instance.Spec.Ironic.Template.DeepCopyInto(&ironic.Spec.IronicSpecCore) - ironic.Spec.Images.API = *version.Status.ContainerImages.IronicAPIImage - ironic.Spec.Images.Conductor = *version.Status.ContainerImages.IronicConductorImage - ironic.Spec.Images.Inspector = *version.Status.ContainerImages.IronicInspectorImage - ironic.Spec.Images.NeutronAgent = *version.Status.ContainerImages.IronicNeutronAgentImage - ironic.Spec.Images.Pxe = *version.Status.ContainerImages.IronicPxeImage - ironic.Spec.Images.IronicPythonAgent = *version.Status.ContainerImages.IronicPythonAgentImage + // Resolve missing image pointers to the empty default so that legacy + // OpenStackVersion CRs remain compatible and the Ironic operator can + // apply its environment defaults. + ironic.Spec.Images.API = *getImg(version.Status.ContainerImages.IronicAPIImage, &missingImageDefault) + ironic.Spec.Images.Conductor = *getImg(version.Status.ContainerImages.IronicConductorImage, &missingImageDefault) + ironic.Spec.Images.GraphicalConsole = *getImg(version.Status.ContainerImages.IronicGraphicalConsoleImage, &missingImageDefault) + ironic.Spec.Images.Inspector = *getImg(version.Status.ContainerImages.IronicInspectorImage, &missingImageDefault) + ironic.Spec.Images.NeutronAgent = *getImg(version.Status.ContainerImages.IronicNeutronAgentImage, &missingImageDefault) + ironic.Spec.Images.NoVNCProxy = *getImg(version.Status.ContainerImages.IronicNovncImage, &missingImageDefault) + ironic.Spec.Images.Pxe = *getImg(version.Status.ContainerImages.IronicPxeImage, &missingImageDefault) + ironic.Spec.Images.IronicPythonAgent = *getImg(version.Status.ContainerImages.IronicPythonAgentImage, &missingImageDefault) if ironic.Spec.Secret == "" { ironic.Spec.Secret = instance.Spec.Secret @@ -319,8 +326,10 @@ func ReconcileIronic(ctx context.Context, instance *corev1beta1.OpenStackControl Log.Info("Ironic ready condition is true") instance.Status.ContainerImages.IronicAPIImage = version.Status.ContainerImages.IronicAPIImage instance.Status.ContainerImages.IronicConductorImage = version.Status.ContainerImages.IronicConductorImage + instance.Status.ContainerImages.IronicGraphicalConsoleImage = version.Status.ContainerImages.IronicGraphicalConsoleImage instance.Status.ContainerImages.IronicInspectorImage = version.Status.ContainerImages.IronicInspectorImage instance.Status.ContainerImages.IronicNeutronAgentImage = version.Status.ContainerImages.IronicNeutronAgentImage + instance.Status.ContainerImages.IronicNovncImage = version.Status.ContainerImages.IronicNovncImage instance.Status.ContainerImages.IronicPxeImage = version.Status.ContainerImages.IronicPxeImage instance.Status.ContainerImages.IronicPythonAgentImage = version.Status.ContainerImages.IronicPythonAgentImage instance.Status.Conditions.MarkTrue(corev1beta1.OpenStackControlPlaneIronicReadyCondition, corev1beta1.OpenStackControlPlaneIronicReadyMessage) @@ -354,8 +363,10 @@ func IronicImageMatch(ctx context.Context, controlPlane *corev1beta1.OpenStackCo if controlPlane.Spec.Ironic.Enabled { if !stringPointersEqual(controlPlane.Status.ContainerImages.IronicAPIImage, version.Status.ContainerImages.IronicAPIImage) || !stringPointersEqual(controlPlane.Status.ContainerImages.IronicConductorImage, version.Status.ContainerImages.IronicConductorImage) || + !stringPointersEqual(controlPlane.Status.ContainerImages.IronicGraphicalConsoleImage, version.Status.ContainerImages.IronicGraphicalConsoleImage) || !stringPointersEqual(controlPlane.Status.ContainerImages.IronicInspectorImage, version.Status.ContainerImages.IronicInspectorImage) || !stringPointersEqual(controlPlane.Status.ContainerImages.IronicNeutronAgentImage, version.Status.ContainerImages.IronicNeutronAgentImage) || + !stringPointersEqual(controlPlane.Status.ContainerImages.IronicNovncImage, version.Status.ContainerImages.IronicNovncImage) || !stringPointersEqual(controlPlane.Status.ContainerImages.IronicPxeImage, version.Status.ContainerImages.IronicPxeImage) || !stringPointersEqual(controlPlane.Status.ContainerImages.IronicPythonAgentImage, version.Status.ContainerImages.IronicPythonAgentImage) { Log.Info("Ironic images do not match") diff --git a/internal/openstack/version.go b/internal/openstack/version.go index c0d98bd5b..e947a8fcc 100644 --- a/internal/openstack/version.go +++ b/internal/openstack/version.go @@ -101,6 +101,9 @@ func InitializeOpenStackVersionImageDefaults(ctx context.Context, envImages map[ if envImages["RELATED_IMAGE_IRONIC_CONDUCTOR_IMAGE_URL_DEFAULT"] != nil { defaults.IronicPxeImage = envImages["RELATED_IMAGE_IRONIC_CONDUCTOR_IMAGE_URL_DEFAULT"] } + if envImages["RELATED_IMAGE_IRONIC_API_IMAGE_URL_DEFAULT"] != nil { + defaults.IronicNovncImage = envImages["RELATED_IMAGE_IRONIC_API_IMAGE_URL_DEFAULT"] + } if envImages["RELATED_IMAGE_OCTAVIA_WORKER_IMAGE_URL_DEFAULT"] != nil { defaults.OctaviaHealthmanagerImage = envImages["RELATED_IMAGE_OCTAVIA_WORKER_IMAGE_URL_DEFAULT"] defaults.OctaviaHousekeepingImage = envImages["RELATED_IMAGE_OCTAVIA_WORKER_IMAGE_URL_DEFAULT"] @@ -213,8 +216,10 @@ func GetContainerImages(defaults *corev1beta1.ContainerDefaults, instance corev1 InfraRedisImage: getImg(instance.Spec.CustomContainerImages.InfraRedisImage, defaults.InfraRedisImage), IronicAPIImage: getImg(instance.Spec.CustomContainerImages.IronicAPIImage, defaults.IronicAPIImage), IronicConductorImage: getImg(instance.Spec.CustomContainerImages.IronicConductorImage, defaults.IronicConductorImage), + IronicGraphicalConsoleImage: getImg(instance.Spec.CustomContainerImages.IronicGraphicalConsoleImage, defaults.IronicGraphicalConsoleImage), IronicInspectorImage: getImg(instance.Spec.CustomContainerImages.IronicInspectorImage, defaults.IronicInspectorImage), IronicNeutronAgentImage: getImg(instance.Spec.CustomContainerImages.IronicNeutronAgentImage, defaults.IronicNeutronAgentImage), + IronicNovncImage: getImg(instance.Spec.CustomContainerImages.IronicNovncImage, defaults.IronicNovncImage), IronicPxeImage: getImg(instance.Spec.CustomContainerImages.IronicPxeImage, defaults.IronicPxeImage), IronicPythonAgentImage: getImg(instance.Spec.CustomContainerImages.IronicPythonAgentImage, defaults.IronicPythonAgentImage), KeystoneAPIImage: getImg(instance.Spec.CustomContainerImages.KeystoneAPIImage, defaults.KeystoneAPIImage), diff --git a/test/functional/ctlplane/openstackversion_controller_test.go b/test/functional/ctlplane/openstackversion_controller_test.go index 01d3cb050..dcfef52c0 100644 --- a/test/functional/ctlplane/openstackversion_controller_test.go +++ b/test/functional/ctlplane/openstackversion_controller_test.go @@ -206,8 +206,10 @@ var _ = Describe("OpenStackVersion controller", func() { g.Expect(version.Status.ContainerImages.InfraRedisImage).ShouldNot(BeNil()) g.Expect(version.Status.ContainerImages.IronicAPIImage).ShouldNot(BeNil()) g.Expect(version.Status.ContainerImages.IronicConductorImage).ShouldNot(BeNil()) + g.Expect(version.Status.ContainerImages.IronicGraphicalConsoleImage).ShouldNot(BeNil()) g.Expect(version.Status.ContainerImages.IronicInspectorImage).ShouldNot(BeNil()) g.Expect(version.Status.ContainerImages.IronicNeutronAgentImage).ShouldNot(BeNil()) + g.Expect(version.Status.ContainerImages.IronicNovncImage).ShouldNot(BeNil()) g.Expect(version.Status.ContainerImages.IronicPxeImage).ShouldNot(BeNil()) g.Expect(version.Status.ContainerImages.IronicPythonAgentImage).ShouldNot(BeNil()) g.Expect(version.Status.ContainerImages.KeystoneAPIImage).ShouldNot(BeNil())