Skip to content

Commit e39c730

Browse files
committed
OpenStackClusterSpec: ExternalNetwork->pointer
ExternalNetwork was already marked optional. This change allows it to be omitted when marshalling and unmarshalling the object in Go. This change also adds the 'external' flag when executing an explicit external network query.
1 parent ffbfd40 commit e39c730

File tree

14 files changed

+141
-67
lines changed

14 files changed

+141
-67
lines changed

api/v1alpha5/conversion.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ func Convert_v1beta1_OpenStackClusterSpec_To_v1alpha5_OpenStackClusterSpec(in *i
205205
return err
206206
}
207207

208-
if in.ExternalNetwork.ID != "" {
208+
if in.ExternalNetwork != nil && in.ExternalNetwork.ID != "" {
209209
out.ExternalNetworkID = in.ExternalNetwork.ID
210210
}
211211

@@ -240,7 +240,7 @@ func Convert_v1alpha5_OpenStackClusterSpec_To_v1beta1_OpenStackClusterSpec(in *O
240240
}
241241

242242
if in.ExternalNetworkID != "" {
243-
out.ExternalNetwork = infrav1.NetworkFilter{
243+
out.ExternalNetwork = &infrav1.NetworkFilter{
244244
ID: in.ExternalNetworkID,
245245
}
246246
}

api/v1alpha5/conversion_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ func TestConvertFrom(t *testing.T) {
5151
},
5252
ObjectMeta: metav1.ObjectMeta{
5353
Annotations: map[string]string{
54-
"cluster.x-k8s.io/conversion-data": "{\"spec\":{\"apiServerLoadBalancer\":{},\"controlPlaneEndpoint\":{\"host\":\"\",\"port\":0},\"disableAPIServerFloatingIP\":false,\"disableExternalNetwork\":false,\"externalNetwork\":{},\"identityRef\":{\"cloudName\":\"\",\"name\":\"\"}},\"status\":{\"ready\":false}}",
54+
"cluster.x-k8s.io/conversion-data": "{\"spec\":{\"apiServerLoadBalancer\":{},\"controlPlaneEndpoint\":{\"host\":\"\",\"port\":0},\"disableAPIServerFloatingIP\":false,\"disableExternalNetwork\":false,\"identityRef\":{\"cloudName\":\"\",\"name\":\"\"}},\"status\":{\"ready\":false}}",
5555
},
5656
},
5757
},
@@ -72,7 +72,7 @@ func TestConvertFrom(t *testing.T) {
7272
},
7373
ObjectMeta: metav1.ObjectMeta{
7474
Annotations: map[string]string{
75-
"cluster.x-k8s.io/conversion-data": "{\"spec\":{\"template\":{\"spec\":{\"apiServerLoadBalancer\":{},\"controlPlaneEndpoint\":{\"host\":\"\",\"port\":0},\"disableAPIServerFloatingIP\":false,\"disableExternalNetwork\":false,\"externalNetwork\":{},\"identityRef\":{\"cloudName\":\"\",\"name\":\"\"}}}}}",
75+
"cluster.x-k8s.io/conversion-data": "{\"spec\":{\"template\":{\"spec\":{\"apiServerLoadBalancer\":{},\"controlPlaneEndpoint\":{\"host\":\"\",\"port\":0},\"disableAPIServerFloatingIP\":false,\"disableExternalNetwork\":false,\"identityRef\":{\"cloudName\":\"\",\"name\":\"\"}}}}}",
7676
},
7777
},
7878
},

api/v1alpha6/openstackcluster_conversion.go

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -167,13 +167,19 @@ func restorev1beta1ClusterSpec(previous *infrav1.OpenStackClusterSpec, dst *infr
167167
}
168168

