diff --git a/pkg/controller/jaeger/jaeger_controller.go b/pkg/controller/jaeger/jaeger_controller.go index 5c31bac87d..3ea26be544 100644 --- a/pkg/controller/jaeger/jaeger_controller.go +++ b/pkg/controller/jaeger/jaeger_controller.go @@ -10,6 +10,7 @@ import ( "github.com/pkg/errors" log "github.com/sirupsen/logrus" "github.com/spf13/viper" + appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" k8serrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" @@ -21,6 +22,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/source" "github.com/jaegertracing/jaeger-operator/pkg/apis/jaegertracing/v1" + "github.com/jaegertracing/jaeger-operator/pkg/inject" "github.com/jaegertracing/jaeger-operator/pkg/strategy" ) @@ -220,5 +222,29 @@ func (r *ReconcileJaeger) apply(jaeger v1.Jaeger, str strategy.S) error { } } + if err := r.scanDeployments(jaeger); err != nil { + return err + } + + return nil +} + +func (r *ReconcileJaeger) scanDeployments(jaeger v1.Jaeger) error { + pods := &v1.JaegerList{} + deps := &appsv1.DeploymentList{} + + opts := &client.ListOptions{} + if err := r.client.List(context.Background(), opts, pods); err != nil { + return err + } + if err := r.client.List(context.Background(), opts, deps); err != nil { + return err + } + injectedDeps := inject.RequireInjections(&jaeger, pods, deps) + for _, d := range injectedDeps { + if err := r.client.Update(context.Background(), d); err != nil { + return err + } + } return nil } diff --git a/pkg/inject/sidecar.go b/pkg/inject/sidecar.go index c6ff52fef0..92dd83a4ea 100644 --- a/pkg/inject/sidecar.go +++ b/pkg/inject/sidecar.go @@ -177,3 +177,34 @@ func hasEnv(name string, vars []corev1.EnvVar) bool { } return false } + +// RequireInjections deployments +func RequireInjections(jaeger *v1.Jaeger, pods *v1.JaegerList, deps *appsv1.DeploymentList) []*appsv1.Deployment { + requireUpdates := make([]*appsv1.Deployment, 0) + for i := 0; i < len(deps.Items); i++ { + dep := &deps.Items[i] + if Needed(dep) { + if belongsToJaegerInstance(dep, jaeger, len(pods.Items) == 1) { + // a suitable jaeger instance was found! let's inject a sidecar pointing to it then + log.WithFields(log.Fields{ + "deployment": dep.Name, + "namespace": dep.Namespace, + "jaeger": jaeger.Name, + "jaeger-namespace": jaeger.Namespace, + }).Info("Injecting Jaeger Agent sidecar") + dep.Annotations[Annotation] = jaeger.Name + newDep := Sidecar(jaeger, dep) + requireUpdates = append(requireUpdates, newDep) + } else { + log.WithField("deployment", dep.Name).Info("No suitable Jaeger instances found to inject a sidecar") + } + } + } + return requireUpdates +} + +func belongsToJaegerInstance(dep *appsv1.Deployment, instance *v1.Jaeger, uniqueInstance bool) bool { + annotation := dep.Annotations[Annotation] + return strings.EqualFold(annotation, "true") && + uniqueInstance || annotation == instance.Name +}