@@ -14,6 +14,7 @@ import (
1414 "helm.sh/helm/v3/pkg/chartutil"
1515 "helm.sh/helm/v3/pkg/engine"
1616 "helm.sh/helm/v3/pkg/releaseutil"
17+ corev1 "k8s.io/api/core/v1"
1718 extensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
1819 "k8s.io/apimachinery/pkg/api/errors"
1920 "k8s.io/apimachinery/pkg/api/meta"
@@ -32,6 +33,7 @@ import (
3233 v1 "github.com/sapcc/kubernikus/pkg/apis/kubernikus/v1"
3334 "github.com/sapcc/kubernikus/pkg/client/openstack/project"
3435 "github.com/sapcc/kubernikus/pkg/controller/config"
36+ "github.com/sapcc/kubernikus/pkg/util"
3537)
3638
3739const SeedChartPath string = "charts/seed"
@@ -40,6 +42,7 @@ const ManagedByLabelKey string = "cloud.sap/managed-by"
4042const ManagedByLabelValue string = "kubernikus"
4143const SkipPatchKey string = "kubernikus.cloud.sap/skip-manage"
4244const SkipPatchValue string = "true"
45+ const InjectAdmissionCAKey string = "kubernikus.cloud.sap/inject-admission-ca"
4346
4447var recreateKinds map [string ]struct {} = map [string ]struct {}{
4548 "RoleBinding" : {},
@@ -206,6 +209,49 @@ func (sr *SeedReconciler) ReconcileSeeding(chartPath string, values map[string]i
206209 if err != nil {
207210 return err
208211 }
212+
213+ // inject admission CA in labeled namespaces
214+ k8sClient , err := sr .Clients .Satellites .ClientFor (sr .Kluster )
215+ if err != nil {
216+ return err
217+ }
218+ nsList , err := k8sClient .CoreV1 ().Namespaces ().List (context .TODO (), metav1.ListOptions {LabelSelector : fmt .Sprintf ("%s=true" , InjectAdmissionCAKey )})
219+ if err != nil {
220+ return err
221+ }
222+ if nsList .Size () > 0 {
223+ secret , err := util .KlusterSecret (sr .Clients .Kubernetes , sr .Kluster )
224+ if err != nil {
225+ return fmt .Errorf ("Couldn't get kluster secret: %s" , err )
226+ }
227+ ca := map [string ]string {"ca.crt" : secret .Certificates .AdmissionCACertificate }
228+ cm := corev1.ConfigMap {
229+ TypeMeta : metav1.TypeMeta {
230+ Kind : "ConfigMap" ,
231+ APIVersion : "v1" ,
232+ },
233+ ObjectMeta : metav1.ObjectMeta {
234+ Name : "admission-auth-ca" ,
235+ },
236+ Data : ca ,
237+ }
238+ for _ , ns := range nsList .Items {
239+ _ , err = k8sClient .CoreV1 ().ConfigMaps (ns .Name ).Create (context .TODO (), & cm , metav1.CreateOptions {})
240+ if errors .IsAlreadyExists (err ) {
241+ _ , err = k8sClient .CoreV1 ().ConfigMaps (ns .Name ).Update (context .TODO (), & cm , metav1.UpdateOptions {})
242+ }
243+ if err != nil {
244+ return fmt .Errorf ("Admission CA certificate reconciliation in namespace %s failed: %s" , ns .Name , err )
245+ }
246+ sr .Logger .Log (
247+ "msg" , "Reconciling admission CA certificate" ,
248+ "namespace" , ns .Name ,
249+ "kluster" , sr .Kluster .GetName (),
250+ "project" , sr .Kluster .Account (),
251+ "v" , 6 )
252+ }
253+ }
254+
209255 sr .Logger .Log (
210256 "msg" , "Seed reconciliation: successful" ,
211257 "kluster" , sr .Kluster .GetName (),
0 commit comments