169169
// Restore all fields except ID, which should have been copied over in conversion
170-
dst.ExternalNetwork.Name = previous.ExternalNetwork.Name
171-
dst.ExternalNetwork.Description = previous.ExternalNetwork.Description
172-
dst.ExternalNetwork.ProjectID = previous.ExternalNetwork.ProjectID
173-
dst.ExternalNetwork.Tags = previous.ExternalNetwork.Tags
174-
dst.ExternalNetwork.TagsAny = previous.ExternalNetwork.TagsAny
175-
dst.ExternalNetwork.NotTags = previous.ExternalNetwork.NotTags
176-
dst.ExternalNetwork.NotTagsAny = previous.ExternalNetwork.NotTagsAny
170+
if previous.ExternalNetwork != nil {
171+
if dst.ExternalNetwork == nil {
172+
dst.ExternalNetwork = &infrav1.NetworkFilter{}
173+
}
174+
175+
dst.ExternalNetwork.Name = previous.ExternalNetwork.Name
176+
dst.ExternalNetwork.Description = previous.ExternalNetwork.Description
177+
dst.ExternalNetwork.ProjectID = previous.ExternalNetwork.ProjectID
178+
dst.ExternalNetwork.Tags = previous.ExternalNetwork.Tags
179+
dst.ExternalNetwork.TagsAny = previous.ExternalNetwork.TagsAny
180+
dst.ExternalNetwork.NotTags = previous.ExternalNetwork.NotTags
181+
dst.ExternalNetwork.NotTagsAny = previous.ExternalNetwork.NotTagsAny
182+
}
177183

178184
// Restore fields not present in v1alpha6
179185
dst.Router = previous.Router
@@ -205,7 +211,7 @@ func Convert_v1alpha6_OpenStackClusterSpec_To_v1beta1_OpenStackClusterSpec(in *O
205211
}
206212

207213
if in.ExternalNetworkID != "" {
208-
out.ExternalNetwork = infrav1.NetworkFilter{
214+
out.ExternalNetwork = &infrav1.NetworkFilter{
209215
ID: in.ExternalNetworkID,
210216
}
211217
}
@@ -258,7 +264,7 @@ func Convert_v1beta1_OpenStackClusterSpec_To_v1alpha6_OpenStackClusterSpec(in *i
258264
}
259265
}
260266

