Skip to content

Commit ea9b449

Browse files
tmshortclaude
andauthored
Integrate APIServer TLS controller into Catalog operator (#3745)
Adds cluster-wide TLS configuration support to the Catalog operator's HTTPS metrics/health server on OpenShift clusters, matching the OLM operator. On OpenShift, the metrics server now automatically adopts cluster-wide TLS security profiles (Old, Intermediate, Modern, Custom) without restart. Signed-off-by: Todd Short <todd.short@me.com> Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent c220d11 commit ea9b449

1 file changed

Lines changed: 51 additions & 10 deletions

File tree

cmd/catalog/main.go

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
1111
apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
1212

13+
configclientset "github.com/openshift/client-go/config/clientset/versioned"
1314
configv1client "github.com/openshift/client-go/config/clientset/versioned/typed/config/v1"
1415
"github.com/sirupsen/logrus"
1516
k8sscheme "k8s.io/client-go/kubernetes/scheme"
@@ -19,6 +20,8 @@ import (
1920
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client"
2021
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog"
2122
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalogtemplate"
23+
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/apiserver"
24+
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/openshiftconfig"
2225
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient"
2326
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorstatus"
2427
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/server"
@@ -63,10 +66,53 @@ func (o *options) run(ctx context.Context, logger *logrus.Logger) error {
6366
return fmt.Errorf("error configuring client: %s", err.Error())
6467
}
6568

69+
configClient, err := configv1client.NewForConfig(config)
70+
if err != nil {
71+
return fmt.Errorf("error configuring client: %s", err.Error())
72+
}
73+
opClient := operatorclient.NewClientFromConfig(o.kubeconfig, logger)
74+
crClient, err := client.NewClient(o.kubeconfig)
75+
if err != nil {
76+
return fmt.Errorf("error configuring client: %s", err.Error())
77+
}
78+
79+
// Setup APIServer TLS configuration for HTTPS servers
80+
discovery := opClient.KubernetesInterface().Discovery()
81+
openshiftConfigAPIExists, err := openshiftconfig.IsAPIAvailable(discovery)
82+
if err != nil {
83+
return fmt.Errorf("error checking for OpenShift config API support: %w", err)
84+
}
85+
86+
apiServerTLSQuerier := apiserver.NoopQuerier()
87+
var apiServerFactory interface{ Start(<-chan struct{}) }
88+
if openshiftConfigAPIExists {
89+
logger.Info("OpenShift APIServer API available - setting up watch for APIServer TLS configuration")
90+
91+
versionedConfigClient, err := configclientset.NewForConfig(config)
92+
if err != nil {
93+
return fmt.Errorf("error configuring openshift config client: %w", err)
94+
}
95+
96+
apiServerInformer, apiServerSyncer, querier, factory, err := apiserver.NewSyncer(logger, versionedConfigClient)
97+
if err != nil {
98+
return fmt.Errorf("error initializing APIServer TLS syncer: %w", err)
99+
}
100+
101+
logger.Info("APIServer TLS configuration will be applied to HTTPS servers")
102+
apiServerTLSQuerier = querier
103+
104+
// Register event handlers for APIServer resource changes
105+
apiserver.RegisterEventHandlers(apiServerInformer, apiServerSyncer)
106+
107+
apiServerFactory = factory
108+
}
109+
110+
// Setup metrics/health server with TLS configuration
66111
listenAndServe, err := server.GetListenAndServeFunc(
67112
server.WithLogger(logger),
68113
server.WithTLS(&o.tlsCertPath, &o.tlsKeyPath, &o.clientCAPath),
69114
server.WithKubeConfig(config),
115+
server.WithAPIServerTLSQuerier(apiServerTLSQuerier),
70116
server.WithDebug(o.debug),
71117
)
72118
if err != nil {
@@ -79,16 +125,6 @@ func (o *options) run(ctx context.Context, logger *logrus.Logger) error {
79125
}
80126
}()
81127

82-
configClient, err := configv1client.NewForConfig(config)
83-
if err != nil {
84-
return fmt.Errorf("error configuring client: %s", err.Error())
85-
}
86-
opClient := operatorclient.NewClientFromConfig(o.kubeconfig, logger)
87-
crClient, err := client.NewClient(o.kubeconfig)
88-
if err != nil {
89-
return fmt.Errorf("error configuring client: %s", err.Error())
90-
}
91-
92128
workloadUserID := int64(-1)
93129
if o.setWorkloadUserID {
94130
workloadUserID = defaultWorkLoadUserID
@@ -139,6 +175,11 @@ func (o *options) run(ctx context.Context, logger *logrus.Logger) error {
139175
opCatalogTemplate.Run(ctx)
140176
<-opCatalogTemplate.Ready()
141177

178+
// Start APIServer TLS informer factory if on OpenShift
179+
if apiServerFactory != nil {
180+
apiServerFactory.Start(ctx.Done())
181+
}
182+
142183
if o.writeStatusName != "" {
143184
operatorstatus.MonitorClusterStatus(o.writeStatusName, op.AtLevel(), op.Done(), opClient, configClient, crClient, logger)
144185
}

0 commit comments

Comments
 (0)