Files
open-cluster-management/pkg/operator/operators/clustermanager/options.go
Qing Hao c516beffa6
Some checks failed
Post / images (amd64, addon-manager) (push) Failing after 46s
Post / images (amd64, placement) (push) Failing after 41s
Post / images (amd64, registration-operator) (push) Failing after 39s
Post / images (amd64, work) (push) Failing after 42s
Post / images (arm64, addon-manager) (push) Failing after 39s
Post / images (arm64, placement) (push) Failing after 39s
Post / images (arm64, registration) (push) Failing after 40s
Post / images (arm64, registration-operator) (push) Failing after 42s
Post / images (arm64, work) (push) Failing after 39s
Post / images (amd64, registration) (push) Failing after 7m46s
Post / image manifest (addon-manager) (push) Has been skipped
Post / image manifest (placement) (push) Has been skipped
Post / image manifest (registration) (push) Has been skipped
Post / image manifest (registration-operator) (push) Has been skipped
Post / image manifest (work) (push) Has been skipped
Post / trigger clusteradm e2e (push) Has been skipped
Post / coverage (push) Failing after 14m33s
Scorecard supply-chain security / Scorecard analysis (push) Failing after 1m25s
Close stale issues and PRs / stale (push) Successful in 46s
Add addon conversion webhook for v1alpha1/v1beta1 API migration (#1289)
* Add addon conversion webhook for v1alpha1/v1beta1 API migration

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: Qing Hao <qhao@redhat.com>

* Fix GroupVersion compatibility issues after API dependency update

This commit fixes compilation and test errors introduced by updating
the API dependency to use native conversion functions from PR #411.

Changes include:

1. Fix GroupVersion type mismatches across the codebase:
   - Updated OwnerReference creation to use schema.GroupVersion
   - Fixed webhook scheme registration to use proper GroupVersion type
   - Applied fixes to addon, placement, migration, work, and registration controllers

2. Enhance addon conversion webhook:
   - Use native API conversion functions from addon/v1beta1/conversion.go
   - Fix InstallNamespace annotation key to match expected format
   - Add custom logic to populate deprecated ConfigReferent field in ConfigReferences
   - Properly preserve annotations during v1alpha1 <-> v1beta1 conversion

3. Remove duplicate conversion code:
   - Deleted pkg/addon/webhook/conversion/ directory (~500 lines)
   - Now using native conversion functions from the API repository

4. Patch vendored addon-framework:
   - Fixed GroupVersion errors in agentdeploy utils

All unit tests pass successfully (97 packages, 0 failures).

Signed-off-by: Qing Hao <qhao@redhat.com>

---------

Signed-off-by: Qing Hao <qhao@redhat.com>
Co-authored-by: Claude <noreply@anthropic.com>
2025-12-24 08:26:35 +00:00

144 lines
5.5 KiB
Go

package clustermanager
import (
"context"
"os"
"time"
"github.com/openshift/library-go/pkg/controller/controllercmd"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/fields"
"k8s.io/client-go/informers"
corev1informers "k8s.io/client-go/informers/core/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/klog/v2"
operatorclient "open-cluster-management.io/api/client/operator/clientset/versioned"
operatorinformer "open-cluster-management.io/api/client/operator/informers/externalversions"
"open-cluster-management.io/ocm/pkg/operator/helpers"
"open-cluster-management.io/ocm/pkg/operator/operators/clustermanager/controllers/certrotationcontroller"
"open-cluster-management.io/ocm/pkg/operator/operators/clustermanager/controllers/clustermanagercontroller"
"open-cluster-management.io/ocm/pkg/operator/operators/clustermanager/controllers/crdstatuccontroller"
"open-cluster-management.io/ocm/pkg/operator/operators/clustermanager/controllers/migrationcontroller"
clustermanagerstatuscontroller "open-cluster-management.io/ocm/pkg/operator/operators/clustermanager/controllers/statuscontroller"
)
type Options struct {
SkipRemoveCRDs bool
ControlPlaneNodeLabelSelector string
DeploymentReplicas int32
EnableSyncLabels bool
}
// RunClusterManagerOperator starts a new cluster manager operator
func (o *Options) RunClusterManagerOperator(ctx context.Context, controllerContext *controllercmd.ControllerContext) error {
// setting up contextual logger
logger := klog.NewKlogr()
podName := os.Getenv("POD_NAME")
if podName != "" {
logger = logger.WithValues("podName", podName)
}
ctx = klog.NewContext(ctx, logger)
// Build kubclient client and informer for managed cluster
kubeClient, err := kubernetes.NewForConfig(controllerContext.KubeConfig)
if err != nil {
return err
}
newOneTermInformer := func(name string) informers.SharedInformerFactory {
return informers.NewSharedInformerFactoryWithOptions(kubeClient, 5*time.Minute,
informers.WithTweakListOptions(func(options *metav1.ListOptions) {
options.FieldSelector = fields.OneTermEqualSelector("metadata.name", name).String()
}))
}
signerSecretInformer := newOneTermInformer(helpers.SignerSecret)
registrationSecretInformer := newOneTermInformer(helpers.RegistrationWebhookSecret)
workSecretInformer := newOneTermInformer(helpers.WorkWebhookSecret)
addonSecretInformer := newOneTermInformer(helpers.AddonWebhookSecret)
grpcServerSecretInformer := newOneTermInformer(helpers.GRPCServerSecret)
configmapInformer := newOneTermInformer(helpers.CaBundleConfigmap)
deploymentInformer := informers.NewSharedInformerFactoryWithOptions(kubeClient, 5*time.Minute,
informers.WithTweakListOptions(func(options *metav1.ListOptions) {
selector := &metav1.LabelSelector{
MatchExpressions: []metav1.LabelSelectorRequirement{
{
Key: helpers.HubLabelKey,
Operator: metav1.LabelSelectorOpExists,
},
},
}
options.LabelSelector = metav1.FormatLabelSelector(selector)
}))
secretInformers := map[string]corev1informers.SecretInformer{
helpers.SignerSecret: signerSecretInformer.Core().V1().Secrets(),
helpers.RegistrationWebhookSecret: registrationSecretInformer.Core().V1().Secrets(),
helpers.WorkWebhookSecret: workSecretInformer.Core().V1().Secrets(),
helpers.AddonWebhookSecret: addonSecretInformer.Core().V1().Secrets(),
helpers.GRPCServerSecret: grpcServerSecretInformer.Core().V1().Secrets(),
}
// Build operator client and informer
operatorClient, err := operatorclient.NewForConfig(controllerContext.KubeConfig)
if err != nil {
return err
}
operatorInformer := operatorinformer.NewSharedInformerFactory(operatorClient, 5*time.Minute)
clusterManagerController := clustermanagercontroller.NewClusterManagerController(
kubeClient,
controllerContext.KubeConfig,
operatorClient.OperatorV1().ClusterManagers(),
operatorInformer.Operator().V1().ClusterManagers(),
deploymentInformer.Apps().V1().Deployments(),
configmapInformer.Core().V1().ConfigMaps(),
o.SkipRemoveCRDs,
o.ControlPlaneNodeLabelSelector,
o.DeploymentReplicas,
controllerContext.OperatorNamespace,
o.EnableSyncLabels,
)
statusController := clustermanagerstatuscontroller.NewClusterManagerStatusController(
operatorClient.OperatorV1().ClusterManagers(),
operatorInformer.Operator().V1().ClusterManagers(),
deploymentInformer.Apps().V1().Deployments())
certRotationController := certrotationcontroller.NewCertRotationController(
kubeClient,
secretInformers,
configmapInformer.Core().V1().ConfigMaps(),
operatorInformer.Operator().V1().ClusterManagers())
crdMigrationController := migrationcontroller.NewCRDMigrationController(
controllerContext.KubeConfig,
kubeClient,
operatorClient.OperatorV1().ClusterManagers(),
operatorInformer.Operator().V1().ClusterManagers())
crdStatusController := crdstatuccontroller.NewCRDStatusController(
controllerContext.KubeConfig,
kubeClient,
operatorInformer.Operator().V1().ClusterManagers())
go operatorInformer.Start(ctx.Done())
go deploymentInformer.Start(ctx.Done())
go signerSecretInformer.Start(ctx.Done())
go registrationSecretInformer.Start(ctx.Done())
go workSecretInformer.Start(ctx.Done())
go addonSecretInformer.Start(ctx.Done())
go grpcServerSecretInformer.Start(ctx.Done())
go configmapInformer.Start(ctx.Done())
go clusterManagerController.Run(ctx, 1)
go statusController.Run(ctx, 1)
go certRotationController.Run(ctx, 1)
go crdMigrationController.Run(ctx, 1)
go crdStatusController.Run(ctx, 1)
<-ctx.Done()
return nil
}