@@ -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
116125var (
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+
748827func createSecretAssetFiles (resources []corev1.Secret , fileName string ) ([]* asset.File , error ) {
749828
750829 var objects []interface {}
0 commit comments