@@ -166,15 +166,29 @@ func (r *CloudStackMachineReconciler) reconcile(
166
166
// Set ZoneID on csMachine.
167
167
if util .IsControlPlaneMachine (capiMachine ) { // Use failure domain zone.
168
168
csMachine .Status .ZoneID = * capiMachine .Spec .FailureDomain
169
- } else { // Random zone.
170
- zones := make ([]string , len (csCluster .Status .Zones ))
171
- zidx := 0
172
- for zoneID := range csCluster .Status .Zones {
173
- zones [zidx ] = zoneID
174
- zidx ++
169
+ } else { // Specified by Machine Template or Random zone.
170
+ if csMachine .Spec .ZoneID != "" {
171
+ if zone , foundZone := csCluster .Status .Zones [csMachine .Spec .ZoneID ]; foundZone { // ZoneID Specified.
172
+ csMachine .Status .ZoneID = zone .ID
173
+ } else {
174
+ return ctrl.Result {}, errors .Errorf ("could not find zone by zoneID: %s" , csMachine .Spec .ZoneID )
175
+ }
176
+ } else if csMachine .Spec .ZoneName != "" {
177
+ if zone := csCluster .Status .Zones .GetByName (csMachine .Spec .ZoneName ); zone != nil { // ZoneName Specified.
178
+ csMachine .Status .ZoneID = zone .ID
179
+ } else {
180
+ return ctrl.Result {}, errors .Errorf ("could not find zone by zoneName: %s" , csMachine .Spec .ZoneName )
181
+ }
182
+ } else { // No Zone Specified, pick a Random Zone.
183
+ zones := make ([]string , len (csCluster .Status .Zones ))
184
+ zidx := 0
185
+ for zoneID := range csCluster .Status .Zones {
186
+ zones [zidx ] = zoneID
187
+ zidx ++
188
+ }
189
+ randNum := (rand .Int () % len (csCluster .Spec .Zones )) // #nosec G404 -- weak crypt rand doesn't matter here.
190
+ csMachine .Status .ZoneID = zones [randNum ]
175
191
}
176
- randNum := (rand .Int () % len (csCluster .Spec .Zones )) // #nosec G404 -- weak crypt rand doesn't matter here.
177
- csMachine .Status .ZoneID = zones [randNum ]
178
192
}
179
193
180
194
secret := & corev1.Secret {}
0 commit comments