diff --git a/deploy/crds/contrail.juniper.net_kubemanagers_crd.yaml b/deploy/crds/contrail.juniper.net_kubemanagers_crd.yaml index 18e17b0ae..43220f4e1 100644 --- a/deploy/crds/contrail.juniper.net_kubemanagers_crd.yaml +++ b/deploy/crds/contrail.juniper.net_kubemanagers_crd.yaml @@ -142,6 +142,10 @@ spec: type: string type: object type: array + envVariablesConfig: + additionalProperties: + type: string + type: object hostNetworkService: type: boolean ipFabricForwarding: diff --git a/deploy/crds/contrail.juniper.net_managers_crd.yaml b/deploy/crds/contrail.juniper.net_managers_crd.yaml index 4ea47652e..d7d709183 100644 --- a/deploy/crds/contrail.juniper.net_managers_crd.yaml +++ b/deploy/crds/contrail.juniper.net_managers_crd.yaml @@ -1517,6 +1517,10 @@ spec: type: string type: object type: array + envVariablesConfig: + additionalProperties: + type: string + type: object hostNetworkService: type: boolean ipFabricForwarding: diff --git a/pkg/apis/contrail/v1alpha1/kubemanager_types.go b/pkg/apis/contrail/v1alpha1/kubemanager_types.go index 6528a0dd8..5613e0717 100644 --- a/pkg/apis/contrail/v1alpha1/kubemanager_types.go +++ b/pkg/apis/contrail/v1alpha1/kubemanager_types.go @@ -77,6 +77,7 @@ type KubemanagerConfiguration struct { RabbitmqPassword string `json:"rabbitmqPassword,omitempty"` RabbitmqVhost string `json:"rabbitmqVhost,omitempty"` StaticConfiguration *KubemanagerStaticConfiguration `json:"staticConfiguration,omitempty"` + EnvVariablesConfig map[string]string `json:"envVariablesConfig,omitempty"` } // KubemanagerStaticConfiguration is the configuration for deployment with static controller. @@ -271,7 +272,13 @@ func (c *Kubemanager) InstanceConfiguration(request reconcile.Request, if err = client.Update(context.TODO(), configMapInstanceDynamicConfig); err != nil { return err } - return nil + envVariablesConfigMapName := request.Name + "-" + "kubemanager" + "-configmap-envs" + envVariablesConfigMap := &corev1.ConfigMap{} + if err := client.Get(context.TODO(), types.NamespacedName{Name: envVariablesConfigMapName, Namespace: request.Namespace}, envVariablesConfigMap); err != nil { + return err + } + envVariablesConfigMap.Data = c.getKubemanagerEnvironmentData() + return client.Update(context.TODO(), envVariablesConfigMap) } func (c *Kubemanager) CreateConfigMap(configMapName string, client client.Client, scheme *runtime.Scheme, request reconcile.Request) (*corev1.ConfigMap, error) { @@ -457,10 +464,22 @@ func (c *Kubemanager) ConfigurationParameters() KubemanagerConfiguration { kubemanagerConfiguration.HostNetworkService = &hostNetworkService kubemanagerConfiguration.UseKubeadmConfig = &useKubeadmConfig kubemanagerConfiguration.IPFabricSnat = &ipFabricSnat + kubemanagerConfiguration.EnvVariablesConfig = c.Spec.ServiceConfiguration.EnvVariablesConfig return kubemanagerConfiguration } +func (c *Kubemanager) getKubemanagerEnvironmentData() map[string]string { + kubemanagerConfig := c.ConfigurationParameters() + envVariables := make(map[string]string) + if len(kubemanagerConfig.EnvVariablesConfig) != 0 { + for key, value := range kubemanagerConfig.EnvVariablesConfig { + envVariables[key] = value + } + } + return envVariables +} + func (c *Kubemanager) getCassandraNodesInformation(namespace string, client client.Client) (CassandraClusterConfiguration, error) { if c.Spec.ServiceConfiguration.StaticConfiguration != nil && c.Spec.ServiceConfiguration.StaticConfiguration.CassandraNodesConfiguration != nil { cassandraNodesInformation := *c.Spec.ServiceConfiguration.StaticConfiguration.CassandraNodesConfiguration diff --git a/pkg/apis/contrail/v1alpha1/kubemanager_types_test.go b/pkg/apis/contrail/v1alpha1/kubemanager_types_test.go index 899463f61..1a4dfef1d 100644 --- a/pkg/apis/contrail/v1alpha1/kubemanager_types_test.go +++ b/pkg/apis/contrail/v1alpha1/kubemanager_types_test.go @@ -114,6 +114,13 @@ var kubemanagerCM = &corev1.ConfigMap{ }, } +var kubemanagerCMEnvs = &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: "kubemanager1-kubemanager-configmap-envs", + Namespace: "test-ns", + }, +} + var rabbitSecret = &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ Name: "rabbit-secret", @@ -394,7 +401,7 @@ func TestInstanceConfigurationWithStaticConfiguration(t *testing.T) { require.NoError(t, err, "Failed to build scheme") require.NoError(t, corev1.SchemeBuilder.AddToScheme(scheme), "Failed to add CoreV1 into scheme") - cl := fake.NewFakeClientWithScheme(scheme, kubemanagerCM, rabbitSecret, kubemanagerSecret) + cl := fake.NewFakeClientWithScheme(scheme, kubemanagerCM, kubemanagerCMEnvs, rabbitSecret, kubemanagerSecret) kubemanager := Kubemanager{ Spec: KubemanagerSpec{ @@ -466,7 +473,7 @@ func TestInstanceConfigurationWithDynamicConfiguration(t *testing.T) { require.NoError(t, err, "Failed to build scheme") require.NoError(t, corev1.SchemeBuilder.AddToScheme(scheme), "Failed to add CoreV1 into scheme") - cl := fake.NewFakeClientWithScheme(scheme, kubemanagerCM, rabbitSecret, kubemanagerSecret, cassandraCR, zookeeperCR, configCR, rabbitmqCR) + cl := fake.NewFakeClientWithScheme(scheme, kubemanagerCM, kubemanagerCMEnvs, rabbitSecret, kubemanagerSecret, cassandraCR, zookeeperCR, configCR, rabbitmqCR) kubemanager := Kubemanager{ ObjectMeta: metav1.ObjectMeta{ @@ -523,7 +530,7 @@ func TestInstanceConfigurationWithDynamicCassandraZookeeperConfiguration(t *test require.NoError(t, err, "Failed to build scheme") require.NoError(t, corev1.SchemeBuilder.AddToScheme(scheme), "Failed to add CoreV1 into scheme") - cl := fake.NewFakeClientWithScheme(scheme, kubemanagerCM, rabbitSecret, kubemanagerSecret, cassandraCR, zookeeperCR) + cl := fake.NewFakeClientWithScheme(scheme, kubemanagerCM, kubemanagerCMEnvs, rabbitSecret, kubemanagerSecret, cassandraCR, zookeeperCR) kubemanager := Kubemanager{ ObjectMeta: metav1.ObjectMeta{ @@ -593,7 +600,7 @@ func TestInstanceConfigurationWithDynamicRabbitmqConfigConfiguration(t *testing. require.NoError(t, err, "Failed to build scheme") require.NoError(t, corev1.SchemeBuilder.AddToScheme(scheme), "Failed to add CoreV1 into scheme") - cl := fake.NewFakeClientWithScheme(scheme, kubemanagerCM, rabbitSecret, kubemanagerSecret, configCR, rabbitmqCR) + cl := fake.NewFakeClientWithScheme(scheme, kubemanagerCM, kubemanagerCMEnvs, rabbitSecret, kubemanagerSecret, configCR, rabbitmqCR) kubemanager := Kubemanager{ ObjectMeta: metav1.ObjectMeta{ @@ -659,7 +666,7 @@ func TestInstanceConfigurationWithDynamicConfigZookeeperConfiguration(t *testing require.NoError(t, err, "Failed to build scheme") require.NoError(t, corev1.SchemeBuilder.AddToScheme(scheme), "Failed to add CoreV1 into scheme") - cl := fake.NewFakeClientWithScheme(scheme, kubemanagerCM, rabbitSecret, kubemanagerSecret, configCR, zookeeperCR) + cl := fake.NewFakeClientWithScheme(scheme, kubemanagerCM, kubemanagerCMEnvs, rabbitSecret, kubemanagerSecret, configCR, zookeeperCR) kubemanager := Kubemanager{ ObjectMeta: metav1.ObjectMeta{ @@ -727,7 +734,7 @@ func TestInstanceConfigurationWithDynamicRabbitmqCassandraConfiguration(t *testi require.NoError(t, err, "Failed to build scheme") require.NoError(t, corev1.SchemeBuilder.AddToScheme(scheme), "Failed to add CoreV1 into scheme") - cl := fake.NewFakeClientWithScheme(scheme, kubemanagerCM, rabbitSecret, kubemanagerSecret, cassandraCR, rabbitmqCR) + cl := fake.NewFakeClientWithScheme(scheme, kubemanagerCM, kubemanagerCMEnvs, rabbitSecret, kubemanagerSecret, cassandraCR, rabbitmqCR) kubemanager := Kubemanager{ ObjectMeta: metav1.ObjectMeta{ diff --git a/pkg/apis/contrail/v1alpha1/tests/config_test.go b/pkg/apis/contrail/v1alpha1/tests/config_test.go index bc07bc477..bba2e179c 100644 --- a/pkg/apis/contrail/v1alpha1/tests/config_test.go +++ b/pkg/apis/contrail/v1alpha1/tests/config_test.go @@ -188,35 +188,36 @@ var configMap = &corev1.ConfigMap{} var secret = &corev1.Secret{} type Environment struct { - client *client.Client - configPodList corev1.PodList - rabbitmqPodList corev1.PodList - zookeeperPodList corev1.PodList - cassandraPodList corev1.PodList - controlPodList corev1.PodList - kubemanbagerPodList corev1.PodList - webuiPodList corev1.PodList - vrouterPodList corev1.PodList - configResource v1alpha1.Config - controlResource v1alpha1.Control - cassandraResource v1alpha1.Cassandra - zookeeperResource v1alpha1.Zookeeper - rabbitmqResource v1alpha1.Rabbitmq - kubemanagerResource v1alpha1.Kubemanager - webuiResource v1alpha1.Webui - vrouterResource v1alpha1.Vrouter - configConfigMap corev1.ConfigMap - controlConfigMap corev1.ConfigMap - cassandraConfigMap corev1.ConfigMap - zookeeperConfigMap corev1.ConfigMap - zookeeperConfigMap2 corev1.ConfigMap - rabbitmqConfigMap corev1.ConfigMap - rabbitmqConfigMap2 corev1.ConfigMap - kubemanagerConfigMap corev1.ConfigMap - kubemanagerSecret corev1.Secret - webuiConfigMap corev1.ConfigMap - vrouterConfigMap corev1.ConfigMap - vrouterConfigMap2 corev1.ConfigMap + client *client.Client + configPodList corev1.PodList + rabbitmqPodList corev1.PodList + zookeeperPodList corev1.PodList + cassandraPodList corev1.PodList + controlPodList corev1.PodList + kubemanbagerPodList corev1.PodList + webuiPodList corev1.PodList + vrouterPodList corev1.PodList + configResource v1alpha1.Config + controlResource v1alpha1.Control + cassandraResource v1alpha1.Cassandra + zookeeperResource v1alpha1.Zookeeper + rabbitmqResource v1alpha1.Rabbitmq + kubemanagerResource v1alpha1.Kubemanager + webuiResource v1alpha1.Webui + vrouterResource v1alpha1.Vrouter + configConfigMap corev1.ConfigMap + controlConfigMap corev1.ConfigMap + cassandraConfigMap corev1.ConfigMap + zookeeperConfigMap corev1.ConfigMap + zookeeperConfigMap2 corev1.ConfigMap + rabbitmqConfigMap corev1.ConfigMap + rabbitmqConfigMap2 corev1.ConfigMap + kubemanagerConfigMap corev1.ConfigMap + kubemanagerConfigMapEnvs corev1.ConfigMap + kubemanagerSecret corev1.Secret + webuiConfigMap corev1.ConfigMap + vrouterConfigMap corev1.ConfigMap + vrouterConfigMap2 corev1.ConfigMap } func SetupEnv() Environment { @@ -228,6 +229,7 @@ func SetupEnv() Environment { zookeeperConfigMap := *configMap controlConfigMap := *configMap kubemanagerConfigMap := *configMap + kubemanagerConfigMapEnvs := *configMap webuiConfigMap := *configMap vrouterConfigMap := *configMap vrouterConfigMap2 := *configMap @@ -286,6 +288,9 @@ func SetupEnv() Environment { kubemanagerConfigMap.Name = "kubemanager1-kubemanager-configmap" kubemanagerConfigMap.Namespace = "default" + kubemanagerConfigMapEnvs.Name = "kubemanager1-kubemanager-configmap-envs" + kubemanagerConfigMapEnvs.Namespace = "default" + webuiConfigMap.Name = "webui1-webui-configmap" webuiConfigMap.Namespace = "default" @@ -338,6 +343,7 @@ func SetupEnv() Environment { &rabbitmqConfigMap, &rabbitmqConfigMap2, &kubemanagerConfigMap, + &kubemanagerConfigMapEnvs, &webuiConfigMap, &vrouterConfigMap, &vrouterConfigMap2, @@ -498,33 +504,34 @@ func SetupEnv() Environment { vrouterResource.ManageNodeStatus(podMap.vrouterPods, cl) environment := Environment{ - client: &cl, - configPodList: configPodList, - cassandraPodList: cassandraPodList, - zookeeperPodList: zookeeperPodList, - rabbitmqPodList: rabbitmqPodList, - controlPodList: controlPodList, - kubemanbagerPodList: kubemanagerPodList, - webuiPodList: webuiPodList, - vrouterPodList: vrouterPodList, - configResource: *configResource, - controlResource: *controlResource, - cassandraResource: *cassandraResource, - zookeeperResource: *zookeeperResource, - rabbitmqResource: *rabbitmqResource, - kubemanagerResource: *kubemanagerResource, - webuiResource: *webuiResource, - vrouterResource: *vrouterResource, - configConfigMap: configConfigMap, - controlConfigMap: controlConfigMap, - cassandraConfigMap: cassandraConfigMap, - zookeeperConfigMap: zookeeperConfigMap, - rabbitmqConfigMap: rabbitmqConfigMap, - rabbitmqConfigMap2: rabbitmqConfigMap2, - kubemanagerConfigMap: kubemanagerConfigMap, - webuiConfigMap: webuiConfigMap, - vrouterConfigMap: vrouterConfigMap, - vrouterConfigMap2: vrouterConfigMap2, + client: &cl, + configPodList: configPodList, + cassandraPodList: cassandraPodList, + zookeeperPodList: zookeeperPodList, + rabbitmqPodList: rabbitmqPodList, + controlPodList: controlPodList, + kubemanbagerPodList: kubemanagerPodList, + webuiPodList: webuiPodList, + vrouterPodList: vrouterPodList, + configResource: *configResource, + controlResource: *controlResource, + cassandraResource: *cassandraResource, + zookeeperResource: *zookeeperResource, + rabbitmqResource: *rabbitmqResource, + kubemanagerResource: *kubemanagerResource, + webuiResource: *webuiResource, + vrouterResource: *vrouterResource, + configConfigMap: configConfigMap, + controlConfigMap: controlConfigMap, + cassandraConfigMap: cassandraConfigMap, + zookeeperConfigMap: zookeeperConfigMap, + rabbitmqConfigMap: rabbitmqConfigMap, + rabbitmqConfigMap2: rabbitmqConfigMap2, + kubemanagerConfigMap: kubemanagerConfigMap, + kubemanagerConfigMapEnvs: kubemanagerConfigMapEnvs, + webuiConfigMap: webuiConfigMap, + vrouterConfigMap: vrouterConfigMap, + vrouterConfigMap2: vrouterConfigMap2, } return environment } diff --git a/pkg/apis/contrail/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/contrail/v1alpha1/zz_generated.deepcopy.go index 455347783..ba720f78e 100644 --- a/pkg/apis/contrail/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/contrail/v1alpha1/zz_generated.deepcopy.go @@ -1,6 +1,6 @@ // +build !ignore_autogenerated -// Code generated by operator-sdk. DO NOT EDIT. +// Code generated by operator-sdk-0.17.1. DO NOT EDIT. package v1alpha1 @@ -1837,6 +1837,13 @@ func (in *KubemanagerConfiguration) DeepCopyInto(out *KubemanagerConfiguration) *out = new(KubemanagerStaticConfiguration) (*in).DeepCopyInto(*out) } + if in.EnvVariablesConfig != nil { + in, out := &in.EnvVariablesConfig, &out.EnvVariablesConfig + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } return } diff --git a/pkg/controller/kubemanager/kubemanager_controller.go b/pkg/controller/kubemanager/kubemanager_controller.go index 37cc75b39..e2fa9e196 100644 --- a/pkg/controller/kubemanager/kubemanager_controller.go +++ b/pkg/controller/kubemanager/kubemanager_controller.go @@ -224,6 +224,12 @@ func (r *ReconcileKubemanager) Reconcile(request reconcile.Request) (reconcile.R return reconcile.Result{}, err } + envVariablesConfigMap := request.Name + "-" + instanceType + "-configmap-envs" + _, err = instance.CreateConfigMap(envVariablesConfigMap, r.Client, r.Scheme, request) + if err != nil { + return reconcile.Result{}, err + } + secretCertificates, err := instance.CreateSecret(request.Name+"-secret-certificates", r.Client, r.Scheme, request) if err != nil { return reconcile.Result{}, err @@ -429,6 +435,13 @@ func (r *ReconcileKubemanager) Reconcile(request reconcile.Request) (reconcile.R volumeMountList = append(volumeMountList, volumeMount) (&statefulSet.Spec.Template.Spec.Containers[idx]).VolumeMounts = volumeMountList (&statefulSet.Spec.Template.Spec.Containers[idx]).Image = instanceContainer.Image + (&statefulSet.Spec.Template.Spec.Containers[idx]).EnvFrom = []corev1.EnvFromSource{{ + ConfigMapRef: &corev1.ConfigMapEnvSource{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: envVariablesConfigMap, + }, + }, + }} } if container.Name == "statusmonitor" { command := []string{"sh", "-c",