Skip to content

Commit 485de0d

Browse files
committed
Allow the user to provide its own networks/subnets
By setting lbMgmtNetwork.manageLbMgmtNetworks to false, the user can prevent the octavia-operator from creating the Neutron networking resources for the management network. In this case, the octavia-operator assumes that the user has already created: - lb-mgmt-net (optional), default management network for the amphora instances - lb-mgmt-subnet (optional), subnet of the lb-mgmt-net - octavia-link-router (optional), a router that connects the management provider network to the tenant networks - lb-mgmt-<az>-subnet (optional), per AZ subnets for each AZ defined in lbMgmtNetwork.availabilityZones JIRA: OSPRH-10232
1 parent cc5d028 commit 485de0d

File tree

6 files changed

+138
-33
lines changed

6 files changed

+138
-33
lines changed

api/bases/octavia.openstack.org_octavias.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ spec:
105105
type: object
106106
lbMgmtNetwork:
107107
default:
108+
createDefaultLbMgmtNetwork: true
108109
manageLbMgmtNetworks: true
109110
description: OctaviaLbMgmtNetworks Settings for Octavia management
110111
networks
@@ -135,7 +136,8 @@ spec:
135136
Attachment Definition
136137
type: string
137138
manageLbMgmtNetworks:
138-
default: true
139+
description: ManageLbMgmtNetworks - when True, octavia-operator
140+
creates the Neutron resources needed for its Management Network
139141
type: boolean
140142
type: object
141143
nodeSelector:

