Skip to content

Commit 64a9107

Browse files
feat(approvaltask): add approval progress tracking fields
Introduces approvalsRequired and approvalsReceived status fields to track approval progress, supporting both users and groups. Signed-off-by: PuneetPunamiya <[email protected]>
1 parent 46c5bdc commit 64a9107

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

pkg/apis/approvaltask/v1alpha1/approvaltask_types.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ type ApprovalTaskStatus struct {
6666
ApproversResponse []ApproverState `json:"approversResponse,omitempty"`
6767
// StartTime is the time the build is actually started.
6868
StartTime *metav1.Time `json:"startTime,omitempty"`
69+
// ApprovalsRequired is the number of approvals required for the task
70+
ApprovalsRequired int `json:"approvalsRequired,omitempty"`
71+
// ApprovalsReceived is the number of approvals received so far
72+
ApprovalsReceived int `json:"approvalsReceived,omitempty"`
6973
}
7074

7175
type GroupMemberState struct {

pkg/reconciler/approvaltask/utils.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,8 @@ func createApprovalTask(ctx context.Context, approvaltaskClientSet versioned.Int
259259
State: pendingState,
260260
Approvers: users,
261261
ApproversResponse: []v1alpha1.ApproverState{},
262+
ApprovalsRequired: numberOfApprovalsRequired,
263+
ApprovalsReceived: 0, // Initially no approvals received
262264
}
263265

264266
at.Status = status
@@ -304,6 +306,29 @@ func approvalTaskHasTrueInput(approvalTask v1alpha1.ApprovalTask) bool {
304306
return len(approvedUsers) >= requiredApprovals
305307
}
306308

309+
func countApprovalsReceived(approvalTask v1alpha1.ApprovalTask) int {
310+
// Count unique users who have approved
311+
approvedUsers := make(map[string]bool)
312+
313+
for _, approver := range approvalTask.Spec.Approvers {
314+
if approver.Input != hasApproved {
315+
continue
316+
}
317+
318+
if approver.Type == "User" {
319+
approvedUsers[approver.Name] = true
320+
} else if approver.Type == "Group" {
321+
for _, user := range approver.Users {
322+
if user.Input == hasApproved {
323+
approvedUsers[user.Name] = true
324+
}
325+
}
326+
}
327+
}
328+
329+
return len(approvedUsers)
330+
}
331+
307332
func (r *Reconciler) checkIfUpdateRequired(ctx context.Context, approvalTask v1alpha1.ApprovalTask, run *v1beta1.CustomRun) error {
308333
logger := logging.FromContext(ctx)
309334

@@ -414,6 +439,10 @@ func updateApprovalState(ctx context.Context, approvaltaskClientSet versioned.In
414439
// Update the ApprovedBy list
415440
approvalTask.Status.ApproversResponse = filteredApprovedBy
416441

442+
// Update the approvals count fields
443+
approvalTask.Status.ApprovalsRequired = approvalTask.Spec.NumberOfApprovalsRequired
444+
approvalTask.Status.ApprovalsReceived = countApprovalsReceived(*approvalTask)
445+
417446
// Update the approvalState
418447
// Reject scenario: Check if there is one false and if found mark the approvalstate to false
419448
// Approve scenario: Check if the input value from the user is true and is equal to the approvalsRequired

0 commit comments

Comments
 (0)