@@ -95,9 +95,11 @@ func TestOpenStackMachineSpecToOpenStackServerSpec(t *testing.T) {
9595 tags := []string {"tag1" , "tag2" }
9696 userData := & corev1.LocalObjectReference {Name : "server-data-secret" }
9797 tests := []struct {
98- name string
99- spec * infrav1.OpenStackMachineSpec
100- want * infrav1alpha1.OpenStackServerSpec
98+ name string
99+ spec * infrav1.OpenStackMachineSpec
100+ clusterNetwork * infrav1.NetworkStatusWithSubnets
101+ want * infrav1alpha1.OpenStackServerSpec
102+ wantErr bool
101103 }{
102104 {
103105 name : "Test a minimum OpenStackMachineSpec to OpenStackServerSpec conversion" ,
@@ -106,6 +108,7 @@ func TestOpenStackMachineSpecToOpenStackServerSpec(t *testing.T) {
106108 Image : image ,
107109 SSHKeyName : sshKeyName ,
108110 },
111+ clusterNetwork : openStackCluster .Status .Network ,
109112 want : & infrav1alpha1.OpenStackServerSpec {
110113 Flavor : ptr .To (flavorName ),
111114 IdentityRef : identityRef ,
@@ -128,6 +131,7 @@ func TestOpenStackMachineSpecToOpenStackServerSpec(t *testing.T) {
128131 },
129132 },
130133 },
134+ clusterNetwork : openStackCluster .Status .Network ,
131135 want : & infrav1alpha1.OpenStackServerSpec {
132136 Flavor : ptr .To (flavorName ),
133137 IdentityRef : identityRef ,
@@ -146,6 +150,7 @@ func TestOpenStackMachineSpecToOpenStackServerSpec(t *testing.T) {
146150 Image : image ,
147151 SSHKeyName : sshKeyName ,
148152 },
153+ clusterNetwork : openStackCluster .Status .Network ,
149154 want : & infrav1alpha1.OpenStackServerSpec {
150155 Flavor : ptr .To (flavorName ),
151156 FlavorID : ptr .To (flavorUUID ),
@@ -164,6 +169,7 @@ func TestOpenStackMachineSpecToOpenStackServerSpec(t *testing.T) {
164169 Image : image ,
165170 SSHKeyName : sshKeyName ,
166171 },
172+ clusterNetwork : openStackCluster .Status .Network ,
167173 want : & infrav1alpha1.OpenStackServerSpec {
168174 FlavorID : ptr .To (flavorUUID ),
169175 IdentityRef : identityRef ,
@@ -174,12 +180,90 @@ func TestOpenStackMachineSpecToOpenStackServerSpec(t *testing.T) {
174180 UserDataRef : userData ,
175181 },
176182 },
183+ {
184+ name : "Cluster network nil, machine defines port network and overrides SG" ,
185+ spec : & infrav1.OpenStackMachineSpec {
186+ Ports : []infrav1.PortOpts {{
187+ Network : & infrav1.NetworkParam {ID : ptr .To (networkUUID )},
188+ }},
189+ SecurityGroups : []infrav1.SecurityGroupParam {{ID : ptr .To (extraSecurityGroupUUID )}},
190+ },
191+ clusterNetwork : nil ,
192+ want : & infrav1alpha1.OpenStackServerSpec {
193+ IdentityRef : identityRef ,
194+ Ports : []infrav1.PortOpts {{
195+ Network : & infrav1.NetworkParam {ID : ptr .To (networkUUID )},
196+ SecurityGroups : []infrav1.SecurityGroupParam {
197+ {ID : ptr .To (workerSecurityGroupUUID )},
198+ {ID : ptr .To (extraSecurityGroupUUID )},
199+ },
200+ }},
201+ Tags : tags ,
202+ UserDataRef : userData ,
203+ },
204+ },
205+ {
206+ name : "Cluster network nil, machine defines port network and falls back to cluster SG" ,
207+ spec : & infrav1.OpenStackMachineSpec {
208+ Ports : []infrav1.PortOpts {{
209+ Network : & infrav1.NetworkParam {ID : ptr .To (networkUUID )},
210+ }},
211+ },
212+ clusterNetwork : nil ,
213+ want : & infrav1alpha1.OpenStackServerSpec {
214+ IdentityRef : identityRef ,
215+ Ports : []infrav1.PortOpts {{
216+ Network : & infrav1.NetworkParam {ID : ptr .To (networkUUID )},
217+ SecurityGroups : []infrav1.SecurityGroupParam {{ID : ptr .To (workerSecurityGroupUUID )}},
218+ }},
219+ Tags : tags ,
220+ UserDataRef : userData ,
221+ },
222+ },
223+ {
224+ name : "Error case: no cluster network and no machine ports" ,
225+ spec : & infrav1.OpenStackMachineSpec {
226+ Flavor : ptr .To (flavorName ),
227+ Image : image ,
228+ SSHKeyName : sshKeyName ,
229+ // No ports defined
230+ },
231+ clusterNetwork : nil ,
232+ want : nil ,
233+ wantErr : true ,
234+ },
235+ {
236+ name : "Empty cluster network ID, machine defines explicit ports" ,
237+ spec : & infrav1.OpenStackMachineSpec {
238+ Flavor : ptr .To (flavorName ),
239+ Image : image ,
240+ Ports : []infrav1.PortOpts {{
241+ Network : & infrav1.NetworkParam {ID : ptr .To (networkUUID )},
242+ }},
243+ },
244+ clusterNetwork : & infrav1.NetworkStatusWithSubnets {NetworkStatus : infrav1.NetworkStatus {ID : "" }},
245+ want : & infrav1alpha1.OpenStackServerSpec {
246+ Flavor : ptr .To (flavorName ),
247+ IdentityRef : identityRef ,
248+ Image : image ,
249+ Ports : []infrav1.PortOpts {{
250+ Network : & infrav1.NetworkParam {ID : ptr .To (networkUUID )},
251+ SecurityGroups : []infrav1.SecurityGroupParam {{ID : ptr .To (workerSecurityGroupUUID )}},
252+ }},
253+ Tags : tags ,
254+ UserDataRef : userData ,
255+ },
256+ },
177257 }
178258 for i := range tests {
179259 tt := tests [i ]
180260 t .Run (tt .name , func (t * testing.T ) {
181- spec := openStackMachineSpecToOpenStackServerSpec (tt .spec , identityRef , tags , "" , userData , & openStackCluster .Status .WorkerSecurityGroup .ID , openStackCluster .Status .Network .ID )
182- if ! reflect .DeepEqual (spec , tt .want ) {
261+ spec , err := openStackMachineSpecToOpenStackServerSpec (tt .spec , identityRef , tags , "" , userData , & openStackCluster .Status .WorkerSecurityGroup .ID , tt .clusterNetwork )
262+ if (err != nil ) != tt .wantErr {
263+ t .Errorf ("openStackMachineSpecToOpenStackServerSpec() error = %v, wantErr %v" , err , tt .wantErr )
264+ return
265+ }
266+ if ! tt .wantErr && ! reflect .DeepEqual (spec , tt .want ) {
183267 t .Errorf ("openStackMachineSpecToOpenStackServerSpec() got = %+v, want %+v" , spec , tt .want )
184268 }
185269 })
0 commit comments