From f94a1aed20eee9cc60f41ebe3ebd8748b96fd2a6 Mon Sep 17 00:00:00 2001 From: Matthew Booth Date: Thu, 7 Dec 2023 14:23:41 +0000 Subject: [PATCH] Revert "Move FloatingIP to Bastion spec" This reverts commit f19a6cc61bc5698f8292e851dba2d0b491d14ed0. This change required a version bump. We will re-add this change after creating the required version bump. --- api/v1alpha5/conversion.go | 19 ----------- api/v1alpha5/zz_generated.conversion.go | 29 +++++++--------- api/v1alpha6/conversion.go | 23 ------------- api/v1alpha6/zz_generated.conversion.go | 29 +++++++--------- api/v1alpha7/openstackmachine_types.go | 4 +++ api/v1alpha7/types.go | 5 --- ...re.cluster.x-k8s.io_openstackclusters.yaml | 10 +++--- ...er.x-k8s.io_openstackclustertemplates.yaml | 10 +++--- ...re.cluster.x-k8s.io_openstackmachines.yaml | 5 +++ ...er.x-k8s.io_openstackmachinetemplates.yaml | 5 +++ controllers/openstackcluster_controller.go | 2 +- .../src/clusteropenstack/configuration.md | 2 +- .../crd-changes/v1alpha6-to-v1alpha7.md | 33 ------------------- 13 files changed, 50 insertions(+), 126 deletions(-) diff --git a/api/v1alpha5/conversion.go b/api/v1alpha5/conversion.go index 2db68f0402..3f41962b92 100644 --- a/api/v1alpha5/conversion.go +++ b/api/v1alpha5/conversion.go @@ -238,16 +238,6 @@ func Convert_v1alpha5_PortOpts_To_v1alpha7_PortOpts(in *PortOpts, out *infrav1.P return nil } -func Convert_v1alpha5_OpenStackMachineSpec_To_v1alpha7_Bastion(in *OpenStackMachineSpec, out *infrav1.Bastion, _ conversion.Scope) error { - out.FloatingIP = in.FloatingIP - return nil -} - -func Convert_v1alpha7_Bastion_To_v1alpha5_OpenStackMachineSpec(in *infrav1.Bastion, out *OpenStackMachineSpec, _ conversion.Scope) error { - out.FloatingIP = in.FloatingIP - return nil -} - func Convert_v1alpha5_Instance_To_v1alpha7_BastionStatus(in *Instance, out *infrav1.BastionStatus, _ conversion.Scope) error { // BastionStatus is the same as Instance with unused fields removed out.ID = in.ID @@ -447,12 +437,3 @@ func Convert_v1alpha5_OpenStackClusterStatus_To_v1alpha7_OpenStackClusterStatus( func Convert_v1alpha7_OpenStackMachineSpec_To_v1alpha5_OpenStackMachineSpec(in *infrav1.OpenStackMachineSpec, out *OpenStackMachineSpec, s conversion.Scope) error { return autoConvert_v1alpha7_OpenStackMachineSpec_To_v1alpha5_OpenStackMachineSpec(in, out, s) } - -func Convert_v1alpha7_Bastion_To_v1alpha5_Bastion(in *infrav1.Bastion, out *Bastion, s conversion.Scope) error { - err := autoConvert_v1alpha7_Bastion_To_v1alpha5_Bastion(in, out, s) - if err != nil { - return err - } - in.FloatingIP = out.Instance.FloatingIP - return nil -} diff --git a/api/v1alpha5/zz_generated.conversion.go b/api/v1alpha5/zz_generated.conversion.go index 1f0f43c79e..52681a9c65 100644 --- a/api/v1alpha5/zz_generated.conversion.go +++ b/api/v1alpha5/zz_generated.conversion.go @@ -59,6 +59,11 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*v1alpha7.Bastion)(nil), (*Bastion)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha7_Bastion_To_v1alpha5_Bastion(a.(*v1alpha7.Bastion), b.(*Bastion), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*ExternalRouterIPParam)(nil), (*v1alpha7.ExternalRouterIPParam)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha5_ExternalRouterIPParam_To_v1alpha7_ExternalRouterIPParam(a.(*ExternalRouterIPParam), b.(*v1alpha7.ExternalRouterIPParam), scope) }); err != nil { @@ -324,11 +329,6 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddConversionFunc((*OpenStackMachineSpec)(nil), (*v1alpha7.Bastion)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha5_OpenStackMachineSpec_To_v1alpha7_Bastion(a.(*OpenStackMachineSpec), b.(*v1alpha7.Bastion), scope) - }); err != nil { - return err - } if err := s.AddConversionFunc((*OpenStackMachineSpec)(nil), (*v1alpha7.OpenStackMachineSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha5_OpenStackMachineSpec_To_v1alpha7_OpenStackMachineSpec(a.(*OpenStackMachineSpec), b.(*v1alpha7.OpenStackMachineSpec), scope) }); err != nil { @@ -364,16 +364,6 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddConversionFunc((*v1alpha7.Bastion)(nil), (*Bastion)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha7_Bastion_To_v1alpha5_Bastion(a.(*v1alpha7.Bastion), b.(*Bastion), scope) - }); err != nil { - return err - } - if err := s.AddConversionFunc((*v1alpha7.Bastion)(nil), (*OpenStackMachineSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha7_Bastion_To_v1alpha5_OpenStackMachineSpec(a.(*v1alpha7.Bastion), b.(*OpenStackMachineSpec), scope) - }); err != nil { - return err - } if err := s.AddConversionFunc((*v1alpha7.LoadBalancer)(nil), (*LoadBalancer)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha7_LoadBalancer_To_v1alpha5_LoadBalancer(a.(*v1alpha7.LoadBalancer), b.(*LoadBalancer), scope) }); err != nil { @@ -484,10 +474,14 @@ func autoConvert_v1alpha7_Bastion_To_v1alpha5_Bastion(in *v1alpha7.Bastion, out return err } out.AvailabilityZone = in.AvailabilityZone - // WARNING: in.FloatingIP requires manual conversion: does not exist in peer-type return nil } +// Convert_v1alpha7_Bastion_To_v1alpha5_Bastion is an autogenerated conversion function. +func Convert_v1alpha7_Bastion_To_v1alpha5_Bastion(in *v1alpha7.Bastion, out *Bastion, s conversion.Scope) error { + return autoConvert_v1alpha7_Bastion_To_v1alpha5_Bastion(in, out, s) +} + func autoConvert_v1alpha5_ExternalRouterIPParam_To_v1alpha7_ExternalRouterIPParam(in *ExternalRouterIPParam, out *v1alpha7.ExternalRouterIPParam, s conversion.Scope) error { out.FixedIP = in.FixedIP if err := Convert_v1alpha5_SubnetParam_To_v1alpha7_SubnetFilter(&in.Subnet, &out.Subnet, s); err != nil { @@ -1083,7 +1077,7 @@ func autoConvert_v1alpha5_OpenStackMachineSpec_To_v1alpha7_OpenStackMachineSpec( out.Ports = nil } // WARNING: in.Subnet requires manual conversion: does not exist in peer-type - // WARNING: in.FloatingIP requires manual conversion: does not exist in peer-type + out.FloatingIP = in.FloatingIP if in.SecurityGroups != nil { in, out := &in.SecurityGroups, &out.SecurityGroups *out = make([]v1alpha7.SecurityGroupFilter, len(*in)) @@ -1124,6 +1118,7 @@ func autoConvert_v1alpha7_OpenStackMachineSpec_To_v1alpha5_OpenStackMachineSpec( } else { out.Ports = nil } + out.FloatingIP = in.FloatingIP if in.SecurityGroups != nil { in, out := &in.SecurityGroups, &out.SecurityGroups *out = make([]SecurityGroupParam, len(*in)) diff --git a/api/v1alpha6/conversion.go b/api/v1alpha6/conversion.go index b3faa7605d..ae8e343ea8 100644 --- a/api/v1alpha6/conversion.go +++ b/api/v1alpha6/conversion.go @@ -40,10 +40,6 @@ func restorev1alpha6MachineSpec(previous *OpenStackMachineSpec, dst *OpenStackMa dst.Networks = previous.Networks dst.Ports = previous.Ports dst.SecurityGroups = previous.SecurityGroups - - // FloatingIP is removed from v1alpha7 with no replacement, so can't be - // losslessly converted. Restore the previously stored value on down-conversion. - dst.FloatingIP = previous.FloatingIP } func restorev1alpha6ClusterStatus(previous *OpenStackClusterStatus, dst *OpenStackClusterStatus) { @@ -476,16 +472,6 @@ func Convert_v1alpha7_PortOpts_To_v1alpha6_PortOpts(in *infrav1.PortOpts, out *P return nil } -func Convert_v1alpha6_OpenStackMachineSpec_To_v1alpha7_Bastion(in *OpenStackMachineSpec, out *infrav1.Bastion, _ apiconversion.Scope) error { - out.FloatingIP = in.FloatingIP - return nil -} - -func Convert_v1alpha7_Bastion_To_v1alpha6_OpenStackMachineSpec(in *infrav1.Bastion, out *OpenStackMachineSpec, _ apiconversion.Scope) error { - out.FloatingIP = in.FloatingIP - return nil -} - func Convert_v1alpha6_Instance_To_v1alpha7_BastionStatus(in *Instance, out *infrav1.BastionStatus, _ apiconversion.Scope) error { // BastionStatus is the same as Instance with unused fields removed out.ID = in.ID @@ -673,12 +659,3 @@ func Convert_v1alpha6_OpenStackClusterStatus_To_v1alpha7_OpenStackClusterStatus( func Convert_v1alpha7_OpenStackMachineSpec_To_v1alpha6_OpenStackMachineSpec(in *infrav1.OpenStackMachineSpec, out *OpenStackMachineSpec, s apiconversion.Scope) error { return autoConvert_v1alpha7_OpenStackMachineSpec_To_v1alpha6_OpenStackMachineSpec(in, out, s) } - -func Convert_v1alpha7_Bastion_To_v1alpha6_Bastion(in *infrav1.Bastion, out *Bastion, s apiconversion.Scope) error { - err := autoConvert_v1alpha7_Bastion_To_v1alpha6_Bastion(in, out, s) - if err != nil { - return err - } - in.FloatingIP = out.Instance.FloatingIP - return nil -} diff --git a/api/v1alpha6/zz_generated.conversion.go b/api/v1alpha6/zz_generated.conversion.go index 09cd655cc1..6bfa0129c3 100644 --- a/api/v1alpha6/zz_generated.conversion.go +++ b/api/v1alpha6/zz_generated.conversion.go @@ -64,6 +64,11 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*v1alpha7.Bastion)(nil), (*Bastion)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha7_Bastion_To_v1alpha6_Bastion(a.(*v1alpha7.Bastion), b.(*Bastion), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*ExternalRouterIPParam)(nil), (*v1alpha7.ExternalRouterIPParam)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha6_ExternalRouterIPParam_To_v1alpha7_ExternalRouterIPParam(a.(*ExternalRouterIPParam), b.(*v1alpha7.ExternalRouterIPParam), scope) }); err != nil { @@ -344,11 +349,6 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddConversionFunc((*OpenStackMachineSpec)(nil), (*v1alpha7.Bastion)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha6_OpenStackMachineSpec_To_v1alpha7_Bastion(a.(*OpenStackMachineSpec), b.(*v1alpha7.Bastion), scope) - }); err != nil { - return err - } if err := s.AddConversionFunc((*OpenStackMachineSpec)(nil), (*v1alpha7.OpenStackMachineSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha6_OpenStackMachineSpec_To_v1alpha7_OpenStackMachineSpec(a.(*OpenStackMachineSpec), b.(*v1alpha7.OpenStackMachineSpec), scope) }); err != nil { @@ -379,16 +379,6 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddConversionFunc((*v1alpha7.Bastion)(nil), (*Bastion)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha7_Bastion_To_v1alpha6_Bastion(a.(*v1alpha7.Bastion), b.(*Bastion), scope) - }); err != nil { - return err - } - if err := s.AddConversionFunc((*v1alpha7.Bastion)(nil), (*OpenStackMachineSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha7_Bastion_To_v1alpha6_OpenStackMachineSpec(a.(*v1alpha7.Bastion), b.(*OpenStackMachineSpec), scope) - }); err != nil { - return err - } if err := s.AddConversionFunc((*v1alpha7.NetworkStatusWithSubnets)(nil), (*Network)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha7_NetworkStatusWithSubnets_To_v1alpha6_Network(a.(*v1alpha7.NetworkStatusWithSubnets), b.(*Network), scope) }); err != nil { @@ -500,10 +490,14 @@ func autoConvert_v1alpha7_Bastion_To_v1alpha6_Bastion(in *v1alpha7.Bastion, out return err } out.AvailabilityZone = in.AvailabilityZone - // WARNING: in.FloatingIP requires manual conversion: does not exist in peer-type return nil } +// Convert_v1alpha7_Bastion_To_v1alpha6_Bastion is an autogenerated conversion function. +func Convert_v1alpha7_Bastion_To_v1alpha6_Bastion(in *v1alpha7.Bastion, out *Bastion, s conversion.Scope) error { + return autoConvert_v1alpha7_Bastion_To_v1alpha6_Bastion(in, out, s) +} + func autoConvert_v1alpha6_ExternalRouterIPParam_To_v1alpha7_ExternalRouterIPParam(in *ExternalRouterIPParam, out *v1alpha7.ExternalRouterIPParam, s conversion.Scope) error { out.FixedIP = in.FixedIP if err := Convert_v1alpha6_SubnetParam_To_v1alpha7_SubnetFilter(&in.Subnet, &out.Subnet, s); err != nil { @@ -1106,7 +1100,7 @@ func autoConvert_v1alpha6_OpenStackMachineSpec_To_v1alpha7_OpenStackMachineSpec( out.Ports = nil } // WARNING: in.Subnet requires manual conversion: does not exist in peer-type - // WARNING: in.FloatingIP requires manual conversion: does not exist in peer-type + out.FloatingIP = in.FloatingIP if in.SecurityGroups != nil { in, out := &in.SecurityGroups, &out.SecurityGroups *out = make([]v1alpha7.SecurityGroupFilter, len(*in)) @@ -1147,6 +1141,7 @@ func autoConvert_v1alpha7_OpenStackMachineSpec_To_v1alpha6_OpenStackMachineSpec( } else { out.Ports = nil } + out.FloatingIP = in.FloatingIP if in.SecurityGroups != nil { in, out := &in.SecurityGroups, &out.SecurityGroups *out = make([]SecurityGroupParam, len(*in)) diff --git a/api/v1alpha7/openstackmachine_types.go b/api/v1alpha7/openstackmachine_types.go index df5c4a55db..f5f4f698aa 100644 --- a/api/v1alpha7/openstackmachine_types.go +++ b/api/v1alpha7/openstackmachine_types.go @@ -60,6 +60,10 @@ type OpenStackMachineSpec struct { // If not specified a default port will be added for the default cluster network. Ports []PortOpts `json:"ports,omitempty"` + // The floatingIP which will be associated to the machine, only used for master. + // The floatingIP should have been created and haven't been associated. + FloatingIP string `json:"floatingIP,omitempty"` + // The names of the security groups to assign to the instance SecurityGroups []SecurityGroupFilter `json:"securityGroups,omitempty"` diff --git a/api/v1alpha7/types.go b/api/v1alpha7/types.go index d82016bbc7..3ef5305ff2 100644 --- a/api/v1alpha7/types.go +++ b/api/v1alpha7/types.go @@ -344,11 +344,6 @@ type Bastion struct { //+optional AvailabilityZone string `json:"availabilityZone,omitempty"` - - // FloatingIP which will be associated to the bastion machine. - // The floating IP should already exist and should not be associated with a port. - //+optional - FloatingIP string `json:"floatingIP,omitempty"` } type APIServerLoadBalancer struct { diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclusters.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclusters.yaml index ac700b690a..a5114ac6a2 100644 --- a/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclusters.yaml +++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclusters.yaml @@ -3767,11 +3767,6 @@ spec: type: string enabled: type: boolean - floatingIP: - description: FloatingIP which will be associated to the bastion - machine. The floating IP should already exist and should not - be associated with a port. - type: string instance: description: Instance for the bastion itself properties: @@ -3847,6 +3842,11 @@ spec: description: The flavor reference for the flavor for your server instance. type: string + floatingIP: + description: The floatingIP which will be associated to the + machine, only used for master. The floatingIP should have + been created and haven't been associated. + type: string identityRef: description: IdentityRef is a reference to a identity to be used when reconciling this cluster diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclustertemplates.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclustertemplates.yaml index 281b48f8df..815a3a83fc 100644 --- a/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclustertemplates.yaml +++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclustertemplates.yaml @@ -1607,11 +1607,6 @@ spec: type: string enabled: type: boolean - floatingIP: - description: FloatingIP which will be associated to the - bastion machine. The floating IP should already exist - and should not be associated with a port. - type: string instance: description: Instance for the bastion itself properties: @@ -1693,6 +1688,11 @@ spec: description: The flavor reference for the flavor for your server instance. type: string + floatingIP: + description: The floatingIP which will be associated + to the machine, only used for master. The floatingIP + should have been created and haven't been associated. + type: string identityRef: description: IdentityRef is a reference to a identity to be used when reconciling this cluster diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackmachines.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackmachines.yaml index be2ad0feee..e5171cd868 100644 --- a/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackmachines.yaml +++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackmachines.yaml @@ -1226,6 +1226,11 @@ spec: flavor: description: The flavor reference for the flavor for your server instance. type: string + floatingIP: + description: The floatingIP which will be associated to the machine, + only used for master. The floatingIP should have been created and + haven't been associated. + type: string identityRef: description: IdentityRef is a reference to a identity to be used when reconciling this cluster diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackmachinetemplates.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackmachinetemplates.yaml index f0dca99933..bc88d84fa2 100644 --- a/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackmachinetemplates.yaml +++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackmachinetemplates.yaml @@ -1030,6 +1030,11 @@ spec: description: The flavor reference for the flavor for your server instance. type: string + floatingIP: + description: The floatingIP which will be associated to the + machine, only used for master. The floatingIP should have + been created and haven't been associated. + type: string identityRef: description: IdentityRef is a reference to a identity to be used when reconciling this cluster diff --git a/controllers/openstackcluster_controller.go b/controllers/openstackcluster_controller.go index e6d3025cba..08177fc9ed 100644 --- a/controllers/openstackcluster_controller.go +++ b/controllers/openstackcluster_controller.go @@ -359,7 +359,7 @@ func reconcileBastion(scope scope.Scope, cluster *clusterv1.Cluster, openStackCl return err } clusterName := fmt.Sprintf("%s-%s", cluster.Namespace, cluster.Name) - fp, err := networkingService.GetOrCreateFloatingIP(openStackCluster, openStackCluster, clusterName, openStackCluster.Spec.Bastion.FloatingIP) + fp, err := networkingService.GetOrCreateFloatingIP(openStackCluster, openStackCluster, clusterName, openStackCluster.Spec.Bastion.Instance.FloatingIP) if err != nil { handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to get or create floating IP for bastion: %w", err)) return fmt.Errorf("failed to get or create floating IP for bastion: %w", err) diff --git a/docs/book/src/clusteropenstack/configuration.md b/docs/book/src/clusteropenstack/configuration.md index 3f4e9dc58f..6d9ab32fff 100644 --- a/docs/book/src/clusteropenstack/configuration.md +++ b/docs/book/src/clusteropenstack/configuration.md @@ -626,7 +626,7 @@ spec: ... bastion: ... - floatingIP: + floatingIP: ``` If `managedSecurityGroups: true`, security group rule opening 22/tcp is added to security groups for bastion, controller, and worker nodes respectively. Otherwise, you have to add `securityGroups` to the `bastion` in `OpenStackCluster` spec and `OpenStackMachineTemplate` spec template respectively. diff --git a/docs/book/src/topics/crd-changes/v1alpha6-to-v1alpha7.md b/docs/book/src/topics/crd-changes/v1alpha6-to-v1alpha7.md index bed0c4cf5f..25937afa52 100644 --- a/docs/book/src/topics/crd-changes/v1alpha6-to-v1alpha7.md +++ b/docs/book/src/topics/crd-changes/v1alpha6-to-v1alpha7.md @@ -8,7 +8,6 @@ - [`OpenStackMachine`](#openstackmachine) - [⚠️ Removal of networks](#-removal-of-networks) - [Removal of subnet](#removal-of-subnet) - - [Change to floatingIP](#change-to-floatingip) - [Change to securityGroups](#change-to-securitygroups) - [Changes to ports](#changes-to-ports) - [Change to securityGroupFilters](#change-to-securitygroupfilters) @@ -122,38 +121,6 @@ to set the `accessIPv4` field on Nova servers. This feature was not widely used, difficult to use, and could not be extended to support IPv6. It is removed without replacement. -#### Change to floatingIP - -The `OpenStackMachineSpec.FloatingIP` field has moved to `OpenStackClusterSpec.Bastion.FloatingIP`. -For example, if you had the following `OpenStackMachineTemplate`: - -```yaml -apiVersion: infrastructure.cluster.x-k8s.io/v1alpha6 -kind: OpenStackMachineTemplate -metadata: - name: ${CLUSTER_NAME}-md-0 -spec: - template: - spec: - .. - floatingIP: "1.2.3.4" -``` - -This will safely converted to use `Bastion.FloatingIP` when upgrading to version 0.8. - -To use the new `Bastion.FloatingIP` field, here is an example: - -```yaml -apiVersion: infrastructure.cluster.x-k8s.io/v1alpha7 -kind: OpenStackCluster -metadata: - name: ${CLUSTER_NAME} -spec: - .. - bastion: - floatingIP: "1.2.3.4" -``` - #### Change to securityGroups `securityGroups` has been simplified by the removal of a separate filter parameter. It was previously: