Skip to content

Commit

Permalink
Move CAPA userconfig values to global chart values (#1216)
Browse files Browse the repository at this point in the history
* Move capa userconfig root fields to global fields

* add CHANGELOG

* Update CHANGELOG.md
  • Loading branch information
njuettner committed Dec 5, 2023
1 parent 57f9bc7 commit 4295fce
Show file tree
Hide file tree
Showing 7 changed files with 181 additions and 168 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ and this project's packages adheres to [Semantic Versioning](http://semver.org/s

## [Unreleased]

### Changed

- **BREAKING** All values of cluster userconfig for `CAPA` are moving under `global`.

## [2.48.1] - 2023-11-30

### Changed
Expand Down
84 changes: 43 additions & 41 deletions cmd/template/cluster/provider/capa.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,8 @@ func templateClusterCAPA(ctx context.Context, k8sClient k8sclient.Interface, out
return fmt.Errorf("management cluster's AWSCluster object had an invalid IPv4 in `.status.networkStatus.natGatewaysIPs`: %q", ip)
}

if !slices.Contains(flagValues.ControlPlane.LoadBalancerIngressAllowCIDRBlocks, cidr) {
flagValues.ControlPlane.LoadBalancerIngressAllowCIDRBlocks = append(flagValues.ControlPlane.LoadBalancerIngressAllowCIDRBlocks, cidr)
if !slices.Contains(flagValues.Global.ControlPlane.LoadBalancerIngressAllowCIDRBlocks, cidr) {
flagValues.Global.ControlPlane.LoadBalancerIngressAllowCIDRBlocks = append(flagValues.Global.ControlPlane.LoadBalancerIngressAllowCIDRBlocks, cidr)
}
}

Expand All @@ -93,7 +93,7 @@ func templateClusterCAPA(ctx context.Context, k8sClient k8sclient.Interface, out
// We allow specifying an empty value `--control-plane-load-balancer-ingress-allow-cidr-block ""`
// to denote that only the management cluster's IPs should be allowed. Skip this value.
} else if net.IsIPv4CIDRString(cidr) {
flagValues.ControlPlane.LoadBalancerIngressAllowCIDRBlocks = append(flagValues.ControlPlane.LoadBalancerIngressAllowCIDRBlocks, cidr)
flagValues.Global.ControlPlane.LoadBalancerIngressAllowCIDRBlocks = append(flagValues.Global.ControlPlane.LoadBalancerIngressAllowCIDRBlocks, cidr)
} else {
return fmt.Errorf("invalid CIDR (for single IPv4, please use `/32` suffix): %q", cidr)
}
Expand All @@ -116,14 +116,14 @@ func templateClusterCAPA(ctx context.Context, k8sClient k8sclient.Interface, out
return microerror.Mask(err)
}

flagValues.Connectivity.Subnets = []capa.Subnet{
flagValues.Global.Connectivity.Subnets = []capa.Subnet{
{
CidrBlocks: []capa.CIDRBlock{},
},
}

for i := 0; i < subnetCount; i++ {
flagValues.Connectivity.Subnets[0].CidrBlocks = append(flagValues.Connectivity.Subnets[0].CidrBlocks, capa.CIDRBlock{
flagValues.Global.Connectivity.Subnets[0].CidrBlocks = append(flagValues.Global.Connectivity.Subnets[0].CidrBlocks, capa.CIDRBlock{
CIDR: subnets[i].CIDR().String(),
AvailabilityZone: string(rune('a' + i)), // generate `a`, `b`, etc. based on which index we're at
})
Expand All @@ -133,18 +133,18 @@ func templateClusterCAPA(ctx context.Context, k8sClient k8sclient.Interface, out
if config.AWS.HttpProxy != "" {
httpProxy = config.AWS.HttpProxy
}
flagValues.Connectivity.Proxy = &capa.Proxy{
flagValues.Global.Connectivity.Proxy = &capa.Proxy{
Enabled: true,
HttpsProxy: config.AWS.HttpsProxy,
HttpProxy: httpProxy,
NoProxy: config.AWS.NoProxy,
}

flagValues.ControlPlane.APIMode = defaultTo(config.AWS.APIMode, ModePrivate)
flagValues.Connectivity.VPCMode = defaultTo(config.AWS.VPCMode, ModePrivate)
flagValues.Connectivity.Topology.Mode = defaultTo(config.AWS.TopologyMode, gsannotation.NetworkTopologyModeGiantSwarmManaged)
flagValues.Connectivity.Topology.PrefixListID = config.AWS.PrefixListID
flagValues.Connectivity.Topology.TransitGatewayID = config.AWS.TransitGatewayID
flagValues.Global.ControlPlane.APIMode = defaultTo(config.AWS.APIMode, ModePrivate)
flagValues.Global.Connectivity.VPCMode = defaultTo(config.AWS.VPCMode, ModePrivate)
flagValues.Global.Connectivity.Topology.Mode = defaultTo(config.AWS.TopologyMode, gsannotation.NetworkTopologyModeGiantSwarmManaged)
flagValues.Global.Connectivity.Topology.PrefixListID = config.AWS.PrefixListID
flagValues.Global.Connectivity.Topology.TransitGatewayID = config.AWS.TransitGatewayID
}

configData, err := capa.GenerateClusterValues(flagValues)
Expand Down Expand Up @@ -209,38 +209,40 @@ func templateClusterCAPA(ctx context.Context, k8sClient k8sclient.Interface, out

func BuildCapaClusterConfig(config ClusterConfig) capa.ClusterConfig {
return capa.ClusterConfig{
Metadata: &capa.Metadata{
Name: config.Name,
Description: config.Description,
Organization: config.Organization,
},
ProviderSpecific: &capa.ProviderSpecific{
Region: config.Region,
AWSClusterRoleIdentityName: config.AWS.AWSClusterRoleIdentityName,
},
Connectivity: &capa.Connectivity{
AvailabilityZoneUsageLimit: config.AWS.NetworkAZUsageLimit,
Bastion: &capa.Bastion{
Enabled: true,
InstanceType: config.BastionInstanceType,
Replicas: config.BastionReplicas,
Global: &capa.Global{
Connectivity: &capa.Connectivity{
AvailabilityZoneUsageLimit: config.AWS.NetworkAZUsageLimit,
Bastion: &capa.Bastion{
Enabled: true,
InstanceType: config.BastionInstanceType,
Replicas: config.BastionReplicas,
},
Network: &capa.Network{
VPCCIDR: config.AWS.NetworkVPCCIDR,
},
Topology: &capa.Topology{},
},
Network: &capa.Network{
VPCCIDR: config.AWS.NetworkVPCCIDR,
ControlPlane: &capa.ControlPlane{
InstanceType: config.ControlPlaneInstanceType,
},
Topology: &capa.Topology{},
},
ControlPlane: &capa.ControlPlane{
InstanceType: config.ControlPlaneInstanceType,
},
NodePools: &map[string]capa.MachinePool{
config.AWS.MachinePool.Name: {
AvailabilityZones: config.AWS.MachinePool.AZs,
InstanceType: config.AWS.MachinePool.InstanceType,
MinSize: config.AWS.MachinePool.MinSize,
MaxSize: config.AWS.MachinePool.MaxSize,
RootVolumeSizeGB: config.AWS.MachinePool.RootVolumeSizeGB,
CustomNodeLabels: config.AWS.MachinePool.CustomNodeLabels,
Metadata: &capa.Metadata{
Name: config.Name,
Description: config.Description,
Organization: config.Organization,
},
NodePools: &map[string]capa.MachinePool{
config.AWS.MachinePool.Name: {
AvailabilityZones: config.AWS.MachinePool.AZs,
InstanceType: config.AWS.MachinePool.InstanceType,
MinSize: config.AWS.MachinePool.MinSize,
MaxSize: config.AWS.MachinePool.MaxSize,
RootVolumeSizeGB: config.AWS.MachinePool.RootVolumeSizeGB,
CustomNodeLabels: config.AWS.MachinePool.CustomNodeLabels,
},
},
ProviderSpecific: &capa.ProviderSpecific{
Region: config.Region,
AWSClusterRoleIdentityName: config.AWS.AWSClusterRoleIdentityName,
},
},
}
Expand Down
12 changes: 6 additions & 6 deletions cmd/template/cluster/provider/templates/capa/functions.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@ import (
)

func GenerateClusterValues(flagInputs ClusterConfig) (string, error) {
if flagInputs.Connectivity.Topology.Mode != "" && flagInputs.Connectivity.Topology.Mode != gsannotation.NetworkTopologyModeGiantSwarmManaged && flagInputs.Connectivity.Topology.Mode != gsannotation.NetworkTopologyModeUserManaged && flagInputs.Connectivity.Topology.Mode != gsannotation.NetworkTopologyModeNone {
return "", fmt.Errorf("invalid topology mode value %q", flagInputs.Connectivity.Topology.Mode)
if flagInputs.Global.Connectivity.Topology.Mode != "" && flagInputs.Global.Connectivity.Topology.Mode != gsannotation.NetworkTopologyModeGiantSwarmManaged && flagInputs.Global.Connectivity.Topology.Mode != gsannotation.NetworkTopologyModeUserManaged && flagInputs.Global.Connectivity.Topology.Mode != gsannotation.NetworkTopologyModeNone {
return "", fmt.Errorf("invalid topology mode value %q", flagInputs.Global.Connectivity.Topology.Mode)
}
if flagInputs.Connectivity.Topology.PrefixListID != "" && !strings.HasPrefix(flagInputs.Connectivity.Topology.PrefixListID, "pl-") {
return "", fmt.Errorf("invalid AWS prefix list ID %q", flagInputs.Connectivity.Topology.PrefixListID)
if flagInputs.Global.Connectivity.Topology.PrefixListID != "" && !strings.HasPrefix(flagInputs.Global.Connectivity.Topology.PrefixListID, "pl-") {
return "", fmt.Errorf("invalid AWS prefix list ID %q", flagInputs.Global.Connectivity.Topology.PrefixListID)
}
if flagInputs.Connectivity.Topology.TransitGatewayID != "" && !strings.HasPrefix(flagInputs.Connectivity.Topology.TransitGatewayID, "tgw-") {
return "", fmt.Errorf("invalid AWS transit gateway ID %q", flagInputs.Connectivity.Topology.TransitGatewayID)
if flagInputs.Global.Connectivity.Topology.TransitGatewayID != "" && !strings.HasPrefix(flagInputs.Global.Connectivity.Topology.TransitGatewayID, "tgw-") {
return "", fmt.Errorf("invalid AWS transit gateway ID %q", flagInputs.Global.Connectivity.Topology.TransitGatewayID)
}

var flagConfigData map[string]interface{}
Expand Down
8 changes: 6 additions & 2 deletions cmd/template/cluster/provider/templates/capa/types.go
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
package capa

type ClusterConfig struct {
type Global struct {
Connectivity *Connectivity `json:"connectivity,omitempty"`
ControlPlane *ControlPlane `json:"controlPlane,omitempty"`
Metadata *Metadata `json:"metadata,omitempty"`
NodePools *map[string]MachinePool `json:"nodePools,omitempty"`
ProviderSpecific *ProviderSpecific `json:"providerSpecific,omitempty"`
}

type ClusterConfig struct {
Global *Global `json:"global,omitempty"`
}

type Metadata struct {
Name string `json:"name,omitempty"`
Description string `json:"description,omitempty"`
Name string `json:"name,omitempty"`
Organization string `json:"organization,omitempty"`
}

Expand Down
53 changes: 27 additions & 26 deletions cmd/template/cluster/testdata/run_template_cluster_capa.golden
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,33 @@
apiVersion: v1
data:
values: |
connectivity:
bastion:
enabled: true
network:
vpcCidr: 10.123.0.0/16
topology: {}
controlPlane:
instanceType: control-plane-instance-type
metadata:
description: just a test cluster
name: test1
organization: test
nodePools:
worker1:
availabilityZones:
- eu-west-1a
- eu-west-1b
customNodeLabels:
- label=value
instanceType: big-one
maxSize: 5
minSize: 2
rootVolumeSizeGB: 200
providerSpecific:
awsClusterRoleIdentityName: default
region: the-region
global:
connectivity:
bastion:
enabled: true
network:
vpcCidr: 10.123.0.0/16
topology: {}
controlPlane:
instanceType: control-plane-instance-type
metadata:
description: just a test cluster
name: test1
organization: test
nodePools:
worker1:
availabilityZones:
- eu-west-1a
- eu-west-1b
customNodeLabels:
- label=value
instanceType: big-one
maxSize: 5
minSize: 2
rootVolumeSizeGB: 200
providerSpecific:
awsClusterRoleIdentityName: default
region: the-region
kind: ConfigMap
metadata:
creationTimestamp: null
Expand Down
91 changes: 46 additions & 45 deletions cmd/template/cluster/testdata/run_template_cluster_capa_2.golden
Original file line number Diff line number Diff line change
Expand Up @@ -2,51 +2,52 @@
apiVersion: v1
data:
values: |
connectivity:
bastion:
enabled: true
network:
vpcCidr: 10.123.0.0/16
proxy:
enabled: true
httpProxy: http://internal-a1c90e5331e124481a14fb7ad80ae8eb-1778512673.eu-west-2.elb.amazonaws.com:4000
httpsProxy: https://internal-a1c90e5331e124481a14fb7ad80ae8eb-1778512673.eu-west-2.elb.amazonaws.com:4000
noProxy: test-domain.com
subnets:
- cidrBlocks:
- availabilityZone: a
cidr: 10.123.0.0/18
- availabilityZone: b
cidr: 10.123.64.0/18
isPublic: false
topology:
mode: GiantSwarmManaged
vpcMode: private
controlPlane:
apiMode: private
instanceType: control-plane-instance-type
loadBalancerIngressAllowCidrBlocks:
- 1.2.3.4/32
- 5.6.7.8/32
- 9.10.11.12/32
metadata:
description: just a test cluster
name: test1
organization: test
nodePools:
worker1:
availabilityZones:
- eu-west-1a
- eu-west-1b
customNodeLabels:
- label=value
instanceType: big-one
maxSize: 5
minSize: 2
rootVolumeSizeGB: 200
providerSpecific:
awsClusterRoleIdentityName: default
region: the-region
global:
connectivity:
bastion:
enabled: true
network:
vpcCidr: 10.123.0.0/16
proxy:
enabled: true
httpProxy: http://internal-a1c90e5331e124481a14fb7ad80ae8eb-1778512673.eu-west-2.elb.amazonaws.com:4000
httpsProxy: https://internal-a1c90e5331e124481a14fb7ad80ae8eb-1778512673.eu-west-2.elb.amazonaws.com:4000
noProxy: test-domain.com
subnets:
- cidrBlocks:
- availabilityZone: a
cidr: 10.123.0.0/18
- availabilityZone: b
cidr: 10.123.64.0/18
isPublic: false
topology:
mode: GiantSwarmManaged
vpcMode: private
controlPlane:
apiMode: private
instanceType: control-plane-instance-type
loadBalancerIngressAllowCidrBlocks:
- 1.2.3.4/32
- 5.6.7.8/32
- 9.10.11.12/32
metadata:
description: just a test cluster
name: test1
organization: test
nodePools:
worker1:
availabilityZones:
- eu-west-1a
- eu-west-1b
customNodeLabels:
- label=value
instanceType: big-one
maxSize: 5
minSize: 2
rootVolumeSizeGB: 200
providerSpecific:
awsClusterRoleIdentityName: default
region: the-region
kind: ConfigMap
metadata:
creationTimestamp: null
Expand Down
Loading

0 comments on commit 4295fce

Please sign in to comment.