Skip to content

Commit d56ccce

Browse files
author
Shawn Warren
committed
feat: add subnet support to external networks
1 parent 4292683 commit d56ccce

File tree

7 files changed

+110
-41
lines changed

7 files changed

+110
-41
lines changed

api/v1beta1/openstackcluster_types.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ type OpenStackClusterSpec struct {
8888
// If ExternalNetwork is not defined and there are no external networks
8989
// the controller will proceed as though DisableExternalNetwork was set.
9090
// +optional
91-
ExternalNetwork *NetworkParam `json:"externalNetwork,omitempty"`
91+
ExternalNetwork *ExternalNetworkParam `json:"externalNetwork,omitempty"`
9292

9393
// DisableExternalNetwork specifies whether or not to attempt to connect the cluster
9494
// to an external network. This allows for the creation of clusters when connecting
@@ -208,7 +208,7 @@ type OpenStackClusterStatus struct {
208208

209209
// ExternalNetwork contains information about the external network used for default ingress and egress traffic.
210210
// +optional
211-
ExternalNetwork *NetworkStatus `json:"externalNetwork,omitempty"`
211+
ExternalNetwork *NetworkStatusWithSubnets `json:"externalNetwork,omitempty"`
212212

213213
// Router describes the default cluster router
214214
// +optional

api/v1beta1/types.go

+10
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,16 @@ type NetworkParam struct {
167167
Filter *NetworkFilter `json:"filter,omitempty"`
168168
}
169169

170+
// ExternalNetworkParam specifies an OpenStack external network. It may be specified by either ID or Filter, but not both.
171+
// +kubebuilder:validation:MinProperties:=1
172+
type ExternalNetworkParam struct {
173+
// Network specifies an OpenStack external network. It may be specified by either ID or Filter, but not both.
174+
Network NetworkParam `json:"network"`
175+
// Subnets specifies an list of OpenStack external network subnet. Each may be specified by either ID or Filter, but not both.
176+
// +optional
177+
Subnets []SubnetParam `json:"subnets,omitempty"`
178+
}
179+
170180
// NetworkFilter specifies a query to select an OpenStack network. At least one property must be set.
171181
// +kubebuilder:validation:MinProperties:=1
172182
type NetworkFilter struct {

controllers/openstackcluster_controller_test.go

+8-4
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,10 @@ var _ = Describe("OpenStackCluster controller", func() {
257257
},
258258
DisableAPIServerFloatingIP: ptr.To(true),
259259
APIServerFixedIP: ptr.To("10.0.0.1"),
260-
ExternalNetwork: &infrav1.NetworkParam{
261-
ID: ptr.To(externalNetworkID),
260+
ExternalNetwork: &infrav1.ExternalNetworkParam{
261+
Network: infrav1.NetworkParam{
262+
ID: ptr.To(externalNetworkID),
263+
},
262264
},
263265
Network: &infrav1.NetworkParam{
264266
ID: ptr.To(clusterNetworkID),
@@ -327,8 +329,10 @@ var _ = Describe("OpenStackCluster controller", func() {
327329
},
328330
DisableAPIServerFloatingIP: ptr.To(true),
329331
APIServerFixedIP: ptr.To("10.0.0.1"),
330-
ExternalNetwork: &infrav1.NetworkParam{
331-
ID: ptr.To(externalNetworkID),
332+
ExternalNetwork: &infrav1.ExternalNetworkParam{
333+
Network: infrav1.NetworkParam{
334+
ID: ptr.To(externalNetworkID),
335+
},
332336
},
333337
Network: &infrav1.NetworkParam{
334338
ID: ptr.To(clusterNetworkID),

pkg/cloud/services/loadbalancer/loadbalancer_test.go

+7-2
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,13 @@ func Test_ReconcileLoadBalancer(t *testing.T) {
7676
},
7777
},
7878
Status: infrav1.OpenStackClusterStatus{
79-
ExternalNetwork: &infrav1.NetworkStatus{
80-
ID: "aaaaaaaa-bbbb-cccc-dddd-111111111111",
79+
ExternalNetwork: &infrav1.NetworkStatusWithSubnets{
80+
NetworkStatus: infrav1.NetworkStatus{
81+
ID: "aaaaaaaa-bbbb-cccc-dddd-111111111111",
82+
},
83+
Subnets: []infrav1.Subnet{
84+
{ID: "aaaaaaaa-bbbb-cccc-dddd-111111111111"},
85+
},
8186
},
8287
Network: &infrav1.NetworkStatusWithSubnets{
8388
Subnets: []infrav1.Subnet{

pkg/cloud/services/networking/floatingip_test.go

+10-2
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,16 @@ func Test_GetOrCreateFloatingIP(t *testing.T) {
6868
},
6969
}
7070
openStackCluster := &infrav1.OpenStackCluster{Status: infrav1.OpenStackClusterStatus{
71-
ExternalNetwork: &infrav1.NetworkStatus{
72-
ID: "",
71+
ExternalNetwork: &infrav1.NetworkStatusWithSubnets{
72+
NetworkStatus: infrav1.NetworkStatus{
73+
ID: "",
74+
},
75+
Subnets: []infrav1.Subnet{
76+
{
77+
ID: "",
78+
CIDR: "",
79+
},
80+
},
7381
},
7482
}}
7583
for _, tt := range tests {

pkg/cloud/services/networking/network.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -78,17 +78,17 @@ func (s *Service) ReconcileExternalNetwork(openStackCluster *infrav1.OpenStackCl
7878
}
7979
} else {
8080
var err error
81-
network, err = s.GetNetworkByParam(openStackCluster.Spec.ExternalNetwork, ExternalNetworksOnly)
81+
network, err = s.GetNetworkByParam(&openStackCluster.Spec.ExternalNetwork.Network, ExternalNetworksOnly)
8282
if err != nil {
8383
return fmt.Errorf("failed to get external network: %w", err)
8484
}
8585
}
8686

87-
openStackCluster.Status.ExternalNetwork = &infrav1.NetworkStatus{
88-
ID: network.ID,
89-
Name: network.Name,
90-
Tags: network.Tags,
91-
}
87+
openStackCluster.Status.ExternalNetwork = &infrav1.NetworkStatusWithSubnets{}
88+
openStackCluster.Status.ExternalNetwork.ID = network.ID
89+
openStackCluster.Status.ExternalNetwork.Name = network.Name
90+
openStackCluster.Status.ExternalNetwork.Tags = openStackCluster.Spec.Tags
91+
9292
s.scope.Logger().Info("External network found", "id", network.ID)
9393
return nil
9494
}

pkg/cloud/services/networking/network_test.go

+67-25
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,8 @@ func Test_ReconcileNetwork(t *testing.T) {
208208
func Test_ReconcileExternalNetwork(t *testing.T) {
209209
fakeNetworkID := "d08803fc-2fa5-4179-b9f7-8c43d0af2fe6"
210210
fakeNetworkname := "external-network"
211+
fakeSubnetID := "d08803fc-2fa5-4179-b9d7-8c43d0af2fe6"
212+
fakeCIDR := "10.0.0.0/24"
211213

212214
// Use gomega to match the ListOptsBuilder argument
213215
getExternalNetwork := func(g Gomega, listOpts networks.ListOpts, ret []networks.Network) func(networks.ListOptsBuilder) ([]networks.Network, error) {
@@ -233,8 +235,10 @@ func Test_ReconcileExternalNetwork(t *testing.T) {
233235
name: "reconcile external network by ID",
234236
openStackCluster: &infrav1.OpenStackCluster{
235237
Spec: infrav1.OpenStackClusterSpec{
236-
ExternalNetwork: &infrav1.NetworkParam{
237-
ID: ptr.To(fakeNetworkID),
238+
ExternalNetwork: &infrav1.ExternalNetworkParam{
239+
Network: infrav1.NetworkParam{
240+
ID: ptr.To(fakeNetworkID),
241+
},
238242
},
239243
},
240244
},
@@ -246,14 +250,24 @@ func Test_ReconcileExternalNetwork(t *testing.T) {
246250
},
247251
want: &infrav1.OpenStackCluster{
248252
Spec: infrav1.OpenStackClusterSpec{
249-
ExternalNetwork: &infrav1.NetworkParam{
250-
ID: ptr.To(fakeNetworkID),
253+
ExternalNetwork: &infrav1.ExternalNetworkParam{
254+
Network: infrav1.NetworkParam{
255+
ID: ptr.To(fakeNetworkID),
256+
},
251257
},
252258
},
253259
Status: infrav1.OpenStackClusterStatus{
254-
ExternalNetwork: &infrav1.NetworkStatus{
255-
ID: fakeNetworkID,
256-
Name: fakeNetworkname,
260+
ExternalNetwork: &infrav1.NetworkStatusWithSubnets{
261+
NetworkStatus: infrav1.NetworkStatus{
262+
ID: fakeNetworkID,
263+
Name: fakeNetworkname,
264+
},
265+
Subnets: []infrav1.Subnet{
266+
{
267+
ID: fakeSubnetID,
268+
CIDR: fakeCIDR,
269+
},
270+
},
257271
},
258272
},
259273
},
@@ -263,8 +277,10 @@ func Test_ReconcileExternalNetwork(t *testing.T) {
263277
name: "reconcile external network by name",
264278
openStackCluster: &infrav1.OpenStackCluster{
265279
Spec: infrav1.OpenStackClusterSpec{
266-
ExternalNetwork: &infrav1.NetworkParam{
267-
Filter: &infrav1.NetworkFilter{Name: fakeNetworkname},
280+
ExternalNetwork: &infrav1.ExternalNetworkParam{
281+
Network: infrav1.NetworkParam{
282+
Filter: &infrav1.NetworkFilter{Name: fakeNetworkname},
283+
},
268284
},
269285
},
270286
},
@@ -279,14 +295,24 @@ func Test_ReconcileExternalNetwork(t *testing.T) {
279295
},
280296
want: &infrav1.OpenStackCluster{
281297
Spec: infrav1.OpenStackClusterSpec{
282-
ExternalNetwork: &infrav1.NetworkParam{
283-
Filter: &infrav1.NetworkFilter{Name: fakeNetworkname},
298+
ExternalNetwork: &infrav1.ExternalNetworkParam{
299+
Network: infrav1.NetworkParam{
300+
Filter: &infrav1.NetworkFilter{Name: fakeNetworkname},
301+
},
284302
},
285303
},
286304
Status: infrav1.OpenStackClusterStatus{
287-
ExternalNetwork: &infrav1.NetworkStatus{
288-
ID: fakeNetworkID,
289-
Name: fakeNetworkname,
305+
ExternalNetwork: &infrav1.NetworkStatusWithSubnets{
306+
NetworkStatus: infrav1.NetworkStatus{
307+
ID: fakeNetworkID,
308+
Name: fakeNetworkname,
309+
},
310+
Subnets: []infrav1.Subnet{
311+
{
312+
ID: fakeSubnetID,
313+
CIDR: fakeCIDR,
314+
},
315+
},
290316
},
291317
},
292318
},
@@ -296,8 +322,10 @@ func Test_ReconcileExternalNetwork(t *testing.T) {
296322
name: "reconcile external network by ID when external network by id not found",
297323
openStackCluster: &infrav1.OpenStackCluster{
298324
Spec: infrav1.OpenStackClusterSpec{
299-
ExternalNetwork: &infrav1.NetworkParam{
300-
ID: ptr.To(fakeNetworkID),
325+
ExternalNetwork: &infrav1.ExternalNetworkParam{
326+
Network: infrav1.NetworkParam{
327+
ID: ptr.To(fakeNetworkID),
328+
},
301329
},
302330
},
303331
},
@@ -306,8 +334,10 @@ func Test_ReconcileExternalNetwork(t *testing.T) {
306334
},
307335
want: &infrav1.OpenStackCluster{
308336
Spec: infrav1.OpenStackClusterSpec{
309-
ExternalNetwork: &infrav1.NetworkParam{
310-
ID: ptr.To(fakeNetworkID),
337+
ExternalNetwork: &infrav1.ExternalNetworkParam{
338+
Network: infrav1.NetworkParam{
339+
ID: ptr.To(fakeNetworkID),
340+
},
311341
},
312342
},
313343
},
@@ -317,8 +347,10 @@ func Test_ReconcileExternalNetwork(t *testing.T) {
317347
name: "reconcile external network by ID when external network by name not found",
318348
openStackCluster: &infrav1.OpenStackCluster{
319349
Spec: infrav1.OpenStackClusterSpec{
320-
ExternalNetwork: &infrav1.NetworkParam{
321-
Filter: &infrav1.NetworkFilter{Name: fakeNetworkname},
350+
ExternalNetwork: &infrav1.ExternalNetworkParam{
351+
Network: infrav1.NetworkParam{
352+
Filter: &infrav1.NetworkFilter{Name: fakeNetworkname},
353+
},
322354
},
323355
},
324356
},
@@ -328,8 +360,10 @@ func Test_ReconcileExternalNetwork(t *testing.T) {
328360
},
329361
want: &infrav1.OpenStackCluster{
330362
Spec: infrav1.OpenStackClusterSpec{
331-
ExternalNetwork: &infrav1.NetworkParam{
332-
Filter: &infrav1.NetworkFilter{Name: fakeNetworkname},
363+
ExternalNetwork: &infrav1.ExternalNetworkParam{
364+
Network: infrav1.NetworkParam{
365+
Filter: &infrav1.NetworkFilter{Name: fakeNetworkname},
366+
},
333367
},
334368
},
335369
},
@@ -387,9 +421,17 @@ func Test_ReconcileExternalNetwork(t *testing.T) {
387421
want: &infrav1.OpenStackCluster{
388422
Spec: infrav1.OpenStackClusterSpec{},
389423
Status: infrav1.OpenStackClusterStatus{
390-
ExternalNetwork: &infrav1.NetworkStatus{
391-
ID: fakeNetworkID,
392-
Name: fakeNetworkname,
424+
ExternalNetwork: &infrav1.NetworkStatusWithSubnets{
425+
NetworkStatus: infrav1.NetworkStatus{
426+
ID: fakeNetworkID,
427+
Name: fakeNetworkname,
428+
},
429+
Subnets: []infrav1.Subnet{
430+
{
431+
ID: fakeSubnetID,
432+
CIDR: fakeCIDR,
433+
},
434+
},
393435
},
394436
},
395437
},

0 commit comments

Comments
 (0)