Skip to content

Commit e836121

Browse files
committed
fix: separate handlers for control-plane and workers
1 parent 3336e0b commit e836121

File tree

11 files changed

+328
-123
lines changed

11 files changed

+328
-123
lines changed

common/pkg/capi/clustertopology/handlers/mutation/meta.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,14 @@ import (
1515
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/handlers"
1616
)
1717

18+
type MutateFunc func(
19+
ctx context.Context,
20+
obj runtime.Object,
21+
vars map[string]apiextensionsv1.JSON,
22+
holderRef runtimehooksv1.HolderReference,
23+
clusterKey client.ObjectKey,
24+
) error
25+
1826
type MetaMutator interface {
1927
Mutate(
2028
ctx context.Context,

common/pkg/capi/clustertopology/patches/selectors/selectors.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ func InfrastructureWorkerMachineTemplates(
7272

7373
// InfrastructureControlPlaneMachines selector matches against infrastructure control-plane machines.
7474
// Passing in the API version (not the API group) is required because different providers could support different API
75-
// versions. This also allows for a oatch to select multiple infrastructure versions for the same provider.
75+
// versions. This also allows for a patch to select multiple infrastructure versions for the same provider.
7676
func InfrastructureControlPlaneMachines(
7777
capiInfrastructureAPIVersion, kind string,
7878
) clusterv1.PatchSelector {
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
// Copyright 2023 D2iQ, Inc. All rights reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package customimage
5+
6+
import (
7+
"context"
8+
_ "embed"
9+
"fmt"
10+
"strings"
11+
12+
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
13+
"k8s.io/apimachinery/pkg/runtime"
14+
runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
15+
ctrl "sigs.k8s.io/controller-runtime"
16+
"sigs.k8s.io/controller-runtime/pkg/client"
17+
18+
"github.com/d2iq-labs/capi-runtime-extensions/api/v1alpha1"
19+
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/apis"
20+
commonhandlers "github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/handlers"
21+
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/handlers/mutation"
22+
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/patches"
23+
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/patches/selectors"
24+
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/variables"
25+
capdv1 "github.com/d2iq-labs/capi-runtime-extensions/common/pkg/external/sigs.k8s.io/cluster-api/test/infrastructure/docker/api/v1beta1"
26+
"github.com/d2iq-labs/capi-runtime-extensions/pkg/handlers"
27+
dockerclusterconfig "github.com/d2iq-labs/capi-runtime-extensions/pkg/handlers/docker/clusterconfig"
28+
"github.com/d2iq-labs/capi-runtime-extensions/pkg/handlers/generic/clusterconfig"
29+
)
30+
31+
const (
32+
// HandlerNamePatch is the name of the inject handler.
33+
HandlerNamePatch = "DockerCustomImagePatch"
34+
35+
defaultKinDImageRepository = "ghcr.io/mesosphere/kind-node"
36+
)
37+
38+
type customImageControlPlanePatchHandler struct {
39+
variableName string
40+
variableFieldPath []string
41+
}
42+
43+
var (
44+
_ commonhandlers.Named = &customImageControlPlanePatchHandler{}
45+
_ mutation.GeneratePatches = &customImageControlPlanePatchHandler{}
46+
_ mutation.MetaMutator = &customImageControlPlanePatchHandler{}
47+
)
48+
49+
func NewControlPlanePatch() *customImageControlPlanePatchHandler {
50+
return newCustomImageControlPlanePatchHandler(VariableName)
51+
}
52+
53+
func NewControlPlaneMetaPatch() *customImageControlPlanePatchHandler {
54+
return newCustomImageControlPlanePatchHandler(
55+
clusterconfig.MetaVariableName,
56+
clusterconfig.MetaControlPlaneConfigName,
57+
dockerclusterconfig.DockerVariableName,
58+
VariableName,
59+
)
60+
}
61+
62+
func newCustomImageControlPlanePatchHandler(
63+
variableName string,
64+
variableFieldPath ...string,
65+
) *customImageControlPlanePatchHandler {
66+
return &customImageControlPlanePatchHandler{
67+
variableName: variableName,
68+
variableFieldPath: variableFieldPath,
69+
}
70+
}
71+
72+
func (h *customImageControlPlanePatchHandler) Name() string {
73+
return HandlerNamePatch
74+
}
75+
76+
func (h *customImageControlPlanePatchHandler) Mutate(
77+
ctx context.Context,
78+
obj runtime.Object,
79+
vars map[string]apiextensionsv1.JSON,
80+
holderRef runtimehooksv1.HolderReference,
81+
_ client.ObjectKey,
82+
) error {
83+
log := ctrl.LoggerFrom(ctx).WithValues(
84+
"holderRef", holderRef,
85+
)
86+
87+
customImageVar, found, err := variables.Get[v1alpha1.OCIImage](
88+
vars,
89+
h.variableName,
90+
h.variableFieldPath...,
91+
)
92+
if err != nil {
93+
return err
94+
}
95+
if !found {
96+
log.V(5).
97+
Info("Docker customImage variable not defined for control-plane, using default KinD node image")
98+
}
99+
100+
log = log.WithValues(
101+
"variableName",
102+
h.variableName,
103+
"variableFieldPath",
104+
h.variableFieldPath,
105+
"variableValue",
106+
customImageVar,
107+
)
108+
109+
return patches.Generate(
110+
obj,
111+
vars,
112+
&holderRef,
113+
selectors.InfrastructureControlPlaneMachines("v1beta1", "DockerMachineTemplate"),
114+
log,
115+
func(obj *capdv1.DockerMachineTemplate) error {
116+
variablePath := []string{"builtin", "controlPlane", "version"}
117+
118+
if customImageVar == "" {
119+
kubernetesVersion, found, err := variables.Get[string](
120+
vars,
121+
variablePath[0],
122+
variablePath[1:]...)
123+
if err != nil {
124+
return err
125+
}
126+
if !found {
127+
return fmt.Errorf(
128+
"missing required variable: %s",
129+
strings.Join(variablePath, "."),
130+
)
131+
}
132+
133+
customImageVar = v1alpha1.OCIImage(
134+
defaultKinDImageRepository + ":" + kubernetesVersion,
135+
)
136+
}
137+
138+
log.WithValues(
139+
"patchedObjectKind", obj.GetObjectKind().GroupVersionKind().String(),
140+
"patchedObjectName", client.ObjectKeyFromObject(obj),
141+
"customImage", customImageVar,
142+
).Info("setting customImage in control plane DockerMachineTemplate spec")
143+
144+
obj.Spec.Template.Spec.CustomImage = string(customImageVar)
145+
146+
return nil
147+
},
148+
)
149+
}
150+
151+
func (h *customImageControlPlanePatchHandler) GeneratePatches(
152+
ctx context.Context,
153+
req *runtimehooksv1.GeneratePatchesRequest,
154+
resp *runtimehooksv1.GeneratePatchesResponse,
155+
) {
156+
handlers.GeneratePatches(ctx, req, resp, apis.CAPDDecoder(), h.Mutate)
157+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Copyright 2023 D2iQ, Inc. All rights reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package customimage
5+
6+
import (
7+
"testing"
8+
9+
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/handlers/mutation"
10+
"github.com/d2iq-labs/capi-runtime-extensions/pkg/handlers/docker/mutation/customimage/tests"
11+
)
12+
13+
func TestControlPlaneGeneratePatches(t *testing.T) {
14+
t.Parallel()
15+
16+
tests.TestControlPlaneGeneratePatches(
17+
t,
18+
func() mutation.GeneratePatches { return NewControlPlanePatch() },
19+
VariableName,
20+
)
21+
}

pkg/handlers/docker/mutation/customimage/inject.go renamed to pkg/handlers/docker/mutation/customimage/inject_worker.go

Lines changed: 22 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
1313
"k8s.io/apimachinery/pkg/runtime"
1414
runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
15-
"sigs.k8s.io/cluster-api/exp/runtime/topologymutation"
1615
ctrl "sigs.k8s.io/controller-runtime"
1716
"sigs.k8s.io/controller-runtime/pkg/client"
1817

@@ -24,65 +23,60 @@ import (
2423
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/patches/selectors"
2524
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/variables"
2625
capdv1 "github.com/d2iq-labs/capi-runtime-extensions/common/pkg/external/sigs.k8s.io/cluster-api/test/infrastructure/docker/api/v1beta1"
26+
"github.com/d2iq-labs/capi-runtime-extensions/pkg/handlers"
2727
dockerclusterconfig "github.com/d2iq-labs/capi-runtime-extensions/pkg/handlers/docker/clusterconfig"
2828
dockerworkerconfig "github.com/d2iq-labs/capi-runtime-extensions/pkg/handlers/docker/workerconfig"
2929
"github.com/d2iq-labs/capi-runtime-extensions/pkg/handlers/generic/clusterconfig"
3030
"github.com/d2iq-labs/capi-runtime-extensions/pkg/handlers/generic/workerconfig"
3131
)
3232

33-
const (
34-
// HandlerNamePatch is the name of the inject handler.
35-
HandlerNamePatch = "DockerCustomImagePatch"
36-
37-
defaultKinDImageRepository = "ghcr.io/mesosphere/kind-node"
38-
)
39-
40-
type customImagePatchHandler struct {
33+
type customImageWorkerPatchHandler struct {
4134
variableName string
4235
variableFieldPath []string
4336
}
4437

4538
var (
46-
_ commonhandlers.Named = &customImagePatchHandler{}
47-
_ mutation.GeneratePatches = &customImagePatchHandler{}
48-
_ mutation.MetaMutator = &customImagePatchHandler{}
39+
_ commonhandlers.Named = &customImageWorkerPatchHandler{}
40+
_ mutation.GeneratePatches = &customImageWorkerPatchHandler{}
41+
_ mutation.MetaMutator = &customImageWorkerPatchHandler{}
4942
)
5043

51-
func NewPatch() *customImagePatchHandler {
52-
return newCustomImagePatchHandler(VariableName)
44+
func NewWorkerPatch() *customImageWorkerPatchHandler {
45+
return newcustomImageWorkerPatchHandler(VariableName)
5346
}
5447

55-
func NewMetaPatch() *customImagePatchHandler {
56-
return newCustomImagePatchHandler(
48+
func NewWorkerInClusterConfigMetaPatch() *customImageControlPlanePatchHandler {
49+
return newCustomImageControlPlanePatchHandler(
5750
clusterconfig.MetaVariableName,
51+
clusterconfig.MetaWorkerConfigName,
5852
dockerclusterconfig.DockerVariableName,
5953
VariableName,
6054
)
6155
}
6256

63-
func NewMetaWorkerPatch() *customImagePatchHandler {
64-
return newCustomImagePatchHandler(
57+
func NewMetaWorkerPatch() *customImageWorkerPatchHandler {
58+
return newcustomImageWorkerPatchHandler(
6559
workerconfig.MetaVariableName,
6660
dockerworkerconfig.DockerVariableName,
6761
VariableName,
6862
)
6963
}
7064

71-
func newCustomImagePatchHandler(
65+
func newcustomImageWorkerPatchHandler(
7266
variableName string,
7367
variableFieldPath ...string,
74-
) *customImagePatchHandler {
75-
return &customImagePatchHandler{
68+
) *customImageWorkerPatchHandler {
69+
return &customImageWorkerPatchHandler{
7670
variableName: variableName,
7771
variableFieldPath: variableFieldPath,
7872
}
7973
}
8074

81-
func (h *customImagePatchHandler) Name() string {
75+
func (h *customImageWorkerPatchHandler) Name() string {
8276
return HandlerNamePatch
8377
}
8478

85-
func (h *customImagePatchHandler) Mutate(
79+
func (h *customImageWorkerPatchHandler) Mutate(
8680
ctx context.Context,
8781
obj runtime.Object,
8882
vars map[string]apiextensionsv1.JSON,
@@ -102,7 +96,8 @@ func (h *customImagePatchHandler) Mutate(
10296
return err
10397
}
10498
if !found {
105-
log.V(5).Info("Docker customImage variable not defined, using default KinD node image")
99+
log.V(5).
100+
Info("Docker customImage variable not defined for workers, using default KinD node image")
106101
}
107102

108103
log = log.WithValues(
@@ -114,7 +109,7 @@ func (h *customImagePatchHandler) Mutate(
114109
customImageVar,
115110
)
116111

117-
err = patches.Generate(
112+
return patches.Generate(
118113
obj,
119114
vars,
120115
&holderRef,
@@ -154,74 +149,12 @@ func (h *customImagePatchHandler) Mutate(
154149
return nil
155150
},
156151
)
157-
158-
if err != nil {
159-
return err
160-
}
161-
162-
if h.variableName == workerconfig.MetaVariableName {
163-
return nil
164-
}
165-
166-
return patches.Generate(
167-
obj,
168-
vars,
169-
&holderRef,
170-
selectors.InfrastructureControlPlaneMachines("v1beta1", "DockerMachineTemplate"),
171-
log,
172-
func(obj *capdv1.DockerMachineTemplate) error {
173-
variablePath := []string{"builtin", "controlPlane", "version"}
174-
175-
if customImageVar == "" {
176-
kubernetesVersion, found, err := variables.Get[string](
177-
vars,
178-
variablePath[0],
179-
variablePath[1:]...)
180-
if err != nil {
181-
return err
182-
}
183-
if !found {
184-
return fmt.Errorf(
185-
"missing required variable: %s",
186-
strings.Join(variablePath, "."),
187-
)
188-
}
189-
190-
customImageVar = v1alpha1.OCIImage(
191-
defaultKinDImageRepository + ":" + kubernetesVersion,
192-
)
193-
}
194-
195-
log.WithValues(
196-
"patchedObjectKind", obj.GetObjectKind().GroupVersionKind().String(),
197-
"patchedObjectName", client.ObjectKeyFromObject(obj),
198-
"customImage", customImageVar,
199-
).Info("setting customImage in control plane DockerMachineTemplate spec")
200-
201-
obj.Spec.Template.Spec.CustomImage = string(customImageVar)
202-
203-
return nil
204-
},
205-
)
206152
}
207153

208-
func (h *customImagePatchHandler) GeneratePatches(
154+
func (h *customImageWorkerPatchHandler) GeneratePatches(
209155
ctx context.Context,
210156
req *runtimehooksv1.GeneratePatchesRequest,
211157
resp *runtimehooksv1.GeneratePatchesResponse,
212158
) {
213-
topologymutation.WalkTemplates(
214-
ctx,
215-
apis.CAPDDecoder(),
216-
req,
217-
resp,
218-
func(
219-
ctx context.Context,
220-
obj runtime.Object,
221-
vars map[string]apiextensionsv1.JSON,
222-
holderRef runtimehooksv1.HolderReference,
223-
) error {
224-
return h.Mutate(ctx, obj, vars, holderRef, client.ObjectKey{})
225-
},
226-
)
159+
handlers.GeneratePatches(ctx, req, resp, apis.CAPDDecoder(), h.Mutate)
227160
}

0 commit comments

Comments
 (0)