Skip to content

Commit dd7e338

Browse files
authored
feat: Skip FD dependent preflight checks when failureDomain configured (#1213)
https://jira.nutanix.com/browse/NCN-108172 Ensure all existing preflight checks are also handling failure domains For 2.16, just to skip the preflight checks that depends on the PE cluster configuration. Added corresponding unit tests.
1 parent 5a5f8e0 commit dd7e338

File tree

4 files changed

+111
-17
lines changed

4 files changed

+111
-17
lines changed

pkg/webhook/preflight/nutanix/checker.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ type checkDependencies struct {
6060

6161
nutanixClusterConfigSpec *carenv1.NutanixClusterConfigSpec
6262
nutanixWorkerNodeConfigSpecByMachineDeploymentName map[string]*carenv1.NutanixWorkerNodeConfigSpec
63+
failureDomainByMachineDeploymentName map[string]string
6364

6465
nclient client
6566
log logr.Logger

pkg/webhook/preflight/nutanix/specs.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,18 @@ func newConfigurationCheck(
6565
cd.nutanixClusterConfigSpec = nutanixClusterConfigSpec
6666
}
6767

68+
failureDomainByMachineDeploymentName := make(map[string]string)
6869
nutanixWorkerNodeConfigSpecByMachineDeploymentName := make(map[string]*carenv1.NutanixWorkerNodeConfigSpec)
70+
6971
if cd.cluster.Spec.Topology.Workers != nil {
7072
for i := range cd.cluster.Spec.Topology.Workers.MachineDeployments {
7173
md := &cd.cluster.Spec.Topology.Workers.MachineDeployments[i]
74+
75+
// Save the failureDomain only if it is configured
76+
if md.FailureDomain != nil && *md.FailureDomain != "" {
77+
failureDomainByMachineDeploymentName[md.Name] = *md.FailureDomain
78+
}
79+
7280
if md.Variables == nil {
7381
continue
7482
}
@@ -107,5 +115,8 @@ func newConfigurationCheck(
107115
cd.nutanixWorkerNodeConfigSpecByMachineDeploymentName = nutanixWorkerNodeConfigSpecByMachineDeploymentName
108116
}
109117

118+
// Save the failureDomainByMachineDeploymentName
119+
cd.failureDomainByMachineDeploymentName = failureDomainByMachineDeploymentName
120+
110121
return configurationCheck
111122
}

pkg/webhook/preflight/nutanix/storagecontainer.go

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -165,20 +165,36 @@ func newStorageContainerChecks(cd *checkDependencies) []preflight.Check {
165165
return checks
166166
}
167167

168-
if cd.nutanixClusterConfigSpec != nil && cd.nutanixClusterConfigSpec.ControlPlane != nil &&
168+
if cd.nutanixClusterConfigSpec != nil &&
169+
cd.nutanixClusterConfigSpec.ControlPlane != nil &&
169170
cd.nutanixClusterConfigSpec.ControlPlane.Nutanix != nil {
170-
checks = append(checks,
171-
&storageContainerCheck{
172-
machineSpec: &cd.nutanixClusterConfigSpec.ControlPlane.Nutanix.MachineDetails,
173-
field: "$.spec.topology.variables[[email protected]==\"clusterConfig\"].value.controlPlane.nutanix.machineDetails",
174-
csiSpec: &cd.nutanixClusterConfigSpec.Addons.CSI.Providers.NutanixCSI,
175-
nclient: cd.nclient,
176-
},
177-
)
171+
// Skip the check if failureDomains are configured
172+
if len(cd.nutanixClusterConfigSpec.ControlPlane.Nutanix.FailureDomains) > 0 {
173+
cd.log.V(5).
174+
Info("Skip preflight check NutanixStorageContainer for controlPlane with failureDomains configured.")
175+
} else {
176+
checks = append(checks,
177+
&storageContainerCheck{
178+
machineSpec: &cd.nutanixClusterConfigSpec.ControlPlane.Nutanix.MachineDetails,
179+
field: "$.spec.topology.variables[[email protected]==\"clusterConfig\"].value.controlPlane.nutanix.machineDetails",
180+
csiSpec: &cd.nutanixClusterConfigSpec.Addons.CSI.Providers.NutanixCSI,
181+
nclient: cd.nclient,
182+
},
183+
)
184+
}
178185
}
179186

180187
for mdName, nutanixWorkerNodeConfigSpec := range cd.nutanixWorkerNodeConfigSpecByMachineDeploymentName {
181188
if nutanixWorkerNodeConfigSpec.Nutanix != nil {
189+
// Skip the check if failureDomain is configured
190+
if fdName, ok := cd.failureDomainByMachineDeploymentName[mdName]; ok {
191+
cd.log.V(5).Info(
192+
"Skip preflight check NutanixStorageContainer for machineDeployment with failureDomain configured.",
193+
"machineDeployment", mdName, "failureDomain", fdName,
194+
)
195+
continue
196+
}
197+
182198
checks = append(checks,
183199
&storageContainerCheck{
184200
machineSpec: &nutanixWorkerNodeConfigSpec.Nutanix.MachineDetails,

pkg/webhook/preflight/nutanix/storagecontainer_test.go

Lines changed: 74 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,12 @@ import (
2121

2222
func TestInitStorageContainerChecks(t *testing.T) {
2323
testCases := []struct {
24-
name string
25-
nutanixClusterConfigSpec *carenv1.NutanixClusterConfigSpec
26-
workerNodeConfigSpecByMDName map[string]*carenv1.NutanixWorkerNodeConfigSpec
27-
expectedChecksCount int
28-
nclient client
24+
name string
25+
nutanixClusterConfigSpec *carenv1.NutanixClusterConfigSpec
26+
workerNodeConfigSpecByMDName map[string]*carenv1.NutanixWorkerNodeConfigSpec
27+
failureDomainByMachineDeploymentName map[string]string
28+
expectedChecksCount int
29+
nclient client
2930
}{
3031
{
3132
name: "client not initialized",
@@ -80,7 +81,7 @@ func TestInitStorageContainerChecks(t *testing.T) {
8081
nclient: &mocknclient{},
8182
},
8283
{
83-
name: "cluster config with CSI and control plane",
84+
name: "cluster config with CSI and control plane without failure domains",
8485
nutanixClusterConfigSpec: &carenv1.NutanixClusterConfigSpec{
8586
ControlPlane: &carenv1.NutanixControlPlaneSpec{
8687
Nutanix: &carenv1.NutanixControlPlaneNodeSpec{
@@ -113,7 +114,41 @@ func TestInitStorageContainerChecks(t *testing.T) {
113114
nclient: &mocknclient{},
114115
},
115116
{
116-
name: "cluster config with CSI and worker nodes",
117+
name: "cluster config with CSI and control plane with failure domains",
118+
nutanixClusterConfigSpec: &carenv1.NutanixClusterConfigSpec{
119+
ControlPlane: &carenv1.NutanixControlPlaneSpec{
120+
Nutanix: &carenv1.NutanixControlPlaneNodeSpec{
121+
FailureDomains: []string{"fd-1", "fd-2", "fd-3"},
122+
MachineDetails: carenv1.NutanixMachineDetails{
123+
Cluster: capxv1.NutanixResourceIdentifier{
124+
Type: capxv1.NutanixIdentifierName,
125+
Name: ptr.To("my-cluster"),
126+
},
127+
},
128+
},
129+
},
130+
Addons: &carenv1.NutanixAddons{
131+
CSI: &carenv1.NutanixCSI{
132+
Providers: carenv1.NutanixCSIProviders{
133+
NutanixCSI: carenv1.CSIProvider{
134+
StorageClassConfigs: map[string]carenv1.StorageClassConfig{
135+
"test-sc": {
136+
Parameters: map[string]string{
137+
"storageContainer": "test-container",
138+
},
139+
},
140+
},
141+
},
142+
},
143+
},
144+
},
145+
},
146+
workerNodeConfigSpecByMDName: map[string]*carenv1.NutanixWorkerNodeConfigSpec{},
147+
expectedChecksCount: 0,
148+
nclient: &mocknclient{},
149+
},
150+
{
151+
name: "cluster config with CSI and worker nodes without failureDomain",
117152
nutanixClusterConfigSpec: &carenv1.NutanixClusterConfigSpec{
118153
Addons: &carenv1.NutanixAddons{
119154
CSI: &carenv1.NutanixCSI{
@@ -138,6 +173,33 @@ func TestInitStorageContainerChecks(t *testing.T) {
138173
expectedChecksCount: 1,
139174
nclient: &mocknclient{},
140175
},
176+
{
177+
name: "cluster config with CSI and worker nodes with failureDomain",
178+
nutanixClusterConfigSpec: &carenv1.NutanixClusterConfigSpec{
179+
Addons: &carenv1.NutanixAddons{
180+
CSI: &carenv1.NutanixCSI{
181+
Providers: carenv1.NutanixCSIProviders{
182+
NutanixCSI: carenv1.CSIProvider{},
183+
},
184+
},
185+
},
186+
},
187+
workerNodeConfigSpecByMDName: map[string]*carenv1.NutanixWorkerNodeConfigSpec{
188+
"worker-1": {
189+
Nutanix: &carenv1.NutanixWorkerNodeSpec{
190+
MachineDetails: carenv1.NutanixMachineDetails{
191+
Cluster: capxv1.NutanixResourceIdentifier{
192+
Type: capxv1.NutanixIdentifierName,
193+
Name: ptr.To("worker-cluster"),
194+
},
195+
},
196+
},
197+
},
198+
},
199+
failureDomainByMachineDeploymentName: map[string]string{"worker-1": "fd-4"},
200+
expectedChecksCount: 0,
201+
nclient: &mocknclient{},
202+
},
141203
{
142204
name: "cluster config with CSI, control plane and worker nodes",
143205
nutanixClusterConfigSpec: &carenv1.NutanixClusterConfigSpec{
@@ -238,7 +300,11 @@ func TestInitStorageContainerChecks(t *testing.T) {
238300
cd := &checkDependencies{
239301
nutanixClusterConfigSpec: tc.nutanixClusterConfigSpec,
240302
nutanixWorkerNodeConfigSpecByMachineDeploymentName: tc.workerNodeConfigSpecByMDName,
241-
nclient: tc.nclient,
303+
failureDomainByMachineDeploymentName: tc.failureDomainByMachineDeploymentName,
304+
nclient: tc.nclient,
305+
}
306+
if cd.failureDomainByMachineDeploymentName == nil {
307+
cd.failureDomainByMachineDeploymentName = map[string]string{}
242308
}
243309

244310
// Call the function under test

0 commit comments

Comments
 (0)