This repository has been archived by the owner on Apr 11, 2024. It is now read-only.
/
inject_control_plane.go
105 lines (91 loc) · 2.95 KB
/
inject_control_plane.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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// Copyright 2023 D2iQ, Inc. All rights reserved.
// SPDX-License-Identifier: Apache-2.0
package instancetype
import (
"context"
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
capav1 "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/api/external/sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2"
"github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/api/v1alpha1"
"github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/capi/clustertopology/patches"
"github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/capi/clustertopology/patches/selectors"
"github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/capi/clustertopology/variables"
"github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/clusterconfig"
)
const (
// VariableName is the external patch variable name.
VariableName = "instanceType"
)
type awsInstanceTypeControlPlanePatchHandler struct {
variableName string
variableFieldPath []string
}
func NewControlPlanePatch() *awsInstanceTypeControlPlanePatchHandler {
return newAWSInstanceTypeControlPlanePatchHandler(
clusterconfig.MetaVariableName,
clusterconfig.MetaControlPlaneConfigName,
v1alpha1.AWSVariableName,
VariableName,
)
}
func newAWSInstanceTypeControlPlanePatchHandler(
variableName string,
variableFieldPath ...string,
) *awsInstanceTypeControlPlanePatchHandler {
return &awsInstanceTypeControlPlanePatchHandler{
variableName: variableName,
variableFieldPath: variableFieldPath,
}
}
func (h *awsInstanceTypeControlPlanePatchHandler) Mutate(
ctx context.Context,
obj *unstructured.Unstructured,
vars map[string]apiextensionsv1.JSON,
holderRef runtimehooksv1.HolderReference,
_ client.ObjectKey,
) error {
log := ctrl.LoggerFrom(ctx).WithValues(
"holderRef", holderRef,
)
instanceTypeVar, found, err := variables.Get[v1alpha1.InstanceType](
vars,
h.variableName,
h.variableFieldPath...,
)
if err != nil {
return err
}
if !found {
log.V(5).Info("AWS instance type variable for control-plane not defined")
return nil
}
log = log.WithValues(
"variableName",
h.variableName,
"variableFieldPath",
h.variableFieldPath,
"variableValue",
instanceTypeVar,
)
return patches.MutateIfApplicable(
obj,
vars,
&holderRef,
selectors.InfrastructureControlPlaneMachines(
"v1beta2",
"AWSMachineTemplate",
),
log,
func(obj *capav1.AWSMachineTemplate) error {
log.WithValues(
"patchedObjectKind", obj.GetObjectKind().GroupVersionKind().String(),
"patchedObjectName", client.ObjectKeyFromObject(obj),
).Info("setting instance type in control plane AWSMachineTemplate spec")
obj.Spec.Template.Spec.InstanceType = string(instanceTypeVar)
return nil
},
)
}