Skip to content

Commit 67d5569

Browse files
authored
Add stackit git commands: list, describe, create and delete.
* Add stackit git list instances command * Add stackit git list instances command * Git. Move list package and add describe command * Stackit Git create instance command * Add delete command to the stackit git cli
1 parent fdb5bc6 commit 67d5569

File tree

16 files changed

+1621
-0
lines changed

16 files changed

+1621
-0
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ require (
7777
github.com/sourcegraph/conc v0.3.0 // indirect
7878
github.com/spf13/afero v1.12.0 // indirect
7979
github.com/spf13/cast v1.7.1 // indirect
80+
github.com/stackitcloud/stackit-sdk-go/services/git v0.3.1
8081
github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.0.2
8182
github.com/stackitcloud/stackit-sdk-go/services/logme v0.22.1
8283
github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.22.1

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,8 @@ github.com/stackitcloud/stackit-sdk-go/services/authorization v0.6.2 h1:erpN0BM7
119119
github.com/stackitcloud/stackit-sdk-go/services/authorization v0.6.2/go.mod h1:dJ19ZwFjp2bfC5ZobXV3vUdSpE3quUw3GuoFSKLpHIo=
120120
github.com/stackitcloud/stackit-sdk-go/services/dns v0.13.2 h1:6rb3EM0yXuMIBd1U6WsJoMzEiVaHC3WQFWFvT23OE4Y=
121121
github.com/stackitcloud/stackit-sdk-go/services/dns v0.13.2/go.mod h1:PMHoavoIaRZpkI9BA0nsnRjGoHASVSBon45XB3QyhMA=
122+
github.com/stackitcloud/stackit-sdk-go/services/git v0.3.1 h1:1QYUya5bstfd/XdHtQNQU2kHDp1Ikz/e2Zc9o3VSG48=
123+
github.com/stackitcloud/stackit-sdk-go/services/git v0.3.1/go.mod h1:XhXHJpOVC9Rpwyf1G+EpMbprBafH9aZb8vWBdR+z0WM=
122124
github.com/stackitcloud/stackit-sdk-go/services/iaas v0.22.1 h1:JXcLcbVesTtwVVb+jJjU3o0FmSpXBRnOw6PVETaeK+E=
123125
github.com/stackitcloud/stackit-sdk-go/services/iaas v0.22.1/go.mod h1:QNH50Pq0Hu21lLDOwa02PIjRjTl0LfEdHoz5snGQRn8=
124126
github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.0.2 h1:5rVt3n7kDJvJQxFCtxfx8uZI9PGkvJY9fVJ4yar10Uc=

internal/cmd/git/create/create.go

Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
package create
2+
3+
import (
4+
"context"
5+
"encoding/json"
6+
"fmt"
7+
8+
"github.com/goccy/go-yaml"
9+
"github.com/spf13/cobra"
10+
"github.com/stackitcloud/stackit-cli/internal/pkg/args"
11+
"github.com/stackitcloud/stackit-cli/internal/pkg/errors"
12+
"github.com/stackitcloud/stackit-cli/internal/pkg/examples"
13+
"github.com/stackitcloud/stackit-cli/internal/pkg/flags"
14+
"github.com/stackitcloud/stackit-cli/internal/pkg/globalflags"
15+
"github.com/stackitcloud/stackit-cli/internal/pkg/print"
16+
"github.com/stackitcloud/stackit-cli/internal/pkg/services/git/client"
17+
"github.com/stackitcloud/stackit-cli/internal/pkg/spinner"
18+
"github.com/stackitcloud/stackit-cli/internal/pkg/utils"
19+
"github.com/stackitcloud/stackit-sdk-go/services/git"
20+
"github.com/stackitcloud/stackit-sdk-go/services/git/wait"
21+
)
22+
23+
const (
24+
nameFlag = "name"
25+
)
26+
27+
type inputModel struct {
28+
*globalflags.GlobalFlagModel
29+
Id *string
30+
Name string
31+
}
32+
33+
func NewCmd(p *print.Printer) *cobra.Command {
34+
cmd := &cobra.Command{
35+
Use: "create",
36+
Short: "Creates stackit git instance",
37+
Long: "Create an stackit git instance by name.",
38+
Args: args.NoArgs,
39+
Example: examples.Build(
40+
examples.NewExample(
41+
`Create an instance with name 'my-new-instance'`,
42+
`$ stackit git create --name my-new-instance`,
43+
),
44+
),
45+
RunE: func(cmd *cobra.Command, _ []string) (err error) {
46+
ctx := context.Background()
47+
model, err := parseInput(p, cmd)
48+
if err != nil {
49+
return err
50+
}
51+
52+
// Configure API client
53+
apiClient, err := client.ConfigureClient(p)
54+
if err != nil {
55+
return err
56+
}
57+
58+
if !model.AssumeYes {
59+
prompt := fmt.Sprintf("Are you sure you want to create the instance %q?", model.Name)
60+
err = p.PromptForConfirmation(prompt)
61+
if err != nil {
62+
return err
63+
}
64+
}
65+
66+
// Call API
67+
request := buildRequest(ctx, model, apiClient)
68+
69+
result, err := request.Execute()
70+
if err != nil {
71+
return fmt.Errorf("create stackit git instance: %w", err)
72+
}
73+
model.Id = result.Id
74+
75+
// Wait for async operation, if async mode not enabled
76+
if !model.Async {
77+
s := spinner.New(p)
78+
s.Start("Creating stackit git instance")
79+
_, err = wait.CreateGitInstanceWaitHandler(ctx, apiClient, model.ProjectId, *model.Id).WaitWithContext(ctx)
80+
if err != nil {
81+
return fmt.Errorf("wait for stackit git Instance creation: %w", err)
82+
}
83+
s.Stop()
84+
}
85+
86+
return outputResult(p, model, result)
87+
},
88+
}
89+
90+
configureFlags(cmd)
91+
return cmd
92+
}
93+
94+
func configureFlags(cmd *cobra.Command) {
95+
cmd.Flags().String(nameFlag, "", "The name of the instance.")
96+
if err := flags.MarkFlagsRequired(cmd, nameFlag); err != nil {
97+
cobra.CheckErr(err)
98+
}
99+
}
100+
101+
func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) {
102+
globalFlags := globalflags.Parse(p, cmd)
103+
104+
if globalFlags.ProjectId == "" {
105+
return nil, &errors.ProjectIdError{}
106+
}
107+
name := flags.FlagToStringValue(p, cmd, nameFlag)
108+
109+
model := inputModel{
110+
GlobalFlagModel: globalFlags,
111+
Name: name,
112+
}
113+
114+
if p.IsVerbosityDebug() {
115+
modelStr, err := print.BuildDebugStrFromInputModel(model)
116+
if err != nil {
117+
p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err)
118+
} else {
119+
p.Debug(print.DebugLevel, "parsed input values: %s", modelStr)
120+
}
121+
}
122+
123+
return &model, nil
124+
}
125+
126+
func buildRequest(ctx context.Context, model *inputModel, apiClient *git.APIClient) git.ApiCreateInstanceRequest {
127+
return apiClient.CreateInstance(ctx, model.ProjectId).CreateInstancePayload(createPayload(model))
128+
}
129+
130+
func createPayload(model *inputModel) git.CreateInstancePayload {
131+
return git.CreateInstancePayload{
132+
Name: &model.Name,
133+
}
134+
}
135+
136+
func outputResult(p *print.Printer, model *inputModel, resp *git.Instance) error {
137+
if model == nil {
138+
return fmt.Errorf("input model is nil")
139+
}
140+
var outputFormat string
141+
if model.GlobalFlagModel != nil {
142+
outputFormat = model.OutputFormat
143+
}
144+
switch outputFormat {
145+
case print.JSONOutputFormat:
146+
details, err := json.MarshalIndent(resp, "", " ")
147+
if err != nil {
148+
return fmt.Errorf("marshal instance: %w", err)
149+
}
150+
p.Outputln(string(details))
151+
152+
return nil
153+
case print.YAMLOutputFormat:
154+
details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler())
155+
if err != nil {
156+
return fmt.Errorf("marshal iminstanceage: %w", err)
157+
}
158+
p.Outputln(string(details))
159+
160+
return nil
161+
default:
162+
p.Outputf("Created instance %q with id %s\n", model.Name, utils.PtrString(model.Id))
163+
return nil
164+
}
165+
}

0 commit comments

Comments
 (0)