@@ -8,11 +8,12 @@ import (
8
8
9
9
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
10
10
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
11
+ capiv1 "sigs.k8s.io/cluster-api/api/v1beta1"
11
12
bootstrapv1 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1"
12
13
controlplanev1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1"
13
14
runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
14
15
ctrl "sigs.k8s.io/controller-runtime"
15
- "sigs.k8s.io/controller-runtime/pkg/client"
16
+ ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
16
17
17
18
"github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/api/v1alpha1"
18
19
"github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/capi/clustertopology/patches"
@@ -29,18 +30,23 @@ const (
29
30
type extraAPIServerCertSANsPatchHandler struct {
30
31
variableName string
31
32
variableFieldPath []string
33
+ client ctrlclient.Reader
32
34
}
33
35
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 )
36
40
}
37
41
38
42
func newExtraAPIServerCertSANsPatchHandler (
39
43
variableName string ,
44
+ cl ctrlclient.Reader ,
40
45
variableFieldPath ... string ,
41
46
) * extraAPIServerCertSANsPatchHandler {
42
47
return & extraAPIServerCertSANsPatchHandler {
43
48
variableName : variableName ,
49
+ client : cl ,
44
50
variableFieldPath : variableFieldPath ,
45
51
}
46
52
}
@@ -50,12 +56,16 @@ func (h *extraAPIServerCertSANsPatchHandler) Mutate(
50
56
obj * unstructured.Unstructured ,
51
57
vars map [string ]apiextensionsv1.JSON ,
52
58
holderRef runtimehooksv1.HolderReference ,
53
- _ client .ObjectKey ,
59
+ clusterKey ctrlclient .ObjectKey ,
54
60
) error {
55
61
log := ctrl .LoggerFrom (ctx ).WithValues (
56
62
"holderRef" , holderRef ,
57
63
)
58
-
64
+ cluster := & capiv1.Cluster {}
65
+ if err := h .client .Get (ctx , clusterKey , cluster ); err != nil {
66
+ return err
67
+ }
68
+ defaultAPICertSANs := getDefaultAPIServerSANs (cluster )
59
69
extraAPIServerCertSANsVar , found , err := variables .Get [v1alpha1.ExtraAPIServerCertSANs ](
60
70
vars ,
61
71
h .variableName ,
@@ -64,11 +74,13 @@ func (h *extraAPIServerCertSANsPatchHandler) Mutate(
64
74
if err != nil {
65
75
return err
66
76
}
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 " )
69
79
return nil
70
80
}
71
81
82
+ extraSans := deDup (extraAPIServerCertSANsVar , defaultAPICertSANs )
83
+
72
84
log = log .WithValues (
73
85
"variableName" ,
74
86
h .variableName ,
@@ -83,15 +95,46 @@ func (h *extraAPIServerCertSANsPatchHandler) Mutate(
83
95
func (obj * controlplanev1.KubeadmControlPlaneTemplate ) error {
84
96
log .WithValues (
85
97
"patchedObjectKind" , obj .GetObjectKind ().GroupVersionKind ().String (),
86
- "patchedObjectName" , client .ObjectKeyFromObject (obj ),
98
+ "patchedObjectName" , ctrlclient .ObjectKeyFromObject (obj ),
87
99
).Info ("adding API server extra cert SANs in kubeadm config spec" )
88
100
89
101
if obj .Spec .Template .Spec .KubeadmConfigSpec .ClusterConfiguration == nil {
90
102
obj .Spec .Template .Spec .KubeadmConfigSpec .ClusterConfiguration = & bootstrapv1.ClusterConfiguration {}
91
103
}
92
- obj .Spec .Template .Spec .KubeadmConfigSpec .ClusterConfiguration .APIServer .CertSANs = extraAPIServerCertSANsVar
93
-
104
+ obj .Spec .Template .Spec .KubeadmConfigSpec .ClusterConfiguration .APIServer .CertSANs = extraSans
94
105
return nil
95
106
},
96
107
)
97
108
}
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
+ }
0 commit comments