From 89c439efa2a7f156579f3d87cc3e467ce3d6b2df Mon Sep 17 00:00:00 2001 From: Ruben Vargas Palma Date: Fri, 15 Nov 2019 09:12:13 -0600 Subject: [PATCH] Scan deployments for agent injection (#454) Signed-off-by: Ruben Vargas --- pkg/autodetect/main.go | 49 ++++++++++++++++++++++++++++++++++++++++++ pkg/inject/sidecar.go | 11 ++++++++++ 2 files changed, 60 insertions(+) diff --git a/pkg/autodetect/main.go b/pkg/autodetect/main.go index f68860e79..e7ba701b4 100644 --- a/pkg/autodetect/main.go +++ b/pkg/autodetect/main.go @@ -77,6 +77,54 @@ func (b *Background) Stop() { b.ticker.Stop() } +func (b *Background) requireUpdates(deps *appsv1.DeploymentList) []*appsv1.Deployment { + instances := &v1.JaegerList{} + if err := b.cl.List(context.Background(), instances); err != nil { + return nil + } + requireUpdates := make([]*appsv1.Deployment, 0) + for i := 0; i < len(deps.Items); i++ { + dep := &deps.Items[i] + if inject.Needed(dep) { // If sidecar is not present and should be + jaeger := inject.Select(dep, instances) + if jaeger != nil { // Instance exists. + jaeger.Logger().WithFields(log.Fields{ + "deploymentName": dep.Name, + "deploymentNamespace": dep.Namespace, + }).Info("Injecting Jaeger Agent sidecar") + dep.Annotations[inject.Annotation] = jaeger.Name + newDep := inject.Sidecar(jaeger, dep) + requireUpdates = append(requireUpdates, newDep) + } + } else { + // Try to update the sidecar if is required + jaeger := inject.Select(dep, instances) + updated := inject.UpdateSideCar(jaeger, dep) + if updated { + if err := b.cl.Update(context.Background(), dep); err != nil { + return nil + } + } + } + } + return requireUpdates +} + +func (b *Background) detectDeploymentUpdates() error { + deps := &appsv1.DeploymentList{} + if err := b.cl.List(context.Background(), deps); err != nil { + return err + } + injectedDeps := b.requireUpdates(deps) + for _, d := range injectedDeps { + if err := b.cl.Update(context.Background(), d); err != nil { + return err + } + } + + return nil +} + func (b *Background) autoDetectCapabilities() { apiList, err := b.availableAPIs() if err != nil { @@ -92,6 +140,7 @@ func (b *Background) autoDetectCapabilities() { b.detectClusterRoles() b.cleanDeployments() + b.detectDeploymentUpdates() } diff --git a/pkg/inject/sidecar.go b/pkg/inject/sidecar.go index ce9d0a02e..fd0f004b0 100644 --- a/pkg/inject/sidecar.go +++ b/pkg/inject/sidecar.go @@ -60,6 +60,17 @@ func Sidecar(jaeger *v1.Jaeger, dep *appsv1.Deployment) *appsv1.Deployment { return dep } +// UpdateSideCar modify the deployment side car with the latest parameters if it's required. +func UpdateSideCar(jaeger *v1.Jaeger, dep *appsv1.Deployment) bool { + for i := range dep.Spec.Template.Spec.Containers { + if dep.Spec.Template.Spec.Containers[i].Name == "jaeger-agent" { + dep.Spec.Template.Spec.Containers[i] = container(jaeger, dep) + return true + } + } + return false +} + // Needed determines whether a pod needs to get a sidecar injected or not func Needed(dep *appsv1.Deployment) bool { if dep.Annotations[Annotation] == "" {