Skip to content

Commit f2eacf3

Browse files
committed
asset/machines/master: allow adding MachineConfigs for control-plane machinepool
This sets up the master machine asset to allow adding MachineConfigs. A list of machine configs can be added to master machines that will be created alongside the user-data and machine objects.
1 parent 8683b8e commit f2eacf3

File tree

2 files changed

+71
-45
lines changed

2 files changed

+71
-45
lines changed

pkg/asset/machines/master.go

Lines changed: 70 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/openshift/installer/pkg/asset/installconfig"
1515
"github.com/openshift/installer/pkg/asset/machines/aws"
1616
"github.com/openshift/installer/pkg/asset/machines/libvirt"
17+
"github.com/openshift/installer/pkg/asset/machines/machineconfig"
1718
"github.com/openshift/installer/pkg/asset/machines/openstack"
1819
"github.com/openshift/installer/pkg/asset/rhcos"
1920
awstypes "github.com/openshift/installer/pkg/types/aws"
@@ -22,6 +23,7 @@ import (
2223
nonetypes "github.com/openshift/installer/pkg/types/none"
2324
openstacktypes "github.com/openshift/installer/pkg/types/openstack"
2425
vspheretypes "github.com/openshift/installer/pkg/types/vsphere"
26+
mcfgv1 "github.com/openshift/machine-config-operator/pkg/apis/machineconfiguration.openshift.io/v1"
2527
"github.com/pkg/errors"
2628
"k8s.io/apimachinery/pkg/runtime"
2729
"k8s.io/apimachinery/pkg/runtime/serializer"
@@ -33,17 +35,23 @@ import (
3335

3436
// Master generates the machines for the `master` machine pool.
3537
type Master struct {
36-
FileList []*asset.File
38+
UserDataFile *asset.File
39+
MachineConfigFiles []*asset.File
40+
MachineFiles []*asset.File
3741
}
3842

39-
var (
43+
const (
4044
directory = "openshift"
4145

42-
// MasterMachineFileName is the format string for constucting the master Machine filenames.
43-
MasterMachineFileName = "99_openshift-cluster-api_master-machines-%s.yaml"
46+
// masterMachineFileName is the format string for constucting the master Machine filenames.
47+
masterMachineFileName = "99_openshift-cluster-api_master-machines-%s.yaml"
48+
49+
// masterUserDataFileName is the filename used for the master user-data secret.
50+
masterUserDataFileName = "99_openshift-cluster-api_master-user-data-secret.yaml"
51+
)
4452

45-
// MasterUserDataFileName is the filename used for the master user-data secret.
46-
MasterUserDataFileName = "99_openshift-cluster-api_master-user-data-secret.yaml"
53+
var (
54+
masterMachineFileNamePattern = fmt.Sprintf(masterMachineFileName, "*")
4755

4856
_ asset.WritableAsset = (*Master)(nil)
4957
)
@@ -82,10 +90,10 @@ func (m *Master) Generate(dependencies asset.Parents) error {
8290
mign := &machine.Master{}
8391
dependencies.Get(clusterID, installconfig, rhcosImage, mign)
8492

85-
var err error
86-
machines := []machineapi.Machine{}
8793
ic := installconfig.Config
8894
pool := ic.ControlPlane
95+
var err error
96+
machines := []machineapi.Machine{}
8997
switch ic.Platform.Name() {
9098
case awstypes.Name:
9199
mpool := defaultAWSMachinePoolPlatform()
@@ -138,71 +146,80 @@ func (m *Master) Generate(dependencies asset.Parents) error {
138146
return errors.Wrap(err, "failed to create user-data secret for master machines")
139147
}
140148

141-
m.FileList = []*asset.File{{
142-
Filename: filepath.Join(directory, MasterUserDataFileName),
149+
m.UserDataFile = &asset.File{
150+
Filename: filepath.Join(directory, masterUserDataFileName),
143151
Data: data,
144-
}}
152+
}
145153

146-
count := len(machines)
147-
if count == 0 {
148-
return errors.New("at least one master machine must be configured")
154+
machineConfigs := []*mcfgv1.MachineConfig{}
155+
m.MachineConfigFiles, err = machineconfig.Manifests(machineConfigs, "master", directory)
156+
if err != nil {
157+
return errors.Wrap(err, "failed to create MachineConfig manifests for master machines")
149158
}
150159

151-
padFormat := fmt.Sprintf("%%0%dd", len(fmt.Sprintf("%d", count)))
160+
m.MachineFiles = make([]*asset.File, len(machines))
161+
padFormat := fmt.Sprintf("%%0%dd", len(fmt.Sprintf("%d", len(machines))))
152162
for i, machine := range machines {
153163
data, err := yaml.Marshal(machine)
154164
if err != nil {
155165
return errors.Wrapf(err, "marshal master %d", i)
156166
}
157167

158168
padded := fmt.Sprintf(padFormat, i)
159-
m.FileList = append(m.FileList, &asset.File{
160-
Filename: filepath.Join(directory, fmt.Sprintf(MasterMachineFileName, padded)),
169+
m.MachineFiles[i] = &asset.File{
170+
Filename: filepath.Join(directory, fmt.Sprintf(masterMachineFileName, padded)),
161171
Data: data,
162-
})
172+
}
163173
}
164174

165175
return nil
166176
}
167177

168178
// Files returns the files generated by the asset.
169179
func (m *Master) Files() []*asset.File {
170-
return m.FileList
180+
files := make([]*asset.File, 0, 1+len(m.MachineConfigFiles)+len(m.MachineFiles))
181+
if m.UserDataFile != nil {
182+
files = append(files, m.UserDataFile)
183+
}
184+
files = append(files, m.MachineConfigFiles...)
185+
files = append(files, m.MachineFiles...)
186+
return files
171187
}
172188

173189
// Load reads the asset files from disk.
174190
func (m *Master) Load(f asset.FileFetcher) (found bool, err error) {
175-
file, err := f.FetchByName(filepath.Join(directory, MasterUserDataFileName))
191+
file, err := f.FetchByName(filepath.Join(directory, masterUserDataFileName))
176192
if err != nil {
177193
if os.IsNotExist(err) {
178194
return false, nil
179195
}
180196
return false, err
181197
}
182-
m.FileList = []*asset.File{file}
198+
m.UserDataFile = file
183199

184-
fileList, err := f.FetchByPattern(filepath.Join(directory, fmt.Sprintf(MasterMachineFileName, "*")))
200+
m.MachineConfigFiles, err = machineconfig.Load(f, "master", directory)
201+
if err != nil {
202+
return true, err
203+
}
204+
205+
fileList, err := f.FetchByPattern(filepath.Join(directory, masterMachineFileNamePattern))
185206
if err != nil {
186207
return true, err
187208
}
188209

189210
if len(fileList) == 0 {
190-
return true, errors.Errorf("master machine manifests are required if you also provide %s", file.Filename)
211+
return true, errors.Errorf("master machine manifests are required if you also provide %s", m.UserDataFile.Filename)
191212
}
192213

193-
m.FileList = append(m.FileList, fileList...)
214+
m.MachineFiles = fileList
194215
return true, nil
195216
}
196217

197218
// Machines returns master Machine manifest YAML.
198219
func (m *Master) Machines() [][]byte {
199-
machines := [][]byte{}
200-
userData := filepath.Join(directory, MasterUserDataFileName)
201-
for _, file := range m.FileList {
202-
if file.Filename == userData {
203-
continue
204-
}
205-
machines = append(machines, file.Data)
220+
machines := make([][]byte, len(m.MachineFiles))
221+
for i, file := range m.MachineFiles {
222+
machines[i] = file.Data
206223
}
207224
return machines
208225
}
@@ -220,9 +237,9 @@ func (m *Master) StructuredMachines() ([]machineapi.Machine, error) {
220237
)
221238

222239
machines := []machineapi.Machine{}
223-
for i, data := range m.Machines() {
240+
for i, file := range m.MachineFiles {
224241
machine := &machineapi.Machine{}
225-
err := yaml.Unmarshal(data, &machine)
242+
err := yaml.Unmarshal(file.Data, &machine)
226243
if err != nil {
227244
return machines, errors.Wrapf(err, "unmarshal master %d", i)
228245
}
@@ -238,3 +255,23 @@ func (m *Master) StructuredMachines() ([]machineapi.Machine, error) {
238255

239256
return machines, nil
240257
}
258+
259+
// IsMasterManifest tests whether a file is a manifest that belongs to the
260+
// Master Machines asset.
261+
func IsMasterManifest(file *asset.File) bool {
262+
if filepath.Dir(file.Filename) != directory {
263+
return false
264+
}
265+
filename := filepath.Base(file.Filename)
266+
if filename == masterUserDataFileName {
267+
return true
268+
}
269+
if machineconfig.IsManifest("master", filename) {
270+
return true
271+
}
272+
if matched, err := filepath.Match(masterMachineFileNamePattern, filename); err != nil {
273+
panic("bad format for master machine file name pattern")
274+
} else {
275+
return matched
276+
}
277+
}

pkg/asset/manifests/openshift.go

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package manifests
22

33
import (
44
"encoding/base64"
5-
"fmt"
65
"path/filepath"
76

87
"github.com/aws/aws-sdk-go/aws/session"
@@ -154,18 +153,8 @@ func (o *Openshift) Load(f asset.FileFetcher) (bool, error) {
154153
return false, err
155154
}
156155

157-
masterMachinePattern := fmt.Sprintf(machines.MasterMachineFileName, "*")
158156
for _, file := range fileList {
159-
filename := filepath.Base(file.Filename)
160-
if filename == machines.MasterUserDataFileName {
161-
continue
162-
}
163-
164-
matched, err := filepath.Match(masterMachinePattern, filename)
165-
if err != nil {
166-
return true, err
167-
}
168-
if matched {
157+
if machines.IsMasterManifest(file) {
169158
continue
170159
}
171160

0 commit comments

Comments
 (0)