-
Notifications
You must be signed in to change notification settings - Fork 132
/
stage.go
135 lines (113 loc) · 3.44 KB
/
stage.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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package verify
import (
"context"
"errors"
"fmt"
"strings"
"connectrpc.com/connect"
"github.com/spf13/cobra"
"github.com/akuity/kargo/internal/cli/client"
"github.com/akuity/kargo/internal/cli/config"
"github.com/akuity/kargo/internal/cli/option"
"github.com/akuity/kargo/internal/cli/templates"
v1alpha1 "github.com/akuity/kargo/pkg/api/service/v1alpha1"
)
type verifyStageOptions struct {
Config config.CLIConfig
ClientOptions client.Options
Project string
Name string
Abort bool
}
func newVerifyStageCommand(cfg config.CLIConfig) *cobra.Command {
cmdOpts := &verifyStageOptions{
Config: cfg,
}
cmd := &cobra.Command{
Use: "stage [--project=project] (NAME) [--abort]",
Short: "(Re)run or abort the verification of the stage's current freight",
Args: option.ExactArgs(1),
Example: templates.Example(`
# Rerun the verification of the stage's current freight
kargo verify stage --project=my-project my-stage
# Rerun the verification of a stage in the default project
kargo config set-project my-project
kargo verify stage my-stage
# Abort the verification of a stage's current freight
kargo verify stage --project=my-project my-stage --abort
# Abort the verification of a stage in the default project
kargo config set-project my-project
kargo verify stage my-stage --abort
`),
RunE: func(cmd *cobra.Command, args []string) error {
cmdOpts.complete(args)
if err := cmdOpts.validate(); err != nil {
return err
}
return cmdOpts.run(cmd.Context())
},
}
// Register the option flags on the command.
cmdOpts.addFlags(cmd)
return cmd
}
// addFlags adds the flags for the verify stage options to the provided command.
func (o *verifyStageOptions) addFlags(cmd *cobra.Command) {
o.ClientOptions.AddFlags(cmd.PersistentFlags())
option.Project(
cmd.Flags(), &o.Project, o.Config.Project,
"The project the stage belongs to. If not set, the default project will be used.",
)
cmd.Flags().BoolVar(&o.Abort, "abort", false, "If set, the verification will be aborted.")
}
// complete sets the options from the command arguments.
func (o *verifyStageOptions) complete(args []string) {
o.Name = strings.TrimSpace(strings.ToLower(args[0]))
}
// validate performs validation of the options. If the options are invalid, an
// error is returned.
func (o *verifyStageOptions) validate() error {
var errs []error
// While the flags are marked as required, a user could still provide an empty
// string. This is a check to ensure that the flags are not empty.
if o.Project == "" {
errs = append(errs, fmt.Errorf("%s is required", option.ProjectFlag))
}
if o.Name == "" {
errs = append(errs, errors.New("name is required"))
}
return errors.Join(errs...)
}
// run requests a rerun of the stage verification.
func (o *verifyStageOptions) run(ctx context.Context) error {
kargoSvcCli, err := client.GetClientFromConfig(ctx, o.Config, o.ClientOptions)
if err != nil {
return fmt.Errorf("get client from config: %w", err)
}
if o.Abort {
if _, err := kargoSvcCli.AbortVerification(
ctx,
connect.NewRequest(
&v1alpha1.AbortVerificationRequest{
Project: o.Project,
Stage: o.Name,
},
),
); err != nil {
return fmt.Errorf("abort verification: %w", err)
}
return nil
}
if _, err := kargoSvcCli.Reverify(
ctx,
connect.NewRequest(
&v1alpha1.ReverifyRequest{
Project: o.Project,
Stage: o.Name,
},
),
); err != nil {
return fmt.Errorf("reverify stage: %w", err)
}
return nil
}