Skip to content

Commit

Permalink
pkg/asset/machines/worker: Convert Worker to a WriteableAsset
Browse files Browse the repository at this point in the history
Like the earlier 7a396d9 (pkg/asset/machines: Convert Master to a
WriteableAsset, 2019-02-07, openshift#1211), but for Worker.  This is
groundwork for extracting configured availability zones when
generating AWS Terraform variables, which will in turn allow us to
avoid provisioning availability zones unless we are going to populate
them with machines.
  • Loading branch information
wking committed Mar 27, 2019
1 parent 97c2d40 commit c0bc4dc
Show file tree
Hide file tree
Showing 7 changed files with 71 additions and 42 deletions.
2 changes: 2 additions & 0 deletions pkg/asset/ignition/bootstrap/bootstrap.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ func (a *Bootstrap) Dependencies() []asset.Asset {
&kubeconfig.AdminClient{},
&kubeconfig.Kubelet{},
&machines.Master{},
&machines.Worker{},
&manifests.Manifests{},
&manifests.Openshift{},
&tls.AdminKubeConfigCABundle{},
Expand Down Expand Up @@ -371,6 +372,7 @@ func (a *Bootstrap) addParentFiles(dependencies asset.Parents) {
&manifests.Manifests{},
&manifests.Openshift{},
&machines.Master{},
&machines.Worker{},
} {
dependencies.Get(asset)
a.Config.Storage.Files = append(a.Config.Storage.Files, ignition.FilesFromAsset(rootDir, "root", 0644, asset)...)
Expand Down
8 changes: 6 additions & 2 deletions pkg/asset/machines/machineconfig/manifest.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,12 @@ func Manifests(configs []*mcfgv1.MachineConfig, role, directory string) ([]*asse
}

// IsManifest tests whether the specified filename is a MachineConfig manifest.
func IsManifest(role, filename string) bool {
return fmt.Sprintf(machineConfigFileName, role) == filename
func IsManifest(filename string) (bool, error) {
matched, err := filepath.Match(machineConfigFileNamePattern, filename)
if err != nil {
return false, err
}
return matched, nil
}

// Load loads the MachineConfig manifests.
Expand Down
12 changes: 7 additions & 5 deletions pkg/asset/machines/master.go
Original file line number Diff line number Diff line change
Expand Up @@ -250,17 +250,19 @@ func Machines(files []*asset.File) ([]machineapi.Machine, error) {
return machines, nil
}

// IsMasterManifest tests whether a file is a manifest that belongs to the
// Master Machines asset.
func IsMasterManifest(file *asset.File) bool {
// IsMachineManifest tests whether a file is a manifest that belongs to the
// Master Machines or Worker Machines asset.
func IsMachineManifest(file *asset.File) bool {
if filepath.Dir(file.Filename) != directory {
return false
}
filename := filepath.Base(file.Filename)
if filename == masterUserDataFileName {
if filename == masterUserDataFileName || filename == workerUserDataFileName {
return true
}
if machineconfig.IsManifest("master", filename) {
if matched, err := machineconfig.IsManifest(filename); err != nil {
panic("bad format for MachineConfig file name pattern")
} else if matched {
return true
}
if matched, err := filepath.Match(masterMachineFileNamePattern, filename); err != nil {
Expand Down
82 changes: 52 additions & 30 deletions pkg/asset/machines/worker.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ package machines

import (
"fmt"
"os"
"path/filepath"

"github.com/ghodss/yaml"
"github.com/pkg/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"

"github.com/openshift/installer/pkg/asset"
Expand All @@ -27,13 +27,19 @@ import (
)

const (
// workerMachineSetFileName is the filename used for the worker MachineSet manifest.
workerMachineSetFileName = "99_openshift-cluster-api_worker-machineset.yaml"
// workerMachineSetFileName is the format string for constructing the worker MachineSet filenames.
workerMachineSetFileName = "99_openshift-cluster-api_worker-machineset-%s.yaml"

// workerUserDataFileName is the filename used for the worker user-data secret.
workerUserDataFileName = "99_openshift-cluster-api_worker-user-data-secret.yaml"
)

var (
workerMachineSetFileNamePattern = fmt.Sprintf(workerMachineSetFileName, "*")

_ asset.WritableAsset = (*Worker)(nil)
)

func defaultAWSMachinePoolPlatform() awstypes.MachinePool {
return awstypes.MachinePool{
EC2RootVolume: awstypes.EC2RootVolume{
Expand All @@ -57,7 +63,7 @@ func defaultOpenStackMachinePoolPlatform(flavor string) openstacktypes.MachinePo
type Worker struct {
UserDataFile *asset.File
MachineConfigFiles []*asset.File
MachineSetFile *asset.File
MachineSetFiles []*asset.File
}

var _ asset.Asset = (*Worker)(nil)
Expand Down Expand Up @@ -172,44 +178,60 @@ func (w *Worker) Generate(dependencies asset.Parents) error {
return errors.Wrap(err, "failed to create MachineConfig manifests for worker machines")
}

if len(machineSets) == 0 {
return nil
}
list := &metav1.List{
TypeMeta: metav1.TypeMeta{
APIVersion: "v1",
Kind: "List",
},
Items: make([]runtime.RawExtension, len(machineSets)),
}
for i, set := range machineSets {
list.Items[i] = runtime.RawExtension{Object: set}
}
data, err = yaml.Marshal(list)
if err != nil {
return errors.Wrap(err, "failed to marshal")
}
w.MachineSetFile = &asset.File{
Filename: filepath.Join(directory, workerMachineSetFileName),
Data: data,
w.MachineSetFiles = make([]*asset.File, len(machineSets))
padFormat := fmt.Sprintf("%%0%dd", len(fmt.Sprintf("%d", len(machineSets))))
for i, machineSet := range machineSets {
data, err := yaml.Marshal(machineSet)
if err != nil {
return errors.Wrapf(err, "marshal worker %d", i)
}

padded := fmt.Sprintf(padFormat, i)
w.MachineSetFiles[i] = &asset.File{
Filename: filepath.Join(directory, fmt.Sprintf(workerMachineSetFileName, padded)),
Data: data,
}
}

return nil
}

// Files returns the files generated by the asset.
func (w *Worker) Files() []*asset.File {
files := make([]*asset.File, 0, 1+len(w.MachineConfigFiles)+1)
files := make([]*asset.File, 0, 1+len(w.MachineConfigFiles)+len(w.MachineSetFiles))
if w.UserDataFile != nil {
files = append(files, w.UserDataFile)
}
files = append(files, w.MachineConfigFiles...)
if w.MachineSetFile != nil {
files = append(files, w.MachineSetFile)
}
files = append(files, w.MachineSetFiles...)
return files
}

// Load returns false since this asset is not written to disk by the installer.
// Load reads the asset files from disk.
func (w *Worker) Load(f asset.FileFetcher) (found bool, err error) {
return false, nil
file, err := f.FetchByName(filepath.Join(directory, workerUserDataFileName))
if err != nil {
if os.IsNotExist(err) {
return false, nil
}
return false, err
}
w.UserDataFile = file

w.MachineConfigFiles, err = machineconfig.Load(f, "worker", directory)
if err != nil {
return true, err
}

fileList, err := f.FetchByPattern(filepath.Join(directory, workerMachineSetFileNamePattern))
if err != nil {
return true, err
}

if len(fileList) == 0 {
return true, errors.Errorf("worker machine manifests are required if you also provide %s", w.UserDataFile.Filename)
}

w.MachineSetFiles = fileList
return true, nil
}
7 changes: 2 additions & 5 deletions pkg/asset/manifests/openshift.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ func (o *Openshift) Name() string {
func (o *Openshift) Dependencies() []asset.Asset {
return []asset.Asset{
&installconfig.InstallConfig{},
&machines.Worker{},
&password.KubeadminPassword{},

&openshift.BindingDiscovery{},
Expand All @@ -53,8 +52,7 @@ func (o *Openshift) Dependencies() []asset.Asset {
func (o *Openshift) Generate(dependencies asset.Parents) error {
installConfig := &installconfig.InstallConfig{}
kubeadminPassword := &password.KubeadminPassword{}
worker := &machines.Worker{}
dependencies.Get(installConfig, worker, kubeadminPassword)
dependencies.Get(installConfig, kubeadminPassword)
var cloudCreds cloudCredsSecretData
platform := installConfig.Config.Platform.Name()
switch platform {
Expand Down Expand Up @@ -133,7 +131,6 @@ func (o *Openshift) Generate(dependencies asset.Parents) error {
Data: data,
})
}
o.FileList = append(o.FileList, worker.Files()...)

asset.SortFiles(o.FileList)

Expand All @@ -153,7 +150,7 @@ func (o *Openshift) Load(f asset.FileFetcher) (bool, error) {
}

for _, file := range fileList {
if machines.IsMasterManifest(file) {
if machines.IsMachineManifest(file) {
continue
}

Expand Down
1 change: 1 addition & 0 deletions pkg/asset/store/assetcreate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ func TestCreatedAssetsAreNotDirty(t *testing.T) {

emptyAssets := map[string]bool{
"Master Machines": true, // no files for the 'none' platform
"Worker Machines": true, // no files for the 'none' platform
"Metadata": true, // read-only
}
for _, a := range tc.targets {
Expand Down
1 change: 1 addition & 0 deletions pkg/asset/targets/targets.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ var (
// Manifests are the manifests targeted assets.
Manifests = []asset.WritableAsset{
&machines.Master{},
&machines.Worker{},
&manifests.Manifests{},
&manifests.Openshift{},
}
Expand Down

0 comments on commit c0bc4dc

Please sign in to comment.