Skip to content

Commit

Permalink
Propagate ImagePullSecrets to collectors (#79)
Browse files Browse the repository at this point in the history
This PR propagate the `imagePullSecrets` value from the helm chart to
the collectors created by autoscaler (data collection & gateway
collectors).
  • Loading branch information
edeNFed authored Mar 1, 2023
1 parent d587f4a commit d35908b
Show file tree
Hide file tree
Showing 8 changed files with 62 additions and 27 deletions.
7 changes: 4 additions & 3 deletions autoscaler/controllers/collectorsgroup_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ import (
// CollectorsGroupReconciler reconciles a CollectorsGroup object
type CollectorsGroupReconciler struct {
client.Client
Scheme *runtime.Scheme
Scheme *runtime.Scheme
ImagePullSecrets []string
}

//+kubebuilder:rbac:groups=odigos.io,namespace=odigos-system,resources=collectorsgroups,verbs=get;list;watch;create;update;patch;delete
Expand All @@ -58,12 +59,12 @@ func (r *CollectorsGroupReconciler) Reconcile(ctx context.Context, req ctrl.Requ
logger := log.FromContext(ctx)
logger.V(0).Info("Reconciling CollectorsGroup")

err := gateway.Sync(ctx, r.Client, r.Scheme)
err := gateway.Sync(ctx, r.Client, r.Scheme, r.ImagePullSecrets)
if err != nil {
return ctrl.Result{}, err
}

err = datacollection.Sync(ctx, r.Client, r.Scheme)
err = datacollection.Sync(ctx, r.Client, r.Scheme, r.ImagePullSecrets)
if err != nil {
return ctrl.Result{}, err
}
Expand Down
14 changes: 11 additions & 3 deletions autoscaler/controllers/datacollection/daemonset.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ var (
)

func syncDaemonSet(apps *odigosv1.InstrumentedApplicationList, dests *odigosv1.DestinationList, datacollection *odigosv1.CollectorsGroup, configData string, ctx context.Context,
c client.Client, scheme *runtime.Scheme) (*appsv1.DaemonSet, error) {
c client.Client, scheme *runtime.Scheme, imagePullSecrets []string) (*appsv1.DaemonSet, error) {
logger := log.FromContext(ctx)
desiredDs, err := getDesiredDaemonSet(datacollection, configData, scheme)
desiredDs, err := getDesiredDaemonSet(datacollection, configData, scheme, imagePullSecrets)
if err != nil {
logger.Error(err, "Failed to get desired DaemonSet")
return nil, err
Expand Down Expand Up @@ -72,7 +72,8 @@ func syncDaemonSet(apps *odigosv1.InstrumentedApplicationList, dests *odigosv1.D
return updated, nil
}

func getDesiredDaemonSet(datacollection *odigosv1.CollectorsGroup, configData string, scheme *runtime.Scheme) (*appsv1.DaemonSet, error) {
func getDesiredDaemonSet(datacollection *odigosv1.CollectorsGroup, configData string,
scheme *runtime.Scheme, imagePullSecrets []string) (*appsv1.DaemonSet, error) {
// TODO(edenfed): add log volumes only if needed according to apps or dests
desiredDs := &appsv1.DaemonSet{
ObjectMeta: metav1.ObjectMeta{
Expand Down Expand Up @@ -199,6 +200,13 @@ func getDesiredDaemonSet(datacollection *odigosv1.CollectorsGroup, configData st
},
}

if imagePullSecrets != nil && len(imagePullSecrets) > 0 {
desiredDs.Spec.Template.Spec.ImagePullSecrets = []corev1.LocalObjectReference{}
for _, secret := range imagePullSecrets {
desiredDs.Spec.Template.Spec.ImagePullSecrets = append(desiredDs.Spec.Template.Spec.ImagePullSecrets, corev1.LocalObjectReference{Name: secret})
}
}

err := ctrl.SetControllerReference(datacollection, desiredDs, scheme)
if err != nil {
return nil, err
Expand Down
9 changes: 5 additions & 4 deletions autoscaler/controllers/datacollection/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
"sigs.k8s.io/controller-runtime/pkg/log"
)

func Sync(ctx context.Context, c client.Client, scheme *runtime.Scheme) error {
func Sync(ctx context.Context, c client.Client, scheme *runtime.Scheme, imagePullSecrets []string) error {
logger := log.FromContext(ctx)
var collectorGroups odigosv1.CollectorsGroupList
if err := c.List(ctx, &collectorGroups); err != nil {
Expand Down Expand Up @@ -41,11 +41,12 @@ func Sync(ctx context.Context, c client.Client, scheme *runtime.Scheme) error {
return err
}

return syncDataCollection(&instApps, &dests, dataCollectionCollectorGroup, ctx, c, scheme)
return syncDataCollection(&instApps, &dests, dataCollectionCollectorGroup, ctx, c, scheme, imagePullSecrets)
}

func syncDataCollection(instApps *odigosv1.InstrumentedApplicationList, dests *odigosv1.DestinationList,
dataCollection *odigosv1.CollectorsGroup, ctx context.Context, c client.Client, scheme *runtime.Scheme) error {
dataCollection *odigosv1.CollectorsGroup, ctx context.Context, c client.Client,
scheme *runtime.Scheme, imagePullSecrets []string) error {
logger := log.FromContext(ctx)
logger.V(0).Info("syncing data collection")

Expand All @@ -55,7 +56,7 @@ func syncDataCollection(instApps *odigosv1.InstrumentedApplicationList, dests *o
return err
}

ds, err := syncDaemonSet(instApps, dests, dataCollection, configData, ctx, c, scheme)
ds, err := syncDaemonSet(instApps, dests, dataCollection, configData, ctx, c, scheme, imagePullSecrets)
if err != nil {
logger.Error(err, "failed to sync daemon set")
return err
Expand Down
5 changes: 3 additions & 2 deletions autoscaler/controllers/destination_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ import (
// DestinationReconciler reconciles a Destination object
type DestinationReconciler struct {
client.Client
Scheme *runtime.Scheme
Scheme *runtime.Scheme
ImagePullSecrets []string
}

//+kubebuilder:rbac:groups=odigos.io,namespace=odigos-system,resources=destinations,verbs=get;list;watch;create;update;patch;delete
Expand All @@ -48,7 +49,7 @@ type DestinationReconciler struct {
func (r *DestinationReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
logger := log.FromContext(ctx)
logger.V(0).Info("Reconciling Destination")
err := gateway.Sync(ctx, r.Client, r.Scheme)
err := gateway.Sync(ctx, r.Client, r.Scheme, r.ImagePullSecrets)
if err != nil {
return ctrl.Result{}, err
}
Expand Down
15 changes: 12 additions & 3 deletions autoscaler/controllers/gateway/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,10 @@ const (
configHashAnnotation = "odigos.io/config-hash"
)

func syncDeployment(dests *odigosv1.DestinationList, gateway *odigosv1.CollectorsGroup, configData string, ctx context.Context, c client.Client, scheme *runtime.Scheme) (*appsv1.Deployment, error) {
func syncDeployment(dests *odigosv1.DestinationList, gateway *odigosv1.CollectorsGroup, configData string,
ctx context.Context, c client.Client, scheme *runtime.Scheme, imagePullSecrets []string) (*appsv1.Deployment, error) {
logger := log.FromContext(ctx)
desiredDeployment, err := getDesiredDeployment(dests, configData, gateway, scheme)
desiredDeployment, err := getDesiredDeployment(dests, configData, gateway, scheme, imagePullSecrets)
if err != nil {
logger.Error(err, "Failed to get desired deployment")
return nil, err
Expand Down Expand Up @@ -91,7 +92,8 @@ func patchDeployment(existing *appsv1.Deployment, desired *appsv1.Deployment, ct
return updated, nil
}

func getDesiredDeployment(dests *odigosv1.DestinationList, configData string, gateway *odigosv1.CollectorsGroup, scheme *runtime.Scheme) (*appsv1.Deployment, error) {
func getDesiredDeployment(dests *odigosv1.DestinationList, configData string,
gateway *odigosv1.CollectorsGroup, scheme *runtime.Scheme, imagePullSecrets []string) (*appsv1.Deployment, error) {
desiredDeployment := &appsv1.Deployment{
ObjectMeta: v1.ObjectMeta{
Name: gateway.Name,
Expand Down Expand Up @@ -164,6 +166,13 @@ func getDesiredDeployment(dests *odigosv1.DestinationList, configData string, ga
},
}

if imagePullSecrets != nil && len(imagePullSecrets) > 0 {
desiredDeployment.Spec.Template.Spec.ImagePullSecrets = []corev1.LocalObjectReference{}
for _, secret := range imagePullSecrets {
desiredDeployment.Spec.Template.Spec.ImagePullSecrets = append(desiredDeployment.Spec.Template.Spec.ImagePullSecrets, corev1.LocalObjectReference{Name: secret})
}
}

err := ctrl.SetControllerReference(gateway, desiredDeployment, scheme)
if err != nil {
return nil, err
Expand Down
9 changes: 5 additions & 4 deletions autoscaler/controllers/gateway/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ var (
}
)

func Sync(ctx context.Context, client client.Client, scheme *runtime.Scheme) error {
func Sync(ctx context.Context, client client.Client, scheme *runtime.Scheme, imagePullSecrets []string) error {
logger := log.FromContext(ctx)
var collectorGroups odigosv1.CollectorsGroupList
if err := client.List(ctx, &collectorGroups); err != nil {
Expand All @@ -46,10 +46,11 @@ func Sync(ctx context.Context, client client.Client, scheme *runtime.Scheme) err
return err
}

return syncGateway(&dests, gatewayCollectorGroup, ctx, client, scheme)
return syncGateway(&dests, gatewayCollectorGroup, ctx, client, scheme, imagePullSecrets)
}

func syncGateway(dests *odigosv1.DestinationList, gateway *odigosv1.CollectorsGroup, ctx context.Context, c client.Client, scheme *runtime.Scheme) error {
func syncGateway(dests *odigosv1.DestinationList, gateway *odigosv1.CollectorsGroup, ctx context.Context,
c client.Client, scheme *runtime.Scheme, imagePullSecrets []string) error {
logger := log.FromContext(ctx)
logger.V(0).Info("syncing gateway")

Expand All @@ -65,7 +66,7 @@ func syncGateway(dests *odigosv1.DestinationList, gateway *odigosv1.CollectorsGr
return err
}

dep, err := syncDeployment(dests, gateway, configData, ctx, c, scheme)
dep, err := syncDeployment(dests, gateway, configData, ctx, c, scheme, imagePullSecrets)
if err != nil {
logger.Error(err, "failed to sync deployment")
return err
Expand Down
5 changes: 3 additions & 2 deletions autoscaler/controllers/instrumentedapplication_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ import (
// InstrumentedApplicationReconciler reconciles a InstrumentedApplication object
type InstrumentedApplicationReconciler struct {
client.Client
Scheme *runtime.Scheme
Scheme *runtime.Scheme
ImagePullSecrets []string
}

//+kubebuilder:rbac:groups=odigos.io,resources=instrumentedapplications,verbs=get;list;watch;create;update;patch;delete
Expand All @@ -47,7 +48,7 @@ type InstrumentedApplicationReconciler struct {
func (r *InstrumentedApplicationReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
logger := log.FromContext(ctx)
logger.V(0).Info("Reconciling InstrumentedApps")
err := datacollection.Sync(ctx, r.Client, r.Scheme)
err := datacollection.Sync(ctx, r.Client, r.Scheme, r.ImagePullSecrets)
if err != nil {
return ctrl.Result{}, err
}
Expand Down
25 changes: 19 additions & 6 deletions autoscaler/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package main
import (
"flag"
"os"
"strings"

"github.com/keyval-dev/odigos/common/utils"

Expand Down Expand Up @@ -54,17 +55,26 @@ func main() {
var metricsAddr string
var enableLeaderElection bool
var probeAddr string
var imagePullSecretsString string
var imagePullSecrets []string
flag.StringVar(&metricsAddr, "metrics-bind-address", ":8080", "The address the metric endpoint binds to.")
flag.StringVar(&probeAddr, "health-probe-bind-address", ":8081", "The address the probe endpoint binds to.")
flag.BoolVar(&enableLeaderElection, "leader-elect", false,
"Enable leader election for controller manager. "+
"Enabling this will ensure there is only one active controller manager.")
flag.StringVar(&imagePullSecretsString, "image-pull-secrets", "",
"The image pull secrets to use for the collectors created by autoscaler")

opts := zap.Options{
Development: true,
}
opts.BindFlags(flag.CommandLine)
flag.Parse()

if imagePullSecretsString != "" {
imagePullSecrets = strings.Split(imagePullSecretsString, ",")
}

ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts)))

mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
Expand All @@ -82,22 +92,25 @@ func main() {
}

if err = (&controllers.DestinationReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
ImagePullSecrets: imagePullSecrets,
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "Destination")
os.Exit(1)
}
if err = (&controllers.CollectorsGroupReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
ImagePullSecrets: imagePullSecrets,
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "CollectorsGroup")
os.Exit(1)
}
if err = (&controllers.InstrumentedApplicationReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
ImagePullSecrets: imagePullSecrets,
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "InstrumentedApplication")
os.Exit(1)
Expand Down

0 comments on commit d35908b

Please sign in to comment.