Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 21 additions & 89 deletions controllers/updateservice_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (

"github.com/go-logr/logr"
conditionsv1 "github.com/openshift/custom-resource-status/conditions/v1"
ophandler "github.com/operator-framework/operator-lib/handler"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
policyv1beta1 "k8s.io/api/policy/v1beta1"
Expand All @@ -16,12 +15,9 @@ import (
"k8s.io/apimachinery/pkg/types"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
"sigs.k8s.io/controller-runtime/pkg/handler"
logf "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/manager"
"sigs.k8s.io/controller-runtime/pkg/predicate"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
"sigs.k8s.io/controller-runtime/pkg/source"

Expand All @@ -34,93 +30,15 @@ import (

var log = logf.Log.WithName("controller_updateservice")

// Options holds settings for the reconciler
type Options struct {
// OperandImage is the full reference to a container image for the operand.
OperandImage string
}

// Add creates a new UpdateService Controller and adds it to the Manager. The Manager will set fields on the Controller
// and Start it when the Manager is Started.
func Add(mgr manager.Manager, options Options) error {
return add(mgr, newReconciler(mgr, options))
}

// newReconciler returns a new reconcile.Reconciler
func newReconciler(mgr manager.Manager, options Options) reconcile.Reconciler {
return &UpdateServiceReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
operandImage: options.OperandImage,
}
}

// add adds a new Controller to mgr with r as the reconcile.Reconciler
func add(mgr manager.Manager, r reconcile.Reconciler) error {
// Create a new controller
c, err := controller.New("updateservice-controller", mgr, controller.Options{Reconciler: r})
if err != nil {
return err
}

// Watch for changes to set metrics
err = c.Watch(&source.Kind{Type: &cv1.UpdateService{}}, &ophandler.InstrumentedEnqueueRequestForObject{})
if err != nil {
return err
}

// Watch for changes to primary resource UpdateService
err = c.Watch(&source.Kind{Type: &cv1.UpdateService{}}, &handler.EnqueueRequestForObject{})
if err != nil {
return err
}

// Watch for changes to secondary resources
for _, obj := range []runtime.Object{
&appsv1.Deployment{},
&corev1.ConfigMap{},
&corev1.Service{},
&policyv1beta1.PodDisruptionBudget{},
&routev1.Route{},
} {
err = c.Watch(&source.Kind{Type: obj}, &handler.EnqueueRequestForOwner{
IsController: true,
OwnerType: &cv1.UpdateService{},
})
if err != nil {
return err
}
}

// Watch for all Image changes, only Reconcile when image found is named defaults.ImageConfigName and is at cluster level
err = c.Watch(&source.Kind{Type: &apicfgv1.Image{}},
&handler.EnqueueRequestsFromMapFunc{ToRequests: &mapper{mgr.GetClient()}},
predicate.GenerationChangedPredicate{})
if err != nil {
log.Error(err, "Error watching ImageConfig API")
return err
}

//Watch for all ConfigMap changes, only Reconcile when name == Image.Spec.AdditionalTrustedCA.Name
err = c.Watch(&source.Kind{Type: &corev1.ConfigMap{}},
&handler.EnqueueRequestsFromMapFunc{ToRequests: &mapper{mgr.GetClient()}},
)
if err != nil {
log.Error(err, "Error watching ConfigMap API")
return err
}

return nil
}

// blank assignment to verify that ReconcileUpdateService implements reconcile.Reconciler
var _ reconcile.Reconciler = &UpdateServiceReconciler{}

// UpdateServiceReconciler reconciles a UpdateService object
type UpdateServiceReconciler struct {
Client client.Client
Scheme *runtime.Scheme
operandImage string
Log logr.Logger
OperandImage string
}

// +kubebuilder:rbac:groups="",resources=pods,verbs=get
Expand Down Expand Up @@ -182,7 +100,7 @@ func (r *UpdateServiceReconciler) Reconcile(req ctrl.Request) (ctrl.Result, erro
// 'newKubeResources' creates all the kube resources we need and holds
// them in 'resources' as the canonical reference for those resources
// during reconciliation.
resources, err := newKubeResources(instanceCopy, r.operandImage, ps, cm)
resources, err := newKubeResources(instanceCopy, r.OperandImage, ps, cm)
if err != nil {
reqLogger.Error(err, "Failed to render resources")
return ctrl.Result{}, err
Expand Down Expand Up @@ -664,9 +582,23 @@ func (r *UpdateServiceReconciler) ensureSecret(ctx context.Context, reqLogger lo
return nil
}

/*
func (r *UpdateServiceReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
For(&cv1.UpdateService{}).
mapped := &mapper{mgr.GetClient()}

return ctrl.NewControllerManagedBy(mgr).
For(&cv1.UpdateService{}).
Owns(&appsv1.Deployment{}).
Owns(&corev1.ConfigMap{}).
Owns(&corev1.Service{}).
Owns(&policyv1beta1.PodDisruptionBudget{}).
Owns(&routev1.Route{}).
Watches(
&source.Kind{Type: &apicfgv1.Image{}},
&handler.EnqueueRequestsFromMapFunc{ToRequests: mapped},
).
Watches(
&source.Kind{Type: &corev1.ConfigMap{}},
&handler.EnqueueRequestsFromMapFunc{ToRequests: mapped},
).
Complete(r)
}
*/
1 change: 0 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ require (
github.com/openshift/cluster-image-registry-operator v0.0.0-20200919005020-e202ec478417
github.com/openshift/custom-resource-status v0.0.0-20200602122900-c002fd1547ca
github.com/openshift/library-go v0.0.0-20201109112824-093ad3cf6600
github.com/operator-framework/operator-lib v0.1.0
github.com/stretchr/testify v1.5.1
go.uber.org/zap v1.15.0 // indirect
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e // indirect
Expand Down
2 changes: 0 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -410,8 +410,6 @@ github.com/openshift/library-go v0.0.0-20200731053141-ff55255233e3/go.mod h1:q7e
github.com/openshift/library-go v0.0.0-20201109112824-093ad3cf6600 h1:BjzxCCiWcRwOq3LAKZxZWmY6wD85D5462KpG1p7zMRw=
github.com/openshift/library-go v0.0.0-20201109112824-093ad3cf6600/go.mod h1:1xYaYQcQsn+AyCRsvOU+Qn5z6GGiCmcblXkT/RZLVfo=
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/operator-framework/operator-lib v0.1.0 h1:7Qy6v2ZccvCeFLWEkrGnN+U+DkaeIWp0gAZaBM9T3DI=
github.com/operator-framework/operator-lib v0.1.0/go.mod h1:HLw61JTIEeq0YLeVf4dwYx/zt4DmLGZUVWI1y3Lf5Hg=
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
Expand Down
108 changes: 34 additions & 74 deletions main.go
Original file line number Diff line number Diff line change
@@ -1,32 +1,29 @@
package main

import (
"context"
"errors"
"flag"
"fmt"
"os"
"runtime"
"strings"

// Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)
apiruntime "k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
_ "k8s.io/client-go/plugin/pkg/client/auth"

"github.com/operator-framework/operator-lib/leader"
"sigs.k8s.io/controller-runtime/pkg/cache"
"sigs.k8s.io/controller-runtime/pkg/client/config"
"sigs.k8s.io/controller-runtime/pkg/manager"

configv1 "github.com/openshift/api/config/v1"
routev1 "github.com/openshift/api/route/v1"

updateservicev1 "github.com/openshift/cincinnati-operator/api/v1"
uscontroller "github.com/openshift/cincinnati-operator/controllers"
"github.com/openshift/cincinnati-operator/controllers"
"github.com/openshift/cincinnati-operator/version"

_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
// +kubebuilder:scaffold:imports
)

// Change below variables to serve metrics on different host or port.
Expand All @@ -37,9 +34,18 @@ var (
)

var (
log = ctrl.Log.WithName("cmd")
scheme = apiruntime.NewScheme()
log = ctrl.Log.WithName("cmd")
)

func init() {
utilruntime.Must(configv1.AddToScheme(scheme))
utilruntime.Must(clientgoscheme.AddToScheme(scheme))
utilruntime.Must(routev1.AddToScheme(scheme))
utilruntime.Must(updateservicev1.AddToScheme(scheme))
// +kubebuilder:scaffold:scheme
}

func printVersion() {
log.Info(fmt.Sprintf("Operator Version: %s", version.Version))
log.Info(fmt.Sprintf("Go Version: %s", runtime.Version()))
Expand Down Expand Up @@ -73,85 +79,39 @@ func main() {

printVersion()

namespace, err := getWatchNamespace()
_, err := getWatchNamespace()
if err != nil {
log.Error(err, "unable to get WatchNamespace; unable to start manager")
os.Exit(1)
}
log.Info(fmt.Sprintf("Namespace: %s", namespace))

// Get a config to talk to the apiserver
cfg, err := config.GetConfig()
if err != nil {
log.Error(err, "")
os.Exit(1)
}

ctx := context.TODO()
// Become the leader before proceeding
err = leader.Become(ctx, "updateservice-operator-lock")
if err != nil {
log.Error(err, "Could not become leader")
os.Exit(1)
}

// Set default manager options
options := manager.Options{
Namespace: namespace,
MetricsBindAddress: fmt.Sprintf("%s:%d", metricsHost, metricsPort),
}

// Add support for MultiNamespace set in WATCH_NAMESPACE (e.g ns1,ns2)
// Note that this is not intended to be used for excluding namespaces, this is better done via a Predicate
// Also note that you may face performance issues when using this with a high number of namespaces.
// More Info: https://godoc.org/github.com/kubernetes-sigs/controller-runtime/pkg/cache#MultiNamespacedCacheBuilder
if strings.Contains(namespace, ",") {
options.Namespace = ""
options.NewCache = cache.MultiNamespacedCacheBuilder(strings.Split(namespace, ","))
}

// Create a new manager to provide shared dependencies and start components
mgr, err := manager.New(cfg, options)
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
Scheme: scheme,
MetricsBindAddress: metricsAddr,
Port: 9443,
LeaderElection: enableLeaderElection,
LeaderElectionID: "2b19ccee.openshift.io",
})
if err != nil {
log.Error(err, "")
os.Exit(1)
}

log.Info("Registering Components.")

// Setup Scheme for all resources
if err := updateservicev1.AddToScheme(mgr.GetScheme()); err != nil {
log.Error(err, "")
os.Exit(1)
}

if err := configv1.Install(mgr.GetScheme()); err != nil {
log.Error(err, "")
log.Error(err, "unable to start manager")
os.Exit(1)
}

if err := routev1.Install(mgr.GetScheme()); err != nil {
log.Error(err, "")
os.Exit(1)
}

opts := uscontroller.Options{
OperandImage: os.Getenv("OPERAND_IMAGE"),
}
if opts.OperandImage == "" {
operandImage := os.Getenv("OPERAND_IMAGE")
if operandImage == "" {
log.Error(errors.New("Must set envvar OPERAND_IMAGE"), "")
os.Exit(1)
}
// Usually this is done with an init() function in the package, but since we
// need to provide input, we're doing it here instead.
uscontroller.AddToManagerFuncs = append(uscontroller.AddToManagerFuncs, func(mgr manager.Manager) error {
return uscontroller.Add(mgr, opts)
})
// Setup UpdateService controllers
if err := uscontroller.AddToManager(mgr); err != nil {
log.Error(err, "")
if err = (&controllers.UpdateServiceReconciler{
Client: mgr.GetClient(),
Log: ctrl.Log.WithName("controllers").WithName("UpdateService"),
Scheme: mgr.GetScheme(),
OperandImage: operandImage,
}).SetupWithManager(mgr); err != nil {
log.Error(err, "unable to create controller", "controller", "UpdateService")
os.Exit(1)
}
// +kubebuilder:scaffold:builder

log.Info("Starting the Cmd.")

Expand Down
Loading