mirror of
https://github.com/openshift/installer.git
synced 2026-02-05 15:47:14 +01:00
pkg/asset/manifests/azure: save cidr blocks
When using a pre-existing network, save CIDR blocks for the virtual network and subnets https://issues.redhat.com/browse/OCPBUGS-59105
This commit is contained in:
@@ -7,6 +7,7 @@ import (
|
||||
"net"
|
||||
"strings"
|
||||
|
||||
aznetwork "github.com/Azure/azure-sdk-for-go/profiles/2020-09-01/network/mgmt/network"
|
||||
"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
|
||||
"github.com/pkg/errors"
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
@@ -30,18 +31,22 @@ import (
|
||||
// GenerateClusterAssets generates the manifests for the cluster-api.
|
||||
func GenerateClusterAssets(installConfig *installconfig.InstallConfig, clusterID *installconfig.ClusterID) (*capiutils.GenerateClusterAssetsOutput, error) {
|
||||
manifests := []*asset.RuntimeFile{}
|
||||
mainCIDR := capiutils.CIDRFromInstallConfig(installConfig)
|
||||
mainCIDR := capiutils.CIDRFromInstallConfig(installConfig).String()
|
||||
|
||||
session, err := installConfig.Azure.Session()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to create Azure session")
|
||||
}
|
||||
|
||||
subnets, err := cidr.SplitIntoSubnetsIPv4(mainCIDR.String(), 2)
|
||||
subnets, err := cidr.SplitIntoSubnetsIPv4(mainCIDR, 2)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to split CIDR into subnets")
|
||||
}
|
||||
|
||||
virtualNetworkAddressPrefixes := []string{mainCIDR}
|
||||
controlPlaneAddressPrefixes := []string{subnets[0].String()}
|
||||
computeAddressPrefixes := []string{subnets[1].String()}
|
||||
|
||||
// CAPZ expects the capz-system to be created.
|
||||
azureNamespace := &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "capz-system"}}
|
||||
azureNamespace.SetGroupVersionKind(corev1.SchemeGroupVersion.WithKind("Namespace"))
|
||||
@@ -57,7 +62,7 @@ func GenerateClusterAssets(installConfig *installconfig.InstallConfig, clusterID
|
||||
|
||||
source := "*"
|
||||
if installConfig.Config.Publish == types.InternalPublishingStrategy {
|
||||
source = mainCIDR.String()
|
||||
source = mainCIDR
|
||||
}
|
||||
|
||||
securityGroup := capz.SecurityGroup{
|
||||
@@ -117,39 +122,31 @@ func GenerateClusterAssets(installConfig *installconfig.InstallConfig, clusterID
|
||||
lbip := capz.DefaultInternalLBIPAddress
|
||||
lbip = getIPWithinCIDR(subnets, lbip)
|
||||
|
||||
if controlPlaneSub := installConfig.Config.Azure.ControlPlaneSubnet; controlPlaneSub != "" {
|
||||
client, err := installConfig.Azure.Client()
|
||||
if controlPlaneSubnetName := installConfig.Config.Azure.ControlPlaneSubnet; controlPlaneSubnetName != "" {
|
||||
controlPlaneSubnet, err := getSubnet(installConfig, clusterID, "controlPlane", controlPlaneSubnetName)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get azure client: %w", err)
|
||||
return nil, fmt.Errorf("failed to get control plane subnet: %w", err)
|
||||
}
|
||||
ctx := context.TODO()
|
||||
controlPlaneSubnet, err := client.GetControlPlaneSubnet(ctx, installConfig.Config.Azure.NetworkResourceGroupName, installConfig.Config.Azure.VirtualNetwork, controlPlaneSub)
|
||||
if err != nil || controlPlaneSubnet == nil {
|
||||
return nil, fmt.Errorf("failed to get azure control plane subnet: %w", err)
|
||||
} else if controlPlaneSubnet.AddressPrefixes == nil && controlPlaneSubnet.AddressPrefix == nil {
|
||||
return nil, fmt.Errorf("failed to get azure control plane subnet addresses: %w", err)
|
||||
}
|
||||
subnetList := []*net.IPNet{}
|
||||
if controlPlaneSubnet.AddressPrefixes != nil {
|
||||
for _, sub := range *controlPlaneSubnet.AddressPrefixes {
|
||||
_, ipnet, err := net.ParseCIDR(sub)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get translate azure control plane subnet addresses: %w", err)
|
||||
}
|
||||
subnetList = append(subnetList, ipnet)
|
||||
}
|
||||
}
|
||||
|
||||
if controlPlaneSubnet.AddressPrefix != nil {
|
||||
_, ipnet, err := net.ParseCIDR(*controlPlaneSubnet.AddressPrefix)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get translate azure control plane subnet address prefix: %w", err)
|
||||
}
|
||||
subnetList = append(subnetList, ipnet)
|
||||
subnetList, err := getSubnetAddressPrefixes(controlPlaneSubnet)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get control plane subnet address prefixes: %w", err)
|
||||
}
|
||||
controlPlaneAddressPrefixes = stringifyAddressPrefixes(subnetList)
|
||||
lbip = getIPWithinCIDR(subnetList, lbip)
|
||||
}
|
||||
|
||||
if computeSubnetName := installConfig.Config.Azure.ComputeSubnet; computeSubnetName != "" {
|
||||
computeSubnet, err := getSubnet(installConfig, clusterID, "compute", computeSubnetName)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get compute subnet: %w", err)
|
||||
}
|
||||
subnetList, err := getSubnetAddressPrefixes(computeSubnet)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get compute subnet address prefixes: %w", err)
|
||||
}
|
||||
computeAddressPrefixes = stringifyAddressPrefixes(subnetList)
|
||||
}
|
||||
|
||||
apiServerLB.FrontendIPs = []capz.FrontendIP{{
|
||||
Name: fmt.Sprintf("%s-internal-frontEnd", clusterID.InfraID),
|
||||
FrontendIPClass: capz.FrontendIPClass{
|
||||
@@ -157,6 +154,8 @@ func GenerateClusterAssets(installConfig *installconfig.InstallConfig, clusterID
|
||||
},
|
||||
}}
|
||||
if installConfig.Config.Azure.VirtualNetwork != "" {
|
||||
virtualNetworkAddressPrefixes = make([]string, 0)
|
||||
|
||||
client, err := installConfig.Azure.Client()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get azure client: %w", err)
|
||||
@@ -176,6 +175,9 @@ func GenerateClusterAssets(installConfig *installconfig.InstallConfig, clusterID
|
||||
apiServerLB.FrontendIPs[0].FrontendIPClass = capz.FrontendIPClass{
|
||||
PrivateIPAddress: lbip,
|
||||
}
|
||||
if virtualNetwork.AddressSpace != nil && virtualNetwork.AddressSpace.AddressPrefixes != nil {
|
||||
virtualNetworkAddressPrefixes = append(virtualNetworkAddressPrefixes, *virtualNetwork.AddressSpace.AddressPrefixes...)
|
||||
}
|
||||
}
|
||||
|
||||
azEnv := string(installConfig.Azure.CloudName)
|
||||
@@ -183,11 +185,9 @@ func GenerateClusterAssets(installConfig *installconfig.InstallConfig, clusterID
|
||||
computeSubnetSpec := capz.SubnetSpec{
|
||||
ID: nodeSubnetID,
|
||||
SubnetClassSpec: capz.SubnetClassSpec{
|
||||
Name: computeSubnet,
|
||||
Role: capz.SubnetNode,
|
||||
CIDRBlocks: []string{
|
||||
subnets[1].String(),
|
||||
},
|
||||
Name: computeSubnet,
|
||||
Role: capz.SubnetNode,
|
||||
CIDRBlocks: computeAddressPrefixes,
|
||||
},
|
||||
SecurityGroup: securityGroup,
|
||||
}
|
||||
@@ -238,9 +238,7 @@ func GenerateClusterAssets(installConfig *installconfig.InstallConfig, clusterID
|
||||
// https://github.com/kubernetes-sigs/cluster-api-provider-azure/commit/0f321e4089a3f4dc37f8420bf2ef6762c398c400
|
||||
ID: virtualNetworkID,
|
||||
VnetClassSpec: capz.VnetClassSpec{
|
||||
CIDRBlocks: []string{
|
||||
mainCIDR.String(),
|
||||
},
|
||||
CIDRBlocks: virtualNetworkAddressPrefixes,
|
||||
},
|
||||
},
|
||||
APIServerLB: &apiServerLB,
|
||||
@@ -248,11 +246,9 @@ func GenerateClusterAssets(installConfig *installconfig.InstallConfig, clusterID
|
||||
Subnets: capz.Subnets{
|
||||
{
|
||||
SubnetClassSpec: capz.SubnetClassSpec{
|
||||
Name: controlPlaneSubnet,
|
||||
Role: capz.SubnetControlPlane,
|
||||
CIDRBlocks: []string{
|
||||
subnets[0].String(),
|
||||
},
|
||||
Name: controlPlaneSubnet,
|
||||
Role: capz.SubnetControlPlane,
|
||||
CIDRBlocks: controlPlaneAddressPrefixes,
|
||||
},
|
||||
SecurityGroup: securityGroup,
|
||||
},
|
||||
@@ -345,6 +341,71 @@ func GenerateClusterAssets(installConfig *installconfig.InstallConfig, clusterID
|
||||
}, nil
|
||||
}
|
||||
|
||||
func getSubnet(installConfig *installconfig.InstallConfig, clusterID *installconfig.ClusterID, subnetType, subnetName string) (*aznetwork.Subnet, error) {
|
||||
var subnet *aznetwork.Subnet
|
||||
|
||||
azClient, err := installConfig.Azure.Client()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get azure client: %w", err)
|
||||
}
|
||||
ctx := context.TODO()
|
||||
|
||||
if subnetType == "controlPlane" {
|
||||
subnet, err = azClient.GetControlPlaneSubnet(ctx,
|
||||
installConfig.Config.Azure.NetworkResourceGroupName,
|
||||
installConfig.Config.Azure.VirtualNetwork,
|
||||
subnetName,
|
||||
)
|
||||
} else if subnetType == "compute" {
|
||||
subnet, err = azClient.GetComputeSubnet(ctx,
|
||||
installConfig.Config.Azure.NetworkResourceGroupName,
|
||||
installConfig.Config.Azure.VirtualNetwork,
|
||||
subnetName,
|
||||
)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get subnet: %w", err)
|
||||
}
|
||||
if subnet == nil {
|
||||
return nil, fmt.Errorf("failed to get subnet")
|
||||
}
|
||||
if subnet.AddressPrefixes == nil && subnet.AddressPrefix == nil {
|
||||
return nil, fmt.Errorf("failed to get subnet addresses: %w", err)
|
||||
}
|
||||
return subnet, nil
|
||||
}
|
||||
|
||||
func getSubnetAddressPrefixes(subnet *aznetwork.Subnet) ([]*net.IPNet, error) {
|
||||
subnetList := []*net.IPNet{}
|
||||
if subnet.AddressPrefixes != nil {
|
||||
for _, sub := range *subnet.AddressPrefixes {
|
||||
_, ipnet, err := net.ParseCIDR(sub)
|
||||
if err != nil {
|
||||
return subnetList, fmt.Errorf("failed to get translate azure subnet addresses: %w", err)
|
||||
}
|
||||
subnetList = append(subnetList, ipnet)
|
||||
}
|
||||
}
|
||||
if subnet.AddressPrefix != nil {
|
||||
_, ipnet, err := net.ParseCIDR(*subnet.AddressPrefix)
|
||||
if err != nil {
|
||||
return subnetList, fmt.Errorf("failed to get translate azure subnet address prefix: %w", err)
|
||||
}
|
||||
subnetList = append(subnetList, ipnet)
|
||||
}
|
||||
|
||||
return subnetList, nil
|
||||
}
|
||||
|
||||
func stringifyAddressPrefixes(addressPrefixes []*net.IPNet) []string {
|
||||
strAddressPrefixes := []string{}
|
||||
for _, addressPrefix := range addressPrefixes {
|
||||
strAddressPrefixes = append(strAddressPrefixes, addressPrefix.String())
|
||||
}
|
||||
return strAddressPrefixes
|
||||
}
|
||||
|
||||
func getIPWithinCIDR(subnets []*net.IPNet, ip string) string {
|
||||
if subnets == nil || ip == "" {
|
||||
return ""
|
||||
|
||||
Reference in New Issue
Block a user