Skip to content

Commit d36c6df

Browse files
committed
Remove hardcoded values for the tenant network
The parameters are computed by using the destination of the route of the NAD
1 parent 58cc17c commit d36c6df

File tree

6 files changed

+92
-87
lines changed

6 files changed

+92
-87
lines changed

api/bases/octavia.openstack.org_octavias.yaml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,6 @@ spec:
103103
lbMgmtNetwork:
104104
default:
105105
manageLbMgmtNetworks: true
106-
subnetIpVersion: 4
107106
description: OctaviaLbMgmtNetworks Settings for Octavia management
108107
networks
109108
properties:
@@ -116,10 +115,6 @@ spec:
116115
manageLbMgmtNetworks:
117116
default: true
118117
type: boolean
119-
subnetIpVersion:
120-
default: 4
121-
description: IP Version of the managed subnets
122-
type: integer
123118
type: object
124119
nodeSelector:
125120
additionalProperties:

api/v1beta1/octavia_types.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ type OctaviaSpecBase struct {
160160
TenantName string `json:"tenantName"`
161161

162162
// +kubebuilder:validation:Optional
163-
// +kubebuilder:default={manageLbMgmtNetworks: true, subnetIpVersion: 4}
163+
// +kubebuilder:default={manageLbMgmtNetworks: true}
164164
LbMgmtNetworks OctaviaLbMgmtNetworks `json:"lbMgmtNetwork"`
165165

166166
// +kubebuilder:validation:Optional
@@ -218,11 +218,6 @@ type OctaviaLbMgmtNetworks struct {
218218
// +kubebuilder:default=true
219219
ManageLbMgmtNetworks bool `json:"manageLbMgmtNetworks,omitempty"`
220220

221-
// +kubebuilder:validation:Optional
222-
// +kubebuilder:default=4
223-
// IP Version of the managed subnets
224-
SubnetIPVersion int `json:"subnetIpVersion,omitempty"`
225-
226221
// +kubebuilder:validation:Optional
227222
// Availability zones for the octavia management network resources
228223
AvailabilityZones []string `json:"availabilityZones,omitempty"`

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

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,6 @@ spec:
103103
lbMgmtNetwork:
104104
default:
105105
manageLbMgmtNetworks: true
106-
subnetIpVersion: 4
107106
description: OctaviaLbMgmtNetworks Settings for Octavia management
108107
networks
109108
properties:
@@ -116,10 +115,6 @@ spec:
116115
manageLbMgmtNetworks:
117116
default: true
118117
type: boolean
119-
subnetIpVersion:
120-
default: 4
121-
description: IP Version of the managed subnets
122-
type: integer
123118
type: object
124119
nodeSelector:
125120
additionalProperties:

pkg/octavia/lb_mgmt_network.go

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,8 @@ func findPort(client *gophercloud.ServiceClient, networkID string, ipAddress str
7272
}
7373

7474
func ensurePort(client *gophercloud.ServiceClient, tenantNetwork *networks.Network, tenantSubnet *subnets.Subnet,
75-
securityGroups *[]string, log *logr.Logger) (*ports.Port, error) {
76-
ipAddress := LbMgmtRouterPortIPv4
77-
if tenantSubnet.IPVersion == 6 {
78-
ipAddress = LbMgmtRouterPortIPv6
79-
}
80-
75+
securityGroups *[]string, networkParameters *NetworkParameters, log *logr.Logger) (*ports.Port, error) {
76+
ipAddress := networkParameters.TenantGateway.String()
8177
p, err := findPort(client, tenantNetwork.ID, ipAddress, log)
8278
if err != nil {
8379
return nil, err
@@ -297,23 +293,18 @@ func ensureProvSubnet(
297293
networkParameters *NetworkParameters,
298294
log *logr.Logger,
299295
) (*subnets.Subnet, error) {
300-
var gatewayIP string
301-
if networkParameters.Gateway.IsValid() {
302-
gatewayIP = networkParameters.Gateway.String()
303-
} else {
304-
gatewayIP = ""
305-
}
296+
gatewayIP := ""
306297
createOpts := subnets.CreateOpts{
307298
Name: LbProvSubnetName,
308299
Description: LbProvSubnetDescription,
309300
NetworkID: providerNetwork.ID,
310301
TenantID: providerNetwork.TenantID,
311-
CIDR: networkParameters.CIDR.String(),
302+
CIDR: networkParameters.ProviderCIDR.String(),
312303
IPVersion: gophercloud.IPVersion(4),
313304
AllocationPools: []subnets.AllocationPool{
314305
{
315-
Start: networkParameters.AllocationStart.String(),
316-
End: networkParameters.AllocationEnd.String(),
306+
Start: networkParameters.ProviderAllocationStart.String(),
307+
End: networkParameters.ProviderAllocationEnd.String(),
317308
},
318309
},
319310
GatewayIP: &gatewayIP,
@@ -346,12 +337,16 @@ func ensureProvNetwork(client *gophercloud.ServiceClient, netDetails *octaviav1.
346337

347338
func ensureLbMgmtSubnet(
348339
client *gophercloud.ServiceClient,
349-
networkDetails *octaviav1.OctaviaLbMgmtNetworks,
350340
tenantNetwork *networks.Network,
351341
networkParameters *NetworkParameters,
352342
log *logr.Logger,
353343
) (*subnets.Subnet, error) {
354-
ipVersion := networkDetails.SubnetIPVersion
344+
var ipVersion int
345+
if networkParameters.TenantCIDR.Addr().Is6() {
346+
ipVersion = 6
347+
} else {
348+
ipVersion = 4
349+
}
355350

356351
var createOpts subnets.CreateOpts
357352
if ipVersion == 6 {
@@ -361,14 +356,14 @@ func ensureLbMgmtSubnet(
361356
Description: LbMgmtSubnetDescription,
362357
NetworkID: tenantNetwork.ID,
363358
TenantID: tenantNetwork.TenantID,
364-
CIDR: LbMgmtSubnetIPv6CIDR,
359+
CIDR: networkParameters.TenantCIDR.String(),
365360
IPVersion: gophercloud.IPVersion(ipVersion),
366361
IPv6AddressMode: LbMgmtSubnetIPv6AddressMode,
367362
IPv6RAMode: LbMgmtSubnetIPv6RAMode,
368363
AllocationPools: []subnets.AllocationPool{
369364
{
370-
Start: LbMgmtSubnetIPv6AllocationPoolStart,
371-
End: LbMgmtSubnetIPv6AllocationPoolEnd,
365+
Start: networkParameters.TenantAllocationStart.String(),
366+
End: networkParameters.TenantAllocationEnd.String(),
372367
},
373368
},
374369
GatewayIP: &gatewayIP,
@@ -381,18 +376,18 @@ func ensureLbMgmtSubnet(
381376
Description: LbMgmtSubnetDescription,
382377
NetworkID: tenantNetwork.ID,
383378
TenantID: tenantNetwork.TenantID,
384-
CIDR: LbMgmtSubnetCIDR,
379+
CIDR: networkParameters.TenantCIDR.String(),
385380
IPVersion: gophercloud.IPVersion(ipVersion),
386381
AllocationPools: []subnets.AllocationPool{
387382
{
388-
Start: LbMgmtSubnetAllocationPoolStart,
389-
End: LbMgmtSubnetAllocationPoolEnd,
383+
Start: networkParameters.TenantAllocationStart.String(),
384+
End: networkParameters.TenantAllocationEnd.String(),
390385
},
391386
},
392387
HostRoutes: []subnets.HostRoute{
393388
{
394-
DestinationCIDR: networkParameters.CIDR.String(),
395-
NextHop: LbMgmtRouterPortIPv4,
389+
DestinationCIDR: networkParameters.ProviderCIDR.String(),
390+
NextHop: networkParameters.TenantGateway.String(),
396391
},
397392
},
398393
GatewayIP: &gatewayIP,
@@ -435,7 +430,7 @@ func ensureLbMgmtNetwork(client *gophercloud.ServiceClient, networkDetails *octa
435430
func externalFixedIPs(subnetID string, networkParameters *NetworkParameters) []routers.ExternalFixedIP {
436431
ips := []routers.ExternalFixedIP{
437432
{
438-
IPAddress: networkParameters.RouterIPAddress.String(),
433+
IPAddress: networkParameters.ProviderGateway.String(),
439434
SubnetID: subnetID,
440435
},
441436
}
@@ -784,7 +779,7 @@ func EnsureAmphoraManagementNetwork(
784779
if err != nil {
785780
return NetworkProvisioningSummary{}, err
786781
}
787-
tenantSubnet, err := ensureLbMgmtSubnet(client, netDetails, tenantNetwork, networkParameters, log)
782+
tenantSubnet, err := ensureLbMgmtSubnet(client, tenantNetwork, networkParameters, log)
788783
if err != nil {
789784
return NetworkProvisioningSummary{}, err
790785
}
@@ -800,7 +795,7 @@ func EnsureAmphoraManagementNetwork(
800795

801796
securityGroups := []string{lbMgmtSecurityGroupID, lbHealthSecurityGroupID}
802797

803-
tenantRouterPort, err := ensurePort(client, tenantNetwork, tenantSubnet, &securityGroups, log)
798+
tenantRouterPort, err := ensurePort(client, tenantNetwork, tenantSubnet, &securityGroups, networkParameters, log)
804799
if err != nil {
805800
return NetworkProvisioningSummary{}, err
806801
}

pkg/octavia/network_consts.go

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -35,31 +35,9 @@ const (
3535

3636
// IPv4 consts
3737

38-
// LbMgmtSubnetCIDR -
39-
LbMgmtSubnetCIDR = "172.24.0.0/16"
40-
41-
// LbMgmtSubnetAllocationPoolStart -
42-
LbMgmtSubnetAllocationPoolStart = "172.24.0.5"
43-
44-
// LbMgmtSubnetAllocationPoolEnd -
45-
LbMgmtSubnetAllocationPoolEnd = "172.24.255.254"
46-
4738
// LbMgmtSubnetGatewayIP -
4839
LbMgmtSubnetGatewayIP = ""
4940

50-
// IPv6 consts
51-
// using Unique local address (fc00::/7)
52-
// with Global ID 6c:6261:6173 ("lbaas")
53-
54-
// LbMgmtSubnetIPv6CIDR -
55-
LbMgmtSubnetIPv6CIDR = "fd6c:6261:6173:0001::/64"
56-
57-
// LbMgmtSubnetIPv6AllocationPoolStart -
58-
LbMgmtSubnetIPv6AllocationPoolStart = "fd6c:6261:6173:0001::5"
59-
60-
// LbMgmtSubnetIPv6AllocationPoolEnd -
61-
LbMgmtSubnetIPv6AllocationPoolEnd = "fd6c:6261:6173:0001:ffff:ffff:ffff:ffff"
62-
6341
// LbMgmtSubnetIPv6AddressMode -
6442
LbMgmtSubnetIPv6AddressMode = "slaac"
6543

@@ -98,12 +76,6 @@ const (
9876
// LbMgmtRouterPortName
9977
LbMgmtRouterPortName = "lb-mgmt-router-port"
10078

101-
// LbMgmtRouterPortIPv4
102-
LbMgmtRouterPortIPv4 = "172.24.0.3"
103-
104-
// LbMgmtRouterPortIPv6
105-
LbMgmtRouterPortIPv6 = "fd6c:6261:6173:0001::3"
106-
10779
// Network attachment details
10880
// LbNetworkAttachmentName
10981
LbNetworkAttachmentName = "octavia"

pkg/octavia/network_parameters.go

Lines changed: 68 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,14 @@ import (
1010

1111
// NetworkParameters - Parameters for the Octavia networks, based on the config of the NAD
1212
type NetworkParameters struct {
13-
CIDR netip.Prefix
14-
AllocationStart netip.Addr
15-
AllocationEnd netip.Addr
16-
Gateway netip.Addr
17-
RouterIPAddress netip.Addr
13+
ProviderCIDR netip.Prefix
14+
ProviderAllocationStart netip.Addr
15+
ProviderAllocationEnd netip.Addr
16+
ProviderGateway netip.Addr
17+
TenantCIDR netip.Prefix
18+
TenantAllocationStart netip.Addr
19+
TenantAllocationEnd netip.Addr
20+
TenantGateway netip.Addr
1821
}
1922

2023
// NADConfig - IPAM parameters of the NAD
@@ -31,7 +34,8 @@ type NADIpam struct {
3134
}
3235

3336
type NADRoute struct {
34-
Gateway netip.Addr `json:"gw"`
37+
Gateway netip.Addr `json:"gw"`
38+
Destination netip.Prefix `json:"dst"`
3539
}
3640

3741
func getConfigFromNAD(
@@ -47,6 +51,38 @@ func getConfigFromNAD(
4751
return nadConfig, nil
4852
}
4953

54+
func getRangeAndGatewayFromCIDR(
55+
cidr netip.Prefix,
56+
) (start netip.Addr, end netip.Addr, gateway netip.Addr) {
57+
addr := cidr.Addr()
58+
if addr.Is6() {
59+
addrBytes := addr.As16()
60+
for i := 8; i < 15; i++ {
61+
addrBytes[i] = 0
62+
}
63+
addrBytes[15] = 3
64+
gateway = netip.AddrFrom16(addrBytes)
65+
addrBytes[15] = 5
66+
start = netip.AddrFrom16(addrBytes)
67+
for i := 8; i < 15; i++ {
68+
addrBytes[i] = 0xff
69+
}
70+
addrBytes[15] = 0xfe
71+
end = netip.AddrFrom16(addrBytes)
72+
} else {
73+
addrBytes := addr.As4()
74+
addrBytes[2] = 0
75+
addrBytes[3] = 3
76+
gateway = netip.AddrFrom4(addrBytes)
77+
addrBytes[3] = 5
78+
start = netip.AddrFrom4(addrBytes)
79+
addrBytes[2] = 0xff
80+
addrBytes[3] = 0xfe
81+
end = netip.AddrFrom4(addrBytes)
82+
}
83+
return
84+
}
85+
5086
func GetNetworkParametersFromNAD(
5187
nad *networkv1.NetworkAttachmentDefinition,
5288
) (*NetworkParameters, error) {
@@ -57,24 +93,41 @@ func GetNetworkParametersFromNAD(
5793
return nil, fmt.Errorf("cannot read network parameters: %w", err)
5894
}
5995

60-
networkParameters.CIDR = nadConfig.IPAM.CIDR
96+
// Provider subnet parameters
97+
networkParameters.ProviderCIDR = nadConfig.IPAM.CIDR
6198

62-
networkParameters.AllocationStart = nadConfig.IPAM.RangeEnd.Next()
63-
end := networkParameters.AllocationStart
99+
networkParameters.ProviderAllocationStart = nadConfig.IPAM.RangeEnd.Next()
100+
end := networkParameters.ProviderAllocationStart
64101
for i := 0; i < LbProvSubnetPoolSize; i++ {
65-
if !networkParameters.CIDR.Contains(end) {
66-
return nil, fmt.Errorf("cannot allocate %d IP addresses in %s", LbProvSubnetPoolSize, networkParameters.CIDR)
102+
if !networkParameters.ProviderCIDR.Contains(end) {
103+
return nil, fmt.Errorf("cannot allocate %d IP addresses in %s", LbProvSubnetPoolSize, networkParameters.ProviderCIDR)
67104
}
68105
end = end.Next()
69106
}
70-
networkParameters.AllocationEnd = end
71-
// TODO(gthiemonge) Remove routes from NAD, manage them in the operator
107+
networkParameters.ProviderAllocationEnd = end
72108
if len(nadConfig.IPAM.Routes) > 0 {
73-
networkParameters.RouterIPAddress = nadConfig.IPAM.Routes[0].Gateway
109+
networkParameters.ProviderGateway = nadConfig.IPAM.Routes[0].Gateway
74110
} else {
75111
return nil, fmt.Errorf("cannot find gateway information in network attachment")
76112
}
77-
// Gateway is currently unset
113+
114+
// Tenant subnet parameters
115+
networkParameters.TenantCIDR = nadConfig.IPAM.Routes[0].Destination
116+
var bitlen int
117+
if networkParameters.TenantCIDR.Addr().Is6() {
118+
bitlen = 64
119+
} else {
120+
bitlen = 16
121+
}
122+
123+
if networkParameters.TenantCIDR.Bits() != bitlen {
124+
return nil, fmt.Errorf("the tenant CIDR is /%d, it should be /%d", networkParameters.TenantCIDR.Bits(), bitlen)
125+
}
126+
127+
start, end, gateway := getRangeAndGatewayFromCIDR(networkParameters.TenantCIDR)
128+
networkParameters.TenantAllocationStart = start
129+
networkParameters.TenantAllocationEnd = end
130+
networkParameters.TenantGateway = gateway
78131

79132
return networkParameters, err
80133
}

0 commit comments

Comments
 (0)