api/v1beta1/octavia_types.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ type OctaviaSpecBase struct {
171171
TenantName string `json:"tenantName"`
172172

173173
// +kubebuilder:validation:Optional
174-
// +kubebuilder:default={manageLbMgmtNetworks: true}
174+
// +kubebuilder:default={manageLbMgmtNetworks: true, createDefaultLbMgmtNetwork: true}
175175
LbMgmtNetworks OctaviaLbMgmtNetworks `json:"lbMgmtNetwork"`
176176

177177
// +kubebuilder:validation:Optional
@@ -230,14 +230,14 @@ type PasswordSelector struct {
230230
// OctaviaLbMgmtNetworks Settings for Octavia management networks
231231
type OctaviaLbMgmtNetworks struct {
232232
// +kubebuilder:validation:Optional
233-
// +kubebuilder:default=true
234-
ManageLbMgmtNetworks bool `json:"manageLbMgmtNetworks,omitempty"`
233+
// ManageLbMgmtNetworks - when True, octavia-operator creates the Neutron resources needed for its Management Network
234+
ManageLbMgmtNetworks bool `json:"manageLbMgmtNetworks"`
235235

236236
// +kubebuilder:validation:Optional
237237
// CreateDefaultLbMgmtNetwork - when True, octavia-operator creates a
238238
// Management Network for the default Availability Zone of the control
239239
// plane. Can be set to false when deploying OpenStack in DCN mode.
240-
CreateDefaultLbMgmtNetwork bool `json:"createDefaultLbMgmtNetwork,omitempty"`
240+
CreateDefaultLbMgmtNetwork bool `json:"createDefaultLbMgmtNetwork"`
241241

242242
// +kubebuilder:validation:Optional
243243
// LbMgmtRouterGateway is the IP address of the Octavia router on the

config/crd/bases/octavia.openstack.org_octavias.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ spec:
105105
type: object
106106
lbMgmtNetwork:
107107
default:
108+
createDefaultLbMgmtNetwork: true
108109
manageLbMgmtNetworks: true
109110
description: OctaviaLbMgmtNetworks Settings for Octavia management
110111
networks
@@ -135,7 +136,8 @@ spec:
135136
Attachment Definition
136137
type: string
137138
manageLbMgmtNetworks:
138-
default: true
139+
description: ManageLbMgmtNetworks - when True, octavia-operator
140+
creates the Neutron resources needed for its Management Network
139141
type: boolean
140142
type: object
141143
nodeSelector:

controllers/octavia_controller.go

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -687,25 +687,47 @@ func (r *OctaviaReconciler) reconcileNormal(ctx context.Context, instance *octav
687687
return ctrl.Result{}, err
688688
}
689689

690-
// Create load balancer management network and get its Id (networkInfo is actually a struct and contains
691-
// multiple details.
692-
networkInfo, err := octavia.EnsureAmphoraManagementNetwork(
693-
ctx,
694-
instance.Namespace,
695-
instance.Spec.TenantName,
696-
&instance.Spec.LbMgmtNetworks,
697-
networkParameters,
698-
&Log,
699-
helper,
700-
)
701-
if err != nil {
702-
instance.Status.Conditions.Set(condition.FalseCondition(
703-
octaviav1.OctaviaManagementNetworkReadyCondition,
704-
condition.ErrorReason,
705-
condition.SeverityWarning,
706-
octaviav1.OctaviaManagementNetworkReadyErrorMessage,
707-
err.Error()))
708-
return ctrl.Result{}, err
690+
var networkInfo octavia.NetworkProvisioningSummary
691+
692+
if instance.Spec.LbMgmtNetworks.ManageLbMgmtNetworks {
693+
// Create load balancer management network and get its Id (networkInfo is actually a struct and contains
694+
// multiple details.
695+
networkInfo, err = octavia.EnsureAmphoraManagementNetwork(
696+
ctx,
697+
instance.Namespace,
698+
instance.Spec.TenantName,
699+
&instance.Spec.LbMgmtNetworks,
700+
networkParameters,
701+
&Log,
702+
helper,
703+
)
704+
if err != nil {
705+
instance.Status.Conditions.Set(condition.FalseCondition(
706+
octaviav1.OctaviaManagementNetworkReadyCondition,
707+
condition.ErrorReason,
708+
condition.SeverityWarning,
709+
octaviav1.OctaviaManagementNetworkReadyErrorMessage,
710+
err.Error()))
711+
return ctrl.Result{}, err
712+
}
713+
} else {
714+
networkInfo, err = octavia.HandleUnmanagedAmphoraManagementNetwork(
715+
ctx,
716+
instance.Namespace,
717+
instance.Spec.TenantName,
718+
&instance.Spec.LbMgmtNetworks,
719+
&Log,
720+
helper,
721+
)
722+
if err != nil {
723+
instance.Status.Conditions.Set(condition.FalseCondition(
724+
octaviav1.OctaviaManagementNetworkReadyCondition,
725+
condition.ErrorReason,
726+
condition.SeverityWarning,
727+
octaviav1.OctaviaManagementNetworkReadyErrorMessage,
728+
err.Error()))
729+
return ctrl.Result{}, err
730+
}
709731
}
710732
instance.Status.Conditions.MarkTrue(octaviav1.OctaviaManagementNetworkReadyCondition, octaviav1.OctaviaManagementNetworkReadyCompleteMessage)
711733
Log.Info(fmt.Sprintf("Using management network \"%s\"", networkInfo.TenantNetworkID))

pkg/octavia/lb_mgmt_network.go

Lines changed: 85 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,6 @@ import (
3737
// Type for conveying the results of the EnsureAmphoraManagementNetwork call.
3838
type NetworkProvisioningSummary struct {
3939
TenantNetworkID string
40-
TenantSubnetID string
41-
ProviderNetworkID string
42-
RouterID string
4340
SecurityGroupID string
4441
ManagementSubnetCIDR string
4542
ManagementSubnetGateway string
@@ -208,6 +205,25 @@ func getNetworkExt(client *gophercloud.ServiceClient, networkName string, servic
208205
return nil, nil
209206
}
210207

208+
func getSubnet(client *gophercloud.ServiceClient, subnetName string, serviceTenantID string) (*subnets.Subnet, error) {
209+
listOpts := subnets.ListOpts{
210+
Name: subnetName,
211+
TenantID: serviceTenantID,
212+
}
213+
allPages, err := subnets.List(client, listOpts).AllPages()
214+
if err != nil {
215+
return nil, err
216+
}
217+
allSubnets, err := subnets.ExtractSubnets(allPages)
218+
if err != nil {
219+
return nil, err
220+
}
221+
if len(allSubnets) > 0 {
222+
return &allSubnets[0], nil
223+
}
224+
return nil, nil
225+
}
226+
211227
func ensureNetwork(client *gophercloud.ServiceClient, createOpts networks.CreateOpts, log *logr.Logger,
212228
serviceTenantID string) (*networks.Network, error) {
213229
foundNetwork, err := getNetwork(client, createOpts.Name, serviceTenantID)
@@ -805,6 +821,72 @@ func ensureSecurityGroup(
805821
return secGroup.ID, nil
806822
}
807823

824+
func HandleUnmanagedAmphoraManagementNetwork(
825+
ctx context.Context,
826+
ns string,
827+
tenantName string,
828+
netDetails *octaviav1.OctaviaLbMgmtNetworks,
829+
log *logr.Logger,
830+
helper *helper.Helper,
831+
) (NetworkProvisioningSummary, error) {
832+
o, err := GetOpenstackClient(ctx, ns, helper)
833+
if err != nil {
834+
return NetworkProvisioningSummary{}, err
835+
}
836+
client, err := GetNetworkClient(o)
837+
if err != nil {
838+
return NetworkProvisioningSummary{}, err
839+
}
840+
serviceTenant, err := GetProject(o, tenantName)
841+
if err != nil {
842+
return NetworkProvisioningSummary{}, err
843+
}
844+
845+
tenantNetworkID := ""
846+
network, err := getNetwork(client, LbMgmtNetName, serviceTenant.ID)
847+
if err == nil && network != nil {
848+
tenantNetworkID = network.ID
849+
}
850+
851+
managementSubnetGateway := ""
852+
router, err := findRouter(client, log)
853+
if err == nil && router != nil {
854+
if len(router.GatewayInfo.ExternalFixedIPs) > 0 {
855+
managementSubnetGateway = router.GatewayInfo.ExternalFixedIPs[0].IPAddress
856+
} else {
857+
log.Info("No external fixedIP on router %s, skipping", router.Name)
858+
}
859+
}
860+
861+
managementSubnetCIDR := ""
862+
subnet, err := getSubnet(client, LbMgmtSubnetName, serviceTenant.ID)
863+
if err == nil && subnet != nil {
864+
managementSubnetCIDR = subnet.CIDR
865+
}
866+
867+
managementSubnetExtraCIDRs := []string{}
868+
for _, az := range netDetails.AvailabilityZones {
869+
subnet, err := getSubnet(client, fmt.Sprintf(LbMgmtSubnetNameAZ, az), serviceTenant.ID)
870+
if err == nil && subnet != nil {
871+
managementSubnetExtraCIDRs = append(managementSubnetExtraCIDRs, subnet.CIDR)
872+
}
873+
}
874+
875+
securityGroupID := ""
876+
securityGroup, err := findSecurityGroup(client, serviceTenant.ID, LbMgmtNetworkSecurityGroupName, log)
877+
if err == nil && securityGroup != nil {
878+
securityGroupID = securityGroup.ID
879+
}
880+
881+
return NetworkProvisioningSummary{
882+
TenantNetworkID: tenantNetworkID,
883+
SecurityGroupID: securityGroupID,
884+
ManagementSubnetCIDR: managementSubnetCIDR,
885+
ManagementSubnetGateway: managementSubnetGateway,
886+
ManagementSubnetExtraCIDRs: managementSubnetExtraCIDRs,
887+
}, nil
888+
}
889+
808890
// EnsureAmphoraManagementNetwork - retrieve, create and reconcile the Octavia management network for the in cluster link to the
809891
// management tenant network.
810892
func EnsureAmphoraManagementNetwork(
@@ -844,7 +926,6 @@ func EnsureAmphoraManagementNetwork(
844926
var tenantSubnet *subnets.Subnet
845927
var tenantRouterPort *ports.Port
846928
tenantNetworkID := ""
847-
tenantSubnetID := ""
848929

849930
if netDetails.CreateDefaultLbMgmtNetwork {
850931
tenantNetwork, err = ensureLbMgmtNetwork(client, nil, netDetails, serviceTenant.ID, log)
@@ -857,7 +938,6 @@ func EnsureAmphoraManagementNetwork(
857938
if err != nil {
858939
return NetworkProvisioningSummary{}, err
859940
}
860-
tenantSubnetID = tenantSubnet.ID
861941

862942
tenantRouterPort, _, err = ensurePort(client, nil, tenantNetwork, &securityGroups, log)
863943
if err != nil {
@@ -997,9 +1077,6 @@ func EnsureAmphoraManagementNetwork(
9971077

9981078
return NetworkProvisioningSummary{
9991079
TenantNetworkID: tenantNetworkID,
1000-
TenantSubnetID: tenantSubnetID,
1001-
ProviderNetworkID: providerNetwork.ID,
1002-
RouterID: router.ID,
10031080
SecurityGroupID: lbMgmtSecurityGroupID,
10041081
ManagementSubnetCIDR: managementSubnetCIDR,
10051082
ManagementSubnetGateway: networkParameters.ProviderGateway.String(),

pkg/octavia/network_parameters.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@ func GetNetworkParametersFromNAD(
124124
if err != nil {
125125
return nil, fmt.Errorf("cannot parse gateway information: %w", err)
126126
}
127+
} else if !instance.Spec.LbMgmtNetworks.ManageLbMgmtNetworks {
128+
return networkParameters, nil
127129
} else {
128130
return nil, fmt.Errorf("cannot find gateway information in network attachment")
129131
}

0 commit comments

Comments
 (0)