/
componentdetectionquery_controller_conditions.go
95 lines (79 loc) · 3.77 KB
/
componentdetectionquery_controller_conditions.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*
Copyright 2022-2023 Red Hat, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package controllers
import (
"context"
"fmt"
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
appstudiov1alpha1 "github.com/redhat-appstudio/application-api/api/v1alpha1"
logutil "github.com/redhat-appstudio/application-service/pkg/log"
)
func (r *ComponentDetectionQueryReconciler) SetDetectingConditionAndUpdateCR(ctx context.Context, req ctrl.Request, componentDetectionQuery *appstudiov1alpha1.ComponentDetectionQuery) {
log := ctrl.LoggerFrom(ctx)
patch := client.MergeFrom(componentDetectionQuery.DeepCopy())
meta.SetStatusCondition(&componentDetectionQuery.Status.Conditions, metav1.Condition{
Type: "Processing",
Status: metav1.ConditionTrue,
Reason: "Success",
Message: "ComponentDetectionQuery is processing",
})
err := r.Client.Status().Patch(ctx, componentDetectionQuery, patch)
if err != nil {
log.Error(err, "Unable to update ComponentDetectionQuery")
}
}
func (r *ComponentDetectionQueryReconciler) SetCompleteConditionAndUpdateCR(ctx context.Context, req ctrl.Request, componentDetectionQuery *appstudiov1alpha1.ComponentDetectionQuery, originalCDQ *appstudiov1alpha1.ComponentDetectionQuery, completeError error) {
log := ctrl.LoggerFrom(ctx)
patch := client.MergeFrom(originalCDQ.DeepCopy())
if completeError == nil {
message := "ComponentDetectionQuery has successfully finished"
if len(componentDetectionQuery.Status.ComponentDetected) == 0 {
message = "ComponentDetectionQuery has successfully finished, no components detected"
}
meta.SetStatusCondition(&componentDetectionQuery.Status.Conditions, metav1.Condition{
Type: "Completed",
Status: metav1.ConditionTrue,
Reason: "OK",
Message: message,
})
logutil.LogAPIResourceChangeEvent(log, componentDetectionQuery.Name, "ComponentDetectionQuery", logutil.ResourceComplete, nil)
} else {
meta.SetStatusCondition(&componentDetectionQuery.Status.Conditions, metav1.Condition{
Type: "Completed",
Status: metav1.ConditionFalse,
Reason: "Error",
Message: fmt.Sprintf("ComponentDetectionQuery failed: %v", completeError),
})
logutil.LogAPIResourceChangeEvent(log, componentDetectionQuery.Name, "ComponentDetectionQuery", logutil.ResourceComplete, completeError)
}
err := r.Client.Status().Patch(ctx, componentDetectionQuery, patch)
if err != nil {
// Error attempting to update the CDQ status. Since some CDQ status fields have specific validation rules (specifically the detected components), a bug could cause
// an invalid field to be present in the status. _If_ the status update fails, still attempt to update only the status conditions
log.Error(err, "Unable to update ComponentDetectionQuery. Will attempt to update only the status condition")
copiedCDQ := originalCDQ.DeepCopy()
meta.SetStatusCondition(&copiedCDQ.Status.Conditions, metav1.Condition{
Type: "Completed",
Status: metav1.ConditionFalse,
Reason: "Error",
Message: fmt.Sprintf("ComponentDetectionQuery failed: %v", completeError),
})
err := r.Client.Status().Patch(ctx, componentDetectionQuery, patch)
if err != nil {
log.Error(err, "Unable to update ComponentDetectionQuery status conditions")
}
}
}