@@ -14,12 +14,12 @@ import (
14
14
"github.com/securesign/operator/internal/labels"
15
15
"github.com/securesign/operator/internal/utils/kubernetes"
16
16
"github.com/securesign/operator/internal/utils/kubernetes/ensure"
17
- "github.com/securesign/operator/internal/utils/kubernetes/job"
17
+ jobUtils "github.com/securesign/operator/internal/utils/kubernetes/job"
18
18
v2 "k8s.io/api/batch/v1"
19
19
v1 "k8s.io/api/core/v1"
20
20
"k8s.io/apimachinery/pkg/api/meta"
21
21
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
22
- "sigs. k8s.io/controller-runtime /pkg/client "
22
+ apilabels " k8s.io/apimachinery /pkg/labels "
23
23
"sigs.k8s.io/controller-runtime/pkg/reconcile"
24
24
)
25
25
@@ -41,61 +41,62 @@ func (i initJobAction) CanHandle(_ context.Context, instance *rhtasv1alpha1.Tuf)
41
41
}
42
42
43
43
func (i initJobAction ) Handle (ctx context.Context , instance * rhtasv1alpha1.Tuf ) * action.Result {
44
- if instance .Spec .Pvc .Name != "" {
45
- meta .SetStatusCondition (& instance .Status .Conditions , metav1.Condition {
46
- Type : tufConstants .RepositoryCondition ,
47
- Status : metav1 .ConditionTrue ,
48
- Reason : constants .Ready ,
49
- Message : "Using self-managed tuf repository." ,
50
- })
51
- return i .StatusUpdate (ctx , instance )
44
+ jobLabels := labels .ForResource (tufConstants .ComponentName , tufConstants .InitJobName , instance .Name , instance .Status .PvcName )
45
+ initJobList := & v2.JobList {}
46
+ selector := apilabels .SelectorFromSet (jobLabels )
47
+ if err := kubernetes .FindByLabelSelector (ctx , i .Client , initJobList , instance .Namespace , selector .String ()); err != nil {
48
+ return i .Error (ctx , err , instance )
52
49
}
53
50
54
- if j , err := job . GetJob ( ctx , i . Client , instance . Namespace , tufConstants . InitJobName ); j != nil {
55
- i . Logger . Info ( "Tuf tuf-repository-init is already present." , "Succeeded" , j . Status . Succeeded , "Failures" , j . Status . Failed )
56
- if job . IsCompleted ( * j ) {
57
- if ! job . IsFailed ( * j ) {
58
- meta . SetStatusCondition ( & instance . Status . Conditions , metav1. Condition {
59
- Type : tufConstants . RepositoryCondition ,
60
- Status : metav1 . ConditionTrue ,
61
- Reason : constants . Ready ,
62
- Message : "tuf-repository-init job passed" ,
63
- })
64
- return i . StatusUpdate (ctx , instance )
65
- } else {
66
- err = fmt . Errorf ( "tuf-repository-init job failed" )
67
- meta . SetStatusCondition ( & instance . Status . Conditions , metav1. Condition {
68
- Type : tufConstants . RepositoryCondition ,
69
- Status : metav1 . ConditionFalse ,
70
- Reason : constants . Failure ,
71
- Message : err . Error () ,
72
- })
73
- return i . Error ( ctx , reconcile . TerminalError ( err ), instance )
74
- }
51
+ switch {
52
+ case len ( initJobList . Items ) > 1 :
53
+ return i . Error ( ctx , reconcile . TerminalError ( fmt . Errorf ( "multiple %s jobs present" , tufConstants . InitJobName )), instance )
54
+ case len ( initJobList . Items ) == 1 :
55
+ return i . jobPresent ( ctx , & initJobList . Items [ 0 ], instance )
56
+ default :
57
+ return i . ensureInitJob ( ctx , jobLabels , instance )
58
+ }
59
+ }
60
+
61
+ func ( i initJobAction ) jobPresent (ctx context. Context , job * v2. Job , instance * rhtasv1alpha1. Tuf ) * action. Result {
62
+ i . Logger . Info ( "Tuf tuf-repository-init is present." , "Succeeded" , job . Status . Succeeded , "Failures" , job . Status . Failed )
63
+ if jobUtils . IsCompleted ( * job ) {
64
+ if ! jobUtils . IsFailed ( * job ) {
65
+ meta . SetStatusCondition ( & instance . Status . Conditions , metav1. Condition {
66
+ Type : tufConstants . RepositoryCondition ,
67
+ Status : metav1 . ConditionTrue ,
68
+ Reason : constants . Ready ,
69
+ Message : "tuf-repository-init job passed" ,
70
+ } )
71
+ return i . StatusUpdate ( ctx , instance )
75
72
} else {
76
- // job not completed yet
77
- return i .Requeue ()
73
+ err := fmt .Errorf ("tuf-repository-init job failed" )
74
+ meta .SetStatusCondition (& instance .Status .Conditions , metav1.Condition {
75
+ Type : tufConstants .RepositoryCondition ,
76
+ Status : metav1 .ConditionFalse ,
77
+ Reason : constants .Failure ,
78
+ Message : err .Error (),
79
+ })
80
+ return i .Error (ctx , reconcile .TerminalError (err ), instance )
78
81
}
79
- } else if client . IgnoreNotFound ( err ) != nil {
80
- return i . Error ( ctx , err , instance )
81
-
82
+ } else {
83
+ // job not completed yet
84
+ return i . Requeue ()
82
85
}
86
+ }
83
87
84
- l := labels .For (tufConstants .ComponentName , tufConstants .InitJobName , instance .Name )
85
- pvc , err := kubernetes .GetPVC (ctx , i .Client , instance .Namespace , instance .Status .PvcName )
86
- if err != nil {
87
- return i .Error (ctx , fmt .Errorf ("could not resolve PVC: %w" , err ), instance )
88
- }
89
- if _ , err = kubernetes .CreateOrUpdate (ctx , i .Client ,
88
+ func (i initJobAction ) ensureInitJob (ctx context.Context , labels map [string ]string , instance * rhtasv1alpha1.Tuf ) * action.Result {
89
+
90
+ if _ , err := kubernetes .CreateOrUpdate (ctx , i .Client ,
90
91
& v2.Job {
91
92
ObjectMeta : metav1.ObjectMeta {
92
- Name : tufConstants .InitJobName ,
93
- Namespace : instance .Namespace ,
93
+ GenerateName : tufConstants .InitJobName + "-" ,
94
+ Namespace : instance .Namespace ,
94
95
},
95
96
},
96
- utils .EnsureTufInitJob (instance , tufConstants .RBACInitJobName , l ),
97
- ensure .ControllerReference [* v2.Job ](pvc , i .Client ),
98
- ensure .Labels [* v2.Job ](slices .Collect (maps .Keys (l )), l ),
97
+ utils .EnsureTufInitJob (instance , tufConstants .RBACInitJobName , labels ),
98
+ ensure .ControllerReference [* v2.Job ](instance , i .Client ),
99
+ ensure .Labels [* v2.Job ](slices .Collect (maps .Keys (labels )), labels ),
99
100
func (object * v2.Job ) error {
100
101
ensure .SetProxyEnvs (object .Spec .Template .Spec .Containers )
101
102
return nil
0 commit comments