@@ -522,20 +522,16 @@ func openStackMachineSpecToOpenStackServerSpec(openStackMachineSpec *infrav1.Ope
522
522
serverPorts = make ([]infrav1.PortOpts , 1 )
523
523
}
524
524
for i := range serverPorts {
525
- if serverPorts [i ].Network == nil {
526
- serverPorts [i ].Network = & infrav1.NetworkParam {
527
- ID : & defaultNetworkID ,
528
- }
529
- }
530
- if len (serverPorts [i ].SecurityGroups ) == 0 && defaultSecGroup != nil {
531
- serverPorts [i ].SecurityGroups = []infrav1.SecurityGroupParam {
532
- {
533
- ID : defaultSecGroup ,
534
- },
535
- }
525
+ // Only inject the default network when we actually have an ID.
526
+ if serverPorts [i ].Network == nil && defaultNetworkID != "" {
527
+ serverPorts [i ].Network = & infrav1.NetworkParam {ID : & defaultNetworkID }
536
528
}
537
529
if len (openStackMachineSpec .SecurityGroups ) > 0 {
538
- serverPorts [i ].SecurityGroups = append (serverPorts [i ].SecurityGroups , openStackMachineSpec .SecurityGroups ... )
530
+ // Machine level security groups override any cluster defaults.
531
+ serverPorts [i ].SecurityGroups = openStackMachineSpec .SecurityGroups
532
+ } else if len (serverPorts [i ].SecurityGroups ) == 0 && defaultSecGroup != nil {
533
+ // Fall back to cluster-managed security group when nothing else specified.
534
+ serverPorts [i ].SecurityGroups = []infrav1.SecurityGroupParam {{ID : defaultSecGroup }}
539
535
}
540
536
}
541
537
openStackServerSpec .Ports = serverPorts
@@ -589,7 +585,18 @@ func (r *OpenStackMachineReconciler) getOrCreateMachineServer(ctx context.Contex
589
585
}
590
586
return openStackCluster .Spec .IdentityRef
591
587
}()
592
- machineServerSpec := openStackMachineSpecToOpenStackServerSpec (& openStackMachine .Spec , identityRef , compute .InstanceTags (& openStackMachine .Spec , openStackCluster ), failureDomain , userDataRef , getManagedSecurityGroup (openStackCluster , machine ), openStackCluster .Status .Network .ID )
588
+ // Determine default network ID if the cluster status exposes one.
589
+ var defaultNetworkID string
590
+ if openStackCluster .Status .Network != nil {
591
+ defaultNetworkID = openStackCluster .Status .Network .ID
592
+ }
593
+
594
+ // If no cluster network is available AND the machine spec did not define any ports with a network, we cannot choose a network.
595
+ if defaultNetworkID == "" && len (openStackMachine .Spec .Ports ) == 0 {
596
+ return nil , capoerrors .Terminal (infrav1 .InvalidMachineSpecReason , "no network configured: cluster network is missing and machine spec does not define ports with a network" )
597
+ }
598
+
599
+ machineServerSpec := openStackMachineSpecToOpenStackServerSpec (& openStackMachine .Spec , identityRef , compute .InstanceTags (& openStackMachine .Spec , openStackCluster ), failureDomain , userDataRef , getManagedSecurityGroup (openStackCluster , machine ), defaultNetworkID )
593
600
machineServer = & infrav1alpha1.OpenStackServer {
594
601
ObjectMeta : metav1.ObjectMeta {
595
602
Labels : map [string ]string {
0 commit comments