diff --git a/cmd/core/main.go b/cmd/core/main.go index bee60cc9b..78d728c2d 100644 --- a/cmd/core/main.go +++ b/cmd/core/main.go @@ -138,6 +138,7 @@ func main() { flag.DurationVar(&clusterMetricsInterval, "cluster-metrics-interval", 15*time.Second, "The interval that ClusterMetricsMgr will collect metrics from clusters, default value is 15 seconds.") flag.BoolVar(&controllerArgs.EnableCompatibility, "enable-asi-compatibility", false, "enable compatibility for asi") flag.BoolVar(&controllerArgs.IgnoreAppWithoutControllerRequirement, "ignore-app-without-controller-version", false, "If true, application controller will not process the app without 'app.oam.dev/controller-version-require' annotation") + flag.BoolVar(&controllerArgs.IgnoreDefinitionWithoutControllerRequirement, "ignore-definition-without-controller-version", false, "If true, trait/component/workflowstep definition controller will not process the definition without 'definition.oam.dev/controller-version-require' annotation") standardcontroller.AddOptimizeFlags() standardcontroller.AddAdmissionFlags() flag.IntVar(&resourcekeeper.MaxDispatchConcurrent, "max-dispatch-concurrent", 10, "Set the max dispatch concurrent number, default is 10") diff --git a/pkg/controller/core.oam.dev/oamruntime_controller.go b/pkg/controller/core.oam.dev/oamruntime_controller.go index ba6f919bc..e5d6ac293 100644 --- a/pkg/controller/core.oam.dev/oamruntime_controller.go +++ b/pkg/controller/core.oam.dev/oamruntime_controller.go @@ -86,4 +86,7 @@ type Args struct { // IgnoreAppWithoutControllerRequirement indicates that application controller will not process the app without 'app.oam.dev/controller-version-require' annotation. IgnoreAppWithoutControllerRequirement bool + + // IgnoreDefinitionWithoutControllerRequirement indicates that trait/component/workflowstep definition controller will not process the definition without 'definition.oam.dev/controller-version-require' annotation. + IgnoreDefinitionWithoutControllerRequirement bool } diff --git a/pkg/controller/core.oam.dev/v1alpha2/core/components/componentdefinition/componentdefinition_controller.go b/pkg/controller/core.oam.dev/v1alpha2/core/components/componentdefinition/componentdefinition_controller.go index 31b9a5339..8aef5fefd 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/core/components/componentdefinition/componentdefinition_controller.go +++ b/pkg/controller/core.oam.dev/v1alpha2/core/components/componentdefinition/componentdefinition_controller.go @@ -43,17 +43,24 @@ import ( "github.com/oam-dev/kubevela/pkg/oam" "github.com/oam-dev/kubevela/pkg/oam/discoverymapper" "github.com/oam-dev/kubevela/pkg/oam/util" + "github.com/oam-dev/kubevela/version" ) // Reconciler reconciles a ComponentDefinition object type Reconciler struct { client.Client - dm discoverymapper.DiscoveryMapper - pd *packages.PackageDiscover - Scheme *runtime.Scheme - record event.Recorder + dm discoverymapper.DiscoveryMapper + pd *packages.PackageDiscover + Scheme *runtime.Scheme + record event.Recorder + options +} + +type options struct { defRevLimit int concurrentReconciles int + ignoreDefNoCtrlReq bool + controllerVersion string } // Reconcile is the main logic for ComponentDefinition controller @@ -68,6 +75,11 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu return ctrl.Result{}, client.IgnoreNotFound(err) } + if !r.matchControllerRequirement(&componentDefinition) { + klog.InfoS("skip componentDefinition: not match the controller requirement of componentDefinition", "componentDefinition", klog.KObj(&componentDefinition)) + return ctrl.Result{}, nil + } + // refresh package discover when componentDefinition is registered if componentDefinition.Spec.Workload.Type != types.AutoDetectWorkloadDefinition { err := utils.RefreshPackageDiscover(ctx, r.Client, r.dm, r.pd, &componentDefinition) @@ -187,12 +199,32 @@ func (r *Reconciler) SetupWithManager(mgr ctrl.Manager) error { // Setup adds a controller that reconciles ComponentDefinition. func Setup(mgr ctrl.Manager, args oamctrl.Args) error { r := Reconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - dm: args.DiscoveryMapper, - pd: args.PackageDiscover, - defRevLimit: args.DefRevisionLimit, - concurrentReconciles: args.ConcurrentReconciles, + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + dm: args.DiscoveryMapper, + pd: args.PackageDiscover, + options: parseOptions(args), } return r.SetupWithManager(mgr) } + +func parseOptions(args oamctrl.Args) options { + return options{ + defRevLimit: args.DefRevisionLimit, + concurrentReconciles: args.ConcurrentReconciles, + ignoreDefNoCtrlReq: args.IgnoreDefinitionWithoutControllerRequirement, + controllerVersion: version.VelaVersion, + } +} + +func (r *Reconciler) matchControllerRequirement(componentDefinition *v1beta1.ComponentDefinition) bool { + if componentDefinition.Annotations != nil { + if requireVersion, ok := componentDefinition.Annotations[oam.AnnotationControllerRequirement]; ok { + return requireVersion == r.controllerVersion + } + } + if r.ignoreDefNoCtrlReq { + return false + } + return true +} diff --git a/pkg/controller/core.oam.dev/v1alpha2/core/components/componentdefinition/componentdefinition_suit_test.go b/pkg/controller/core.oam.dev/v1alpha2/core/components/componentdefinition/componentdefinition_suit_test.go index dfd7507f9..a7ab900b8 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/core/components/componentdefinition/componentdefinition_suit_test.go +++ b/pkg/controller/core.oam.dev/v1alpha2/core/components/componentdefinition/componentdefinition_suit_test.go @@ -90,11 +90,13 @@ var _ = BeforeSuite(func(done Done) { Expect(err).ToNot(HaveOccurred()) r = Reconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - dm: dm, - pd: pd, - defRevLimit: defRevisionLimit, + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + dm: dm, + pd: pd, + options: options{ + defRevLimit: defRevisionLimit, + }, } Expect(r.SetupWithManager(mgr)).ToNot(HaveOccurred()) var ctx context.Context diff --git a/pkg/controller/core.oam.dev/v1alpha2/core/traits/traitdefinition/traitdefinition_controller.go b/pkg/controller/core.oam.dev/v1alpha2/core/traits/traitdefinition/traitdefinition_controller.go index cc7f7cd06..cabc2579d 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/core/traits/traitdefinition/traitdefinition_controller.go +++ b/pkg/controller/core.oam.dev/v1alpha2/core/traits/traitdefinition/traitdefinition_controller.go @@ -42,17 +42,24 @@ import ( "github.com/oam-dev/kubevela/pkg/oam" "github.com/oam-dev/kubevela/pkg/oam/discoverymapper" "github.com/oam-dev/kubevela/pkg/oam/util" + "github.com/oam-dev/kubevela/version" ) // Reconciler reconciles a TraitDefinition object type Reconciler struct { client.Client - dm discoverymapper.DiscoveryMapper - pd *packages.PackageDiscover - Scheme *runtime.Scheme - record event.Recorder + dm discoverymapper.DiscoveryMapper + pd *packages.PackageDiscover + Scheme *runtime.Scheme + record event.Recorder + options +} + +type options struct { defRevLimit int concurrentReconciles int + ignoreDefNoCtrlReq bool + controllerVersion string } // Reconcile is the main logic for TraitDefinition controller @@ -67,6 +74,11 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu return ctrl.Result{}, client.IgnoreNotFound(err) } + if !r.matchControllerRequirement(&traitdefinition) { + klog.InfoS("skip traitDefinition: not match the controller requirement of traitDefinition", "traitDefinition", klog.KObj(&traitdefinition)) + return ctrl.Result{}, nil + } + // this is a placeholder for finalizer here in the future if traitdefinition.DeletionTimestamp != nil { klog.InfoS("The TraitDefinition is being deleted", "traitDefinition", klog.KRef(req.Namespace, req.Name)) @@ -193,12 +205,32 @@ func (r *Reconciler) SetupWithManager(mgr ctrl.Manager) error { // Setup adds a controller that reconciles TraitDefinition. func Setup(mgr ctrl.Manager, args oamctrl.Args) error { r := Reconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - dm: args.DiscoveryMapper, - pd: args.PackageDiscover, - defRevLimit: args.DefRevisionLimit, - concurrentReconciles: args.ConcurrentReconciles, + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + dm: args.DiscoveryMapper, + pd: args.PackageDiscover, + options: parseOptions(args), } return r.SetupWithManager(mgr) } + +func parseOptions(args oamctrl.Args) options { + return options{ + defRevLimit: args.DefRevisionLimit, + concurrentReconciles: args.ConcurrentReconciles, + ignoreDefNoCtrlReq: args.IgnoreDefinitionWithoutControllerRequirement, + controllerVersion: version.VelaVersion, + } +} + +func (r *Reconciler) matchControllerRequirement(traitDefinition *v1beta1.TraitDefinition) bool { + if traitDefinition.Annotations != nil { + if requireVersion, ok := traitDefinition.Annotations[oam.AnnotationControllerRequirement]; ok { + return requireVersion == r.controllerVersion + } + } + if r.ignoreDefNoCtrlReq { + return false + } + return true +} diff --git a/pkg/controller/core.oam.dev/v1alpha2/core/traits/traitdefinition/traitdefinition_suite_test.go b/pkg/controller/core.oam.dev/v1alpha2/core/traits/traitdefinition/traitdefinition_suite_test.go index e314dbf0d..360cf6b2f 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/core/traits/traitdefinition/traitdefinition_suite_test.go +++ b/pkg/controller/core.oam.dev/v1alpha2/core/traits/traitdefinition/traitdefinition_suite_test.go @@ -90,11 +90,13 @@ var _ = BeforeSuite(func(done Done) { Expect(err).ToNot(HaveOccurred()) r = Reconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - dm: dm, - pd: pd, - defRevLimit: defRevisionLimit, + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + dm: dm, + pd: pd, + options: options{ + defRevLimit: defRevisionLimit, + }, } Expect(r.SetupWithManager(mgr)).ToNot(HaveOccurred()) var ctx context.Context diff --git a/pkg/controller/core.oam.dev/v1alpha2/core/workflow/workflowstepdefinition/suite_test.go b/pkg/controller/core.oam.dev/v1alpha2/core/workflow/workflowstepdefinition/suite_test.go index 4983d075f..b343fc6d2 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/core/workflow/workflowstepdefinition/suite_test.go +++ b/pkg/controller/core.oam.dev/v1alpha2/core/workflow/workflowstepdefinition/suite_test.go @@ -90,11 +90,13 @@ var _ = BeforeSuite(func(done Done) { Expect(err).ToNot(HaveOccurred()) r = Reconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - dm: dm, - pd: pd, - defRevLimit: defRevisionLimit, + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + dm: dm, + pd: pd, + options: options{ + defRevLimit: defRevisionLimit, + }, } Expect(r.SetupWithManager(mgr)).ToNot(HaveOccurred()) var ctx context.Context diff --git a/pkg/controller/core.oam.dev/v1alpha2/core/workflow/workflowstepdefinition/workflowstepdefinition_controller.go b/pkg/controller/core.oam.dev/v1alpha2/core/workflow/workflowstepdefinition/workflowstepdefinition_controller.go index 165725d42..c5521336b 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/core/workflow/workflowstepdefinition/workflowstepdefinition_controller.go +++ b/pkg/controller/core.oam.dev/v1alpha2/core/workflow/workflowstepdefinition/workflowstepdefinition_controller.go @@ -42,17 +42,24 @@ import ( "github.com/oam-dev/kubevela/pkg/oam" "github.com/oam-dev/kubevela/pkg/oam/discoverymapper" "github.com/oam-dev/kubevela/pkg/oam/util" + "github.com/oam-dev/kubevela/version" ) // Reconciler reconciles a WorkflowStepDefinition object type Reconciler struct { client.Client - dm discoverymapper.DiscoveryMapper - pd *packages.PackageDiscover - Scheme *runtime.Scheme - record event.Recorder + dm discoverymapper.DiscoveryMapper + pd *packages.PackageDiscover + Scheme *runtime.Scheme + record event.Recorder + options +} + +type options struct { defRevLimit int concurrentReconciles int + ignoreDefNoCtrlReq bool + controllerVersion string } // Reconcile is the main logic for WorkflowStepDefinition controller @@ -68,6 +75,11 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu return ctrl.Result{}, client.IgnoreNotFound(err) } + if !r.matchControllerRequirement(&wfstepdefinition) { + klog.InfoS("skip workflowStepDefinition: not match the controller requirement of workflowStepDefinition", "workflowStepDefinition", klog.KObj(&wfstepdefinition)) + return ctrl.Result{}, nil + } + // this is a placeholder for finalizer here in the future if wfstepdefinition.DeletionTimestamp != nil { return ctrl.Result{}, nil @@ -192,11 +204,32 @@ func (r *Reconciler) SetupWithManager(mgr ctrl.Manager) error { // Setup adds a controller that reconciles WorkflowStepDefinition. func Setup(mgr ctrl.Manager, args oamctrl.Args) error { r := Reconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - dm: args.DiscoveryMapper, - pd: args.PackageDiscover, - defRevLimit: args.DefRevisionLimit, + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + dm: args.DiscoveryMapper, + pd: args.PackageDiscover, + options: parseOptions(args), } return r.SetupWithManager(mgr) } + +func parseOptions(args oamctrl.Args) options { + return options{ + defRevLimit: args.DefRevisionLimit, + concurrentReconciles: args.ConcurrentReconciles, + ignoreDefNoCtrlReq: args.IgnoreDefinitionWithoutControllerRequirement, + controllerVersion: version.VelaVersion, + } +} + +func (r *Reconciler) matchControllerRequirement(wfstepdefinition *v1beta1.WorkflowStepDefinition) bool { + if wfstepdefinition.Annotations != nil { + if requireVersion, ok := wfstepdefinition.Annotations[oam.AnnotationControllerRequirement]; ok { + return requireVersion == r.controllerVersion + } + } + if r.ignoreDefNoCtrlReq { + return false + } + return true +} diff --git a/pkg/oam/labels.go b/pkg/oam/labels.go index ef0cab481..e903c44dc 100644 --- a/pkg/oam/labels.go +++ b/pkg/oam/labels.go @@ -201,7 +201,7 @@ const ( // AnnotationWorkloadName indicates the managed workload's name by trait AnnotationWorkloadName = "trait.oam.dev/workload-name" - // AnnotationControllerRequirement indicates the controller version that can process the application. + // AnnotationControllerRequirement indicates the controller version that can process the application/definition. AnnotationControllerRequirement = "app.oam.dev/controller-version-require" // AnnotationApplicationServiceAccountName indicates the name of the ServiceAccount to use to apply Components and run Workflow.