• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

opendefensecloud / artifact-conduit / 19502920190

19 Nov 2025 01:26PM UTC coverage: 55.638% (-0.2%) from 55.823%
19502920190

push

github

jastBytes
fix docs

301 of 541 relevant lines covered (55.64%)

14.01 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

87.5
/pkg/controller/artifactworkflow_controller.go
1
// Copyright 2025 BWI GmbH and Artefact Conduit contributors
2
// SPDX-License-Identifier: Apache-2.0
3

4
package controller
5

6
import (
7
        "context"
8
        "slices"
9

10
        wfv1alpha1 "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1"
11
        arcv1alpha1 "go.opendefense.cloud/arc/api/arc/v1alpha1"
12
        corev1 "k8s.io/api/core/v1"
13
        apierrors "k8s.io/apimachinery/pkg/api/errors"
14
        "k8s.io/apimachinery/pkg/runtime"
15
        ctrl "sigs.k8s.io/controller-runtime"
16
        "sigs.k8s.io/controller-runtime/pkg/client"
17
)
18

19
const (
20
        fragmentFinalizer = "arc.bwi.de/artifact-workflow-finalizer"
21
)
22

23
// ArtifactWorkflowReconciler reconciles a ArtifactWorkflow object
24
type ArtifactWorkflowReconciler struct {
25
        client.Client
26
        Scheme *runtime.Scheme
27
}
28

29
//+kubebuilder:rbac:groups=arc.bwi.de,resources=artifactworkflows,verbs=get;list;watch;create;update;patch;delete
30
//+kubebuilder:rbac:groups=arc.bwi.de,resources=artifactworkflows/status,verbs=get;update;patch
31
//+kubebuilder:rbac:groups=arc.bwi.de,resources=artifactworkflows/finalizers,verbs=update
32
//+kubebuilder:rbac:groups="",resources=secrets,verbs=get;list;watch;create;update;patch;delete
33
//+kubebuilder:rbac:groups=argoproj.io,resources=workflows,verbs=get;list;watch;create;update;patch;delete
34

35
// Reconcile moves the current state of the cluster closer to the desired state
36
func (r *ArtifactWorkflowReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
34✔
37
        log := ctrl.LoggerFrom(ctx)
34✔
38

34✔
39
        // Fetch the ArtifactWorkflow object
34✔
40
        frag := &arcv1alpha1.ArtifactWorkflow{}
34✔
41
        if err := r.Get(ctx, req.NamespacedName, frag); err != nil {
37✔
42
                if apierrors.IsNotFound(err) {
6✔
43
                        // Object not found, return.
3✔
44
                        return ctrl.Result{}, nil
3✔
45
                }
3✔
46
                return ctrl.Result{}, errLogAndWrap(log, err, "failed to get object")
×
47
        }
48

49
        // Handle deletion: cleanup fragments, then remove finalizer
50
        if !frag.DeletionTimestamp.IsZero() {
34✔
51
                log.V(1).Info("ArtifactWorkflow is being deleted")
3✔
52
                // TODO: remove workflow and secret if exists
3✔
53
                // Workflow and secret was cleaned up, remove finalizer
3✔
54
                if slices.Contains(frag.Finalizers, fragmentFinalizer) {
6✔
55
                        log.V(1).Info("Removing finalizer from ArtifactWorkflow")
3✔
56
                        frag.Finalizers = slices.DeleteFunc(frag.Finalizers, func(f string) bool {
6✔
57
                                return f == fragmentFinalizer
3✔
58
                        })
3✔
59
                        if err := r.Update(ctx, frag); err != nil {
3✔
60
                                return ctrl.Result{}, errLogAndWrap(log, err, "failed to remove finalizer")
×
61
                        }
×
62
                }
63
                return ctrl.Result{}, nil
3✔
64
        }
65

66
        // Add finalizer if not present and not deleting
67
        if frag.DeletionTimestamp.IsZero() {
56✔
68
                if !slices.Contains(frag.Finalizers, fragmentFinalizer) {
42✔
69
                        log.V(1).Info("Adding finalizer to ArtifactWorkflow")
14✔
70
                        frag.Finalizers = append(frag.Finalizers, fragmentFinalizer)
14✔
71
                        if err := r.Update(ctx, frag); err != nil {
14✔
72
                                return ctrl.Result{}, errLogAndWrap(log, err, "failed to add finalizer")
×
73
                        }
×
74
                        // Return without requeue; the Update event will trigger reconciliation again
75
                        return ctrl.Result{}, nil
14✔
76
                }
77
        }
78

79
        // TODO: track status if workload exists
80
        // TODO: create workflow if not exists (and not status done|error)
81

82
        return ctrl.Result{}, nil
14✔
83
}
84

85
// SetupWithManager sets up the controller with the Manager.
86
func (r *ArtifactWorkflowReconciler) SetupWithManager(mgr ctrl.Manager) error {
1✔
87
        return ctrl.NewControllerManagedBy(mgr).
1✔
88
                For(&arcv1alpha1.ArtifactWorkflow{}).
1✔
89
                Owns(&wfv1alpha1.Workflow{}).
1✔
90
                Owns(&corev1.Secret{}).
1✔
91
                Complete(r)
1✔
92
}
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc