Skip to content

Commit 88f59a9

Browse files
dkoshkinjimmidyson
andauthored
refactor: how handlers are added to server (#154)
Co-authored-by: Jimmi Dyson <[email protected]>
1 parent 4f7e62e commit 88f59a9

File tree

21 files changed

+137
-82
lines changed

21 files changed

+137
-82
lines changed

cmd/main.go

Lines changed: 40 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"sigs.k8s.io/controller-runtime/pkg/manager"
2525
metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
2626

27+
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/handlers"
2728
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/handlers/mutation"
2829
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/server"
2930
"github.com/d2iq-labs/capi-runtime-extensions/pkg/handlers/auditpolicy"
@@ -112,43 +113,52 @@ func main() {
112113
os.Exit(1)
113114
}
114115

115-
runtimeWebhookServer := server.NewServer(
116-
runtimeWebhookServerOpts,
117-
116+
// Handlers for lifecycle hooks.
117+
lifeCycleHandlers := []handlers.Named{
118118
servicelbgc.New(mgr.GetClient()),
119-
120-
calico.New(mgr.GetClient(), calicoCNIConfig, clusterconfig.VariableName, "cni"),
121-
119+
}
120+
// Handlers that apply patches to the Cluster object and its objects.
121+
// Used by CAPI's GeneratePatches hook.
122+
patchHandlers := []handlers.Named{
123+
httpproxy.NewPatch(mgr.GetClient()),
124+
extraapiservercertsans.NewPatch(),
125+
auditpolicy.NewPatch(),
126+
kubernetesimagerepository.NewPatch(),
127+
etcd.NewPatch(),
128+
}
129+
// Handlers used by CAPI's DiscoverVariables hook.
130+
// It's ok that this does not match patchHandlers.
131+
// Some of those handlers may always get applied and not have a corresponding variable.
132+
variableHandlers := []handlers.Named{
122133
httpproxy.NewVariable(),
123-
httpproxy.NewPatch(mgr.GetClient(), httpproxy.VariableName),
124-
125134
extraapiservercertsans.NewVariable(),
126-
extraapiservercertsans.NewPatch(extraapiservercertsans.VariableName),
127-
135+
kubernetesimagerepository.NewVariable(),
136+
}
137+
// This metaPatchHandlers combines all other patch and variable handlers under a single handler.
138+
// It allows to specify configuration under a single variable.
139+
metaPatchHandlers := []mutation.GeneratePatches{
140+
httpproxy.NewMetaPatch(mgr.GetClient()),
141+
extraapiservercertsans.NewMetaPatch(),
128142
auditpolicy.NewPatch(),
143+
kubernetesimagerepository.NewMetaPatch(),
144+
etcd.NewMetaPatch(),
145+
}
146+
metaHandlers := []handlers.Named{
147+
// This Calico handler relies on a variable but does not generate a patch.
148+
// Instead it creates other resources in the API.
149+
calico.NewMetaHandler(mgr.GetClient(), calicoCNIConfig),
150+
clusterconfig.NewVariable(),
151+
mutation.NewMetaGeneratePatchesHandler("clusterConfigPatch", metaPatchHandlers...),
152+
}
129153

130-
kubernetesimagerepository.NewVariable(),
131-
kubernetesimagerepository.NewPatch(kubernetesimagerepository.VariableName),
154+
var allHandlers []handlers.Named
155+
allHandlers = append(allHandlers, lifeCycleHandlers...)
156+
allHandlers = append(allHandlers, patchHandlers...)
157+
allHandlers = append(allHandlers, variableHandlers...)
158+
allHandlers = append(allHandlers, metaHandlers...)
132159

133-
etcd.NewVariable(),
134-
etcd.NewPatch(etcd.VariableName),
160+
runtimeWebhookServer := server.NewServer(runtimeWebhookServerOpts, allHandlers...)
135161

136-
clusterconfig.NewVariable(),
137-
mutation.NewMetaGeneratePatchesHandler(
138-
"clusterConfigPatch",
139-
httpproxy.NewPatch(mgr.GetClient(), clusterconfig.VariableName, httpproxy.VariableName),
140-
extraapiservercertsans.NewPatch(
141-
clusterconfig.VariableName,
142-
extraapiservercertsans.VariableName,
143-
),
144-
auditpolicy.NewPatch(),
145-
kubernetesimagerepository.NewPatch(
146-
clusterconfig.VariableName,
147-
kubernetesimagerepository.VariableName,
148-
),
149-
etcd.NewPatch(clusterconfig.VariableName, etcd.VariableName),
150-
),
151-
)
152162
if err := mgr.Add(runtimeWebhookServer); err != nil {
153163
setupLog.Error(err, "unable to add runtime webhook server runnable to controller manager")
154164
os.Exit(1)

pkg/handlers/clusterconfig/variables.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,17 @@ import (
1010
runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
1111

1212
"github.com/d2iq-labs/capi-runtime-extensions/api/v1alpha1"
13-
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/handlers"
13+
commonhandlers "github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/handlers"
1414
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/handlers/mutation"
15+
"github.com/d2iq-labs/capi-runtime-extensions/pkg/handlers"
1516
)
1617

1718
var (
18-
_ handlers.Named = &clusterConfigVariableHandler{}
19+
_ commonhandlers.Named = &clusterConfigVariableHandler{}
1920
_ mutation.DiscoverVariables = &clusterConfigVariableHandler{}
2021
)
2122

2223
const (
23-
// VariableName is http proxy external patch variable name.
24-
VariableName = "clusterConfig"
25-
2624
// HandlerNameVariable is the name of the variable handler.
2725
HandlerNameVariable = "ClusterConfigVars"
2826
)
@@ -43,7 +41,7 @@ func (h *clusterConfigVariableHandler) DiscoverVariables(
4341
resp *runtimehooksv1.DiscoverVariablesResponse,
4442
) {
4543
resp.Variables = append(resp.Variables, clusterv1.ClusterClassVariable{
46-
Name: VariableName,
44+
Name: handlers.MetaVariableName,
4745
Required: false,
4846
Schema: v1alpha1.ClusterConfigSpec{}.VariableSchema(),
4947
})

pkg/handlers/clusterconfig/variables_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@ import (
1010

1111
"github.com/d2iq-labs/capi-runtime-extensions/api/v1alpha1"
1212
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/testutils/capitest"
13+
"github.com/d2iq-labs/capi-runtime-extensions/pkg/handlers"
1314
)
1415

1516
func TestVariableValidation(t *testing.T) {
1617
capitest.ValidateDiscoverVariables(
1718
t,
18-
VariableName,
19+
handlers.MetaVariableName,
1920
ptr.To(v1alpha1.ClusterConfigSpec{}.VariableSchema()),
2021
NewVariable,
2122
capitest.VariableTestDef{

pkg/handlers/cni/calico/handler.go

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,19 @@ import (
2424
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
2525

2626
"github.com/d2iq-labs/capi-runtime-extensions/api/v1alpha1"
27-
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/handlers"
27+
commonhandlers "github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/handlers"
2828
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/handlers/lifecycle"
2929
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/variables"
3030
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/k8s/client"
3131
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/k8s/parser"
32+
"github.com/d2iq-labs/capi-runtime-extensions/pkg/handlers"
3233
"github.com/d2iq-labs/capi-runtime-extensions/pkg/handlers/cni"
3334
)
3435

36+
const (
37+
variableName = "cni"
38+
)
39+
3540
type CalicoCNIConfig struct {
3641
defaultsNamespace string
3742

@@ -72,23 +77,21 @@ type CalicoCNI struct {
7277
}
7378

7479
var (
75-
_ handlers.Named = &CalicoCNI{}
80+
_ commonhandlers.Named = &CalicoCNI{}
7681
_ lifecycle.AfterControlPlaneInitialized = &CalicoCNI{}
7782

7883
calicoInstallationGK = schema.GroupKind{Group: "operator.tigera.io", Kind: "Installation"}
7984
)
8085

81-
func New(
86+
func NewMetaHandler(
8287
c ctrlclient.Client,
8388
cfg *CalicoCNIConfig,
84-
variableName string,
85-
variablePath ...string,
8689
) *CalicoCNI {
8790
return &CalicoCNI{
8891
client: c,
8992
config: cfg,
90-
variableName: variableName,
91-
variablePath: variablePath,
93+
variableName: handlers.MetaVariableName,
94+
variablePath: []string{variableName},
9295
}
9396
}
9497

pkg/handlers/etcd/inject.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@ import (
1818
"sigs.k8s.io/controller-runtime/pkg/client"
1919

2020
"github.com/d2iq-labs/capi-runtime-extensions/api/v1alpha1"
21-
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/handlers"
21+
commonhandlers "github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/handlers"
2222
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/handlers/mutation"
2323
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/patches"
2424
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/patches/selectors"
2525
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/variables"
26+
"github.com/d2iq-labs/capi-runtime-extensions/pkg/handlers"
2627
)
2728

2829
const (
@@ -37,11 +38,19 @@ type etcdPatchHandler struct {
3738
}
3839

3940
var (
40-
_ handlers.Named = &etcdPatchHandler{}
41+
_ commonhandlers.Named = &etcdPatchHandler{}
4142
_ mutation.GeneratePatches = &etcdPatchHandler{}
4243
)
4344

44-
func NewPatch(
45+
func NewPatch() *etcdPatchHandler {
46+
return newEtcdPatchHandler(variableName)
47+
}
48+
49+
func NewMetaPatch() *etcdPatchHandler {
50+
return newEtcdPatchHandler(handlers.MetaVariableName, variableName)
51+
}
52+
53+
func newEtcdPatchHandler(
4554
variableName string,
4655
variableFieldPath ...string,
4756
) *etcdPatchHandler {

pkg/handlers/etcd/inject_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,15 @@ import (
1717
func TestGeneratePatches(t *testing.T) {
1818
capitest.ValidateGeneratePatches(
1919
t,
20-
func() mutation.GeneratePatches { return NewPatch(VariableName) },
20+
func() mutation.GeneratePatches { return NewPatch() },
2121
capitest.PatchTestDef{
2222
Name: "unset variable",
2323
},
2424
capitest.PatchTestDef{
2525
Name: "etcd imageRepository and imageTag set",
2626
Vars: []runtimehooksv1.Variable{
2727
capitest.VariableWithValue(
28-
VariableName,
28+
variableName,
2929
v1alpha1.Etcd{
3030
Image: &v1alpha1.Image{
3131
Repository: "my-registry.io/my-org/my-repo",
@@ -55,7 +55,7 @@ func TestGeneratePatches(t *testing.T) {
5555
Name: "etcd imageRepository set",
5656
Vars: []runtimehooksv1.Variable{
5757
capitest.VariableWithValue(
58-
VariableName,
58+
variableName,
5959
v1alpha1.Etcd{
6060
Image: &v1alpha1.Image{
6161
Repository: "my-registry.io/my-org/my-repo",
@@ -83,7 +83,7 @@ func TestGeneratePatches(t *testing.T) {
8383
Name: "etcd imageTag set",
8484
Vars: []runtimehooksv1.Variable{
8585
capitest.VariableWithValue(
86-
VariableName,
86+
variableName,
8787
v1alpha1.Etcd{
8888
Image: &v1alpha1.Image{
8989
Tag: "v3.5.99_custom.0",

pkg/handlers/etcd/variables.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ var (
2020
)
2121

2222
const (
23-
// VariableName is http proxy external patch variable name.
24-
VariableName = "etcd"
23+
// variableName is etcd external patch variable name.
24+
variableName = "etcd"
2525

2626
// HandlerNameVariable is the name of the variable handler.
2727
HandlerNameVariable = "etcdVars"
@@ -43,7 +43,7 @@ func (h *etcdVariableHandler) DiscoverVariables(
4343
resp *runtimehooksv1.DiscoverVariablesResponse,
4444
) {
4545
resp.Variables = append(resp.Variables, clusterv1.ClusterClassVariable{
46-
Name: VariableName,
46+
Name: variableName,
4747
Required: false,
4848
Schema: v1alpha1.Etcd{}.VariableSchema(),
4949
})

pkg/handlers/etcd/variables_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
func TestVariableValidation(t *testing.T) {
1616
capitest.ValidateDiscoverVariables(
1717
t,
18-
VariableName,
18+
variableName,
1919
ptr.To(v1alpha1.Etcd{}.VariableSchema()),
2020
NewVariable,
2121
capitest.VariableTestDef{

pkg/handlers/extraapiservercertsans/inject.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@ import (
1818
"sigs.k8s.io/controller-runtime/pkg/client"
1919

2020
"github.com/d2iq-labs/capi-runtime-extensions/api/v1alpha1"
21-
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/handlers"
21+
commonhandlers "github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/handlers"
2222
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/handlers/mutation"
2323
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/patches"
2424
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/patches/selectors"
2525
"github.com/d2iq-labs/capi-runtime-extensions/common/pkg/capi/clustertopology/variables"
26+
"github.com/d2iq-labs/capi-runtime-extensions/pkg/handlers"
2627
)
2728

2829
const (
@@ -37,11 +38,19 @@ type extraAPIServerCertSANsPatchHandler struct {
3738
}
3839

3940
var (
40-
_ handlers.Named = &extraAPIServerCertSANsPatchHandler{}
41+
_ commonhandlers.Named = &extraAPIServerCertSANsPatchHandler{}
4142
_ mutation.GeneratePatches = &extraAPIServerCertSANsPatchHandler{}
4243
)
4344

44-
func NewPatch(
45+
func NewPatch() *extraAPIServerCertSANsPatchHandler {
46+
return newExtraAPIServerCertSANsPatchHandler(variableName)
47+
}
48+
49+
func NewMetaPatch() *extraAPIServerCertSANsPatchHandler {
50+
return newExtraAPIServerCertSANsPatchHandler(handlers.MetaVariableName, variableName)
51+
}
52+
53+
func newExtraAPIServerCertSANsPatchHandler(
4554
variableName string,
4655
variableFieldPath ...string,
4756
) *extraAPIServerCertSANsPatchHandler {

pkg/handlers/extraapiservercertsans/inject_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,15 @@ import (
1717
func TestGeneratePatches(t *testing.T) {
1818
capitest.ValidateGeneratePatches(
1919
t,
20-
func() mutation.GeneratePatches { return NewPatch(VariableName) },
20+
func() mutation.GeneratePatches { return NewPatch() },
2121
capitest.PatchTestDef{
2222
Name: "unset variable",
2323
},
2424
capitest.PatchTestDef{
2525
Name: "extra API server cert SANs set",
2626
Vars: []runtimehooksv1.Variable{
2727
capitest.VariableWithValue(
28-
VariableName,
28+
variableName,
2929
v1alpha1.ExtraAPIServerCertSANs{"a.b.c.example.com", "d.e.f.example.com"},
3030
),
3131
},

pkg/handlers/extraapiservercertsans/variables.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ var (
2020
)
2121

2222
const (
23-
// VariableName is http proxy external patch variable name.
24-
VariableName = "extraAPIServerCertSANs"
23+
// variableName is http proxy external patch variable name.
24+
variableName = "extraAPIServerCertSANs"
2525

2626
// HandlerNameVariable is the name of the variable handler.
2727
HandlerNameVariable = "ExtraAPIServerCertSANsVars"
@@ -43,7 +43,7 @@ func (h *extraAPIServerCertSANsVariableHandler) DiscoverVariables(
4343
resp *runtimehooksv1.DiscoverVariablesResponse,
4444
) {
4545
resp.Variables = append(resp.Variables, clusterv1.ClusterClassVariable{
46-
Name: VariableName,
46+
Name: variableName,
4747
Required: false,
4848
Schema: v1alpha1.ExtraAPIServerCertSANs{}.VariableSchema(),
4949
})

pkg/handlers/extraapiservercertsans/variables_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
func TestVariableValidation(t *testing.T) {
1616
capitest.ValidateDiscoverVariables(
1717
t,
18-
VariableName,
18+
variableName,
1919
ptr.To(v1alpha1.ExtraAPIServerCertSANs{}.VariableSchema()),
2020
NewVariable,
2121
capitest.VariableTestDef{

0 commit comments

Comments
 (0)