diff --git a/api/v1alpha1/imageclusterinstall_types.go b/api/v1alpha1/imageclusterinstall_types.go index 938c8a273..55db43b03 100644 --- a/api/v1alpha1/imageclusterinstall_types.go +++ b/api/v1alpha1/imageclusterinstall_types.go @@ -89,7 +89,7 @@ type ImageClusterInstallSpec struct { // BareMetalHostRef identifies a BareMetalHost object to be used to attach the configuration to the host. // +optional - BareMetalHostRef *BareMetalHostReference `json:"bareMetalHostRef,omitempty"` + BareMetalHostRef *corev1.LocalObjectReference `json:"bareMetalHostRef,omitempty"` // MachineNetwork is the subnet provided by user for the ocp cluster. // This will be used to create the node network and choose ip address for the node. @@ -125,19 +125,12 @@ type ImageClusterInstallStatus struct { // InstallRestarts is the total count of container restarts on the clusters install job. InstallRestarts int `json:"installRestarts,omitempty"` - BareMetalHostRef *BareMetalHostReference `json:"bareMetalHostRef,omitempty"` + BareMetalHostRef *corev1.LocalObjectReference `json:"bareMetalHostRef,omitempty"` // BootTime indicates the time at which the host was requested to boot. Used to determine install timeouts. BootTime metav1.Time `json:"bootTime,omitempty"` } -type BareMetalHostReference struct { - // Name identifies the BareMetalHost within a namespace - Name string `json:"name"` - // Namespace identifies the namespace containing the referenced BareMetalHost - Namespace string `json:"namespace"` -} - //+kubebuilder:object:root=true //+kubebuilder:subresource:status // +kubebuilder:resource:path=imageclusterinstalls,shortName=ici diff --git a/api/v1alpha1/imageclusterinstall_webhook_test.go b/api/v1alpha1/imageclusterinstall_webhook_test.go index 2e33bc0be..50c1ab300 100644 --- a/api/v1alpha1/imageclusterinstall_webhook_test.go +++ b/api/v1alpha1/imageclusterinstall_webhook_test.go @@ -101,9 +101,8 @@ var _ = Describe("ValidateUpdate", func() { Expect(err.Error()).To(ContainSubstring("invalid hostname")) }) It("update fail when installation started", func() { - bareMetalHostRef := &BareMetalHostReference{ - Name: "test-bmh", - Namespace: "test-bmh-namespace", + bareMetalHostRef := &corev1.LocalObjectReference{ + Name: "test-bmh", } oldClusterInstall := &ImageClusterInstall{ @@ -285,9 +284,8 @@ var _ = Describe("ValidateUpdate", func() { }, } newClusterInstall := oldClusterInstall.DeepCopy() - newClusterInstall.Spec.BareMetalHostRef = &BareMetalHostReference{ - Name: "test-bmh", - Namespace: "test-bmh-namespace", + newClusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: "test-bmh", } warns, err := newClusterInstall.ValidateUpdate(oldClusterInstall) @@ -296,9 +294,8 @@ var _ = Describe("ValidateUpdate", func() { }) It("update fails BMH ref update when installation started", func() { - bareMetalHostRef := &BareMetalHostReference{ - Name: "test-bmh", - Namespace: "test-bmh-namespace", + bareMetalHostRef := &corev1.LocalObjectReference{ + Name: "test-bmh", } oldClusterInstall := &ImageClusterInstall{ ObjectMeta: metav1.ObjectMeta{ @@ -329,16 +326,14 @@ var _ = Describe("ValidateUpdate", func() { }, Spec: ImageClusterInstallSpec{ Hostname: "test", - BareMetalHostRef: &BareMetalHostReference{ - Name: "test-bmh", - Namespace: "test-bmh-namespace", + BareMetalHostRef: &corev1.LocalObjectReference{ + Name: "test-bmh", }, }, } newClusterInstall := oldClusterInstall.DeepCopy() - newClusterInstall.Spec.BareMetalHostRef = &BareMetalHostReference{ - Name: "other-bmh", - Namespace: "test-bmh-namespace", + newClusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: "other-bmh", } warns, err := newClusterInstall.ValidateUpdate(oldClusterInstall) @@ -354,9 +349,8 @@ var _ = Describe("ValidateUpdate", func() { }, Spec: ImageClusterInstallSpec{ Hostname: "test", - BareMetalHostRef: &BareMetalHostReference{ - Name: "test-bmh", - Namespace: "test-bmh-namespace", + BareMetalHostRef: &corev1.LocalObjectReference{ + Name: "test-bmh", }, }, Status: ImageClusterInstallStatus{ @@ -384,9 +378,8 @@ var _ = Describe("ValidateUpdate", func() { }, Spec: ImageClusterInstallSpec{ Hostname: "test", - BareMetalHostRef: &BareMetalHostReference{ - Name: "test-bmh", - Namespace: "test-bmh-namespace", + BareMetalHostRef: &corev1.LocalObjectReference{ + Name: "test-bmh", }, }, Status: ImageClusterInstallStatus{ @@ -402,9 +395,8 @@ var _ = Describe("ValidateUpdate", func() { }) It("fail status and spec update when installation started", func() { - bareMetalHostRef := &BareMetalHostReference{ - Name: "test-bmh", - Namespace: "test-bmh-namespace", + bareMetalHostRef := &corev1.LocalObjectReference{ + Name: "test-bmh", } oldClusterInstall := &ImageClusterInstall{ @@ -442,9 +434,8 @@ var _ = Describe("ValidateUpdate", func() { }, Spec: ImageClusterInstallSpec{ Hostname: "test", - BareMetalHostRef: &BareMetalHostReference{ - Name: "test-bmh", - Namespace: "test-bmh-namespace", + BareMetalHostRef: &corev1.LocalObjectReference{ + Name: "test-bmh", }, }, Status: ImageClusterInstallStatus{ diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index a9a0d7fcc..77438b29c 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -27,21 +27,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" ) -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *BareMetalHostReference) DeepCopyInto(out *BareMetalHostReference) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BareMetalHostReference. -func (in *BareMetalHostReference) DeepCopy() *BareMetalHostReference { - if in == nil { - return nil - } - out := new(BareMetalHostReference) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ImageClusterInstall) DeepCopyInto(out *ImageClusterInstall) { *out = *in @@ -134,7 +119,7 @@ func (in *ImageClusterInstallSpec) DeepCopyInto(out *ImageClusterInstallSpec) { } if in.BareMetalHostRef != nil { in, out := &in.BareMetalHostRef, &out.BareMetalHostRef - *out = new(BareMetalHostReference) + *out = new(v1.LocalObjectReference) **out = **in } if in.MachineNetworks != nil { @@ -176,7 +161,7 @@ func (in *ImageClusterInstallStatus) DeepCopyInto(out *ImageClusterInstallStatus } if in.BareMetalHostRef != nil { in, out := &in.BareMetalHostRef, &out.BareMetalHostRef - *out = new(BareMetalHostReference) + *out = new(v1.LocalObjectReference) **out = **in } in.BootTime.DeepCopyInto(&out.BootTime) diff --git a/bundle/manifests/extensions.hive.openshift.io_imageclusterinstalls.yaml b/bundle/manifests/extensions.hive.openshift.io_imageclusterinstalls.yaml index 584154219..d349b21e8 100644 --- a/bundle/manifests/extensions.hive.openshift.io_imageclusterinstalls.yaml +++ b/bundle/manifests/extensions.hive.openshift.io_imageclusterinstalls.yaml @@ -66,16 +66,16 @@ spec: be used to attach the configuration to the host. properties: name: - description: Name identifies the BareMetalHost within a namespace - type: string - namespace: - description: Namespace identifies the namespace containing the - referenced BareMetalHost + default: "" + description: |- + Name of the referent. + This field is effectively required, but due to backwards compatibility is + allowed to be empty. Instances of this type with an empty value here are + almost certainly wrong. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names type: string - required: - - name - - namespace type: object + x-kubernetes-map-type: atomic caBundleRef: description: |- CABundle is a reference to a config map containing the new bundle of trusted certificates for the host. @@ -365,18 +365,21 @@ spec: description: ImageClusterInstallStatus defines the observed state of ImageClusterInstall properties: bareMetalHostRef: + description: |- + LocalObjectReference contains enough information to let you locate the + referenced object inside the same namespace. properties: name: - description: Name identifies the BareMetalHost within a namespace - type: string - namespace: - description: Namespace identifies the namespace containing the - referenced BareMetalHost + default: "" + description: |- + Name of the referent. + This field is effectively required, but due to backwards compatibility is + allowed to be empty. Instances of this type with an empty value here are + almost certainly wrong. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names type: string - required: - - name - - namespace type: object + x-kubernetes-map-type: atomic bootTime: description: BootTime indicates the time at which the host was requested to boot. Used to determine install timeouts. diff --git a/bundle/manifests/image-based-install-operator.clusterserviceversion.yaml b/bundle/manifests/image-based-install-operator.clusterserviceversion.yaml index 426a19661..cefc9f58b 100644 --- a/bundle/manifests/image-based-install-operator.clusterserviceversion.yaml +++ b/bundle/manifests/image-based-install-operator.clusterserviceversion.yaml @@ -12,8 +12,7 @@ metadata: }, "spec": { "bareMetalHostRef": { - "name": "host-0", - "namespace": "test-sno" + "name": "host-0" }, "clusterDeploymentRef": { "name": "test-sno" @@ -36,7 +35,7 @@ metadata: } ] capabilities: Basic Install - createdAt: "2026-04-26T07:25:00Z" + createdAt: "2026-04-30T14:01:51Z" operators.operatorframework.io/builder: operator-sdk-v1.30.0 operators.operatorframework.io/project_layout: go.kubebuilder.io/v3 name: image-based-install-operator.v0.0.1 diff --git a/config/crd/bases/extensions.hive.openshift.io_imageclusterinstalls.yaml b/config/crd/bases/extensions.hive.openshift.io_imageclusterinstalls.yaml index f535bc38d..ca4c4b720 100644 --- a/config/crd/bases/extensions.hive.openshift.io_imageclusterinstalls.yaml +++ b/config/crd/bases/extensions.hive.openshift.io_imageclusterinstalls.yaml @@ -64,16 +64,16 @@ spec: be used to attach the configuration to the host. properties: name: - description: Name identifies the BareMetalHost within a namespace - type: string - namespace: - description: Namespace identifies the namespace containing the - referenced BareMetalHost + default: "" + description: |- + Name of the referent. + This field is effectively required, but due to backwards compatibility is + allowed to be empty. Instances of this type with an empty value here are + almost certainly wrong. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names type: string - required: - - name - - namespace type: object + x-kubernetes-map-type: atomic caBundleRef: description: |- CABundle is a reference to a config map containing the new bundle of trusted certificates for the host. @@ -363,18 +363,21 @@ spec: description: ImageClusterInstallStatus defines the observed state of ImageClusterInstall properties: bareMetalHostRef: + description: |- + LocalObjectReference contains enough information to let you locate the + referenced object inside the same namespace. properties: name: - description: Name identifies the BareMetalHost within a namespace - type: string - namespace: - description: Namespace identifies the namespace containing the - referenced BareMetalHost + default: "" + description: |- + Name of the referent. + This field is effectively required, but due to backwards compatibility is + allowed to be empty. Instances of this type with an empty value here are + almost certainly wrong. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names type: string - required: - - name - - namespace type: object + x-kubernetes-map-type: atomic bootTime: description: BootTime indicates the time at which the host was requested to boot. Used to determine install timeouts. diff --git a/config/samples/extensions_v1alpha1_imageclusterinstall.yaml b/config/samples/extensions_v1alpha1_imageclusterinstall.yaml index 284e52822..d1a65672f 100644 --- a/config/samples/extensions_v1alpha1_imageclusterinstall.yaml +++ b/config/samples/extensions_v1alpha1_imageclusterinstall.yaml @@ -12,7 +12,6 @@ spec: name: 4.14.10 bareMetalHostRef: name: host-0 - namespace: test-sno machineNetworks: - cidr: "192.0.2.0/24" - cidr: "2001:db8::/64" diff --git a/controllers/imageclusterinstall_controller.go b/controllers/imageclusterinstall_controller.go index c16358480..212301d52 100644 --- a/controllers/imageclusterinstall_controller.go +++ b/controllers/imageclusterinstall_controller.go @@ -292,9 +292,9 @@ func (r *ImageClusterInstallReconciler) validateConfiguration( return nil, nil } - bmh, err := r.getBMH(ctx, ici.Spec.BareMetalHostRef) + bmh, err := r.getBMH(ctx, ici) if err != nil { - cond.Message = fmt.Sprintf("failed to get BareMetalHost %s/%s", ici.Spec.BareMetalHostRef.Namespace, ici.Spec.BareMetalHostRef.Name) + cond.Message = fmt.Sprintf("failed to get BareMetalHost %s/%s", ici.Namespace, ici.Spec.BareMetalHostRef.Name) log.Error(err) return nil, nil } @@ -609,8 +609,7 @@ func (r *ImageClusterInstallReconciler) mapBMHToICI(ctx context.Context, obj cli } listOptions := []client.ListOption{ client.MatchingFields{ - ".spec.bareMetalHostRef.name": bmhName, - ".spec.bareMetalHostRef.namespace": bmhNamespace}, + ".spec.bareMetalHostRef.name": bmhName}, } iciList := &v1alpha1.ImageClusterInstallList{} if err := r.List(ctx, iciList, listOptions...); err != nil { @@ -690,15 +689,6 @@ func (r *ImageClusterInstallReconciler) addIndexforBaremetalHostRef(mgr ctrl.Man }); err != nil { return err } - if err := mgr.GetFieldIndexer().IndexField(context.TODO(), &v1alpha1.ImageClusterInstall{}, ".spec.bareMetalHostRef.namespace", func(rawObj client.Object) []string { - ici, ok := rawObj.(*v1alpha1.ImageClusterInstall) - if !ok || ici.Spec.BareMetalHostRef == nil { - return nil - } - return []string{ici.Spec.BareMetalHostRef.Namespace} - }); err != nil { - return err - } return nil } @@ -805,11 +795,11 @@ func (r *ImageClusterInstallReconciler) getCD(ctx context.Context, ici *v1alpha1 return clusterDeployment, nil } -func (r *ImageClusterInstallReconciler) getBMH(ctx context.Context, bmhRef *v1alpha1.BareMetalHostReference) (*bmh_v1alpha1.BareMetalHost, error) { +func (r *ImageClusterInstallReconciler) getBMH(ctx context.Context, ici *v1alpha1.ImageClusterInstall) (*bmh_v1alpha1.BareMetalHost, error) { bmh := &bmh_v1alpha1.BareMetalHost{} key := types.NamespacedName{ - Name: bmhRef.Name, - Namespace: bmhRef.Namespace, + Name: ici.Spec.BareMetalHostRef.Name, + Namespace: ici.Namespace, } if err := r.Get(ctx, key, bmh); err != nil { return nil, err @@ -914,8 +904,8 @@ func (r *ImageClusterInstallReconciler) labelSecretForBackup(ctx context.Context return nil } -func (r *ImageClusterInstallReconciler) labelBMHForBackup(ctx context.Context, bmhRef *v1alpha1.BareMetalHostReference) error { - bmh, err := r.getBMH(ctx, bmhRef) +func (r *ImageClusterInstallReconciler) labelBMHForBackup(ctx context.Context, ici *v1alpha1.ImageClusterInstall) error { + bmh, err := r.getBMH(ctx, ici) if err != nil { return err } @@ -927,8 +917,8 @@ func (r *ImageClusterInstallReconciler) labelBMHForBackup(ctx context.Context, b return nil } -func (r *ImageClusterInstallReconciler) labelDataImageForBackup(ctx context.Context, bmhRef *v1alpha1.BareMetalHostReference) error { - dataImage, err := r.getDataImage(ctx, bmhRef.Namespace, bmhRef.Name) +func (r *ImageClusterInstallReconciler) labelDataImageForBackup(ctx context.Context, ici *v1alpha1.ImageClusterInstall) error { + dataImage, err := r.getDataImage(ctx, ici.Namespace, ici.Spec.BareMetalHostRef.Name) if err != nil { return err } @@ -970,12 +960,12 @@ func (r *ImageClusterInstallReconciler) labelReferencedObjectsForBackup(ctx cont } if ici.Spec.BareMetalHostRef != nil { - if err := r.labelBMHForBackup(ctx, ici.Spec.BareMetalHostRef); err != nil { - log.WithError(err).Errorf("failed to label BMH %s/%s for backup", ici.Spec.BareMetalHostRef.Namespace, ici.Spec.BareMetalHostRef.Name) + if err := r.labelBMHForBackup(ctx, ici); err != nil { + log.WithError(err).Errorf("failed to label BMH %s/%s for backup", ici.Namespace, ici.Spec.BareMetalHostRef.Name) } - if err := r.labelDataImageForBackup(ctx, ici.Spec.BareMetalHostRef); err != nil { - log.WithError(err).Errorf("failed to label DataImage %s/%s for backup", ici.Spec.BareMetalHostRef.Namespace, ici.Spec.BareMetalHostRef.Name) + if err := r.labelDataImageForBackup(ctx, ici); err != nil { + log.WithError(err).Errorf("failed to label DataImage %s/%s for backup", ici.Namespace, ici.Spec.BareMetalHostRef.Name) } } @@ -1415,7 +1405,7 @@ func (r *ImageClusterInstallReconciler) handleFinalizer(ctx context.Context, log if ici.Spec.BareMetalHostRef != nil { key := types.NamespacedName{ Name: ici.Spec.BareMetalHostRef.Name, - Namespace: ici.Spec.BareMetalHostRef.Namespace, + Namespace: ici.Namespace, } dataImage, err := r.removeBMHDataImage(ctx, log, key) diff --git a/controllers/imageclusterinstall_controller_test.go b/controllers/imageclusterinstall_controller_test.go index c4a5cfb82..4957413bc 100644 --- a/controllers/imageclusterinstall_controller_test.go +++ b/controllers/imageclusterinstall_controller_test.go @@ -28,6 +28,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/openshift/image-based-install-operator/api/v1alpha1" "github.com/openshift/image-based-install-operator/internal/credentials" "github.com/openshift/image-based-install-operator/internal/installer" @@ -114,11 +115,11 @@ const seedReconfigData = `{ "pull_secret": "{\"auths\":{\"quay.io\":{\"auth\":\"cGFzc3dvcmQK\",\"email\":\"test@example.com\"}}}\n" }` -func bmhInState(state bmh_v1alpha1.ProvisioningState) *bmh_v1alpha1.BareMetalHost { +func bmhInState(state bmh_v1alpha1.ProvisioningState, namespace string) *bmh_v1alpha1.BareMetalHost { return &bmh_v1alpha1.BareMetalHost{ ObjectMeta: metav1.ObjectMeta{ Name: "test-bmh", - Namespace: "test-bmh-namespace", + Namespace: namespace, }, Status: bmh_v1alpha1.BareMetalHostStatus{ Provisioning: bmh_v1alpha1.ProvisionStatus{ @@ -220,7 +221,7 @@ var _ = Describe("Reconcile", func() { bmh := &bmh_v1alpha1.BareMetalHost{ ObjectMeta: metav1.ObjectMeta{ Name: "test-1", - Namespace: "test-bmh-namespace", + Namespace: clusterInstallNamespace, }, Status: bmh_v1alpha1.BareMetalHostStatus{ Provisioning: bmh_v1alpha1.ProvisionStatus{ @@ -247,9 +248,8 @@ var _ = Describe("Reconcile", func() { Name: imageSet.Name, }, ClusterDeploymentRef: &corev1.LocalObjectReference{Name: clusterInstallName}, - BareMetalHostRef: &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + BareMetalHostRef: &corev1.LocalObjectReference{ + Name: bmh.Name, }, }, } @@ -706,7 +706,7 @@ var _ = Describe("Reconcile", func() { }) It("copies the nmstate config bmh preprovisioningNetworkDataName", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) secret := &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ Name: "netconfig", @@ -719,9 +719,8 @@ var _ = Describe("Reconcile", func() { bmh.Spec.PreprovisioningNetworkDataName = "netconfig" Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } Expect(c.Create(ctx, clusterInstall)).To(Succeed()) Expect(c.Create(ctx, clusterDeployment)).To(Succeed()) @@ -748,7 +747,7 @@ var _ = Describe("Reconcile", func() { }) It("fails if nmstate config is bad yaml", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) invalidNmstateString := "some\nnmstate\nstring" secret := &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ @@ -762,9 +761,8 @@ var _ = Describe("Reconcile", func() { bmh.Spec.PreprovisioningNetworkDataName = "netconfig" Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } Expect(c.Create(ctx, clusterInstall)).To(Succeed()) Expect(c.Create(ctx, clusterDeployment)).To(Succeed()) @@ -784,13 +782,12 @@ var _ = Describe("Reconcile", func() { It("fails when a referenced nmstate secret is missing", func() { // note that we don't create the netconfig secret. - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) bmh.Spec.PreprovisioningNetworkDataName = "netconfig" Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } Expect(c.Create(ctx, clusterInstall)).To(Succeed()) @@ -810,7 +807,7 @@ var _ = Describe("Reconcile", func() { }) It("fails when the referenced nmstate secret is missing the required key", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) secret := &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ Name: "netconfig", @@ -822,9 +819,8 @@ var _ = Describe("Reconcile", func() { bmh.Spec.PreprovisioningNetworkDataName = "netconfig" Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } Expect(c.Create(ctx, clusterInstall)).To(Succeed()) Expect(c.Create(ctx, clusterDeployment)).To(Succeed()) @@ -968,13 +964,12 @@ var _ = Describe("Reconcile", func() { }) It("Set status condition in case dataImage exists and being deleted", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) bmh.Spec.ExternallyProvisioned = true Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } Expect(c.Create(ctx, clusterInstall)).To(Succeed()) Expect(c.Create(ctx, clusterDeployment)).To(Succeed()) @@ -1022,13 +1017,12 @@ var _ = Describe("Reconcile", func() { }) It("configures a referenced BMH with state registering and ExternallyProvisioned true", func() { - bmh := bmhInState(bmh_v1alpha1.StateRegistering) + bmh := bmhInState(bmh_v1alpha1.StateRegistering, clusterInstall.Namespace) bmh.Spec.ExternallyProvisioned = true Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } Expect(c.Create(ctx, clusterInstall)).To(Succeed()) Expect(c.Create(ctx, clusterDeployment)).To(Succeed()) @@ -1060,14 +1054,13 @@ var _ = Describe("Reconcile", func() { }) It("configures a referenced BMH with state available, ExternallyProvisioned false and online true", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) bmh.Spec.Online = true bmh.Spec.ExternallyProvisioned = false Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } Expect(c.Create(ctx, clusterInstall)).To(Succeed()) Expect(c.Create(ctx, clusterDeployment)).To(Succeed()) @@ -1101,14 +1094,13 @@ var _ = Describe("Reconcile", func() { }) It("configures a referenced BMH with state available, ExternallyProvisioned false and online false", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) bmh.Spec.Online = false bmh.Spec.ExternallyProvisioned = false Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } Expect(c.Create(ctx, clusterInstall)).To(Succeed()) Expect(c.Create(ctx, clusterDeployment)).To(Succeed()) @@ -1142,14 +1134,13 @@ var _ = Describe("Reconcile", func() { }) It("configures a referenced BMH with state externally provisioned and online false", func() { - bmh := bmhInState(bmh_v1alpha1.StateExternallyProvisioned) + bmh := bmhInState(bmh_v1alpha1.StateExternallyProvisioned, clusterInstall.Namespace) bmh.Spec.ExternallyProvisioned = true bmh.Status.PoweredOn = false Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } Expect(c.Create(ctx, clusterInstall)).To(Succeed()) Expect(c.Create(ctx, clusterDeployment)).To(Succeed()) @@ -1182,13 +1173,12 @@ var _ = Describe("Reconcile", func() { }) It("configures a referenced BMH with status externally provisioned and online true", func() { - bmh := bmhInState(bmh_v1alpha1.StateExternallyProvisioned) + bmh := bmhInState(bmh_v1alpha1.StateExternallyProvisioned, clusterInstall.Namespace) bmh.Spec.ExternallyProvisioned = true Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } Expect(c.Create(ctx, clusterInstall)).To(Succeed()) Expect(c.Create(ctx, clusterDeployment)).To(Succeed()) @@ -1221,13 +1211,12 @@ var _ = Describe("Reconcile", func() { }) It("don't set reboot annotation in case data image was attached already", func() { - bmh := bmhInState(bmh_v1alpha1.StateExternallyProvisioned) + bmh := bmhInState(bmh_v1alpha1.StateExternallyProvisioned, clusterInstall.Namespace) bmh.Spec.ExternallyProvisioned = true Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } Expect(c.Create(ctx, clusterInstall)).To(Succeed()) Expect(c.Create(ctx, clusterDeployment)).To(Succeed()) @@ -1271,12 +1260,11 @@ var _ = Describe("Reconcile", func() { }) It("sets the BMH ref in the cluster install status", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } Expect(c.Create(ctx, clusterInstall)).To(Succeed()) Expect(c.Create(ctx, clusterDeployment)).To(Succeed()) @@ -1300,12 +1288,11 @@ var _ = Describe("Reconcile", func() { Expect(clusterInstall.Status.BareMetalHostRef).To(HaveValue(Equal(*clusterInstall.Spec.BareMetalHostRef))) }) It("sets disables AutomatedCleaningMode", func() { - bmh := bmhInState(bmh_v1alpha1.StateExternallyProvisioned) + bmh := bmhInState(bmh_v1alpha1.StateExternallyProvisioned, clusterInstall.Namespace) Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } Expect(c.Create(ctx, clusterInstall)).To(Succeed()) Expect(c.Create(ctx, clusterDeployment)).To(Succeed()) @@ -1379,10 +1366,8 @@ var _ = Describe("Reconcile", func() { }) It("Set ClusterInstallRequirementsMet to false in case there is not actual bmh under the reference", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: "doesntExist", - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: "doesntExist", } clusterInstall.Spec.MachineNetwork = "192.168.1.0/24" Expect(c.Create(ctx, clusterInstall)).To(Succeed()) @@ -1402,16 +1387,15 @@ var _ = Describe("Reconcile", func() { Expect(cond).NotTo(BeNil()) Expect(cond.Status).To(Equal(corev1.ConditionFalse)) Expect(cond.Reason).To(Equal(v1alpha1.ConfigurationPendingReason)) - Expect(cond.Message).To(Equal("failed to get BareMetalHost test-bmh-namespace/doesntExist")) + Expect(cond.Message).To(Equal(fmt.Sprintf("failed to get BareMetalHost %s/doesntExist", clusterInstallNamespace))) }) It("updates the cluster install and cluster deployment metadata", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } clusterInstall.Spec.Hostname = "thing" Expect(c.Create(ctx, clusterInstall)).To(Succeed()) @@ -1446,12 +1430,11 @@ var _ = Describe("Reconcile", func() { }) It("sets the cluster install metadata to the ids from the reconfig secret when it exists", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } clusterInstall.Spec.Hostname = "thing" Expect(c.Create(ctx, clusterInstall)).To(Succeed()) @@ -1493,13 +1476,12 @@ var _ = Describe("Reconcile", func() { }) It("succeeds in case bmh has ip in provided machine network", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) bmh.Status.HardwareDetails.NIC = []bmh_v1alpha1.NIC{{IP: "192.168.1.30"}} Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } clusterInstall.Spec.MachineNetwork = "192.168.1.0/24" Expect(c.Create(ctx, clusterInstall)).To(Succeed()) @@ -1526,7 +1508,7 @@ var _ = Describe("Reconcile", func() { }) It("succeeds in case bmh has disabled inspection and no hw details", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) bmh.Status.HardwareDetails = nil if bmh.ObjectMeta.Annotations == nil { bmh.ObjectMeta.Annotations = make(map[string]string) @@ -1534,9 +1516,8 @@ var _ = Describe("Reconcile", func() { bmh.ObjectMeta.Annotations[inspectAnnotation] = "disabled" Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } clusterInstall.Spec.MachineNetwork = "192.168.1.0/24" Expect(c.Create(ctx, clusterInstall)).To(Succeed()) @@ -1563,10 +1544,9 @@ var _ = Describe("Reconcile", func() { }) It("in case there is no actual bmh under the reference we should not return error", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } clusterInstall.Spec.MachineNetwork = "192.168.1.0/24" Expect(c.Create(ctx, clusterInstall)).To(Succeed()) @@ -1583,13 +1563,12 @@ var _ = Describe("Reconcile", func() { }) It("requeue in case bmh has no hw details but after adding them it succeeds", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) bmh.Status.HardwareDetails = nil Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } clusterInstall.Spec.MachineNetwork = "192.168.1.0/24" Expect(c.Create(ctx, clusterInstall)).To(Succeed()) @@ -1644,13 +1623,12 @@ var _ = Describe("Reconcile", func() { }) It("fails in case bmh has no ip in provided machine network but after changing machine network it succeeds", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) bmh.Status.HardwareDetails.NIC = []bmh_v1alpha1.NIC{{IP: "192.168.1.30"}} Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } // bad machine network clusterInstall.Spec.MachineNetwork = "192.168.5.0/24" @@ -1699,13 +1677,12 @@ var _ = Describe("Reconcile", func() { }) It("succeeds when no machine networks are specified", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) bmh.Status.HardwareDetails.NIC = []bmh_v1alpha1.NIC{{IP: "192.168.1.30"}} Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } // No machine networks specified - should be valid Expect(c.Create(ctx, clusterInstall)).To(Succeed()) @@ -1729,13 +1706,12 @@ var _ = Describe("Reconcile", func() { }) It("succeeds with single network using new MachineNetworks field", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) bmh.Status.HardwareDetails.NIC = []bmh_v1alpha1.NIC{{IP: "192.168.1.30", MAC: "aa:bb:cc:dd:ee:ff"}} Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } clusterInstall.Spec.MachineNetworks = []v1alpha1.MachineNetworkEntry{ {CIDR: "192.168.1.0/24"}, @@ -1763,16 +1739,15 @@ var _ = Describe("Reconcile", func() { }) It("fails with dual-stack when BMH has IPv4 but no IPv6 in networks", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) // Only IPv4 address, missing IPv6 bmh.Status.HardwareDetails.NIC = []bmh_v1alpha1.NIC{ {IP: "192.168.1.30", MAC: "aa:bb:cc:dd:ee:ff"}, } Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } clusterInstall.Spec.MachineNetworks = []v1alpha1.MachineNetworkEntry{ {CIDR: "192.168.1.0/24"}, @@ -1799,16 +1774,15 @@ var _ = Describe("Reconcile", func() { }) It("fails with dual-stack when BMH has IPv6 but no IPv4 in networks", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) // Only IPv6 address, missing IPv4 bmh.Status.HardwareDetails.NIC = []bmh_v1alpha1.NIC{ {IP: "2001:db8::30", MAC: "aa:bb:cc:dd:ee:ff"}, } Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } clusterInstall.Spec.MachineNetworks = []v1alpha1.MachineNetworkEntry{ {CIDR: "192.168.1.0/24"}, @@ -1835,15 +1809,14 @@ var _ = Describe("Reconcile", func() { }) It("fails with dual-stack when all networks are IPv4", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) bmh.Status.HardwareDetails.NIC = []bmh_v1alpha1.NIC{ {IP: "192.168.1.30", MAC: "aa:bb:cc:dd:ee:ff"}, } Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } clusterInstall.Spec.MachineNetworks = []v1alpha1.MachineNetworkEntry{ {CIDR: "192.168.1.0/24"}, @@ -1870,7 +1843,7 @@ var _ = Describe("Reconcile", func() { }) It("fails with dual-stack when BMH has different MACs for IPv4 and IPv6", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) // Different MACs for IPv4 and IPv6 (different physical interfaces) bmh.Status.HardwareDetails.NIC = []bmh_v1alpha1.NIC{ {IP: "192.168.1.30", MAC: "aa:bb:cc:dd:ee:ff"}, @@ -1878,9 +1851,8 @@ var _ = Describe("Reconcile", func() { } Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } clusterInstall.Spec.MachineNetworks = []v1alpha1.MachineNetworkEntry{ {CIDR: "192.168.1.0/24"}, @@ -1907,7 +1879,7 @@ var _ = Describe("Reconcile", func() { }) It("succeeds with dual-stack when BMH reports multiple NIC with correct IPv4/IPv6 IPs", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) bmh.Status.HardwareDetails.NIC = []bmh_v1alpha1.NIC{ {IP: "192.168.1.30", MAC: "aa:bb:cc:dd:ee:ff"}, // IPv4 in machine network {IP: "2001:db8::30", MAC: "aa:bb:cc:dd:ee:ff"}, // IPv6 in machine network @@ -1916,9 +1888,8 @@ var _ = Describe("Reconcile", func() { } Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } clusterInstall.Spec.MachineNetworks = []v1alpha1.MachineNetworkEntry{ {CIDR: "192.168.1.0/24"}, @@ -1945,7 +1916,7 @@ var _ = Describe("Reconcile", func() { }) It("ignores NICs with empty IP or MAC addresses", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) bmh.Status.HardwareDetails.NIC = []bmh_v1alpha1.NIC{ {IP: "", MAC: "aa:bb:cc:dd:ee:ff"}, // Empty IP {IP: "192.168.1.30", MAC: ""}, // Empty MAC @@ -1954,9 +1925,8 @@ var _ = Describe("Reconcile", func() { } Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } clusterInstall.Spec.MachineNetworks = []v1alpha1.MachineNetworkEntry{ {CIDR: "192.168.1.0/24"}, @@ -1983,16 +1953,15 @@ var _ = Describe("Reconcile", func() { }) It("returns error when legacy MachineNetwork mismatches first MachineNetworks entry", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) bmh.Status.HardwareDetails.NIC = []bmh_v1alpha1.NIC{ {IP: "192.168.1.30", MAC: "aa:bb:cc:dd:ee:ff"}, {IP: "2001:db8::30", MAC: "aa:bb:cc:dd:ee:ff"}, } Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } // Set both legacy and new fields - mismatch should now error clusterInstall.Spec.MachineNetwork = "10.0.0.0/8" // Wrong network @@ -2117,14 +2086,13 @@ var _ = Describe("Reconcile", func() { }) It("labels BMH and DataImage for backup", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) bmh.Spec.Online = true bmh.Spec.ExternallyProvisioned = false Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } Expect(c.Create(ctx, clusterInstall)).To(Succeed()) clusterDeployment.Spec.ClusterName = "test" @@ -2168,14 +2136,13 @@ var _ = Describe("Reconcile", func() { }) It("labels newly created DataImage for backup", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) bmh.Spec.Online = true bmh.Spec.ExternallyProvisioned = false Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } Expect(c.Create(ctx, clusterInstall)).To(Succeed()) clusterDeployment.Spec.ClusterName = "test" @@ -2209,7 +2176,7 @@ var _ = Describe("Reconcile", func() { It("labels referenced resources for backup when cluster is already marked as installed", func() { // Create BMH - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) bmh.Spec.Online = true bmh.Spec.ExternallyProvisioned = false Expect(c.Create(ctx, bmh)).To(Succeed()) @@ -2249,9 +2216,8 @@ var _ = Describe("Reconcile", func() { Expect(c.Create(ctx, extraManifestCM)).To(Succeed()) // Set up ImageClusterInstall with InstallationCompleted condition set to True - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } clusterInstall.Spec.CABundleRef = &corev1.LocalObjectReference{ Name: "ca-bundle", @@ -2344,12 +2310,11 @@ var _ = Describe("Reconcile", func() { }) It("runs the reinstall logic", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } clusterInstall.Spec.Hostname = "thing" Expect(c.Create(ctx, clusterInstall)).To(Succeed()) @@ -2371,12 +2336,11 @@ var _ = Describe("Reconcile", func() { // Generated by Cursor It("ensures RequirementsMet condition is True when BootTime is set after reconcile", func() { // Create BMH in the correct state (StateExternallyProvisioned) - bmh := bmhInState(bmh_v1alpha1.StateExternallyProvisioned) + bmh := bmhInState(bmh_v1alpha1.StateExternallyProvisioned, clusterInstall.Namespace) Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } // Simulate the bug scenario: Set a stale condition that shows False status @@ -2500,7 +2464,7 @@ var _ = Describe("Reconcile with DataImageCoolDownPeriod set to 1 second", func( bmh := &bmh_v1alpha1.BareMetalHost{ ObjectMeta: metav1.ObjectMeta{ Name: "test-1", - Namespace: "test-bmh-namespace", + Namespace: clusterInstallNamespace, }, Status: bmh_v1alpha1.BareMetalHostStatus{ Provisioning: bmh_v1alpha1.ProvisionStatus{ @@ -2527,9 +2491,8 @@ var _ = Describe("Reconcile with DataImageCoolDownPeriod set to 1 second", func( Name: imageSet.Name, }, ClusterDeploymentRef: &corev1.LocalObjectReference{Name: clusterInstallName}, - BareMetalHostRef: &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + BareMetalHostRef: &corev1.LocalObjectReference{ + Name: bmh.Name, }, }, } @@ -2562,14 +2525,13 @@ var _ = Describe("Reconcile with DataImageCoolDownPeriod set to 1 second", func( } It("configures a referenced BMH", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) bmh.Spec.Online = true bmh.Spec.ExternallyProvisioned = false Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } Expect(c.Create(ctx, clusterInstall)).To(Succeed()) Expect(c.Create(ctx, clusterDeployment)).To(Succeed()) @@ -2606,14 +2568,13 @@ var _ = Describe("Reconcile with DataImageCoolDownPeriod set to 1 second", func( Expect(dataImage.Spec.URL).To(Equal(imageURL())) }) It("configures a referenced BMH when dataImage already exists", func() { - bmh := bmhInState(bmh_v1alpha1.StateAvailable) + bmh := bmhInState(bmh_v1alpha1.StateAvailable, clusterInstall.Namespace) bmh.Spec.Online = true bmh.Spec.ExternallyProvisioned = false Expect(c.Create(ctx, bmh)).To(Succeed()) - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } Expect(c.Create(ctx, clusterInstall)).To(Succeed()) Expect(c.Create(ctx, clusterDeployment)).To(Succeed()) @@ -2628,7 +2589,7 @@ var _ = Describe("Reconcile with DataImageCoolDownPeriod set to 1 second", func( dataImage := bmh_v1alpha1.DataImage{ ObjectMeta: metav1.ObjectMeta{ Name: "test-bmh", - Namespace: "test-bmh-namespace", + Namespace: clusterInstallNamespace, }, Spec: bmh_v1alpha1.DataImageSpec{ URL: fmt.Sprintf("https://images-namespace.cluster.example.com/images/%s/%s.iso", clusterInstallNamespace, clusterInstall.ObjectMeta.UID), @@ -2681,13 +2642,6 @@ var _ = Describe("mapBMHToICI", func() { } return []string{ici.Spec.BareMetalHostRef.Name} }). - WithIndex(&v1alpha1.ImageClusterInstall{}, ".spec.bareMetalHostRef.namespace", func(rawObj client.Object) []string { - ici, ok := rawObj.(*v1alpha1.ImageClusterInstall) - if !ok || ici.Spec.BareMetalHostRef == nil { - return nil - } - return []string{ici.Spec.BareMetalHostRef.Namespace} - }). Build() c = FakeClientWithTimestamp{Client: fc} @@ -2702,7 +2656,7 @@ var _ = Describe("mapBMHToICI", func() { bmh := &bmh_v1alpha1.BareMetalHost{ ObjectMeta: metav1.ObjectMeta{ Name: "test-bmh", - Namespace: "test-bmh-namespace", + Namespace: clusterInstallNamespace, }, } Expect(c.Create(ctx, bmh)).To(Succeed()) @@ -2713,9 +2667,8 @@ var _ = Describe("mapBMHToICI", func() { Namespace: clusterInstallNamespace, }, Spec: v1alpha1.ImageClusterInstallSpec{ - BareMetalHostRef: &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + BareMetalHostRef: &corev1.LocalObjectReference{ + Name: bmh.Name, }, }, } @@ -2741,7 +2694,7 @@ var _ = Describe("mapBMHToICI", func() { bmh := &bmh_v1alpha1.BareMetalHost{ ObjectMeta: metav1.ObjectMeta{ Name: "test-bmh", - Namespace: "test-bmh-namespace", + Namespace: clusterInstallNamespace, }, } Expect(c.Create(ctx, bmh)).To(Succeed()) @@ -2752,9 +2705,8 @@ var _ = Describe("mapBMHToICI", func() { Namespace: clusterInstallNamespace, }, Spec: v1alpha1.ImageClusterInstallSpec{ - BareMetalHostRef: &v1alpha1.BareMetalHostReference{ - Name: "other-bmh", - Namespace: bmh.Namespace, + BareMetalHostRef: &corev1.LocalObjectReference{ + Name: "other-bmh", }, }, } @@ -2969,9 +2921,8 @@ var _ = Describe("handleFinalizer", func() { Finalizers: []string{clusterInstallFinalizerName}, }, Spec: v1alpha1.ImageClusterInstallSpec{ - BareMetalHostRef: &v1alpha1.BareMetalHostReference{ - Name: "test-bmh", - Namespace: "test-bmh-namespace", + BareMetalHostRef: &corev1.LocalObjectReference{ + Name: "test-bmh", }, }, } @@ -2980,7 +2931,7 @@ var _ = Describe("handleFinalizer", func() { dataImage := bmh_v1alpha1.DataImage{ ObjectMeta: metav1.ObjectMeta{ Name: "test-bmh", - Namespace: "test-bmh-namespace", + Namespace: clusterInstallNamespace, }, Spec: bmh_v1alpha1.DataImageSpec{ URL: fmt.Sprintf("https://images-namespace.cluster.example.com/images/%s/%s.iso", clusterInstallNamespace, clusterInstall.ObjectMeta.UID), @@ -3013,7 +2964,7 @@ var _ = Describe("handleFinalizer", func() { }) It("removes dataimage on ici delete", func() { - bmh := bmhInState(bmh_v1alpha1.StateExternallyProvisioned) + bmh := bmhInState(bmh_v1alpha1.StateExternallyProvisioned, clusterInstallNamespace) bmh.Spec.Online = true setAnnotationIfNotExists(&bmh.ObjectMeta, detachedAnnotation, detachedAnnotationValue) @@ -3024,9 +2975,8 @@ var _ = Describe("handleFinalizer", func() { Finalizers: []string{clusterInstallFinalizerName}, }, Spec: v1alpha1.ImageClusterInstallSpec{ - BareMetalHostRef: &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + BareMetalHostRef: &corev1.LocalObjectReference{ + Name: bmh.Name, }, }, } diff --git a/controllers/imageclusterinstall_monitor.go b/controllers/imageclusterinstall_monitor.go index 9e80a449e..1edf4b93d 100644 --- a/controllers/imageclusterinstall_monitor.go +++ b/controllers/imageclusterinstall_monitor.go @@ -38,9 +38,10 @@ import ( bmh_v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1" apicfgv1 "github.com/openshift/api/config/v1" + "github.com/sirupsen/logrus" + "github.com/openshift/image-based-install-operator/api/v1alpha1" "github.com/openshift/image-based-install-operator/internal/monitor" - "github.com/sirupsen/logrus" ) // ImageClusterInstallMonitor reconciles a ImageClusterInstall object @@ -85,7 +86,7 @@ func (r *ImageClusterInstallMonitor) monitorInstallationProgress( log logrus.FieldLogger, ici *v1alpha1.ImageClusterInstall) (ctrl.Result, error) { - bmh, err := r.getBMH(ctx, ici.Status.BareMetalHostRef) + bmh, err := r.getBMH(ctx, ici) if err != nil { log.WithError(err).Error("failed to get BareMetalHost") return ctrl.Result{}, err @@ -255,11 +256,11 @@ func (r *ImageClusterInstallMonitor) SetupWithManager(mgr ctrl.Manager) error { Complete(r) } -func (r *ImageClusterInstallMonitor) getBMH(ctx context.Context, bmhRef *v1alpha1.BareMetalHostReference) (*bmh_v1alpha1.BareMetalHost, error) { +func (r *ImageClusterInstallMonitor) getBMH(ctx context.Context, ici *v1alpha1.ImageClusterInstall) (*bmh_v1alpha1.BareMetalHost, error) { bmh := &bmh_v1alpha1.BareMetalHost{} key := types.NamespacedName{ - Name: bmhRef.Name, - Namespace: bmhRef.Namespace, + Name: ici.Status.BareMetalHostRef.Name, + Namespace: ici.Namespace, } if err := r.Get(ctx, key, bmh); err != nil { return nil, err diff --git a/controllers/imageclusterinstall_monitor_test.go b/controllers/imageclusterinstall_monitor_test.go index c06bcba85..ff4763637 100644 --- a/controllers/imageclusterinstall_monitor_test.go +++ b/controllers/imageclusterinstall_monitor_test.go @@ -18,10 +18,11 @@ import ( bmh_v1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1" hivev1 "github.com/openshift/hive/apis/hive/v1" + "github.com/sirupsen/logrus" + "github.com/openshift/image-based-install-operator/api/v1alpha1" "github.com/openshift/image-based-install-operator/internal/credentials" "github.com/openshift/image-based-install-operator/internal/monitor" - "github.com/sirupsen/logrus" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -84,7 +85,7 @@ var _ = Describe("Monitor", func() { bmh = &bmh_v1alpha1.BareMetalHost{ ObjectMeta: metav1.ObjectMeta{ Name: "test-1", - Namespace: "test-bmh-namespace", + Namespace: clusterInstallNamespace, Annotations: map[string]string{ibioManagedBMH: ""}, }, Status: bmh_v1alpha1.BareMetalHostStatus{ @@ -112,9 +113,8 @@ var _ = Describe("Monitor", func() { Name: imageSet.Name, }, ClusterDeploymentRef: &corev1.LocalObjectReference{Name: clusterInstallName}, - BareMetalHostRef: &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + BareMetalHostRef: &corev1.LocalObjectReference{ + Name: bmh.Name, }, ClusterMetadata: &hivev1.ClusterMetadata{ AdminKubeconfigSecretRef: corev1.LocalObjectReference{ @@ -123,9 +123,8 @@ var _ = Describe("Monitor", func() { }, }, Status: v1alpha1.ImageClusterInstallStatus{ - BareMetalHostRef: &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + BareMetalHostRef: &corev1.LocalObjectReference{ + Name: bmh.Name, }, BootTime: metav1.Now(), }, @@ -258,9 +257,8 @@ var _ = Describe("Monitor", func() { r.DefaultInstallTimeout = -time.Minute r.GetSpokeClusterInstallStatus = monitor.FailureMonitor - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } Expect(c.Create(ctx, clusterInstall)).To(Succeed()) Expect(c.Create(ctx, clusterDeployment)).To(Succeed()) @@ -293,9 +291,8 @@ var _ = Describe("Monitor", func() { r.DefaultInstallTimeout = -time.Minute r.GetSpokeClusterInstallStatus = monitor.FailureMonitor - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } Expect(c.Create(ctx, clusterInstall)).To(Succeed()) Expect(c.Create(ctx, clusterDeployment)).To(Succeed()) @@ -455,9 +452,8 @@ var _ = Describe("Monitor", func() { It("does not set timeout when the default timeout has passed but the cluster is already installed", func() { // set negative timeout to ensure it triggers and so that no time is wasted in tests r.DefaultInstallTimeout = -time.Minute - clusterInstall.Spec.BareMetalHostRef = &v1alpha1.BareMetalHostReference{ - Name: bmh.Name, - Namespace: bmh.Namespace, + clusterInstall.Spec.BareMetalHostRef = &corev1.LocalObjectReference{ + Name: bmh.Name, } clusterInstall.Status = v1alpha1.ImageClusterInstallStatus{ Conditions: []hivev1.ClusterInstallCondition{ diff --git a/hack/integration-test/imageclusterinstall.yaml b/hack/integration-test/imageclusterinstall.yaml index b955747be..40184c5e0 100644 --- a/hack/integration-test/imageclusterinstall.yaml +++ b/hack/integration-test/imageclusterinstall.yaml @@ -6,7 +6,6 @@ metadata: spec: bareMetalHostRef: name: ostest-extraworker - namespace: ibi-test clusterDeploymentRef: name: ibi-test hostname: ibitesthost