Skip to content

Commit 8eb5abb

Browse files
committed
feat: add create project command
Signed-off-by: Chris Goller <[email protected]>
1 parent 6f18158 commit 8eb5abb

File tree

11 files changed

+164
-22
lines changed

11 files changed

+164
-22
lines changed

buf.gen.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ managed:
77
except:
88
- buf.build/googleapis/googleapis
99
- buf.build/depot/buildkit
10+
- buf.build/depot/api
1011
plugins:
1112
- plugin: buf.build/protocolbuffers/go:v1.31.0
1213
out: pkg/proto

go.mod

+8-6
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ module github.com/depot/cli
33
go 1.20
44

55
require (
6-
connectrpc.com/connect v1.13.0
6+
buf.build/gen/go/depot/api/connectrpc/go v1.15.0-20240220165926-8fccc82c3226.1
7+
buf.build/gen/go/depot/api/protocolbuffers/go v1.32.0-20240220165926-8fccc82c3226.1
8+
connectrpc.com/connect v1.15.0
79
github.com/adrg/xdg v0.4.0
810
github.com/briandowns/spinner v1.18.1
911
github.com/charmbracelet/bubbles v0.16.1
@@ -44,10 +46,10 @@ require (
4446
go.opentelemetry.io/otel/trace v1.20.0
4547
go.opentelemetry.io/proto/otlp v0.12.0
4648
golang.org/x/exp v0.0.0-20220428152302-39d4317da171
47-
golang.org/x/net v0.17.0
49+
golang.org/x/net v0.21.0
4850
golang.org/x/sync v0.3.0
4951
google.golang.org/grpc v1.59.0
50-
google.golang.org/protobuf v1.31.0
52+
google.golang.org/protobuf v1.32.0
5153
gopkg.in/yaml.v2 v2.4.0
5254
gopkg.in/yaml.v3 v3.0.1
5355
)
@@ -164,11 +166,11 @@ require (
164166
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.4.1 // indirect
165167
go.opentelemetry.io/otel/metric v1.20.0 // indirect
166168
go.opentelemetry.io/otel/sdk v1.20.0 // indirect
167-
golang.org/x/crypto v0.17.0 // indirect
169+
golang.org/x/crypto v0.19.0 // indirect
168170
golang.org/x/mod v0.8.0 // indirect
169171
golang.org/x/oauth2 v0.11.0 // indirect
170-
golang.org/x/sys v0.15.0 // indirect
171-
golang.org/x/term v0.15.0 // indirect
172+
golang.org/x/sys v0.17.0 // indirect
173+
golang.org/x/term v0.17.0 // indirect
172174
golang.org/x/text v0.14.0 // indirect
173175
golang.org/x/time v0.1.0 // indirect
174176
golang.org/x/tools v0.6.0 // indirect

go.sum

+16-12
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
buf.build/gen/go/depot/api/connectrpc/go v1.15.0-20240220165926-8fccc82c3226.1 h1:JPtNTm1/qkPHnNXAUr97RGzCNOGWBvr2/apdt2/UD7w=
2+
buf.build/gen/go/depot/api/connectrpc/go v1.15.0-20240220165926-8fccc82c3226.1/go.mod h1:Zb0tj5AdWMalcUYmRyXbloYoioO/DHULOEwFP6hyHwE=
3+
buf.build/gen/go/depot/api/protocolbuffers/go v1.32.0-20240220165926-8fccc82c3226.1 h1:rt5CDaD1PjF3Na2K4y1ElnnqeL+zOU5ikSxH28MBh3o=
4+
buf.build/gen/go/depot/api/protocolbuffers/go v1.32.0-20240220165926-8fccc82c3226.1/go.mod h1:MP5BDdzxwFdhf/KEm27tKfz9dKjtC9C1kXdpuSOb09g=
15
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
26
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
37
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
@@ -38,8 +42,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl
3842
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
3943
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
4044
cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
41-
connectrpc.com/connect v1.13.0 h1:lGs5maZZzWOOD+PFFiOt5OncKmMsk9ZdPwpy5jcmaYg=
42-
connectrpc.com/connect v1.13.0/go.mod h1:uHAFHtYgeSZJxXrkN1IunDpKghnTXhYbVh0wW4StPW0=
45+
connectrpc.com/connect v1.15.0 h1:lFdeCbZrVVDydAqwr4xGV2y+ULn+0Z73s5JBj2LikWo=
46+
connectrpc.com/connect v1.15.0/go.mod h1:bQmjpDY8xItMnttnurVgOkHUBMRT9cpsNi2O4AjKhmA=
4347
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
4448
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
4549
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
@@ -677,8 +681,8 @@ golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPh
677681
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
678682
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
679683
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
680-
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
681-
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
684+
golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
685+
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
682686
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
683687
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
684688
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -759,8 +763,8 @@ golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qx
759763
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
760764
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
761765
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
762-
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
763-
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
766+
golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
767+
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
764768
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
765769
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
766770
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -854,14 +858,14 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc
854858
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
855859
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
856860
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
857-
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
858-
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
861+
golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
862+
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
859863
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
860864
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
861865
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
862866
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
863-
golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4=
864-
golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
867+
golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U=
868+
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
865869
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
866870
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
867871
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1042,8 +1046,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba
10421046
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
10431047
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
10441048
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
1045-
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
1046-
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
1049+
google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=
1050+
google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
10471051
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
10481052
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
10491053
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

pkg/api/rpc.go

+9
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"net/http"
55
"os"
66

7+
"buf.build/gen/go/depot/api/connectrpc/go/depot/core/v1/corev1connect"
78
"connectrpc.com/connect"
89
"github.com/depot/cli/pkg/proto/depot/cli/v1/cliv1connect"
910
"github.com/depot/cli/pkg/proto/depot/cli/v1beta1/cliv1beta1connect"
@@ -33,6 +34,14 @@ func NewProjectsClient() cliv1beta1connect.ProjectsServiceClient {
3334
return cliv1beta1connect.NewProjectsServiceClient(http.DefaultClient, baseURL, WithUserAgent())
3435
}
3536

37+
func NewSDKProjectsClient() corev1connect.ProjectServiceClient {
38+
baseURL := os.Getenv("DEPOT_API_URL")
39+
if baseURL == "" {
40+
baseURL = "https://api.depot.dev"
41+
}
42+
return corev1connect.NewProjectServiceClient(http.DefaultClient, baseURL, WithUserAgent())
43+
}
44+
3645
func NewPushClient() cliv1connect.PushServiceClient {
3746
baseURL := os.Getenv("DEPOT_API_URL")
3847
if baseURL == "" {

pkg/cmd/list/list.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ func NewCmdList() *cobra.Command {
1616
},
1717
}
1818

19-
cmd.AddCommand(NewCmdProjects())
19+
cmd.AddCommand(NewCmdProjects("projects", "p"))
2020
cmd.AddCommand(NewCmdBuilds())
2121

2222
return cmd

pkg/cmd/list/projects.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@ import (
2121
"github.com/spf13/cobra"
2222
)
2323

24-
func NewCmdProjects() *cobra.Command {
24+
func NewCmdProjects(commandName, commandAlias string) *cobra.Command {
2525
var (
2626
token string
2727
outputFormat string
2828
)
2929

3030
cmd := &cobra.Command{
31-
Use: "projects",
32-
Aliases: []string{"p"},
31+
Use: commandName,
32+
Aliases: []string{commandAlias},
3333
Short: "List depot projects",
3434
RunE: func(cmd *cobra.Command, args []string) error {
3535
token, err := helpers.ResolveToken(context.Background(), token)

pkg/cmd/projects/create.go

+96
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
// Creates a depot project.
2+
package projects
3+
4+
import (
5+
"encoding/json"
6+
"fmt"
7+
"time"
8+
9+
corev1 "buf.build/gen/go/depot/api/protocolbuffers/go/depot/core/v1"
10+
"connectrpc.com/connect"
11+
"github.com/depot/cli/pkg/api"
12+
"github.com/depot/cli/pkg/helpers"
13+
"github.com/spf13/cobra"
14+
)
15+
16+
func NewCmdCreate() *cobra.Command {
17+
var (
18+
token string
19+
region string
20+
keepGigabytes int64
21+
)
22+
23+
cmd := &cobra.Command{
24+
Use: "create [flags] <project-name>",
25+
Aliases: []string{"c"},
26+
Args: cobra.ExactArgs(1),
27+
Hidden: true,
28+
Short: "Create depot project",
29+
RunE: func(cmd *cobra.Command, args []string) error {
30+
ctx := cmd.Context()
31+
projectName := args[0]
32+
33+
token, err := helpers.ResolveToken(ctx, token)
34+
if err != nil {
35+
return err
36+
}
37+
38+
if token == "" {
39+
return fmt.Errorf("missing API token, please run `depot login`")
40+
}
41+
42+
projectClient := api.NewSDKProjectsClient()
43+
req := corev1.CreateProjectRequest{
44+
OrganizationId: "cl0wyyk6k39487ebgraxasinja",
45+
Name: projectName,
46+
RegionId: region,
47+
CachePolicy: &corev1.CachePolicy{
48+
KeepBytes: keepGigabytes * 1024 * 1024 * 1024,
49+
},
50+
}
51+
res, err := projectClient.CreateProject(ctx, api.WithAuthentication(connect.NewRequest(&req), token))
52+
if err != nil {
53+
return err
54+
}
55+
project := NewCreateResponse(res.Msg.GetProject())
56+
buf, err := json.Marshal(project)
57+
if err != nil {
58+
return err
59+
}
60+
fmt.Printf("%s\n", buf)
61+
62+
return nil
63+
},
64+
}
65+
66+
flags := cmd.Flags()
67+
flags.StringVar(&token, "token", "", "Depot token")
68+
flags.StringVar(&region, "region", "us-east-1", "Build data will be stored in the chosen region")
69+
flags.Int64Var(&keepGigabytes, "keep-cache-size", 50, "Build cache to keep per architecture in GB")
70+
71+
return cmd
72+
}
73+
74+
type CreateResponse struct {
75+
ProjectId string `json:"project_id,omitempty"`
76+
OrganizationId string `json:"organization_id,omitempty"`
77+
Name string `json:"name,omitempty"`
78+
RegionId string `json:"region_id,omitempty"`
79+
CreatedAt time.Time `json:"created_at,omitempty"`
80+
CachePolicy *corev1.CachePolicy `json:"cache_policy,omitempty"`
81+
}
82+
83+
func NewCreateResponse(project *corev1.Project) *CreateResponse {
84+
var createdAt time.Time
85+
if project.GetCreatedAt() != nil {
86+
createdAt = project.GetCreatedAt().AsTime()
87+
}
88+
return &CreateResponse{
89+
ProjectId: project.GetProjectId(),
90+
OrganizationId: project.GetOrganizationId(),
91+
Name: project.GetName(),
92+
RegionId: project.GetRegionId(),
93+
CreatedAt: createdAt,
94+
CachePolicy: project.GetCachePolicy(),
95+
}
96+
}

pkg/cmd/projects/projects.go

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package projects
2+
3+
import (
4+
"github.com/depot/cli/pkg/cmd/list"
5+
"github.com/spf13/cobra"
6+
)
7+
8+
func NewCmdProjects() *cobra.Command {
9+
cmd := &cobra.Command{
10+
Use: "projects",
11+
Aliases: []string{"p"},
12+
Short: "Create or display depot project information",
13+
RunE: func(cmd *cobra.Command, args []string) error {
14+
return cmd.Help()
15+
},
16+
}
17+
18+
cmd.AddCommand(NewCmdCreate())
19+
cmd.AddCommand(list.NewCmdProjects("list", "ls"))
20+
21+
return cmd
22+
}

pkg/cmd/root/root.go

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/depot/cli/pkg/cmd/list"
1515
loginCmd "github.com/depot/cli/pkg/cmd/login"
1616
logout "github.com/depot/cli/pkg/cmd/logout"
17+
"github.com/depot/cli/pkg/cmd/projects"
1718
"github.com/depot/cli/pkg/cmd/pull"
1819
"github.com/depot/cli/pkg/cmd/push"
1920
"github.com/depot/cli/pkg/cmd/registry"
@@ -60,6 +61,7 @@ func NewCmdRoot(version, buildDate string) *cobra.Command {
6061
cmd.AddCommand(versionCmd.NewCmdVersion(version, buildDate))
6162
cmd.AddCommand(dockerCmd.NewCmdConfigureDocker(dockerCli))
6263
cmd.AddCommand(registry.NewCmdRegistry())
64+
cmd.AddCommand(projects.NewCmdProjects())
6365

6466
return cmd
6567
}

proto/buf.lock

+5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
# Generated by buf. DO NOT EDIT.
22
version: v1
33
deps:
4+
- remote: buf.build
5+
owner: depot
6+
repository: api
7+
commit: d9787d1716d84b7c9328732ac89b997e
8+
digest: shake256:e7ab026c94db437ac5474756d3ac7bce9d7c8f5680039aae9d95b9a4b0ed68873841be150f396e8894fffec19ebadda9d0ccd6898b6f0fbf6febebb7017f4f06
49
- remote: buf.build
510
owner: depot
611
repository: buildkit

proto/buf.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
version: v1
22
deps:
3+
- buf.build/depot/api
34
- buf.build/depot/buildkit
45
breaking:
56
use:

0 commit comments

Comments
 (0)