Skip to content

Commit

Permalink
✨ Add conditions to manual progressions and other slight changes (#1201)
Browse files Browse the repository at this point in the history
  • Loading branch information
Munklinde96 authored Sep 11, 2024
1 parent 9f82b30 commit 381b09e
Show file tree
Hide file tree
Showing 7 changed files with 148 additions and 75 deletions.
145 changes: 100 additions & 45 deletions cmd/common/pipeline.go
Original file line number Diff line number Diff line change
Expand Up @@ -165,15 +165,21 @@ func updatePipeline(
for _, p := range pipeline.Phases {
var triggers []string
for _, t := range p.GetTriggers() {
switch v := t.GetTrigger().(type) {
case *model.PromotionTrigger_Auto_:
triggers = append(triggers, fmt.Sprintf("auto (%s)", v.Auto.GetTimeAlive().AsDuration().String()))
case *model.PromotionTrigger_Manual_:
triggers = append(triggers, "manual")
triggers = append(triggers, triggerToString(t))
}

fieldsString := ""
if len(p.GetFieldPrefixes().GetPrefixes()) > 0 {
fieldsString = "Excluded: "
if p.GetFieldPrefixes().GetInclusion() {
fieldsString = "Included: "
}

fieldsString += strings.Join(p.GetFieldPrefixes().GetPrefixes(), "/n")
}

rows = append(rows, []string{p.GetEnvironmentId(), strings.Join(triggers, "\n"),
strings.Join(p.GetFixedFields(), "\n")})
fieldsString})
}
i, err := prompter.TableSelect("Select the phase to update (CTRL + C to cancel)", rows, header)
if err != nil {
Expand Down Expand Up @@ -247,30 +253,47 @@ func updatePhase(

phase.Triggers = triggers
case 2:
fixedFields, err := updateFixedFields(prompter, phase.GetFixedFields())
fieldPrefixes, err := updateFieldPrefixes(prompter, phase.GetFieldPrefixes())
if err != nil {
if ErrIsAborted(err) {
continue
}
return nil, err
}

phase.FixedFields = fixedFields
phase.FieldPrefixes = fieldPrefixes
case 3:
return phase, nil
}
}
}

