Skip to content
This repository was archived by the owner on Apr 11, 2024. It is now read-only.

Commit 3ed4632

Browse files
committed
feat: use CAREN to set default cert SANS
1 parent 2ec54be commit 3ed4632

File tree

5 files changed

+70
-18
lines changed

5 files changed

+70
-18
lines changed

api/v1alpha1/clusterconfig_types.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package v1alpha1
55

66
import (
7+
"fmt"
78
"maps"
89

910
corev1 "k8s.io/api/core/v1"
@@ -28,6 +29,13 @@ const (
2829
CCMProviderAWS = "aws"
2930
)
3031

32+
var DefaultDockerCertSANs = []string{
33+
"localhost",
34+
"127.0.0.1",
35+
"0.0.0.0",
36+
"host.docker.internal",
37+
}
38+
3139
// +kubebuilder:object:root=true
3240

3341
// ClusterConfig is the Schema for the clusterconfigs API.
@@ -243,7 +251,8 @@ type ExtraAPIServerCertSANs []string
243251
func (ExtraAPIServerCertSANs) VariableSchema() clusterv1.VariableSchema {
244252
return clusterv1.VariableSchema{
245253
OpenAPIV3Schema: clusterv1.JSONSchemaProps{
246-
Description: "Extra Subject Alternative Names for the API Server signing cert",
254+
Description: fmt.Sprintf("Extra Subject Alternative Names for the API Server signing cert. For Docker %v are injected automatically.",
255+
DefaultDockerCertSANs),
247256
Type: "array",
248257
UniqueItems: true,
249258
Items: &clusterv1.JSONSchemaProps{

charts/cluster-api-runtime-extensions-nutanix/defaultclusterclasses/docker-cluster-class.yaml

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,7 @@ spec:
6565
spec:
6666
kubeadmConfigSpec:
6767
clusterConfiguration:
68-
apiServer:
69-
certSANs:
70-
- localhost
71-
- 127.0.0.1
72-
- 0.0.0.0
73-
- host.docker.internal
68+
apiServer: {}
7469
controllerManager:
7570
extraArgs:
7671
enable-hostpath-provisioner: "true"

hack/examples/bases/docker/clusterclass/kustomization.yaml.tmpl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ labels:
2222

2323
patches:
2424
# Delete the patch and variable definitions.
25+
- target:
26+
kind: KubeadmControlPlaneTemplate
27+
patch: |-
28+
- op: "remove"
29+
path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/certSANs"
2530
- target:
2631
kind: ClusterClass
2732
patch: |-

pkg/handlers/generic/mutation/extraapiservercertsans/inject.go

Lines changed: 53 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@ import (
88

99
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
1010
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
11+
capiv1 "sigs.k8s.io/cluster-api/api/v1beta1"
1112
bootstrapv1 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1"
1213
controlplanev1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1"
1314
runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
1415
ctrl "sigs.k8s.io/controller-runtime"
15-
"sigs.k8s.io/controller-runtime/pkg/client"
16+
ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
1617

1718
"github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/api/v1alpha1"
1819
"github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/capi/clustertopology/patches"
@@ -29,18 +30,23 @@ const (
2930
type extraAPIServerCertSANsPatchHandler struct {
3031
variableName string
3132
variableFieldPath []string
33+
client ctrlclient.Reader
3234
}
3335

34-
func NewPatch() *extraAPIServerCertSANsPatchHandler {
35-
return newExtraAPIServerCertSANsPatchHandler(clusterconfig.MetaVariableName, VariableName)
36+
func NewPatch(
37+
cl ctrlclient.Reader,
38+
) *extraAPIServerCertSANsPatchHandler {
39+
return newExtraAPIServerCertSANsPatchHandler(clusterconfig.MetaVariableName, cl, VariableName)
3640
}
3741

3842
func newExtraAPIServerCertSANsPatchHandler(
3943
variableName string,
44+
cl ctrlclient.Reader,
4045
variableFieldPath ...string,
4146
) *extraAPIServerCertSANsPatchHandler {
4247
return &extraAPIServerCertSANsPatchHandler{
4348
variableName: variableName,
49+
client: cl,
4450
variableFieldPath: variableFieldPath,
4551
}
4652
}
@@ -50,12 +56,16 @@ func (h *extraAPIServerCertSANsPatchHandler) Mutate(
5056
obj *unstructured.Unstructured,
5157
vars map[string]apiextensionsv1.JSON,
5258
holderRef runtimehooksv1.HolderReference,
53-
_ client.ObjectKey,
59+
clusterKey ctrlclient.ObjectKey,
5460
) error {
5561
log := ctrl.LoggerFrom(ctx).WithValues(
5662
"holderRef", holderRef,
5763
)
58-
64+
cluster := &capiv1.Cluster{}
65+
if err := h.client.Get(ctx, clusterKey, cluster); err != nil {
66+
return err
67+
}
68+
defaultAPICertSANs := getDefaultAPIServerSANs(cluster)
5969
extraAPIServerCertSANsVar, found, err := variables.Get[v1alpha1.ExtraAPIServerCertSANs](
6070
vars,
6171
h.variableName,
@@ -64,11 +74,13 @@ func (h *extraAPIServerCertSANsPatchHandler) Mutate(
6474
if err != nil {
6575
return err
6676
}
67-
if !found {
68-
log.V(5).Info("Extra API server cert SANs variable not defined")
77+
if !found && len(defaultAPICertSANs) == 0 {
78+
log.V(5).Info("No Extra API server cert SANs needed to be added")
6979
return nil
7080
}
7181

82+
extraSans := deDup(extraAPIServerCertSANsVar, defaultAPICertSANs)
83+
7284
log = log.WithValues(
7385
"variableName",
7486
h.variableName,
@@ -83,15 +95,46 @@ func (h *extraAPIServerCertSANsPatchHandler) Mutate(
8395
func(obj *controlplanev1.KubeadmControlPlaneTemplate) error {
8496
log.WithValues(
8597
"patchedObjectKind", obj.GetObjectKind().GroupVersionKind().String(),
86-
"patchedObjectName", client.ObjectKeyFromObject(obj),
98+
"patchedObjectName", ctrlclient.ObjectKeyFromObject(obj),
8799
).Info("adding API server extra cert SANs in kubeadm config spec")
88100

89101
if obj.Spec.Template.Spec.KubeadmConfigSpec.ClusterConfiguration == nil {
90102
obj.Spec.Template.Spec.KubeadmConfigSpec.ClusterConfiguration = &bootstrapv1.ClusterConfiguration{}
91103
}
92-
obj.Spec.Template.Spec.KubeadmConfigSpec.ClusterConfiguration.APIServer.CertSANs = extraAPIServerCertSANsVar
93-
104+
obj.Spec.Template.Spec.KubeadmConfigSpec.ClusterConfiguration.APIServer.CertSANs = extraSans
94105
return nil
95106
},
96107
)
97108
}
109+
110+
func getDefaultAPIServerSANs(cluster *capiv1.Cluster) []string {
111+
provider, ok := cluster.Labels[capiv1.ProviderNameLabel]
112+
if !ok {
113+
return []string{}
114+
}
115+
switch provider {
116+
case "docker":
117+
return v1alpha1.DefaultDockerCertSANs
118+
default:
119+
return []string{}
120+
}
121+
}
122+
123+
func deDup(a, b []string) []string {
124+
found := map[string]bool{}
125+
for _, s := range a {
126+
if _, ok := found[s]; !ok {
127+
found[s] = true
128+
}
129+
}
130+
for _, s := range b {
131+
if _, ok := found[s]; !ok {
132+
found[s] = true
133+
}
134+
}
135+
ret := make([]string, 0, len(found))
136+
for k := range found {
137+
ret = append(ret, k)
138+
}
139+
return ret
140+
}

pkg/handlers/generic/mutation/handlers.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ func MetaMutators(mgr manager.Manager) []mutation.MetaMutator {
2323
return []mutation.MetaMutator{
2424
auditpolicy.NewPatch(),
2525
etcd.NewPatch(),
26-
extraapiservercertsans.NewPatch(),
26+
extraapiservercertsans.NewPatch(mgr.GetClient()),
2727
httpproxy.NewPatch(mgr.GetClient()),
2828
kubernetesimagerepository.NewPatch(),
2929
credentials.NewPatch(mgr.GetClient()),

0 commit comments

Comments
 (0)