261-
if in.ExternalNetwork.ID != "" {
267+
if in.ExternalNetwork != nil && in.ExternalNetwork.ID != "" {
262268
out.ExternalNetworkID = in.ExternalNetwork.ID
263269
}
264270

api/v1alpha7/openstackcluster_conversion.go

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -172,13 +172,19 @@ func restorev1beta1ClusterSpec(previous *infrav1.OpenStackClusterSpec, dst *infr
172172
}
173173

174174
// Restore all fields except ID, which should have been copied over in conversion
175-
dst.ExternalNetwork.Name = previous.ExternalNetwork.Name
176-
dst.ExternalNetwork.Description = previous.ExternalNetwork.Description
177-
dst.ExternalNetwork.ProjectID = previous.ExternalNetwork.ProjectID
178-
dst.ExternalNetwork.Tags = previous.ExternalNetwork.Tags
179-
dst.ExternalNetwork.TagsAny = previous.ExternalNetwork.TagsAny
180-
dst.ExternalNetwork.NotTags = previous.ExternalNetwork.NotTags
181-
dst.ExternalNetwork.NotTagsAny = previous.ExternalNetwork.NotTagsAny
175+
if previous.ExternalNetwork != nil {
176+
if dst.ExternalNetwork == nil {
177+
dst.ExternalNetwork = &infrav1.NetworkFilter{}
178+
}
179+
180+
dst.ExternalNetwork.Name = previous.ExternalNetwork.Name
181+
dst.ExternalNetwork.Description = previous.ExternalNetwork.Description
182+
dst.ExternalNetwork.ProjectID = previous.ExternalNetwork.ProjectID
183+
dst.ExternalNetwork.Tags = previous.ExternalNetwork.Tags
184+
dst.ExternalNetwork.TagsAny = previous.ExternalNetwork.TagsAny
185+
dst.ExternalNetwork.NotTags = previous.ExternalNetwork.NotTags
186+
dst.ExternalNetwork.NotTagsAny = previous.ExternalNetwork.NotTagsAny
187+
}
182188

183189
dst.DisableExternalNetwork = previous.DisableExternalNetwork
184190

@@ -207,7 +213,7 @@ func Convert_v1alpha7_OpenStackClusterSpec_To_v1beta1_OpenStackClusterSpec(in *O
207213
}
208214

209215
if in.ExternalNetworkID != "" {
210-
out.ExternalNetwork = infrav1.NetworkFilter{
216+
out.ExternalNetwork = &infrav1.NetworkFilter{
211217
ID: in.ExternalNetworkID,
212218
}
213219
}
@@ -260,7 +266,7 @@ func Convert_v1beta1_OpenStackClusterSpec_To_v1alpha7_OpenStackClusterSpec(in *i
260266
}
261267
}
262268

263-
if in.ExternalNetwork.ID != "" {
269+
if in.ExternalNetwork != nil && in.ExternalNetwork.ID != "" {
264270
out.ExternalNetworkID = in.ExternalNetwork.ID
265271
}
266272

api/v1beta1/openstackcluster_types.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,21 @@ type OpenStackClusterSpec struct {
7272
ExternalRouterIPs []ExternalRouterIPParam `json:"externalRouterIPs,omitempty"`
7373

7474
// ExternalNetwork is the OpenStack Network to be used to get public internet to the VMs.
75+
// This option is ignored if DisableExternalNetwork is set to true.
76+
//
77+
// If ExternalNetwork is defined it must refer to exactly one external network.
78+
//
79+
// If ExternalNetwork is not defined or is empty the controller will use any
80+
// existing external network as long as there is only one. It is an
81+
// error if ExternalNetwork is not defined and there are multiple
82+
// external networks unless DisableExternalNetwork is also set.
83+
//
84+
// If ExternalNetwork is not defined and there are no external networks
85+
// the controller will proceed as though DisableExternalNetwork was set.
7586
// +optional
76-
ExternalNetwork NetworkFilter `json:"externalNetwork,omitempty"`
87+
ExternalNetwork *NetworkFilter `json:"externalNetwork,omitempty"`
7788

78-
// DisableExternalNetwork determines whether or not to attempt to connect the cluster
89+
// DisableExternalNetwork specifies whether or not to attempt to connect the cluster
7990
// to an external network. This allows for the creation of clusters when connecting
8091
// to an external network is not possible or desirable, e.g. if using a provider network.
8192
// +optional

api/v1beta1/zz_generated.deepcopy.go

Lines changed: 5 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclusters.yaml

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5572,7 +5572,7 @@ spec:
55725572
type: boolean
55735573
disableExternalNetwork:
55745574
description: |-
5575-
DisableExternalNetwork determines whether or not to attempt to connect the cluster
5575+
DisableExternalNetwork specifies whether or not to attempt to connect the cluster
55765576
to an external network. This allows for the creation of clusters when connecting
55775577
to an external network is not possible or desirable, e.g. if using a provider network.
55785578
type: boolean
@@ -5582,8 +5582,22 @@ spec:
55825582
Kubernetes cluster, which also disables SecurityGroups
55835583
type: boolean
55845584
externalNetwork:
5585-
description: ExternalNetwork is the OpenStack Network to be used to
5586-
get public internet to the VMs.
5585+
description: |-
5586+
ExternalNetwork is the OpenStack Network to be used to get public internet to the VMs.
5587+
This option is ignored if DisableExternalNetwork is set to true.
5588+
5589+
5590+
If ExternalNetwork is defined it must refer to exactly one external network.
5591+
5592+
5593+
If ExternalNetwork is not defined or is empty the controller will use any
5594+
existing external network as long as there is only one. It is an
5595+
error if ExternalNetwork is not defined and there are multiple
5596+
external networks unless DisableExternalNetwork is also set.
5597+
5598+
5599+
If ExternalNetwork is not defined and there are no external networks
5600+
the controller will proceed as though DisableExternalNetwork was set.
55875601
properties:
55885602
description:
55895603
type: string

config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclustertemplates.yaml

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3004,7 +3004,7 @@ spec:
30043004
type: boolean
30053005
disableExternalNetwork:
30063006
description: |-
3007-
DisableExternalNetwork determines whether or not to attempt to connect the cluster
3007+
DisableExternalNetwork specifies whether or not to attempt to connect the cluster
30083008
to an external network. This allows for the creation of clusters when connecting
30093009
to an external network is not possible or desirable, e.g. if using a provider network.
30103010
type: boolean
@@ -3014,8 +3014,22 @@ spec:
30143014
Kubernetes cluster, which also disables SecurityGroups
30153015
type: boolean
30163016
externalNetwork:
3017-
description: ExternalNetwork is the OpenStack Network to be
3018-
used to get public internet to the VMs.
3017+
description: |-
3018+
ExternalNetwork is the OpenStack Network to be used to get public internet to the VMs.
3019+
This option is ignored if DisableExternalNetwork is set to true.
3020+
3021+
3022+
If ExternalNetwork is defined it must refer to exactly one external network.
3023+
3024+
3025+
If ExternalNetwork is not defined or is empty the controller will use any
3026+
existing external network as long as there is only one. It is an
3027+
error if ExternalNetwork is not defined and there are multiple
3028+
external networks unless DisableExternalNetwork is also set.
3029+
3030+
3031+
If ExternalNetwork is not defined and there are no external networks
3032+
the controller will proceed as though DisableExternalNetwork was set.
30193033
properties:
30203034
description:
30213035
type: string

controllers/openstackcluster_controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,7 @@ func reconcilePreExistingNetworkComponents(scope *scope.WithLogger, networkingSe
634634
}
635635

636636
if !openStackCluster.Spec.Network.IsEmpty() {
637-
netOpts := filterconvert.NetworkFilterToListOpts(&openStackCluster.Spec.Network)
637+
netOpts := filterconvert.NetworkFilterToListOpts(openStackCluster.Spec.Network)
638638
networkList, err := networkingService.GetNetworksByFilter(&netOpts)
639639
if err != nil {
640640
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to find network: %w", err))

controllers/openstackcluster_controller_test.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
. "github.com/onsi/gomega"
3535
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3636
"k8s.io/apimachinery/pkg/types"
37+
"k8s.io/utils/pointer"
3738
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
3839
"sigs.k8s.io/cluster-api/test/framework"
3940
"sigs.k8s.io/cluster-api/util/annotations"
@@ -521,7 +522,7 @@ var _ = Describe("OpenStackCluster controller", func() {
521522
},
522523
DisableAPIServerFloatingIP: true,
523524
APIServerFixedIP: "10.0.0.1",
524-
ExternalNetwork: infrav1.NetworkFilter{
525+
ExternalNetwork: &infrav1.NetworkFilter{
525526
ID: externalNetworkID,
526527
},
527528
Network: &infrav1.NetworkFilter{
@@ -556,6 +557,7 @@ var _ = Describe("OpenStackCluster controller", func() {
556557
ListOptsBuilder: networks.ListOpts{
557558
ID: externalNetworkID,
558559
},
560+
External: pointer.Bool(true),
559561
}).Return([]networks.Network{
560562
{
561563
ID: externalNetworkID,
@@ -600,7 +602,7 @@ var _ = Describe("OpenStackCluster controller", func() {
600602
},
601603
DisableAPIServerFloatingIP: true,
602604
APIServerFixedIP: "10.0.0.1",
603-
ExternalNetwork: infrav1.NetworkFilter{
605+
ExternalNetwork: &infrav1.NetworkFilter{
604606
ID: externalNetworkID,
605607
},
606608
Network: &infrav1.NetworkFilter{
@@ -639,6 +641,7 @@ var _ = Describe("OpenStackCluster controller", func() {
639641
ListOptsBuilder: networks.ListOpts{
640642
ID: externalNetworkID,
641643
},
644+
External: pointer.Bool(true),
642645
}).Return([]networks.Network{
643646
{
644647
ID: externalNetworkID,

0 commit comments

Comments
 (0)