func updateFixedFields(prompter Prompter, fixedFields []string) ([]string, error) {
fields := append(fixedFields, "Add", "Remove", "Done")
func updateFieldPrefixes(prompter Prompter, prefixes *model.FieldPrefixes) (*model.FieldPrefixes, error) {
if prefixes == nil {
prefixes = &model.FieldPrefixes{}
}
prefixes = proto.Clone(prefixes).(*model.FieldPrefixes)
inclusion := "Include Fields"
if prefixes.Inclusion {
inclusion = "Exclude Fields"
}

fields := append(prefixes.GetPrefixes(), inclusion, "Add", "Remove", "Done")
for {
i, _, err := prompter.Select("Select the field to update (CTRL + C to cancel)", fields)
if err != nil {
return nil, err
}

switch i {
case len(fields) - 4:
prefixes.Inclusion = !prefixes.Inclusion
inclusion := "Include Fields"
if prefixes.Inclusion {
inclusion = "Exclude Fields"
}

fields[len(fields)-4] = inclusion
case len(fields) - 3:
field, err := prompter.Input("Enter the fixed field", ValidateNonEmptyOpt)
if err != nil {
Expand All @@ -280,30 +303,32 @@ func updateFixedFields(prompter Prompter, fixedFields []string) ([]string, error
return nil, err
}

fixedFields = append(fixedFields, field)
fields = append(fields[:len(fields)-3], field, "Add", "Remove", "Done")
prefixes.Prefixes = append(prefixes.GetPrefixes(), field)
fields = append(fields[:len(fields)-4], field, "Add", "Remove", "Done")
case len(fields) - 2:
i, _, err := prompter.Select("Select the field to remove", fixedFields)
i, _, err := prompter.Select("Select the field to remove", prefixes.GetPrefixes())
if err != nil {
if ErrIsAborted(err) {
continue
}
return nil, err
}

fixedFields = append(fixedFields[:i], fixedFields[i+1:]...)
prefixes.Prefixes = append(prefixes.GetPrefixes()[:i], prefixes.GetPrefixes()[i+1:]...)
fields = append(fields[:len(fields)-4], "Add", "Remove", "Done")
case len(fields) - 1:
return fixedFields, nil
return prefixes, nil
default:
field, err := prompter.Input("Enter the fixed field", ValidateNonEmptyOpt, InputDefaultOpt(fixedFields[i]))
field, err := prompter.Input("Enter the fixed field", ValidateNonEmptyOpt,
InputDefaultOpt(prefixes.GetPrefixes()[i]))
if err != nil {
if ErrIsAborted(err) {
continue
}
return nil, err
}

fixedFields[i] = field
prefixes.Prefixes[i] = field
}
}
}
Expand All @@ -322,13 +347,22 @@ func updateTriggers(prompter Prompter, triggers []*model.PromotionTrigger) ([]*m
}

triggerToRow := func(t *model.PromotionTrigger) []string {
switch v := t.GetTrigger().(type) {
case *model.PromotionTrigger_Auto_:
return []string{"Auto", v.Auto.GetTimeAlive().AsDuration().String()}
case *model.PromotionTrigger_Manual_:
return []string{"Manual", ""}
details := "None"
if t.GetCondition() != nil {
switch v := t.GetCondition().(type) {
case *model.PromotionTrigger_TimeAlive:
details = fmt.Sprintf("Time Alive: %s", v.TimeAlive.AsDuration().String())
default:
details = "Unknown"
}
}
return nil

triggerType := "Manual"
if t.GetAutomatic() {
triggerType = "Auto"
}

return []string{triggerType, details}
}

header := []string{"Type", "Details"}
Expand Down Expand Up @@ -402,31 +436,52 @@ func updateTrigger(prompter Prompter, trigger *model.PromotionTrigger) (*model.P
return nil, err
}

switch i {
case 0:
d, err := prompter.Input("Enter the time alive", ValidateDurationOpt,
InputDefaultOpt(trigger.GetAuto().GetTimeAlive().AsDuration().String()))
if err != nil {
return nil, err
}
if i == 0 {
trigger.Automatic = true
} else {
trigger.Automatic = false
}

dur, err := time.ParseDuration(d)
if err != nil {
return nil, err
}
hasCondition, err := prompter.Confirm("Is this trigger condition based?", false)
if err != nil {
return nil, err
}

trigger.Trigger = &model.PromotionTrigger_Auto_{
Auto: &model.PromotionTrigger_Auto{
Trigger: &model.PromotionTrigger_Auto_TimeAlive{
TimeAlive: durationpb.New(dur),
},
},
}
case 1:
trigger.Trigger = &model.PromotionTrigger_Manual_{
Manual: &model.PromotionTrigger_Manual{},
}
if !hasCondition {
trigger.Condition = nil
return trigger, nil
}

d, err := prompter.Input("Enter the time alive", ValidateDurationOpt,
InputDefaultOpt(trigger.GetTimeAlive().AsDuration().String()))
if err != nil {
return nil, err
}

dur, err := time.ParseDuration(d)
if err != nil {
return nil, err
}

trigger.Condition = &model.PromotionTrigger_TimeAlive{
TimeAlive: durationpb.New(dur),
}

return trigger, nil
}

func triggerToString(t *model.PromotionTrigger) string {
str := "manual"
if t.GetAutomatic() {
str = "auto"
}

if t.GetCondition() != nil {
switch v := t.GetCondition().(type) {
case *model.PromotionTrigger_TimeAlive:
str = str + fmt.Sprintf(" (%s)", v.TimeAlive.AsDuration().String())
}
}

return str
}
7 changes: 4 additions & 3 deletions cmd/rig/cmd/capsule/pipeline/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,9 @@ import (
func (c *Cmd) list(ctx context.Context, _ *cobra.Command, _ []string) error {
listResp, err := c.Rig.Capsule().ListPipelineStatuses(ctx, connect.NewRequest(&capsule.ListPipelineStatusesRequest{
Pagination: &model.Pagination{
Offset: uint32(offset),
Limit: uint32(limit),
Offset: uint32(offset),
Limit: uint32(limit),
Descending: true,
},
CapsuleFilter: capsule_cmd.CapsuleID,
ProjectFilter: c.Scope.GetCurrentContext().GetProject(),
Expand Down Expand Up @@ -63,6 +64,6 @@ func pipelineStatusToTableRow(s *pipeline_api.Status) []string {
currentPhaseStatus.GetEnvironmentId(),
currentPhaseStatus.GetState().String(),
fmt.Sprint(currentPhaseStatus.GetRolloutId()),
currentPhaseStatus.GetMessage(),
currentPhaseStatus.GetMessages()[len(currentPhaseStatus.GetMessages())-1].Message,
}
}
2 changes: 1 addition & 1 deletion cmd/rig/cmd/capsule/pipeline/progress.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ func (c *Cmd) progress(ctx context.Context, cmd *cobra.Command, args []string) e
}

if !dryRun {
cmd.Printf("pipeline execution %v progressed to phase %v", pipelineID,
cmd.Printf("pipeline execution %v progressed to phase %v \n", pipelineID,
resp.Msg.GetStatus().GetPhaseStatuses()[len(resp.Msg.GetStatus().GetPhaseStatuses())-1].GetEnvironmentId())
return nil
}
Expand Down
33 changes: 25 additions & 8 deletions cmd/rig/cmd/capsule/pipeline/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
capsule_api "github.com/rigdev/rig-go-api/api/v1/capsule"
pipeline_api "github.com/rigdev/rig-go-api/api/v1/capsule/pipeline"
project_api "github.com/rigdev/rig-go-api/api/v1/project"
"github.com/rigdev/rig-go-api/model"
"github.com/rigdev/rig-go-sdk"
"github.com/rigdev/rig/cmd/common"
"github.com/rigdev/rig/cmd/rig/cmd/capsule"
Expand Down Expand Up @@ -194,26 +195,39 @@ func (c *Cmd) promptForPipelineID(ctx context.Context) (string, error) {
resp, err := c.Rig.Capsule().ListPipelineStatuses(ctx,
connect.NewRequest(&capsule_api.ListPipelineStatusesRequest{
ProjectFilter: c.Scope.GetCurrentContext().GetProject(),
Pagination: &model.Pagination{
Descending: true,
},
}))
if err != nil {
return "", err
}

var pipelineStatusIDs []string
for _, status := range resp.Msg.GetStatuses() {
pipelineStatusIDs = append(pipelineStatusIDs, fmt.Sprint(status.GetExecutionId()))
var rows [][]string
for _, pipeline := range resp.Msg.GetStatuses() {
rows = append(rows, []string{
fmt.Sprint(pipeline.GetExecutionId()),
pipeline.GetCapsuleId(),
pipeline.GetPipelineName(),
pipeline.GetState().String(),
})
}

if len(pipelineStatusIDs) == 0 {
if len(rows) == 0 {
return "", fmt.Errorf("no pipeline executions found")
}

_, pipelineStatusID, err := c.Prompter.Select("Pipeline ID", pipelineStatusIDs)
i, err := c.Prompter.TableSelect("Pipeline ID", rows, []string{
"ID",
"Capsule",
"Pipeline",
"State",
})
if err != nil {
return "", err
}

return pipelineStatusID, nil
return fmt.Sprint(resp.Msg.Statuses[i].GetExecutionId()), nil
}

func (c *Cmd) pipelineStatusCompletions(
Expand All @@ -230,6 +244,9 @@ func (c *Cmd) pipelineStatusCompletions(
resp, err := c.Rig.Capsule().ListPipelineStatuses(ctx,
connect.NewRequest(&capsule_api.ListPipelineStatusesRequest{
ProjectFilter: c.Scope.GetCurrentContext().GetProject(),
Pagination: &model.Pagination{
Descending: true,
},
}))
if err != nil {
return nil, cobra.ShellCompDirectiveError
Expand All @@ -256,8 +273,8 @@ func formatPipelineStatus(status *pipeline_api.Status) string {
} else {
startedAt = time.Since(status.GetStartedAt().AsTime()).Truncate(time.Second).String()
}
return fmt.Sprintf("%d\t (State: %v, Started At: %v)",
status.GetExecutionId(), status.GetState(), startedAt)
return fmt.Sprintf("%d\t (Capsule: %s, Pipeline %s, State: %v, Started At: %v)",
status.GetExecutionId(), status.GetCapsuleId(), status.GetPipelineName(), status.GetState(), startedAt)
}

func (c *Cmd) pipelineNameCompletion(
Expand Down
6 changes: 3 additions & 3 deletions docs/docs/api/platform-api.md
Original file line number Diff line number Diff line change
Expand Up @@ -1680,7 +1680,7 @@ A reference to a kubernetes object.
| scale | [Scale](#platform-v1-Scale) | | |
| cronJobs | [CronJob](#platform-v1-CronJob) | repeated | |
| autoAddRigServiceAccounts | [bool](#bool) | | |
| extentions | [CapsuleSpec.ExtentionsEntry](#platform-v1-CapsuleSpec-ExtentionsEntry) | repeated | |
| extensions | [CapsuleSpec.ExtensionsEntry](#platform-v1-CapsuleSpec-ExtensionsEntry) | repeated | |



Expand All @@ -1703,9 +1703,9 @@ A reference to a kubernetes object.



<a name="platform-v1-CapsuleSpec-ExtentionsEntry"></a>
<a name="platform-v1-CapsuleSpec-ExtensionsEntry"></a>

### CapsuleSpec.ExtentionsEntry
### CapsuleSpec.ExtensionsEntry



Expand Down
10 changes: 5 additions & 5 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ require (
github.com/nyaruka/phonenumbers v1.1.7
github.com/pkg/errors v0.9.1
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.70.0
github.com/rigdev/rig-go-api v0.0.0-20240905133218-c6e2ad67afd9
github.com/rigdev/rig-go-api v0.0.0-20240911063651-90d87be8289c
github.com/rigdev/rig-go-sdk v0.0.0-20240612092526-69df8621bc22
github.com/rivo/tview v0.0.0-20240524063012-037df494fb76
github.com/robfig/cron v1.2.0
Expand All @@ -46,9 +46,9 @@ require (
go.uber.org/fx v1.19.3
go.uber.org/zap v1.27.0
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842
golang.org/x/net v0.28.0
golang.org/x/term v0.23.0
google.golang.org/grpc v1.66.0
golang.org/x/net v0.29.0
golang.org/x/term v0.24.0
google.golang.org/grpc v1.66.1
google.golang.org/protobuf v1.34.2
gopkg.in/yaml.v3 v3.0.1
helm.sh/helm/v3 v3.15.4
Expand Down Expand Up @@ -168,7 +168,7 @@ require (
go.opentelemetry.io/otel/trace v1.28.0 // indirect
go.uber.org/atomic v1.11.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/crypto v0.26.0 // indirect
golang.org/x/crypto v0.27.0 // indirect
golang.org/x/mod v0.17.0 // indirect
golang.org/x/oauth2 v0.21.0 // indirect
golang.org/x/sync v0.8.0 // indirect
Expand Down
Loading

0 comments on commit 381b09e

Please sign in to comment.