-
Notifications
You must be signed in to change notification settings - Fork 273
/
workers.go
74 lines (61 loc) 路 2.48 KB
/
workers.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package tinkerbell
import (
"context"
"github.com/go-logr/logr"
"github.com/pkg/errors"
tinkerbellv1 "github.com/tinkerbell/cluster-api-provider-tinkerbell/api/v1beta1"
"github.com/aws/eks-anywhere/pkg/clients/kubernetes"
"github.com/aws/eks-anywhere/pkg/cluster"
"github.com/aws/eks-anywhere/pkg/clusterapi"
capiyaml "github.com/aws/eks-anywhere/pkg/clusterapi/yaml"
"github.com/aws/eks-anywhere/pkg/yamlutil"
)
type (
// Workers represents the Tinkerbell specific CAPI spec for worker nodes.
Workers = clusterapi.Workers[*tinkerbellv1.TinkerbellMachineTemplate]
workersBuilder = capiyaml.WorkersBuilder[*tinkerbellv1.TinkerbellMachineTemplate]
)
// WorkersSpec generates a Tinkerbell specific CAPI spec for an eks-a cluster worker nodes.
// It talks to the cluster with a client to detect changes in immutable objects and generates new
// names for them.
func WorkersSpec(ctx context.Context, logger logr.Logger, client kubernetes.Client, spec *cluster.Spec) (*Workers, error) {
templateBuilder, err := generateTemplateBuilder(spec)
if err != nil {
return nil, errors.Wrap(err, "generating tinkerbell template builder")
}
workerTemplateNames, kubeadmTemplateNames := clusterapi.InitialTemplateNamesForWorkers(spec)
workersYaml, err := templateBuilder.GenerateCAPISpecWorkers(spec, workerTemplateNames, kubeadmTemplateNames)
if err != nil {
return nil, errors.Wrap(err, "generating tinkerbell workers yaml spec")
}
parser, builder, err := newWorkersParserAndBuilder(logger)
if err != nil {
return nil, err
}
if err = parser.Parse(workersYaml, builder); err != nil {
return nil, errors.Wrap(err, "parsing Tinkerbell CAPI workers yaml")
}
workers := builder.Workers
if err = workers.UpdateImmutableObjectNames(ctx, client, GetMachineTemplate, machineTemplateEqual); err != nil {
return nil, errors.Wrap(err, "updating Tinkerbell worker immutable object names")
}
return workers, nil
}
func newWorkersParserAndBuilder(logger logr.Logger) (*yamlutil.Parser, *workersBuilder, error) {
parser, builder, err := capiyaml.NewWorkersParserAndBuilder(
logger,
machineTemplateMapping(),
)
if err != nil {
return nil, nil, errors.Wrap(err, "building Tinkerbell workers parser and builder")
}
return parser, builder, nil
}
func machineTemplateMapping() yamlutil.Mapping[*tinkerbellv1.TinkerbellMachineTemplate] {
return yamlutil.NewMapping(
"TinkerbellMachineTemplate",
func() *tinkerbellv1.TinkerbellMachineTemplate {
return &tinkerbellv1.TinkerbellMachineTemplate{}
},
)
}