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

opendefensecloud / artifact-conduit / 19330239317

13 Nov 2025 11:37AM UTC coverage: 37.833% (-4.3%) from 42.149%
19330239317

Pull #25

github

web-flow
Merge 61d291fb9 into dd9e6a49b
Pull Request #25: Workflow PoC

4 of 46 new or added lines in 3 files covered. (8.7%)

25 existing lines in 2 files now uncovered.

199 of 526 relevant lines covered (37.83%)

3.76 hits per line

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

0.0
/pkg/controller/fragment_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
        apierrors "k8s.io/apimachinery/pkg/api/errors"
13
        "k8s.io/apimachinery/pkg/runtime"
14
        ctrl "sigs.k8s.io/controller-runtime"
15
        "sigs.k8s.io/controller-runtime/pkg/client"
16
)
17

18
const fragmentFinalizer = "arc.bwi.de/fragment-finalizer"
19

20
// FragmentReconciler reconciles a Fragment object
21
type FragmentReconciler struct {
22
        client.Client
23
        Scheme *runtime.Scheme
24
}
25

26
//+kubebuilder:rbac:groups=argoproj.io,resources=workflows,verbs=get;list;watch;create;update;patch;delete
27
//+kubebuilder:rbac:groups=arc.bwi.de,resources=fragments,verbs=get;list;watch;create;update;patch;delete
28
//+kubebuilder:rbac:groups=arc.bwi.de,resources=fragments/status,verbs=get;update;patch
29
//+kubebuilder:rbac:groups=arc.bwi.de,resources=fragments/finalizers,verbs=update
30

31
// Reconcile moves the current state of the cluster closer to the desired state
NEW
32
func (r *FragmentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
×
NEW
33
        log := ctrl.LoggerFrom(ctx)
×
NEW
34

×
NEW
35
        // Fetch the Fragment object
×
NEW
36
        frag := &arcv1alpha1.Fragment{}
×
NEW
37
        if err := r.Get(ctx, req.NamespacedName, frag); err != nil {
×
NEW
38
                if apierrors.IsNotFound(err) {
×
NEW
39
                        // Object not found, return.
×
NEW
40
                        return ctrl.Result{}, nil
×
NEW
41
                }
×
NEW
42
                return ctrl.Result{}, err
×
43
        }
44

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

63
        // Add finalizer if not present and not deleting
NEW
64
        if frag.DeletionTimestamp.IsZero() {
×
NEW
65
                if !slices.Contains(frag.Finalizers, fragmentFinalizer) {
×
NEW
66
                        log.V(1).Info("Adding finalizer to Fragment")
×
NEW
67
                        frag.Finalizers = append(frag.Finalizers, fragmentFinalizer)
×
NEW
68
                        if err := r.Update(ctx, frag); err != nil {
×
NEW
69
                                log.Error(err, "Failed to add finalizer to Fragment")
×
NEW
70
                                return ctrl.Result{}, err
×
NEW
71
                        }
×
72
                        // Return without requeue; the Update event will trigger reconciliation again
NEW
73
                        return ctrl.Result{}, nil
×
74
                }
75
        }
76

77
        // TODO: Is fragment status "done" or "error", then check if secret is still referenced in status.
78
        //       If secret exists, clean up and update status.
79

80
        // TODO: Fragment is not finished, then check if workflow is referenced in status.
81

82
        // TODO: If no workflow referenced, create secret and workflow.
83

84
        // TODO: If workflow exists, check and update status if necessary.
85

NEW
86
        return ctrl.Result{}, nil
×
87
}
88

89
// SetupWithManager sets up the controller with the Manager.
NEW
90
func (r *FragmentReconciler) SetupWithManager(mgr ctrl.Manager) error {
×
NEW
91
        return ctrl.NewControllerManagedBy(mgr).
×
NEW
92
                For(&arcv1alpha1.Fragment{}).
×
NEW
93
                Owns(&wfv1alpha1.Workflow{}).
×
NEW
94
                Complete(r)
×
NEW
95
}
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc