Skip to content

Commit

Permalink
corresponding controller changes
Browse files Browse the repository at this point in the history
Signed-off-by: Kent Rancourt <kent.rancourt@gmail.com>
  • Loading branch information
krancour committed Jan 10, 2024
1 parent 2ec0358 commit 01dadca
Show file tree
Hide file tree
Showing 15 changed files with 481 additions and 310 deletions.
68 changes: 38 additions & 30 deletions cmd/controlplane/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ func newControllerCommand() *cobra.Command {
}

var argocdMgr manager.Manager
{
if types.MustParseBool(os.GetEnv("ARGOCD_INTEGRATION_ENABLED", "true")) {
// If the env var is undefined, this will resolve to kubeconfig for the
// cluster the controller is running in.
//
Expand Down Expand Up @@ -169,7 +169,7 @@ func newControllerCommand() *cobra.Command {
}

var rolloutsMgr manager.Manager
{
if types.MustParseBool(os.GetEnv("ROLLOUTS_INTEGRATION_ENABLED", "true")) {
// If the env var is undefined, this will resolve to kubeconfig for the
// cluster the controller is running in.
//
Expand Down Expand Up @@ -245,22 +245,26 @@ func newControllerCommand() *cobra.Command {
credentials.KubernetesDatabaseConfigFromEnv(),
)

if err := analysis.SetupReconcilerWithManager(
ctx,
kargoMgr,
rolloutsMgr,
shardName,
); err != nil {
return errors.Wrap(err, "error setting up AnalysisRuns reconciler")
if rolloutsMgr != nil {
if err := analysis.SetupReconcilerWithManager(
ctx,
kargoMgr,
rolloutsMgr,
shardName,
); err != nil {
return errors.Wrap(err, "error setting up AnalysisRuns reconciler")
}
}

if err := applications.SetupReconcilerWithManager(
ctx,
kargoMgr,
argocdMgr,
shardName,
); err != nil {
return errors.Wrap(err, "error setting up Applications reconciler")
if argocdMgr != nil {
if err := applications.SetupReconcilerWithManager(
ctx,
kargoMgr,
argocdMgr,
shardName,
); err != nil {
return errors.Wrap(err, "error setting up Applications reconciler")
}
}

if err := promotions.SetupReconcilerWithManager(
Expand Down Expand Up @@ -295,13 +299,15 @@ func newControllerCommand() *cobra.Command {

wg := sync.WaitGroup{}

wg.Add(1)
go func() {
defer wg.Done()
if err := argocdMgr.Start(ctx); err != nil {
errChan <- errors.Wrap(err, "error starting argo cd manager")
}
}()
if argocdMgr != nil {
wg.Add(1)
go func() {
defer wg.Done()
if err := argocdMgr.Start(ctx); err != nil {
errChan <- errors.Wrap(err, "error starting argo cd manager")
}
}()
}

wg.Add(1)
go func() {
Expand All @@ -311,13 +317,15 @@ func newControllerCommand() *cobra.Command {
}
}()

wg.Add(1)
go func() {
defer wg.Done()
if err := rolloutsMgr.Start(ctx); err != nil {
errChan <- errors.Wrap(err, "error starting rollouts manager")
}
}()
if rolloutsMgr != nil {
wg.Add(1)
go func() {
defer wg.Done()
if err := rolloutsMgr.Start(ctx); err != nil {
errChan <- errors.Wrap(err, "error starting rollouts manager")
}
}()
}

// Adapt wg to a channel that can be used in a select
doneCh := make(chan struct{})
Expand Down
4 changes: 2 additions & 2 deletions internal/controller/applications/applications.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,15 @@ type reconciler struct {
func SetupReconcilerWithManager(
ctx context.Context,
kargoMgr manager.Manager,
argoMgr manager.Manager,
argocdMgr manager.Manager,
shardName string,
) error {
// Index Stages by Argo CD Applications
if err := kubeclient.IndexStagesByArgoCDApplications(ctx, kargoMgr, shardName); err != nil {
return errors.Wrap(err, "index Stages by Argo CD Applications")
}
logger := logging.LoggerFromContext(ctx)
return ctrl.NewControllerManagedBy(argoMgr).
return ctrl.NewControllerManagedBy(argocdMgr).
For(&argocd.Application{}).
WithEventFilter(AppHealthSyncStatusChangePredicate{logger: logger}).
WithOptions(controller.CommonOptions()).
Expand Down
27 changes: 19 additions & 8 deletions internal/controller/promotion/argocd.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ const authorizedStageAnnotationKey = "kargo.akuity.io/authorized-stage"
// argoCDMechanism is an implementation of the Mechanism interface that updates
// Argo CD Application resources.
type argoCDMechanism struct {
argocdClient client.Client
// These behaviors are overridable for testing purposes:
doSingleUpdateFn func(
ctx context.Context,
Expand Down Expand Up @@ -47,14 +48,16 @@ type argoCDMechanism struct {

// newArgoCDMechanism returns an implementation of the Mechanism interface that
// updates Argo CD Application resources.
func newArgoCDMechanism(
argoClient client.Client,
) Mechanism {
a := &argoCDMechanism{}
func newArgoCDMechanism(argocdClient client.Client) Mechanism {
a := &argoCDMechanism{
argocdClient: argocdClient,
}
a.doSingleUpdateFn = a.doSingleUpdate
a.getArgoCDAppFn = getApplicationFn(argoClient)
a.getArgoCDAppFn = getApplicationFn(argocdClient)
a.applyArgoCDSourceUpdateFn = applyArgoCDSourceUpdate
a.argoCDAppPatchFn = argoClient.Patch
if argocdClient != nil {
a.argoCDAppPatchFn = argocdClient.Patch
}
return a
}

Expand All @@ -76,6 +79,14 @@ func (a *argoCDMechanism) Promote(
return promo.Status.WithPhase(kargoapi.PromotionPhaseSucceeded), newFreight, nil
}

if a.argocdClient == nil {
return promo.Status.WithPhase(kargoapi.PromotionPhaseFailed), newFreight,
errors.New(
"Argo CD integration is disabled on this controller; cannot perform " +
"promotion",
)
}

logger := logging.LoggerFromContext(ctx)
logger.Debug("executing Argo CD-based promotion mechanisms")

Expand Down Expand Up @@ -202,7 +213,7 @@ func (a *argoCDMechanism) doSingleUpdate(
}

func getApplicationFn(
argoClient client.Client,
argocdClient client.Client,
) func(
ctx context.Context,
namespace string,
Expand All @@ -213,7 +224,7 @@ func getApplicationFn(
namespace string,
name string,
) (*argocd.Application, error) {
return argocd.GetApplication(ctx, argoClient, namespace, name)
return argocd.GetApplication(ctx, argocdClient, namespace, name)
}
}

Expand Down
28 changes: 28 additions & 0 deletions internal/controller/promotion/argocd_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,36 @@ func TestArgoCDPromote(t *testing.T) {
require.Equal(t, newFreightIn, newFreightOut)
},
},
{
name: "argo cd integration disabled",
promoMech: &argoCDMechanism{},
stage: &kargoapi.Stage{
Spec: &kargoapi.StageSpec{
PromotionMechanisms: &kargoapi.PromotionMechanisms{
ArgoCDAppUpdates: []kargoapi.ArgoCDAppUpdate{
{},
},
},
},
},
assertions: func(
newStatus *kargoapi.PromotionStatus,
newFreightIn kargoapi.FreightReference,
newFreightOut kargoapi.FreightReference,
err error,
) {
require.Error(t, err)
require.Contains(
t,
err.Error(),
"Argo CD integration is disabled on this controller",
)
},
},
{
name: "error applying update",
promoMech: &argoCDMechanism{
argocdClient: fake.NewClientBuilder().Build(),
doSingleUpdateFn: func(
context.Context,
metav1.ObjectMeta,
Expand Down Expand Up @@ -100,6 +127,7 @@ func TestArgoCDPromote(t *testing.T) {
{
name: "success",
promoMech: &argoCDMechanism{
argocdClient: fake.NewClientBuilder().Build(),
doSingleUpdateFn: func(
context.Context,
metav1.ObjectMeta,
Expand Down
4 changes: 2 additions & 2 deletions internal/controller/promotion/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ type Mechanism interface {
// NewMechanisms returns the entrypoint to a hierarchical tree of promotion
// mechanisms.
func NewMechanisms(
argoClient client.Client,
argocdClient client.Client,
credentialsDB credentials.Database,
) Mechanism {
return newCompositeMechanism(
Expand All @@ -39,6 +39,6 @@ func NewMechanisms(
newKustomizeMechanism(credentialsDB),
newHelmMechanism(credentialsDB),
),
newArgoCDMechanism(argoClient),
newArgoCDMechanism(argocdClient),
)
}
13 changes: 9 additions & 4 deletions internal/controller/promotions/promotions.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ type reconciler struct {
func SetupReconcilerWithManager(
ctx context.Context,
kargoMgr manager.Manager,
argoMgr manager.Manager,
argocdMgr manager.Manager,
credentialsDB credentials.Database,
shardName string,
) error {
Expand All @@ -53,9 +53,14 @@ func SetupReconcilerWithManager(
return errors.Wrap(err, "error creating shard selector predicate")
}

var argocdClient client.Client
if argocdMgr != nil {
argocdClient = argocdMgr.GetClient()
}

reconciler := newReconciler(
kargoMgr.GetClient(),
argoMgr.GetClient(),
argocdClient,
credentialsDB,
)

Expand Down Expand Up @@ -99,7 +104,7 @@ func SetupReconcilerWithManager(

func newReconciler(
kargoClient client.Client,
argoClient client.Client,
argocdClient client.Client,
credentialsDB credentials.Database,
) *reconciler {
pqs := promoQueues{
Expand All @@ -110,7 +115,7 @@ func newReconciler(
kargoClient: kargoClient,
pqs: &pqs,
promoMechanisms: promotion.NewMechanisms(
argoClient,
argocdClient,
credentialsDB,
),
}
Expand Down
9 changes: 9 additions & 0 deletions internal/controller/stages/health.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,15 @@ func (r *reconciler) checkHealth(
Issues: []string{},
}

if r.argocdClient == nil && len(argoCDAppUpdates) > 0 {
h.Status = kargoapi.HealthStateUnknown
h.Issues = []string{
"Argo CD integration is disabled on this controller; cannot assess" +
" the health or sync status of Argo CD Applications",
}
return &h
}

for i, updates := range argoCDAppUpdates {
h.ArgoCDApps[i] = kargoapi.ArgoCDAppStatus{
Namespace: updates.AppNamespaceOrDefault(),
Expand Down
Loading

0 comments on commit 01dadca

Please sign in to comment.