github.imxd.top/operator-framework/operator-sdk@v0.8.2/pkg/ansible/controller/controller.go (about) 1 // Copyright 2018 The Operator-SDK Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package controller 16 17 import ( 18 "fmt" 19 "os" 20 "strings" 21 "time" 22 23 "github.com/operator-framework/operator-sdk/pkg/ansible/events" 24 "github.com/operator-framework/operator-sdk/pkg/ansible/runner" 25 "github.com/operator-framework/operator-sdk/pkg/predicate" 26 27 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 28 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" 29 "k8s.io/apimachinery/pkg/runtime" 30 "k8s.io/apimachinery/pkg/runtime/schema" 31 "sigs.k8s.io/controller-runtime/pkg/controller" 32 crthandler "sigs.k8s.io/controller-runtime/pkg/handler" 33 "sigs.k8s.io/controller-runtime/pkg/manager" 34 logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" 35 "sigs.k8s.io/controller-runtime/pkg/source" 36 ) 37 38 var log = logf.Log.WithName("ansible-controller") 39 40 // Options - options for your controller 41 type Options struct { 42 EventHandlers []events.EventHandler 43 LoggingLevel events.LogLevel 44 Runner runner.Runner 45 GVK schema.GroupVersionKind 46 ReconcilePeriod time.Duration 47 ManageStatus bool 48 WatchDependentResources bool 49 WatchClusterScopedResources bool 50 MaxWorkers int 51 } 52 53 // Add - Creates a new ansible operator controller and adds it to the manager 54 func Add(mgr manager.Manager, options Options) *controller.Controller { 55 log.Info("Watching resource", "Options.Group", options.GVK.Group, "Options.Version", options.GVK.Version, "Options.Kind", options.GVK.Kind) 56 if options.EventHandlers == nil { 57 options.EventHandlers = []events.EventHandler{} 58 } 59 eventHandlers := append(options.EventHandlers, events.NewLoggingEventHandler(options.LoggingLevel)) 60 61 aor := &AnsibleOperatorReconciler{ 62 Client: mgr.GetClient(), 63 GVK: options.GVK, 64 Runner: options.Runner, 65 EventHandlers: eventHandlers, 66 ReconcilePeriod: options.ReconcilePeriod, 67 ManageStatus: options.ManageStatus, 68 } 69 70 scheme := mgr.GetScheme() 71 _, err := scheme.New(options.GVK) 72 if runtime.IsNotRegisteredError(err) { 73 // Register the GVK with the schema 74 scheme.AddKnownTypeWithName(options.GVK, &unstructured.Unstructured{}) 75 metav1.AddToGroupVersion(mgr.GetScheme(), schema.GroupVersion{ 76 Group: options.GVK.Group, 77 Version: options.GVK.Version, 78 }) 79 } else if err != nil { 80 log.Error(err, "") 81 os.Exit(1) 82 } 83 84 //Create new controller runtime controller and set the controller to watch GVK. 85 c, err := controller.New(fmt.Sprintf("%v-controller", strings.ToLower(options.GVK.Kind)), mgr, controller.Options{ 86 Reconciler: aor, 87 MaxConcurrentReconciles: options.MaxWorkers, 88 }) 89 if err != nil { 90 log.Error(err, "") 91 os.Exit(1) 92 } 93 u := &unstructured.Unstructured{} 94 u.SetGroupVersionKind(options.GVK) 95 if err := c.Watch(&source.Kind{Type: u}, &crthandler.EnqueueRequestForObject{}, predicate.GenerationChangedPredicate{}); err != nil { 96 log.Error(err, "") 97 os.Exit(1) 98 } 99 return &c 100 }