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
87 changes: 65 additions & 22 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ func main() {
ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts)))

if err := util.InspectCluster(); err != nil {
setupLog.Info("unable to inspect cluster")
setupLog.Error(err, "unable to inspect cluster")
}
Comment thread
anandrkskd marked this conversation as resolved.

disableHTTP2 := func(c *tls.Config) {
Expand Down Expand Up @@ -198,18 +198,52 @@ func main() {
client = mgr.GetClient()
}

registerComponentOrExit(mgr, console.AddToScheme)
registerComponentOrExit(mgr, routev1.AddToScheme) // Adding the routev1 api
registerComponentOrExit(mgr, operatorsv1.AddToScheme)
registerComponentOrExit(mgr, operatorsv1alpha1.AddToScheme)
// Setup Scheme for OpenShift Console if available (verified by InspectCluster)
if util.IsConsoleAPIFound() {
registerComponentOrExit(mgr, console.AddToScheme)
}

// Setup Scheme for OpenShift Route if available (verified by InspectCluster)
if util.IsRouteAPIFound() {
registerComponentOrExit(mgr, routev1.AddToScheme)
}

// Setup Scheme for Prometheus Operator if available (verified by InspectCluster)
if util.IsMonitoringAPIFound() {
registerComponentOrExit(mgr, monitoringv1.AddToScheme)
}

// Setup Scheme for OLM if available (verified by InspectCluster)
if util.IsOLMAPIFound() {
registerComponentOrExit(mgr, operatorsv1.AddToScheme)
registerComponentOrExit(mgr, operatorsv1alpha1.AddToScheme)
}

registerComponentOrExit(mgr, argov1alpha1api.AddToScheme)
registerComponentOrExit(mgr, argov1beta1api.AddToScheme)
registerComponentOrExit(mgr, configv1.AddToScheme)
registerComponentOrExit(mgr, monitoringv1.AddToScheme)

// Setup Scheme for OpenShift Config if available
if util.IsConfigAPIFound() {
registerComponentOrExit(mgr, configv1.AddToScheme)
}

registerComponentOrExit(mgr, rolloutManagerApi.AddToScheme)
registerComponentOrExit(mgr, templatev1.AddToScheme)
registerComponentOrExit(mgr, appsv1.AddToScheme)
registerComponentOrExit(mgr, oauthv1.AddToScheme)

// Setup Scheme for OpenShift Template if available (verified by InspectCluster)
if util.IsTemplateAPIFound() {
registerComponentOrExit(mgr, templatev1.AddToScheme)
}

// Setup Scheme for OpenShift Apps if available (verified by InspectCluster)
if util.IsAppsAPIFound() {
registerComponentOrExit(mgr, appsv1.AddToScheme)
}

// Setup Scheme for OpenShift OAuth if available (verified by InspectCluster)
if util.IsOAuthAPIFound() {
registerComponentOrExit(mgr, oauthv1.AddToScheme)
}

registerComponentOrExit(mgr, crdv1.AddToScheme)

// Start webhook only if ENABLE_CONVERSION_WEBHOOK is set
Expand All @@ -229,21 +263,30 @@ func main() {
os.Exit(1)
}

if err = (&controllers.ReconcileArgoCDRoute{
Client: client,
Scheme: mgr.GetScheme(),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "Argo CD route")
os.Exit(1)
if util.IsRouteAPIFound() {
if err = (&controllers.ReconcileArgoCDRoute{
Client: client,
Scheme: mgr.GetScheme(),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "Argo CD route")
os.Exit(1)
}
} else {
setupLog.Info("Route API not found, skipping ReconcileArgoCDRoute controller setup")
}

if err = (&controllers.ArgoCDMetricsReconciler{
Client: client,
Scheme: mgr.GetScheme(),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "Argo CD metrics")
os.Exit(1)
if util.IsMonitoringAPIFound() {
if err = (&controllers.ArgoCDMetricsReconciler{
Client: client,
Scheme: mgr.GetScheme(),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "Argo CD metrics")
os.Exit(1)
}
} else {
setupLog.Info("Monitoring API not found, skipping Argo CD metrics controller setup")
}

// Check the label selector format eg. "foo=bar"
if _, err := labels.Parse(labelSelectorFlag); err != nil {
setupLog.Error(err, "error parsing the labelSelector '%s'.", labelSelectorFlag)
Expand Down
5 changes: 3 additions & 2 deletions controllers/argocd_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,9 @@ func isConsoleLinkDisabled() bool {

// SetupWithManager sets up the controller with the Manager.
func (r *ReconcileArgoCDRoute) SetupWithManager(mgr ctrl.Manager) error {
// Watch for changes to argocd-server route in the default argocd instance namespace
// The ConsoleLink holds the route URL and should be regenerated when route is updated
if !util.IsRouteAPIFound() {
return nil
}

return ctrl.NewControllerManagedBy(mgr).
For(&routev1.Route{}, builder.WithPredicates(filterPredicate(filterArgoCDRoute))).
Expand Down
27 changes: 17 additions & 10 deletions controllers/gitopsservice_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,15 +101,20 @@ func (r *ReconcileGitopsService) SetupWithManager(mgr ctrl.Manager) error {
reqLogger.Error(err, "Failed to create GitOps service instance")
}

return ctrl.NewControllerManagedBy(mgr).
bldr := ctrl.NewControllerManagedBy(mgr).
For(&pipelinesv1alpha1.GitopsService{}, builder.WithPredicates(pred)).
Owns(&rbacv1.ClusterRoleBinding{}).
Owns(&rbacv1.ClusterRole{}).
Owns(&corev1.ServiceAccount{}).
Owns(&corev1.ConfigMap{}).
Owns(&appsv1.Deployment{}, builder.WithPredicates(pred)).
Owns(&corev1.Service{}, builder.WithPredicates(pred)).
Owns(&routev1.Route{}, builder.WithPredicates(pred)).
Owns(&corev1.Service{}, builder.WithPredicates(pred))

if util.IsRouteAPIFound() {
bldr = bldr.Owns(&routev1.Route{}, builder.WithPredicates(pred))
}

return bldr.
Watches(
&corev1.Namespace{},
&handler.EnqueueRequestForObject{},
Expand Down Expand Up @@ -344,14 +349,16 @@ func (r *ReconcileGitopsService) cleanKAMResources(ctx context.Context, reqLogge
}

// KAM Route
cleanupKAMRoute := &routev1.Route{}
if err := r.Client.Get(ctx, types.NamespacedName{Name: kamResourceName, Namespace: serviceNamespace}, cleanupKAMRoute); err == nil {
reqLogger.Info("Detected unsupported KAM Route, deleting", "Name", kamResourceName, "Namespace", serviceNamespace)
if err := r.Client.Delete(ctx, cleanupKAMRoute); err != nil && !errors.IsNotFound(err) {
reqLogger.Error(err, "Failed to delete KAM Route", "Name", kamResourceName, "Namespace", serviceNamespace)
if util.IsRouteAPIFound() {
cleanupKAMRoute := &routev1.Route{}
if err := r.Client.Get(ctx, types.NamespacedName{Name: kamResourceName, Namespace: serviceNamespace}, cleanupKAMRoute); err == nil {
reqLogger.Info("Detected unsupported KAM Route, deleting", "Name", kamResourceName, "Namespace", serviceNamespace)
if err := r.Client.Delete(ctx, cleanupKAMRoute); err != nil && !errors.IsNotFound(err) {
reqLogger.Error(err, "Failed to delete KAM Route", "Name", kamResourceName, "Namespace", serviceNamespace)
}
} else if !errors.IsNotFound(err) {
reqLogger.Error(err, "Failed to retrieve KAM Route", "Name", kamResourceName, "Namespace", serviceNamespace)
}
} else if !errors.IsNotFound(err) {
reqLogger.Error(err, "Failed to retrieve KAM Route", "Name", kamResourceName, "Namespace", serviceNamespace)
}

}
Expand Down
13 changes: 13 additions & 0 deletions controllers/gitopsservice_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package controllers
import (
"context"
"fmt"
"os"
"testing"

argoapp "github.com/argoproj-labs/argocd-operator/api/v1beta1"
Expand Down Expand Up @@ -48,6 +49,14 @@ import (
"sigs.k8s.io/controller-runtime/pkg/reconcile"
)

func TestMain(m *testing.M) {
util.SetConfigAPIFound(true)
util.SetMonitoringAPIFound(true)
util.SetRouteAPIFound(true)
util.SetOLMAPIFound(true)
os.Exit(m.Run())
}

func TestImageFromEnvVariable(t *testing.T) {
ns := types.NamespacedName{Name: "test", Namespace: "test"}
t.Run("Image present as env variable", func(t *testing.T) {
Expand Down Expand Up @@ -927,6 +936,8 @@ func TestCleanKAMResources_ServiceExist(t *testing.T) {
// Route exist
func TestCleanKAMResources_RouteExist(t *testing.T) {
logf.SetLogger(zap.New(zap.UseDevMode(true)))
defer util.SetRouteAPIFound(util.IsRouteAPIFound())
util.SetRouteAPIFound(true)
s := scheme.Scheme
addKnownTypesToScheme(s)
kamRoute := &routev1.Route{
Expand All @@ -947,6 +958,8 @@ func TestCleanKAMResources_RouteExist(t *testing.T) {
// All Resources exist
func TestCleanKAMResources_AllResourcesExist(t *testing.T) {
logf.SetLogger(zap.New(zap.UseDevMode(true)))
defer util.SetRouteAPIFound(util.IsRouteAPIFound())
util.SetRouteAPIFound(true)
s := scheme.Scheme
addKnownTypesToScheme(s)
kamDeploy := &appsv1.Deployment{
Expand Down
56 changes: 56 additions & 0 deletions controllers/util/test_util.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
Copyright 2021.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package util

// *** THIS SHOULD ONLY BE USED FOR UNIT TESTING ***
func SetConfigAPIFound(found bool) {
configAPIFound = found
}

func SetMonitoringAPIFound(found bool) {
monitoringAPIFound = found
}

// *** THIS SHOULD ONLY BE USED FOR UNIT TESTING ***
func SetConsoleAPIFound(found bool) {
consoleAPIFound = found
}

// *** THIS SHOULD ONLY BE USED FOR UNIT TESTING ***
func SetRouteAPIFound(found bool) {
routeAPIFound = found
}

// *** THIS SHOULD ONLY BE USED FOR UNIT TESTING ***
func SetTemplateAPIFound(found bool) {
templateAPIFound = found
}

// *** THIS SHOULD ONLY BE USED FOR UNIT TESTING ***
func SetAppsAPIFound(found bool) {
appsAPIFound = found
}

// *** THIS SHOULD ONLY BE USED FOR UNIT TESTING ***
func SetOAuthAPIFound(found bool) {
oauthAPIFound = found
}

// *** THIS SHOULD ONLY BE USED FOR UNIT TESTING ***
func SetOLMAPIFound(found bool) {
olmAPIFound = found
}
Loading
Loading