Skip to content
This repository was archived by the owner on Mar 24, 2025. It is now read-only.

Commit 5ee7164

Browse files
authored
🎨 Implement redo pipeline trigger changes in the CLI (#1215)
1 parent 880614b commit 5ee7164

File tree

5 files changed

+170
-88
lines changed

5 files changed

+170
-88
lines changed

cmd/common/pipeline.go

Lines changed: 165 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ import (
1212
"google.golang.org/protobuf/types/known/durationpb"
1313
)
1414

15+
// var conditionTypes = []string{
16+
// "Time Alive",
17+
// }
18+
1519
func PromptPipelines(
1620
prompter Prompter,
1721
pipelines []*model.Pipeline,
@@ -160,12 +164,17 @@ func updatePipeline(
160164
pipeline.Phases = append(pipeline.Phases, phase)
161165
fields = slices.Insert(fields, len(fields)-3, fmt.Sprintf("Phase %s", phase.GetEnvironmentId()))
162166
case len(fields) - 2:
163-
header := []string{"Environment", "Triggers", "Fixed Fields"}
167+
header := []string{"Environment", "Manual Trigger", "Auto Trigger", "Field Prefixes"}
164168
rows := [][]string{}
165169
for _, p := range pipeline.Phases {
166-
var triggers []string
167-
for _, t := range p.GetTriggers() {
168-
triggers = append(triggers, triggerToString(t))
170+
manualTrigger := "None"
171+
if p.GetTriggers().GetManual() != nil {
172+
manualTrigger = triggerToString(p.GetTriggers().GetManual())
173+
}
174+
175+
autoTrigger := "None"
176+
if p.GetTriggers().GetAutomatic() != nil {
177+
autoTrigger = triggerToString(p.GetTriggers().GetAutomatic())
169178
}
170179

171180
fieldsString := ""
@@ -178,8 +187,9 @@ func updatePipeline(
178187
fieldsString += strings.Join(p.GetFieldPrefixes().GetPrefixes(), "/n")
179188
}
180189

181-
rows = append(rows, []string{p.GetEnvironmentId(), strings.Join(triggers, "\n"),
182-
fieldsString})
190+
rows = append(rows, []string{
191+
p.GetEnvironmentId(), manualTrigger, autoTrigger, fieldsString,
192+
})
183193
}
184194
i, err := prompter.TableSelect("Select the phase to update (CTRL + C to cancel)", rows, header)
185195
if err != nil {
@@ -333,127 +343,197 @@ func updateFieldPrefixes(prompter Prompter, prefixes *model.FieldPrefixes) (*mod
333343
}
334344
}
335345

336-
func updateTriggers(prompter Prompter, triggers []*model.PromotionTrigger) ([]*model.PromotionTrigger, error) {
337-
if len(triggers) == 0 {
338-
fmt.Println("No triggers configured - Let's configure one!")
339-
t, err := updateTrigger(prompter, nil)
340-
if err != nil {
341-
return nil, err
342-
}
343-
344-
return []*model.PromotionTrigger{
345-
t,
346-
}, nil
346+
func updateTriggers(prompter Prompter, triggers *model.Triggers) (*model.Triggers, error) {
347+
if triggers == nil {
348+
triggers = &model.Triggers{}
347349
}
350+
triggers = proto.Clone(triggers).(*model.Triggers)
351+
352+
triggerToLabel := func(t *model.Trigger) string {
353+
if t == nil {
354+
return "None"
355+
}
348356

349-
triggerToRow := func(t *model.PromotionTrigger) []string {
350-
details := "None"
351-
if t.GetCondition() != nil {
357+
var conditions []string
358+
for _, t := range t.GetConditions() {
352359
switch v := t.GetCondition().(type) {
353-
case *model.PromotionTrigger_TimeAlive:
354-
details = fmt.Sprintf("Time Alive: %s", v.TimeAlive.AsDuration().String())
355-
default:
356-
details = "Unknown"
360+
case *model.Trigger_Condition_TimeAlive:
361+
conditions = append(conditions, fmt.Sprintf("Time Alive: %s", v.TimeAlive.AsDuration().String()))
357362
}
358363
}
359364

360-
triggerType := "Manual"
361-
if t.GetAutomatic() {
362-
triggerType = "Auto"
365+
triggerType := "one-of"
366+
if t.GetRequireAll() {
367+
triggerType = "all-of"
363368
}
364369

365-
return []string{triggerType, details}
370+
return fmt.Sprintf("%s (%s)", triggerType, strings.Join(conditions, ", "))
366371
}
367372

368-
header := []string{"Type", "Details"}
369-
var triggerRows [][]string
370-
for _, t := range triggers {
371-
triggerRows = append(triggerRows, triggerToRow(t))
373+
triggerLabels := []string{
374+
"Auto " + triggerToLabel(triggers.GetAutomatic()),
375+
"Manual " + triggerToLabel(triggers.GetManual()),
376+
"Done",
372377
}
373-
triggerRows = append(triggerRows, []string{"Add new trigger", ""})
374-
triggerRows = append(triggerRows, []string{"Remove trigger", ""})
375-
triggerRows = append(triggerRows, []string{"Done", ""})
376378

377379
for {
378-
i, err := prompter.TableSelect("Select the trigger to update (CTRL + C to cancel)", triggerRows, header)
380+
i, _, err := prompter.Select("Select the trigger to update (CTRL + C to cancel)", triggerLabels)
379381
if err != nil {
380382
return nil, err
381383
}
382384

383385
switch i {
384-
case len(triggerRows) - 1:
386+
case 2:
385387
return triggers, nil
386-
case len(triggerRows) - 2:
387-
// Remove trigger
388-
i, err := prompter.TableSelect("Select the trigger to remove (CTRL + C to cancel)",
389-
triggerRows[:len(triggerRows)-3], header)
388+
case 1:
389+
t, err := updateTrigger(prompter, triggers.GetManual())
390390
if err != nil {
391391
if ErrIsAborted(err) {
392392
continue
393393
}
394394
return nil, err
395395
}
396396

397-
triggerRows = append(triggerRows[:i], triggerRows[i+1:]...)
398-
triggers = append(triggers[:i], triggers[i+1:]...)
399-
case len(triggerRows) - 3:
397+
triggers.Manual = t
398+
triggerLabels[1] = "Manual " + triggerToLabel(t)
399+
case 0:
400400
// Add new trigger
401-
t, err := updateTrigger(prompter, nil)
401+
t, err := updateTrigger(prompter, triggers.GetAutomatic())
402402
if err != nil {
403403
if ErrIsAborted(err) {
404404
continue
405405
}
406406
return nil, err
407407
}
408408

409-
triggers = append(triggers, t)
410-
triggerRows = slices.Insert(triggerRows, len(triggerRows)-3, triggerToRow(t))
411-
default:
412-
// Update trigger
413-
t, err := updateTrigger(prompter, triggers[i])
409+
triggers.Automatic = t
410+
triggerLabels[0] = "Auto " + triggerToLabel(t)
411+
}
412+
}
413+
}
414+
415+
func updateTrigger(prompter Prompter, trigger *model.Trigger) (*model.Trigger, error) {
416+
if trigger == nil {
417+
trigger = &model.Trigger{}
418+
}
419+
trigger = proto.Clone(trigger).(*model.Trigger)
420+
421+
require := "Require all conditions"
422+
if trigger.GetRequireAll() {
423+
require = "Require any condition"
424+
}
425+
426+
fields := []string{
427+
require,
428+
"Conditions",
429+
"Clear",
430+
"Done",
431+
}
432+
433+
for {
434+
i, _, err := prompter.Select("Select the field to update (CTRL + C to cancel)", fields)
435+
if err != nil {
436+
return nil, err
437+
}
438+
439+
switch i {
440+
case 0:
441+
trigger.RequireAll = !trigger.RequireAll
442+
fields[0] = "Require all conditions"
443+
if trigger.GetRequireAll() {
444+
fields[0] = "Require any condition"
445+
}
446+
case 1:
447+
conditions, err := updateConditions(prompter, trigger.GetConditions())
414448
if err != nil {
415449
if ErrIsAborted(err) {
416450
continue
417451
}
418452
return nil, err
419453
}
420454

421-
triggers[i] = t
422-
triggerRows[i] = triggerToRow(t)
455+
trigger.Conditions = conditions
456+
case 2:
457+
return nil, nil
458+
case 3:
459+
return trigger, nil
423460
}
424461
}
425462
}
426463

427-
func updateTrigger(prompter Prompter, trigger *model.PromotionTrigger) (*model.PromotionTrigger, error) {
428-
if trigger == nil {
429-
trigger = &model.PromotionTrigger{}
430-
}
431-
trigger = proto.Clone(trigger).(*model.PromotionTrigger)
464+
func updateConditions(prompter Prompter, conditions []*model.Trigger_Condition) ([]*model.Trigger_Condition, error) {
465+
conditionToLabel := func(c *model.Trigger_Condition) string {
466+
switch v := c.GetCondition().(type) {
467+
case *model.Trigger_Condition_TimeAlive:
468+
return fmt.Sprintf("Time Alive: %s", v.TimeAlive.AsDuration().String())
469+
}
432470

433-
types := []string{"Auto", "Manual"}
434-
i, _, err := prompter.Select("Select the trigger type", types)
435-
if err != nil {
436-
return nil, err
471+
return "None"
437472
}
438473

439-
if i == 0 {
440-
trigger.Automatic = true
441-
} else {
442-
trigger.Automatic = false
474+
conditionLabels := []string{}
475+
for _, c := range conditions {
476+
conditionLabels = append(conditionLabels, conditionToLabel(c))
443477
}
478+
conditionLabels = append(conditionLabels, "Add", "Remove", "Done")
444479

445-
hasCondition, err := prompter.Confirm("Is this trigger condition based?", false)
446-
if err != nil {
447-
return nil, err
480+
for {
481+
i, _, err := prompter.Select("Select the condition to update (CTRL + C to cancel)", conditionLabels)
482+
if err != nil {
483+
return nil, err
484+
}
485+
486+
switch i {
487+
case len(conditionLabels) - 3:
488+
// When we have more, we should switch on types
489+
c, err := updateTimeAliveCondition(prompter, nil)
490+
if err != nil {
491+
if ErrIsAborted(err) {
492+
continue
493+
}
494+
return nil, err
495+
}
496+
497+
conditions = append(conditions, c)
498+
499+
conditionLabels = slices.Insert(conditionLabels,
500+
len(conditionLabels)-3, conditionToLabel(conditions[len(conditions)-1]))
501+
case len(conditionLabels) - 2:
502+
i, _, err := prompter.Select("Select the condition to remove", conditionLabels[:len(conditionLabels)-3])
503+
if err != nil {
504+
if ErrIsAborted(err) {
505+
continue
506+
}
507+
return nil, err
508+
}
509+
510+
conditions = append(conditions[:i], conditions[i+1:]...)
511+
conditionLabels = append(conditionLabels[:i], conditionLabels[i+1:]...)
512+
case len(conditionLabels) - 1:
513+
return conditions, nil
514+
default:
515+
c, err := updateTimeAliveCondition(prompter, conditions[i])
516+
if err != nil {
517+
if ErrIsAborted(err) {
518+
continue
519+
}
520+
return nil, err
521+
}
522+
523+
conditions[i] = c
524+
conditionLabels[i] = conditionToLabel(c)
525+
}
448526
}
527+
}
449528

450-
if !hasCondition {
451-
trigger.Condition = nil
452-
return trigger, nil
529+
func updateTimeAliveCondition(prompter Prompter, c *model.Trigger_Condition) (*model.Trigger_Condition, error) {
530+
if c == nil {
531+
c = &model.Trigger_Condition{}
453532
}
454533

534+
c = proto.Clone(c).(*model.Trigger_Condition)
455535
d, err := prompter.Input("Enter the time alive", ValidateDurationOpt,
456-
InputDefaultOpt(trigger.GetTimeAlive().AsDuration().String()))
536+
InputDefaultOpt(c.GetTimeAlive().AsDuration().String()))
457537
if err != nil {
458538
return nil, err
459539
}
@@ -463,25 +543,27 @@ func updateTrigger(prompter Prompter, trigger *model.PromotionTrigger) (*model.P
463543
return nil, err
464544
}
465545

466-
trigger.Condition = &model.PromotionTrigger_TimeAlive{
546+
c.Condition = &model.Trigger_Condition_TimeAlive{
467547
TimeAlive: durationpb.New(dur),
468548
}
469549

470-
return trigger, nil
550+
return c, nil
471551
}
472552

473-
func triggerToString(t *model.PromotionTrigger) string {
474-
str := "manual"
475-
if t.GetAutomatic() {
476-
str = "auto"
553+
func triggerToString(t *model.Trigger) string {
554+
require := "one-of"
555+
if t.GetRequireAll() {
556+
require = "all-of"
477557
}
478558

479-
if t.GetCondition() != nil {
480-
switch v := t.GetCondition().(type) {
481-
case *model.PromotionTrigger_TimeAlive:
482-
str = str + fmt.Sprintf(" (%s)", v.TimeAlive.AsDuration().String())
559+
conditions := []string{}
560+
561+
for _, c := range t.GetConditions() {
562+
switch v := c.GetCondition().(type) {
563+
case *model.Trigger_Condition_TimeAlive:
564+
conditions = append(conditions, fmt.Sprintf("Time Alive (%s)", v.TimeAlive.AsDuration().String()))
483565
}
484566
}
485567

486-
return str
568+
return fmt.Sprintf("%s: %s)", require, strings.Join(conditions, ", "))
487569
}

cmd/rig/cmd/capsule/pipeline/progress.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ func (c *Cmd) progress(ctx context.Context, cmd *cobra.Command, args []string) e
3434
return err
3535
}
3636

37-
resp, err := c.Rig.Capsule().ProgressPipeline(ctx, connect.NewRequest(&capsule_api.ProgressPipelineRequest{
37+
resp, err := c.Rig.Capsule().PromotePipeline(ctx, connect.NewRequest(&capsule_api.PromotePipelineRequest{
3838
ExecutionId: pipelineID,
3939
DryRun: dryRun,
4040
}))

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ require (
3131
github.com/nyaruka/phonenumbers v1.1.7
3232
github.com/pkg/errors v0.9.1
3333
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.70.0
34-
github.com/rigdev/rig-go-api v0.0.0-20240912093741-f27a73d5eed6
34+
github.com/rigdev/rig-go-api v0.0.0-20240913070422-446ab5e22615
3535
github.com/rigdev/rig-go-sdk v0.0.0-20240612092526-69df8621bc22
3636
github.com/rivo/tview v0.0.0-20240524063012-037df494fb76
3737
github.com/robfig/cron v1.2.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -302,8 +302,8 @@ github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+a
302302
github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U=
303303
github.com/prometheus/procfs v0.14.0 h1:Lw4VdGGoKEZilJsayHf0B+9YgLGREba2C6xr+Fdfq6s=
304304
github.com/prometheus/procfs v0.14.0/go.mod h1:XL+Iwz8k8ZabyZfMFHPiilCniixqQarAy5Mu67pHlNQ=
305-
github.com/rigdev/rig-go-api v0.0.0-20240912093741-f27a73d5eed6 h1:NWNK514FRXVxUIaN/rbFJ25+z8ccr6bVcU+9qH7gc+0=
306-
github.com/rigdev/rig-go-api v0.0.0-20240912093741-f27a73d5eed6/go.mod h1:boVP47XBT/EkpqjVXkZCcF31Nw5RMRANwQuaVvgw9dM=
305+
github.com/rigdev/rig-go-api v0.0.0-20240913070422-446ab5e22615 h1:Sj/rul1RGG/TJuVBTpsMh4l022OCeocsfNYZIdlRvg8=
306+
github.com/rigdev/rig-go-api v0.0.0-20240913070422-446ab5e22615/go.mod h1:boVP47XBT/EkpqjVXkZCcF31Nw5RMRANwQuaVvgw9dM=
307307
github.com/rigdev/rig-go-sdk v0.0.0-20240612092526-69df8621bc22 h1:NFjBY/F42lcgqnqru+h1q3RrzRk645HUilCvbZD7exI=
308308
github.com/rigdev/rig-go-sdk v0.0.0-20240612092526-69df8621bc22/go.mod h1:bmASl5RyuOoEddGeaOxHB27W3KDI4sBxqfnR1cRTstY=
309309
github.com/rivo/tview v0.0.0-20240524063012-037df494fb76 h1:iqvDlgyjmqleATtFbA7c14djmPh2n4mCYUv7JlD/ruA=

pkg/rbac/actions.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ var CapsuleActionMap = map[string]string{
158158
capsuleconnect.ServiceListPipelineStatusesProcedure: ActionCapsuleView,
159159
capsuleconnect.ServiceGetPipelineStatusProcedure: ActionCapsuleView,
160160
capsuleconnect.ServiceAbortPipelineProcedure: ActionCapsuleDeploy,
161-
capsuleconnect.ServiceProgressPipelineProcedure: ActionCapsuleDeploy,
161+
capsuleconnect.ServicePromotePipelineProcedure: ActionCapsuleDeploy,
162162
capsuleconnect.ServiceStartPipelineProcedure: ActionCapsuleDeploy,
163163
}
164164

0 commit comments

Comments
 (0)