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

Commit 9d6b755

Browse files
committed
feat: use CAREN to set default cert SANS
1 parent 7092a4c commit 9d6b755

File tree

5 files changed

+69
-16
lines changed

5 files changed

+69
-16
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"
@@ -23,6 +24,13 @@ const (
2324
CCMProviderAWS = "aws"
2425
)
2526

27+
var DefaultDockerCertSANs = []string{
28+
"localhost",
29+
"127.0.0.1",
30+
"0.0.0.0",
31+
"host.docker.internal",
32+
}
33+
2634
// +kubebuilder:object:root=true
2735

2836
// ClusterConfig is the Schema for the clusterconfigs API.
@@ -234,7 +242,8 @@ type ExtraAPIServerCertSANs []string
234242
func (ExtraAPIServerCertSANs) VariableSchema() clusterv1.VariableSchema {
235243
return clusterv1.VariableSchema{
236244
OpenAPIV3Schema: clusterv1.JSONSchemaProps{
237-
Description: "Extra Subject Alternative Names for the API Server signing cert",
245+
Description: fmt.Sprintf("Extra Subject Alternative Names for the API Server signing cert. For Docker %v are injected automatically.",
246+
DefaultDockerCertSANs),
238247
Type: "array",
239248
UniqueItems: true,
240249
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: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ 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"
1516
"sigs.k8s.io/controller-runtime/pkg/client"
17+
ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
1618

1719
"github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/api/v1alpha1"
1820
"github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/capi/clustertopology/patches"
@@ -29,18 +31,23 @@ const (
2931
type extraAPIServerCertSANsPatchHandler struct {
3032
variableName string
3133
variableFieldPath []string
34+
client ctrlclient.Reader
3235
}
3336

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

3843
func newExtraAPIServerCertSANsPatchHandler(
3944
variableName string,
45+
cl ctrlclient.Reader,
4046
variableFieldPath ...string,
4147
) *extraAPIServerCertSANsPatchHandler {
4248
return &extraAPIServerCertSANsPatchHandler{
4349
variableName: variableName,
50+
client: cl,
4451
variableFieldPath: variableFieldPath,
4552
}
4653
}
@@ -50,12 +57,16 @@ func (h *extraAPIServerCertSANsPatchHandler) Mutate(
5057
obj *unstructured.Unstructured,
5158
vars map[string]apiextensionsv1.JSON,
5259
holderRef runtimehooksv1.HolderReference,
53-
_ client.ObjectKey,
60+
clusterKey client.ObjectKey,
5461
) error {
5562
log := ctrl.LoggerFrom(ctx).WithValues(
5663
"holderRef", holderRef,
5764
)
58-
65+
cluster := &capiv1.Cluster{}
66+
if err := h.client.Get(ctx, clusterKey, cluster); err != nil {
67+
return err
68+
}
69+
defaultAPICertSANs := getDefaultAPIServerSANs(cluster)
5970
extraAPIServerCertSANsVar, found, err := variables.Get[v1alpha1.ExtraAPIServerCertSANs](
6071
vars,
6172
h.variableName,
@@ -64,11 +75,13 @@ func (h *extraAPIServerCertSANsPatchHandler) Mutate(
6475
if err != nil {
6576
return err
6677
}
67-
if !found {
68-
log.V(5).Info("Extra API server cert SANs variable not defined")
78+
if !found && len(defaultAPICertSANs) == 0 {
79+
log.V(5).Info("No Extra API server cert SANs needed to be added")
6980
return nil
7081
}
7182

83+
extraSans := deDup(extraAPIServerCertSANsVar, defaultAPICertSANs)
84+
7285
log = log.WithValues(
7386
"variableName",
7487
h.variableName,
@@ -89,9 +102,40 @@ func (h *extraAPIServerCertSANsPatchHandler) Mutate(
89102
if obj.Spec.Template.Spec.KubeadmConfigSpec.ClusterConfiguration == nil {
90103
obj.Spec.Template.Spec.KubeadmConfigSpec.ClusterConfiguration = &bootstrapv1.ClusterConfiguration{}
91104
}
92-
obj.Spec.Template.Spec.KubeadmConfigSpec.ClusterConfiguration.APIServer.CertSANs = extraAPIServerCertSANsVar
93-
105+
obj.Spec.Template.Spec.KubeadmConfigSpec.ClusterConfiguration.APIServer.CertSANs = extraSans
94106
return nil
95107
},
96108
)
97109
}
110+
111+
func getDefaultAPIServerSANs(cluster *capiv1.Cluster) []string {
112+
provider, ok := cluster.Labels[capiv1.ProviderNameLabel]
113+
if !ok {
114+
return []string{}
115+
}
116+
switch provider {
117+
case "docker":
118+
return v1alpha1.DefaultDockerCertSANs
119+
default:
120+
return []string{}
121+
}
122+
}
123+
124+
func deDup(a, b []string) []string {
125+
found := map[string]bool{}
126+
for _, s := range a {
127+
if _, ok := found[s]; !ok {
128+
found[s] = true
129+
}
130+
}
131+
for _, s := range b {
132+
if _, ok := found[s]; !ok {
133+
found[s] = true
134+
}
135+
}
136+
ret := make([]string, 0, len(found))
137+
for k := range found {
138+
ret = append(ret, k)
139+
}
140+
return ret
141+
}

pkg/handlers/generic/mutation/handlers.go

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

0 commit comments

Comments
 (0)