diff --git a/pkg/operator/configobservation/configobservercontroller/observe_config_controller.go b/pkg/operator/configobservation/configobservercontroller/observe_config_controller.go index f8697a9eb..ca4a65e75 100644 --- a/pkg/operator/configobservation/configobservercontroller/observe_config_controller.go +++ b/pkg/operator/configobservation/configobservercontroller/observe_config_controller.go @@ -10,6 +10,7 @@ import ( "github.com/openshift/library-go/pkg/operator/configobserver" "github.com/openshift/library-go/pkg/operator/configobserver/cloudprovider" "github.com/openshift/library-go/pkg/operator/configobserver/featuregates" + "github.com/openshift/library-go/pkg/operator/configobserver/proxy" "github.com/openshift/library-go/pkg/operator/events" "github.com/openshift/library-go/pkg/operator/resourcesynccontroller" "github.com/openshift/library-go/pkg/operator/v1helpers" @@ -47,6 +48,7 @@ func NewConfigObserver( FeatureGateLister_: configinformers.Config().V1().FeatureGates().Lister(), InfrastructureLister_: configinformers.Config().V1().Infrastructures().Lister(), NetworkLister: configinformers.Config().V1().Networks().Lister(), + ProxyLister_: configinformers.Config().V1().Proxies().Lister(), ResourceSync: resourceSyncer, ConfigMapLister: kubeInformersForNamespaces.InformersFor(operatorclient.TargetNamespace).Core().V1().ConfigMaps().Lister(), @@ -59,6 +61,7 @@ func NewConfigObserver( configinformers.Config().V1().FeatureGates().Informer().HasSynced, configinformers.Config().V1().Infrastructures().Informer().HasSynced, configinformers.Config().V1().Networks().Informer().HasSynced, + configinformers.Config().V1().Proxies().Informer().HasSynced, ), }, cloudprovider.NewCloudProviderObserver( @@ -68,6 +71,7 @@ func NewConfigObserver( featuregates.NewObserveFeatureFlagsFunc(nil, []string{"extendedArguments", "feature-gates"}), network.ObserveClusterCIDRs, network.ObserveServiceClusterIPRanges, + proxy.NewProxyObserveFunc([]string{"targetconfigcontroller", "proxy"}), serviceca.ObserveServiceCA, clustername.ObserveInfraID, ), @@ -82,6 +86,7 @@ func NewConfigObserver( configinformers.Config().V1().FeatureGates().Informer().AddEventHandler(c.EventHandler()) configinformers.Config().V1().Infrastructures().Informer().AddEventHandler(c.EventHandler()) configinformers.Config().V1().Networks().Informer().AddEventHandler(c.EventHandler()) + configinformers.Config().V1().Proxies().Informer().AddEventHandler(c.EventHandler()) return c } diff --git a/pkg/operator/configobservation/interfaces.go b/pkg/operator/configobservation/interfaces.go index 79d8699d0..4a7f5bf94 100644 --- a/pkg/operator/configobservation/interfaces.go +++ b/pkg/operator/configobservation/interfaces.go @@ -15,6 +15,7 @@ type Listers struct { FeatureGateLister_ configlistersv1.FeatureGateLister InfrastructureLister_ configlistersv1.InfrastructureLister NetworkLister configlistersv1.NetworkLister + ProxyLister_ configlistersv1.ProxyLister ConfigMapLister corev1listers.ConfigMapLister ResourceSync resourcesynccontroller.ResourceSyncer @@ -29,6 +30,10 @@ func (l Listers) FeatureGateLister() configlistersv1.FeatureGateLister { return l.FeatureGateLister_ } +func (l Listers) ProxyLister() configlistersv1.ProxyLister { + return l.ProxyLister_ +} + func (l Listers) ResourceSyncer() resourcesynccontroller.ResourceSyncer { return l.ResourceSync } diff --git a/pkg/operator/targetconfigcontroller/targetconfigcontroller.go b/pkg/operator/targetconfigcontroller/targetconfigcontroller.go index 2deb38a18..e2f72a783 100644 --- a/pkg/operator/targetconfigcontroller/targetconfigcontroller.go +++ b/pkg/operator/targetconfigcontroller/targetconfigcontroller.go @@ -6,9 +6,11 @@ import ( "encoding/json" "fmt" "reflect" + "sort" "strings" "time" + yaml "gopkg.in/yaml.v2" corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -291,6 +293,20 @@ func managePod(configMapsGetter corev1client.ConfigMapsGetter, secretsGetter cor required.Spec.Containers[0].Args = append(required.Spec.Containers[0].Args, "--tls-private-key-file=/etc/kubernetes/static-pod-resources/secrets/serving-cert/tls.key") } + var observedConfig map[string]interface{} + if err := yaml.Unmarshal(operatorSpec.ObservedConfig.Raw, &observedConfig); err != nil { + return nil, false, fmt.Errorf("failed to unmarshal the observedConfig: %v", err) + } + proxyConfig, _, err := unstructured.NestedStringMap(observedConfig, "targetconfigcontroller", "proxy") + if err != nil { + return nil, false, fmt.Errorf("couldn't get the proxy config from observedConfig: %v", err) + } + + proxyEnvVars := proxyMapToEnvVars(proxyConfig) + for i, container := range required.Spec.Containers { + required.Spec.Containers[i].Env = append(container.Env, proxyEnvVars...) + } + configMap := resourceread.ReadConfigMapV1OrDie(v411_00_assets.MustAsset("v4.1.0/kube-controller-manager/pod-cm.yaml")) configMap.Data["pod.yaml"] = resourceread.WritePodV1OrDie(required) configMap.Data["forceRedeploymentReason"] = operatorSpec.ForceRedeploymentReason @@ -536,3 +552,18 @@ func (c *TargetConfigController) namespaceEventHandler() cache.ResourceEventHand }, } } + +func proxyMapToEnvVars(proxyConfig map[string]string) []corev1.EnvVar { + if proxyConfig == nil { + return nil + } + + envVars := []corev1.EnvVar{} + for k, v := range proxyConfig { + envVars = append(envVars, corev1.EnvVar{Name: k, Value: v}) + } + + // need to sort the slice so that kube-apiserver-pod configmap does not change all the time + sort.Slice(envVars, func(i, j int) bool { return envVars[i].Name < envVars[j].Name }) + return envVars +}