|
| 1 | +package budgetadjustments |
| 2 | + |
| 3 | +import ( |
| 4 | + _ "embed" |
| 5 | + "encoding/json" |
| 6 | + "fmt" |
| 7 | + "io" |
| 8 | + "net/http" |
| 9 | + "net/url" |
| 10 | + "os" |
| 11 | + "time" |
| 12 | + |
| 13 | + "github.com/nobl9/nobl9-go/sdk" |
| 14 | + "github.com/pkg/errors" |
| 15 | + "github.com/spf13/cobra" |
| 16 | + |
| 17 | + "github.com/nobl9/sloctl/internal/printer" |
| 18 | +) |
| 19 | + |
| 20 | +type GetCmd struct { |
| 21 | + client *sdk.Client |
| 22 | + filepath string |
| 23 | + dryRun bool |
| 24 | + outputFormat string |
| 25 | + fieldSeparator string |
| 26 | + recordSeparator string |
| 27 | + out io.Writer |
| 28 | + adjustment string |
| 29 | + from, to TimeValue |
| 30 | + project, sloName string |
| 31 | +} |
| 32 | + |
| 33 | +type SLO struct { |
| 34 | + Project string `json:"project" validate:"required"` |
| 35 | + Name string `json:"name" validate:"required"` |
| 36 | +} |
| 37 | + |
| 38 | +type Event struct { |
| 39 | + EventStart time.Time `json:"eventStart"` |
| 40 | + EventEnd time.Time `json:"eventEnd"` |
| 41 | + Slos []SLO `json:"slos"` |
| 42 | +} |
| 43 | + |
| 44 | +//go:embed examples/get_example.sh |
| 45 | +var example string |
| 46 | + |
| 47 | +func NewGetCmd(client *sdk.Client) *cobra.Command { |
| 48 | + get := &GetCmd{out: os.Stdout} |
| 49 | + |
| 50 | + cmd := &cobra.Command{ |
| 51 | + Use: "get", |
| 52 | + Short: "Return a list of events for given Adjustment with related SLOs.", |
| 53 | + Long: "This endpoint only return past and ongoing events (events that are already started)." + |
| 54 | + "Please see Editing budget adjustments." + |
| 55 | + "Maximum 500 events can be returned." + |
| 56 | + "Optional filtering for specific SLO (only one). If SLO is defined we will return only events for that SLO and the result will also include other SLOs that this events have. Sorted by eventStart.", |
| 57 | + Example: example, |
| 58 | + PersistentPreRun: func(cmd *cobra.Command, args []string) { |
| 59 | + get.client = client |
| 60 | + project, _ := cmd.Flags().GetString(flagProject) |
| 61 | + sloName, _ := cmd.Flags().GetString(flagSloName) |
| 62 | + if project != "" { |
| 63 | + cmd.MarkFlagRequired(flagSloName) |
| 64 | + } |
| 65 | + if sloName != "" { |
| 66 | + cmd.MarkFlagRequired(flagProject) |
| 67 | + } |
| 68 | + }, |
| 69 | + RunE: func(cmd *cobra.Command, args []string) error { return get.run(cmd) }, |
| 70 | + } |
| 71 | + |
| 72 | + registerOutputFormatFlags(cmd, &get.outputFormat, &get.fieldSeparator, &get.recordSeparator) |
| 73 | + registerAdjustmentFlag(cmd, &get.adjustment) |
| 74 | + registerProjectFlag(cmd, &get.project) |
| 75 | + registerSloNameFlag(cmd, &get.sloName) |
| 76 | + registerFromFlag(cmd, &get.from) |
| 77 | + registerToFlag(cmd, &get.to) |
| 78 | + |
| 79 | + return cmd |
| 80 | +} |
| 81 | + |
| 82 | +func (g *GetCmd) run(cmd *cobra.Command) error { |
| 83 | + if g.dryRun { |
| 84 | + g.client.WithDryRun() |
| 85 | + } |
| 86 | + values := url.Values{"from": {g.from.String()}, "to": {g.to.String()}} |
| 87 | + if g.sloName != "" { |
| 88 | + values.Add("sloName", g.sloName) |
| 89 | + } |
| 90 | + if g.project != "" { |
| 91 | + values.Add("project", g.project) |
| 92 | + } |
| 93 | + |
| 94 | + resBody, err := doRequest( |
| 95 | + g.client, |
| 96 | + cmd.Context(), |
| 97 | + http.MethodGet, |
| 98 | + fmt.Sprintf("%s/%s/events", budgetAdjustmentAPI, g.adjustment), |
| 99 | + values, |
| 100 | + ) |
| 101 | + if err != nil { |
| 102 | + return errors.Wrap(err, "failed to get") |
| 103 | + } |
| 104 | + |
| 105 | + var events []Event |
| 106 | + if err := json.Unmarshal(resBody, &events); err != nil { |
| 107 | + return errors.Wrap(err, "failed parse response") |
| 108 | + } |
| 109 | + |
| 110 | + g.printObjects(events) |
| 111 | + |
| 112 | + return nil |
| 113 | +} |
| 114 | + |
| 115 | +func (g *GetCmd) printObjects(objects interface{}) error { |
| 116 | + p, err := printer.New( |
| 117 | + g.out, |
| 118 | + printer.Format(g.outputFormat), |
| 119 | + g.fieldSeparator, |
| 120 | + g.recordSeparator, |
| 121 | + ) |
| 122 | + if err != nil { |
| 123 | + return err |
| 124 | + } |
| 125 | + if err = p.Print(objects); err != nil { |
| 126 | + return err |
| 127 | + } |
| 128 | + return nil |
| 129 | +} |
0 commit comments