Skip to content

Commit e2d6dfd

Browse files
committed
Convert baremetalSetTemplate field to pointer
As this field is optional we should make it a pointer which ensures proper optional validation i.e struct is optional, but if it is provided, some of its internal fields can be required. Depends-On: openstack-k8s-operators/openstack-baremetal-operator#328 Signed-off-by: rabi <ramishra@redhat.com>
1 parent 8fb6d05 commit e2d6dfd

5 files changed

Lines changed: 42 additions & 25 deletions

File tree

apis/dataplane/v1beta1/openstackdataplanenodeset_types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import (
3737
type OpenStackDataPlaneNodeSetSpec struct {
3838
// +kubebuilder:validation:Optional
3939
// BaremetalSetTemplate Template for BaremetalSet for the NodeSet
40-
BaremetalSetTemplate baremetalv1.OpenStackBaremetalSetTemplateSpec `json:"baremetalSetTemplate,omitempty"`
40+
BaremetalSetTemplate *baremetalv1.OpenStackBaremetalSetTemplateSpec `json:"baremetalSetTemplate,omitempty"`
4141

4242
// +kubebuilder:validation:Required
4343
// NodeTemplate - node attributes specific to nodes defined by this resource. These

apis/dataplane/v1beta1/openstackdataplanenodeset_webhook.go

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,11 @@ func (r *OpenStackDataPlaneNodeSet) Default() {
6868

6969
// Default - set defaults for this OpenStackDataPlaneNodeSet Spec
7070
func (spec *OpenStackDataPlaneNodeSetSpec) Default() {
71-
domain := spec.BaremetalSetTemplate.DomainName
71+
var domain string
72+
if spec.BaremetalSetTemplate != nil {
73+
domain = spec.BaremetalSetTemplate.DomainName
74+
}
75+
7276
for nodeName, node := range spec.Nodes {
7377
if node.HostName == "" {
7478
node.HostName = nodeName
@@ -82,7 +86,7 @@ func (spec *OpenStackDataPlaneNodeSetSpec) Default() {
8286
spec.Nodes[nodeName] = *node.DeepCopy()
8387
}
8488

85-
if !spec.PreProvisioned {
89+
if !spec.PreProvisioned && spec.BaremetalSetTemplate != nil {
8690
spec.NodeTemplate.Ansible.AnsibleUser = spec.BaremetalSetTemplate.CloudUserName
8791
if spec.BaremetalSetTemplate.DeploymentSSHSecret == "" {
8892
spec.BaremetalSetTemplate.DeploymentSSHSecret = spec.NodeTemplate.AnsibleSSHPrivateKeySecret
@@ -212,12 +216,14 @@ func (r *OpenStackDataPlaneNodeSetSpec) ValidateUpdate(oldSpec *OpenStackDataPla
212216
// to the openstack-baremetal-operator webhook to avoid duplicating logic.
213217
if !reflect.DeepEqual(r.BaremetalSetTemplate, oldSpec.BaremetalSetTemplate) {
214218
// Call openstack-baremetal-operator webhook Validate() to parse changes
215-
err := r.BaremetalSetTemplate.ValidateTemplate(
216-
len(oldSpec.Nodes), oldSpec.BaremetalSetTemplate)
217-
if err != nil {
218-
errors = append(errors, field.Forbidden(
219-
field.NewPath("spec.baremetalSetTemplate"),
220-
fmt.Sprintf("%s", err)))
219+
if r.BaremetalSetTemplate != nil && oldSpec.BaremetalSetTemplate != nil {
220+
err := r.BaremetalSetTemplate.ValidateTemplate(
221+
len(oldSpec.Nodes), *oldSpec.BaremetalSetTemplate)
222+
if err != nil {
223+
errors = append(errors, field.Forbidden(
224+
field.NewPath("spec.baremetalSetTemplate"),
225+
fmt.Sprintf("%s", err)))
226+
}
221227
}
222228
}
223229

apis/dataplane/v1beta1/zz_generated.deepcopy.go

Lines changed: 6 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/dataplane/baremetal.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -61,16 +61,18 @@ func DeployBaremetalSet(
6161
ownerLabels := labels.GetLabels(instance, labels.GetGroupLabel(NodeSetLabel), map[string]string{})
6262
baremetalSet.Labels = utils.MergeStringMaps(baremetalSet.GetLabels(), ownerLabels)
6363
baremetalSet.Spec.BaremetalHosts = make(map[string]baremetalv1.InstanceSpec)
64-
instance.Spec.BaremetalSetTemplate.DeepCopyInto(&baremetalSet.Spec.OpenStackBaremetalSetTemplateSpec)
65-
// Set Images
66-
if containerImages.OsContainerImage != nil && instance.Spec.BaremetalSetTemplate.OSContainerImageURL == "" {
67-
baremetalSet.Spec.OSContainerImageURL = *containerImages.OsContainerImage
68-
}
69-
if containerImages.AgentImage != nil && instance.Spec.BaremetalSetTemplate.AgentImageURL == "" {
70-
baremetalSet.Spec.AgentImageURL = *containerImages.AgentImage
71-
}
72-
if containerImages.ApacheImage != nil && instance.Spec.BaremetalSetTemplate.ApacheImageURL == "" {
73-
baremetalSet.Spec.ApacheImageURL = *containerImages.ApacheImage
64+
if instance.Spec.BaremetalSetTemplate != nil {
65+
instance.Spec.BaremetalSetTemplate.DeepCopyInto(&baremetalSet.Spec.OpenStackBaremetalSetTemplateSpec)
66+
// Set Images
67+
if containerImages.OsContainerImage != nil && instance.Spec.BaremetalSetTemplate.OSContainerImageURL == "" {
68+
baremetalSet.Spec.OSContainerImageURL = *containerImages.OsContainerImage
69+
}
70+
if containerImages.AgentImage != nil && instance.Spec.BaremetalSetTemplate.AgentImageURL == "" {
71+
baremetalSet.Spec.AgentImageURL = *containerImages.AgentImage
72+
}
73+
if containerImages.ApacheImage != nil && instance.Spec.BaremetalSetTemplate.ApacheImageURL == "" {
74+
baremetalSet.Spec.ApacheImageURL = *containerImages.ApacheImage
75+
}
7476
}
7577

7678
for _, node := range instance.Spec.Nodes {

tests/functional/dataplane/openstackdataplanenodeset_webhook_test.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,10 @@ var _ = Describe("DataplaneNodeSet Webhook", func() {
5151
It("Should block changes to the BmhLabelSelector object in baremetalSetTemplate spec", func() {
5252
Eventually(func(_ Gomega) string {
5353
instance := GetDataplaneNodeSet(dataplaneNodeSetName)
54-
instance.Spec.BaremetalSetTemplate.BmhLabelSelector = map[string]string{
55-
"app": "openstack1",
54+
if instance.Spec.BaremetalSetTemplate != nil {
55+
instance.Spec.BaremetalSetTemplate.BmhLabelSelector = map[string]string{
56+
"app": "openstack1",
57+
}
5658
}
5759
err := th.K8sClient.Update(th.Ctx, instance)
5860
return fmt.Sprintf("%s", err)
@@ -80,9 +82,11 @@ var _ = Describe("DataplaneNodeSet Webhook", func() {
8082
It("Should allow changes to the CloudUserName", func() {
8183
Eventually(func(_ Gomega) error {
8284
instance := GetDataplaneNodeSet(dataplaneNodeSetName)
83-
instance.Spec.BaremetalSetTemplate.CloudUserName = "new-user"
84-
instance.Spec.BaremetalSetTemplate.BmhLabelSelector = map[string]string{
85-
"app": "test-openstack",
85+
if instance.Spec.BaremetalSetTemplate != nil {
86+
instance.Spec.BaremetalSetTemplate.CloudUserName = "new-user"
87+
instance.Spec.BaremetalSetTemplate.BmhLabelSelector = map[string]string{
88+
"app": "test-openstack",
89+
}
8690
}
8791

8892
return th.K8sClient.Update(th.Ctx, instance)

0 commit comments

Comments
 (0)