Skip to content

Commit 62209ca

Browse files
Merge pull request openshift#7501 from vr4manta/SPLAT-1173
SPLAT-1173: Enhance vSphere Installer to use IPAddressClaims for static IP
2 parents fcef1d3 + af93103 commit 62209ca

File tree

8 files changed

+311
-38
lines changed

8 files changed

+311
-38
lines changed

pkg/asset/cluster/tfvars/tfvars.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,6 +1035,10 @@ func (t *TerraformVariables) Generate(parents asset.Parents) error {
10351035
if err != nil {
10361036
return err
10371037
}
1038+
ipAddresses, err := mastersAsset.IPAddresses()
1039+
if err != nil {
1040+
return err
1041+
}
10381042
controlPlaneConfigs := make([]*machinev1beta1.VSphereMachineProviderSpec, len(controlPlanes))
10391043
for i, c := range controlPlanes {
10401044
var clusterMo mo.ClusterComputeResource
@@ -1098,6 +1102,7 @@ func (t *TerraformVariables) Generate(parents asset.Parents) error {
10981102
InfraID: clusterID.InfraID,
10991103
InstallConfig: installConfig,
11001104
ControlPlaneMachines: controlPlanes,
1105+
IPAddresses: ipAddresses,
11011106
},
11021107
)
11031108
if err != nil {

pkg/asset/machines/master.go

Lines changed: 81 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
corev1 "k8s.io/api/core/v1"
1414
"k8s.io/apimachinery/pkg/runtime"
1515
"k8s.io/apimachinery/pkg/runtime/serializer"
16+
ipamv1 "sigs.k8s.io/cluster-api/exp/ipam/api/v1beta1"
1617
"sigs.k8s.io/yaml"
1718

1819
configv1 "github.com/openshift/api/config/v1"
@@ -70,6 +71,8 @@ type Master struct {
7071
MachineConfigFiles []*asset.File
7172
MachineFiles []*asset.File
7273
ControlPlaneMachineSet *asset.File
74+
IPClaimFiles []*asset.File
75+
IPAddrFiles []*asset.File
7376

7477
// SecretFiles is used by the baremetal platform to register the
7578
// credential information for communicating with management
@@ -109,15 +112,23 @@ const (
109112
// user-data secret.
110113
masterUserDataFileName = "99_openshift-cluster-api_master-user-data-secret.yaml"
111114

112-
// masterUserDataFileName is the filename used for the control plane machine sets.
115+
// controlPlaneMachineSetFileName is the filename used for the control plane machine sets.
113116
controlPlaneMachineSetFileName = "99_openshift-machine-api_master-control-plane-machine-set.yaml"
117+
118+
// ipClaimFileName is the filename used for the ip claims list.
119+
ipClaimFileName = "99_openshift-machine-api_claim-%s.yaml"
120+
121+
// ipAddressFileName is the filename used for the ip addresses list.
122+
ipAddressFileName = "99_openshift-machine-api_address-%s.yaml"
114123
)
115124

116125
var (
117126
secretFileNamePattern = fmt.Sprintf(secretFileName, "*")
118127
networkConfigSecretFileNamePattern = fmt.Sprintf(networkConfigSecretFileName, "*")
119128
hostFileNamePattern = fmt.Sprintf(hostFileName, "*")
120129
masterMachineFileNamePattern = fmt.Sprintf(masterMachineFileName, "*")
130+
masterIPClaimFileNamePattern = fmt.Sprintf(ipClaimFileName, "*master*")
131+
masterIPAddressFileNamePattern = fmt.Sprintf(ipAddressFileName, "*master*")
121132

122133
_ asset.WritableAsset = (*Master)(nil)
123134
)
@@ -158,6 +169,8 @@ func (m *Master) Generate(dependencies asset.Parents) error {
158169
pool := *ic.ControlPlane
159170
var err error
160171
machines := []machinev1beta1.Machine{}
172+
var ipClaims []ipamv1.IPAddressClaim
173+
var ipAddrs []ipamv1.IPAddress
161174
var controlPlaneMachineSet *machinev1.ControlPlaneMachineSet
162175
switch ic.Platform.Name() {
163176
case awstypes.Name:
@@ -439,10 +452,14 @@ func (m *Master) Generate(dependencies asset.Parents) error {
439452
pool.Platform.VSphere = &mpool
440453
templateName := clusterID.InfraID + "-rhcos"
441454

442-
machines, controlPlaneMachineSet, err = vsphere.Machines(clusterID.InfraID, ic, &pool, templateName, "master", masterUserDataSecretName)
455+
data, err := vsphere.Machines(clusterID.InfraID, ic, &pool, templateName, "master", masterUserDataSecretName)
443456
if err != nil {
444457
return errors.Wrap(err, "failed to create master machine objects")
445458
}
459+
machines = data.Machines
460+
controlPlaneMachineSet = data.ControlPlaneMachineSet
461+
ipClaims = data.IPClaims
462+
ipAddrs = data.IPAddresses
446463

447464
if ic.FeatureSet != configv1.TechPreviewNoUpgrade {
448465
controlPlaneMachineSet = nil
@@ -563,6 +580,33 @@ func (m *Master) Generate(dependencies asset.Parents) error {
563580
Data: data,
564581
}
565582
}
583+
584+
m.IPClaimFiles = make([]*asset.File, len(ipClaims))
585+
for i, claim := range ipClaims {
586+
data, err := yaml.Marshal(claim)
587+
if err != nil {
588+
return errors.Wrapf(err, "unable to marshal ip claim %v", claim.Name)
589+
}
590+
591+
m.IPClaimFiles[i] = &asset.File{
592+
Filename: filepath.Join(directory, fmt.Sprintf(ipClaimFileName, claim.Name)),
593+
Data: data,
594+
}
595+
}
596+
597+
m.IPAddrFiles = make([]*asset.File, len(ipAddrs))
598+
for i, address := range ipAddrs {
599+
data, err := yaml.Marshal(address)
600+
if err != nil {
601+
return errors.Wrapf(err, "unable to marshal ip claim %v", address.Name)
602+
}
603+
604+
m.IPAddrFiles[i] = &asset.File{
605+
Filename: filepath.Join(directory, fmt.Sprintf(ipAddressFileName, address.Name)),
606+
Data: data,
607+
}
608+
}
609+
566610
padFormat := fmt.Sprintf("%%0%dd", len(fmt.Sprintf("%d", len(machines))))
567611
for i, machine := range machines {
568612
data, err := yaml.Marshal(machine)
@@ -598,6 +642,8 @@ func (m *Master) Files() []*asset.File {
598642
if m.ControlPlaneMachineSet != nil {
599643
files = append(files, m.ControlPlaneMachineSet)
600644
}
645+
files = append(files, m.IPClaimFiles...)
646+
files = append(files, m.IPAddrFiles...)
601647
return files
602648
}
603649

@@ -654,6 +700,20 @@ func (m *Master) Load(f asset.FileFetcher) (found bool, err error) {
654700
}
655701
m.ControlPlaneMachineSet = file
656702

703+
fileList, err = f.FetchByPattern(filepath.Join(directory, masterIPClaimFileNamePattern))
704+
if err != nil {
705+
return true, err
706+
}
707+
logrus.Infof("Loaded %v ip claims.", len(fileList))
708+
m.IPClaimFiles = fileList
709+
710+
fileList, err = f.FetchByPattern(filepath.Join(directory, masterIPAddressFileNamePattern))
711+
if err != nil {
712+
return true, err
713+
}
714+
logrus.Infof("Loaded %v ip addresses.", len(fileList))
715+
m.IPAddrFiles = fileList
716+
657717
return true, nil
658718
}
659719

@@ -735,6 +795,8 @@ func IsMachineManifest(file *asset.File) bool {
735795
{Pattern: hostFileNamePattern, Type: "host"},
736796
{Pattern: masterMachineFileNamePattern, Type: "master machine"},
737797
{Pattern: workerMachineSetFileNamePattern, Type: "worker machineset"},
798+
{Pattern: masterIPAddressFileNamePattern, Type: "master ip address"},
799+
{Pattern: masterIPClaimFileNamePattern, Type: "master ip address claim"},
738800
} {
739801
if matched, err := filepath.Match(pattern.Pattern, filename); err != nil {
740802
panic(fmt.Sprintf("bad format for %s file name pattern", pattern.Type))
@@ -745,6 +807,23 @@ func IsMachineManifest(file *asset.File) bool {
745807
return false
746808
}
747809

810+
// IPAddresses returns IPAddress manifest structures.
811+
func (m *Master) IPAddresses() ([]ipamv1.IPAddress, error) {
812+
ipAddresses := []ipamv1.IPAddress{}
813+
for i, file := range m.IPAddrFiles {
814+
logrus.Debugf("Attempting to load address %v.", file.Filename)
815+
address := &ipamv1.IPAddress{}
816+
err := yaml.Unmarshal(file.Data, &address)
817+
if err != nil {
818+
return ipAddresses, errors.Wrapf(err, "unable to unmarshal ip address %d", i)
819+
}
820+
821+
ipAddresses = append(ipAddresses, *address)
822+
}
823+
824+
return ipAddresses, nil
825+
}
826+
748827
func createSecretAssetFiles(resources []corev1.Secret, fileName string) ([]*asset.File, error) {
749828

750829
var objects []interface{}

pkg/asset/machines/vsphere/capimachines.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ import (
2121
"github.com/openshift/installer/pkg/types"
2222
)
2323

24+
const (
25+
masterRole = "master"
26+
)
27+
2428
// ProviderSpecFromRawExtension unmarshals the JSON-encoded spec.
2529
func ProviderSpecFromRawExtension(rawExtension *runtime.RawExtension) (*machinev1.VSphereMachineProviderSpec, error) {
2630
if rawExtension == nil {
@@ -57,10 +61,11 @@ func getNetworkInventoryPath(vcenterContext vsphere.VCenterContext, networkName
5761

5862
// GenerateMachines returns a list of capi machines.
5963
func GenerateMachines(ctx context.Context, clusterID string, config *types.InstallConfig, pool *types.MachinePool, osImage string, role string, metadata *vsphere.Metadata) ([]*asset.RuntimeFile, error) {
60-
machines, _, err := Machines(clusterID, config, pool, osImage, role, "")
64+
data, err := Machines(clusterID, config, pool, osImage, role, "")
6165
if err != nil {
6266
return nil, fmt.Errorf("unable to retrieve machines: %w", err)
6367
}
68+
machines := data.Machines
6469

6570
capvMachines := make([]*capv.VSphereMachine, 0, len(machines))
6671
result := make([]*asset.RuntimeFile, 0, len(machines))
@@ -157,8 +162,8 @@ func GenerateMachines(ctx context.Context, clusterID string, config *types.Insta
157162
})
158163
}
159164

160-
// as part of provisioning conrtol plane nodes, we need to create a bootstrap node as well
161-
if role == "master" {
165+
// as part of provisioning control plane nodes, we need to create a bootstrap node as well
166+
if role == masterRole {
162167
customVMXKeys := map[string]string{}
163168

164169
bootstrapSpec := capvMachines[0].Spec

0 commit comments

Comments
 (0)