Skip to content

Commit ea483e8

Browse files
committed
Added static ip support to CAPI installer for vSphere.
1 parent 62209ca commit ea483e8

File tree

2 files changed

+42
-41
lines changed

2 files changed

+42
-41
lines changed

pkg/asset/machines/vsphere/capimachines.go

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"github.com/openshift/installer/pkg/asset/installconfig/vsphere"
2020
"github.com/openshift/installer/pkg/asset/manifests/capiutils"
2121
"github.com/openshift/installer/pkg/types"
22+
"github.com/openshift/installer/pkg/utils"
2223
)
2324

2425
const (
@@ -69,8 +70,9 @@ func GenerateMachines(ctx context.Context, clusterID string, config *types.Insta
6970

7071
capvMachines := make([]*capv.VSphereMachine, 0, len(machines))
7172
result := make([]*asset.RuntimeFile, 0, len(machines))
73+
staticIP := false
7274

73-
for _, machine := range machines {
75+
for mIndex, machine := range machines {
7476
providerSpec, ok := machine.Spec.ProviderSpec.Value.Object.(*machinev1.VSphereMachineProviderSpec)
7577
if !ok {
7678
return nil, errors.New("unable to convert ProviderSpec to VSphereMachineProviderSpec")
@@ -79,22 +81,33 @@ func GenerateMachines(ctx context.Context, clusterID string, config *types.Insta
7981
vcenterContext := metadata.VCenterContexts[providerSpec.Workspace.Server]
8082
resourcePool := providerSpec.Workspace.ResourcePool
8183

84+
customVMXKeys := map[string]string{
85+
"guestinfo.hostname": machine.Name,
86+
"guestinfo.domain": strings.TrimSuffix(config.ClusterDomain(), "."),
87+
"stealclock.enable": "TRUE",
88+
}
89+
8290
capvNetworkDevices := []capv.NetworkDeviceSpec{}
8391
for _, networkDevice := range providerSpec.Network.Devices {
8492
networkName, err := getNetworkInventoryPath(vcenterContext, networkDevice.NetworkName, providerSpec)
8593
if err != nil {
8694
return nil, fmt.Errorf("unable to get network inventory path: %w", err)
8795
}
88-
capvNetworkDevices = append(capvNetworkDevices, capv.NetworkDeviceSpec{
96+
deviceSpec := capv.NetworkDeviceSpec{
8997
NetworkName: networkName,
9098
DHCP4: true,
91-
})
92-
}
99+
}
93100

94-
customVMXKeys := map[string]string{
95-
"guestinfo.hostname": machine.Name,
96-
"guestinfo.domain": strings.TrimSuffix(config.ClusterDomain(), "."),
97-
"stealclock.enable": "TRUE",
101+
// Static IP configured. Add kargs.
102+
if len(networkDevice.AddressesFromPools) > 0 {
103+
staticIP = true
104+
kargs, err := utils.ConstructNetworkKargsFromMachine(data.IPClaims, data.IPAddresses, &machines[mIndex], networkDevice)
105+
if err != nil {
106+
return nil, fmt.Errorf("unable to get static ip config for machine %v: %w", machine.Name, err)
107+
}
108+
customVMXKeys["guestinfo.afterburn.initrd.network-kargs"] = kargs
109+
}
110+
capvNetworkDevices = append(capvNetworkDevices, deviceSpec)
98111
}
99112

100113
vsphereMachine := &capv.VSphereMachine{
@@ -166,6 +179,15 @@ func GenerateMachines(ctx context.Context, clusterID string, config *types.Insta
166179
if role == masterRole {
167180
customVMXKeys := map[string]string{}
168181

182+
// If we detected static IP for masters, lets apply to bootstrap as well.
183+
if staticIP {
184+
kargs, err := utils.ConstructKargsForBootstrap(config)
185+
if err != nil {
186+
return nil, fmt.Errorf("unable to get static ip config for bootstrap: %w", err)
187+
}
188+
customVMXKeys["guestinfo.afterburn.initrd.network-kargs"] = kargs
189+
}
190+
169191
bootstrapSpec := capvMachines[0].Spec
170192
bootstrapSpec.CustomVMXKeys = customVMXKeys
171193
bootstrapVSphereMachine := &capv.VSphereMachine{

pkg/utils/vmware.go

Lines changed: 12 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -9,48 +9,27 @@ import (
99
"strings"
1010

1111
"github.com/sirupsen/logrus"
12-
"sigs.k8s.io/cluster-api/exp/ipam/api/v1alpha1"
12+
ipamv1 "sigs.k8s.io/cluster-api/exp/ipam/api/v1beta1"
1313

1414
machinev1beta1 "github.com/openshift/api/machine/v1beta1"
1515
"github.com/openshift/installer/pkg/types"
1616
)
1717

18-
func getIPAddressForClaim(claim v1alpha1.IPAddressClaim, addresses []v1alpha1.IPAddress) (*v1alpha1.IPAddress, error) {
19-
for _, address := range addresses {
20-
if address.Name == claim.Status.AddressRef.Name {
21-
return &address, nil
22-
}
23-
}
24-
return nil, fmt.Errorf("unable to find address for claim %s", claim.Name)
25-
}
26-
2718
// ConstructNetworkKargsFromMachine does something.
28-
func ConstructNetworkKargsFromMachine(claims []v1alpha1.IPAddressClaim, addresses []v1alpha1.IPAddress, machine *machinev1beta1.Machine) (string, error) {
29-
var addressList []string
30-
var gatewayList []string
31-
var nameserverList []string
32-
33-
for _, claim := range claims {
34-
for _, ownerReference := range claim.OwnerReferences {
35-
if ownerReference.Name != machine.Name {
36-
continue
37-
}
38-
address, err := getIPAddressForClaim(claim, addresses)
39-
if err != nil {
40-
return "", fmt.Errorf("unable to get address for claim %s: %w", claim.Name, err)
41-
}
42-
43-
addressList = append(addressList, fmt.Sprintf("%s/%d", address.Spec.Address, address.Spec.Prefix))
44-
gatewayList = append(gatewayList, address.Spec.Gateway)
45-
for _, networkDevices := range machine.Spec.ProviderSpec.Value.Object.(*machinev1beta1.VSphereMachineProviderSpec).Network.Devices {
46-
if networkDevices.Nameservers == nil {
47-
continue
48-
}
49-
nameserverList = append(nameserverList, networkDevices.Nameservers...)
19+
func ConstructNetworkKargsFromMachine(claims []ipamv1.IPAddressClaim, addresses []ipamv1.IPAddress, machine *machinev1beta1.Machine, network machinev1beta1.NetworkDeviceSpec) (string, error) {
20+
var ipAddresses []string
21+
var gateways []string
22+
for idx := range network.AddressesFromPools {
23+
for _, address := range addresses {
24+
logrus.Debugf("Checking IPAdress %v. Does it match? %v", address.Name, fmt.Sprintf("%s-claim-%d-%d", machine.Name, 0, idx))
25+
if address.Name == fmt.Sprintf("%s-claim-%d-%d", machine.Name, 0, idx) {
26+
ipAddresses = append(ipAddresses, fmt.Sprintf("%v/%v", address.Spec.Address, address.Spec.Prefix))
27+
gateways = append(gateways, address.Spec.Gateway)
28+
break
5029
}
5130
}
5231
}
53-
return ConstructKargsFromNetworkConfig(addressList, nameserverList, gatewayList)
32+
return ConstructKargsFromNetworkConfig(ipAddresses, network.Nameservers, gateways)
5433
}
5534

5635
func getSubnetMask(prefix netip.Prefix) (string, error) {

0 commit comments

Comments
 (0)