Skip to content

Commit d82fe19

Browse files
authored
feat: cd list --remote (#382)
1 parent 549f06c commit d82fe19

File tree

6 files changed

+38
-33
lines changed

6 files changed

+38
-33
lines changed

src/cmd/cli/command/commands.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ func SetupCommands(version string) {
149149
bootstrapCmd.AddCommand(bootstrapRefreshCmd)
150150
bootstrapTearDownCmd.Flags().Bool("force", false, "force the teardown of the CD stack")
151151
bootstrapCmd.AddCommand(bootstrapTearDownCmd)
152+
bootstrapListCmd.Flags().Bool("remote", false, "invoke the command on the remote cluster")
152153
bootstrapCmd.AddCommand(bootstrapListCmd)
153154
bootstrapCmd.AddCommand(bootstrapCancelCmd)
154155

@@ -1068,7 +1069,12 @@ var bootstrapListCmd = &cobra.Command{
10681069
Aliases: []string{"list"},
10691070
Short: "List all the projects and stacks in the CD cluster",
10701071
RunE: func(cmd *cobra.Command, args []string) error {
1071-
return cli.BootstrapList(cmd.Context(), client)
1072+
remote, _ := cmd.Flags().GetBool("remote")
1073+
1074+
if remote {
1075+
return cli.BootstrapCommand(cmd.Context(), client, "list")
1076+
}
1077+
return cli.BootstrapLocalList(cmd.Context(), client)
10721078
},
10731079
}
10741080

src/pkg/cli/bootstrap.go

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,26 +19,22 @@ func BootstrapCommand(ctx context.Context, client client.Client, command string)
1919
if DoDryRun {
2020
return ErrDryRun
2121
}
22+
2223
since := time.Now()
2324
etag, err := client.BootstrapCommand(ctx, command)
2425
if err != nil || etag == "" {
2526
return err
2627
}
27-
params := TailOptions{
28-
Service: "",
29-
Etag: etag,
30-
Since: since,
31-
Raw: false,
32-
}
3328

34-
return Tail(ctx, client, params)
29+
return Tail(ctx, client, TailOptions{Etag: etag, Since: since})
3530
}
3631

37-
func BootstrapList(ctx context.Context, client client.Client) error {
32+
func BootstrapLocalList(ctx context.Context, client client.Client) error {
3833
term.Debug(" - Running CD list")
3934
if DoDryRun {
4035
return ErrDryRun
4136
}
37+
4238
stacks, err := client.BootstrapList(ctx)
4339
if err != nil {
4440
return err

src/pkg/cli/client/byoc/aws/byoc.go

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,13 @@ func (b *ByocAws) setUp(ctx context.Context) error {
141141
if b.customDomain == "" {
142142
domain, err := b.GetDelegateSubdomainZone(ctx)
143143
if err != nil {
144+
term.Debug(" - Failed to get subdomain zone:", err)
144145
// return err; FIXME: ignore this error for now
145146
} else {
146147
b.customDomain = b.getProjectDomain(domain.Zone)
147-
b.shouldDelegateSubdomain = true
148+
if b.customDomain != "" {
149+
b.shouldDelegateSubdomain = true
150+
}
148151
}
149152
}
150153

@@ -326,12 +329,12 @@ func (b *ByocAws) WhoAmI(ctx context.Context) (*defangv1.WhoAmIResponse, error)
326329
}, nil
327330
}
328331

329-
func (ByocAws) GetVersions(context.Context) (*defangv1.Version, error) {
332+
func (*ByocAws) GetVersions(context.Context) (*defangv1.Version, error) {
330333
cdVersion := CdImage[strings.LastIndex(CdImage, ":")+1:]
331334
return &defangv1.Version{Fabric: cdVersion}, nil
332335
}
333336

334-
func (b *ByocAws) Get(ctx context.Context, s *defangv1.ServiceID) (*defangv1.ServiceInfo, error) {
337+
func (b *ByocAws) GetService(ctx context.Context, s *defangv1.ServiceID) (*defangv1.ServiceInfo, error) {
335338
all, err := b.GetServices(ctx)
336339
if err != nil {
337340
return nil, err
@@ -349,9 +352,6 @@ func (b *ByocAws) bucketName() string {
349352
}
350353

351354
func (b *ByocAws) environment() map[string]string {
352-
if b.pulumiProject == "" {
353-
panic("pulumiProject not set")
354-
}
355355
region := b.driver.Region // TODO: this should be the destination region, not the CD region; make customizable
356356
return map[string]string{
357357
// "AWS_REGION": region.String(), should be set by ECS (because of CD task role)
@@ -360,7 +360,7 @@ func (b *ByocAws) environment() map[string]string {
360360
"DEFANG_ORG": b.tenantID,
361361
"DOMAIN": b.customDomain,
362362
"PRIVATE_DOMAIN": b.privateDomain,
363-
"PROJECT": b.pulumiProject,
363+
"PROJECT": b.pulumiProject, // may be empty
364364
"PULUMI_BACKEND_URL": fmt.Sprintf(`s3://%s?region=%s&awssdk=v2`, b.bucketName(), region),
365365
"PULUMI_CONFIG_PASSPHRASE": pkg.Getenv("PULUMI_CONFIG_PASSPHRASE", "asdf"), // TODO: make customizable
366366
"STACK": b.pulumiStack,
@@ -398,11 +398,9 @@ func (b *ByocAws) Delete(ctx context.Context, req *defangv1.DeleteRequest) (*def
398398
return &defangv1.DeleteResponse{Etag: etag}, nil
399399
}
400400

401-
// stackDir returns a stack-qualified name, like the Pulumi TS function `stackDir`
401+
// stackDir returns a stack-qualified path, like the Pulumi TS function `stackDir`
402402
func (b *ByocAws) stackDir(name string) string {
403-
if b.pulumiProject == "" {
404-
panic("pulumiProject not set")
405-
}
403+
ensure(b.pulumiProject != "", "pulumiProject not set")
406404
return fmt.Sprintf("/%s/%s/%s/%s", DefangPrefix, b.pulumiProject, b.pulumiStack, name) // same as shared/common.ts
407405
}
408406

@@ -422,6 +420,7 @@ func (b *ByocAws) GetServices(ctx context.Context) (*defangv1.ListServicesRespon
422420

423421
s3Client := s3.NewFromConfig(cfg)
424422
// Path to the state file, Defined at: https://github.com/defang-io/defang-mvp/blob/main/pulumi/cd/byoc/aws/index.ts#L89
423+
ensure(b.pulumiProject != "", "pulumiProject not set")
425424
path := fmt.Sprintf("projects/%s/%s/project.pb", b.pulumiProject, b.pulumiStack)
426425

427426
term.Debug(" - Getting services from", bucketName, path)
@@ -445,10 +444,7 @@ func (b *ByocAws) GetServices(ctx context.Context) (*defangv1.ListServicesRespon
445444
}
446445

447446
func (b *ByocAws) getSecretID(name string) string {
448-
if b.pulumiProject == "" {
449-
panic("pulumiProject not set")
450-
}
451-
return fmt.Sprintf("/%s/%s/%s/%s", DefangPrefix, b.pulumiProject, b.pulumiStack, name) // same as defang_service.ts
447+
return b.stackDir(name) // same as defang_service.ts
452448
}
453449

454450
func (b *ByocAws) PutConfig(ctx context.Context, secret *defangv1.SecretValue) error {
@@ -556,6 +552,7 @@ func (b *ByocAws) update(ctx context.Context, service *defangv1.Service) (*defan
556552
return nil, fmt.Errorf("missing config %s", missing) // retryable CodeFailedPrecondition
557553
}
558554

555+
ensure(b.pulumiProject != "", "pulumiProject not set")
559556
si := &defangv1.ServiceInfo{
560557
Service: service,
561558
Project: b.pulumiProject, // was: tenant
@@ -671,6 +668,9 @@ func (b *ByocAws) getPrivateFqdn(fqn qualifiedName) string {
671668
}
672669

673670
func (b *ByocAws) getProjectDomain(zone string) string {
671+
if b.pulumiProject == "" {
672+
return "" // no project name => no custom domain
673+
}
674674
projectLabel := dnsSafeLabel(b.pulumiProject)
675675
if projectLabel == dnsSafeLabel(b.tenantID) {
676676
return dnsSafe(zone) // the zone will already have the tenant ID
@@ -791,3 +791,9 @@ func (b *ByocAws) LoadProjectName() (string, error) {
791791
}
792792
return p.Name, nil
793793
}
794+
795+
func ensure(cond bool, msg string) {
796+
if !cond {
797+
panic(msg)
798+
}
799+
}

src/pkg/cli/client/client.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ type Client interface {
3737
Deploy(context.Context, *defangv1.DeployRequest) (*defangv1.DeployResponse, error)
3838
Destroy(context.Context) (types.ETag, error)
3939
GenerateFiles(context.Context, *defangv1.GenerateFilesRequest) (*defangv1.GenerateFilesResponse, error)
40-
Get(context.Context, *defangv1.ServiceID) (*defangv1.ServiceInfo, error)
4140
GetDelegateSubdomainZone(context.Context) (*defangv1.DelegateSubdomainZoneResponse, error)
41+
GetService(context.Context, *defangv1.ServiceID) (*defangv1.ServiceInfo, error)
4242
GetServices(context.Context) (*defangv1.ListServicesResponse, error)
4343
GetVersions(context.Context) (*defangv1.Version, error)
4444
ListConfig(context.Context) (*defangv1.Secrets, error)

src/pkg/cli/client/grpc.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func (g GrpcClient) Deploy(ctx context.Context, req *defangv1.DeployRequest) (*d
9696
return getMsg(g.client.Deploy(ctx, &connect.Request[defangv1.DeployRequest]{Msg: req}))
9797
}
9898

99-
func (g GrpcClient) Get(ctx context.Context, req *defangv1.ServiceID) (*defangv1.ServiceInfo, error) {
99+
func (g GrpcClient) GetService(ctx context.Context, req *defangv1.ServiceID) (*defangv1.ServiceInfo, error) {
100100
return getMsg(g.client.Get(ctx, &connect.Request[defangv1.ServiceID]{Msg: req}))
101101
}
102102

@@ -123,11 +123,8 @@ func (g GrpcClient) PutConfig(ctx context.Context, req *defangv1.SecretValue) er
123123
}
124124

125125
func (g GrpcClient) DeleteConfig(ctx context.Context, req *defangv1.Secrets) error {
126-
// _, err := g.client.DeleteSecrets(ctx, &connect.Request[v1.Secrets]{Msg: req}); TODO: implement this in the server
127-
var errs []error
128126
_, err := g.client.DeleteSecrets(ctx, &connect.Request[defangv1.Secrets]{Msg: &defangv1.Secrets{Names: req.Names}})
129-
errs = append(errs, err)
130-
return errors.Join(errs...)
127+
return err
131128
}
132129

133130
func (g GrpcClient) ListConfig(ctx context.Context) (*defangv1.Secrets, error) {
@@ -226,7 +223,7 @@ func (g *GrpcClient) Restart(ctx context.Context, names ...string) (types.ETag,
226223
// For now, we'll just get the service info and pass it back to Deploy as-is.
227224
services := make([]*defangv1.Service, 0, len(names))
228225
for _, name := range names {
229-
serviceInfo, err := g.Get(ctx, &defangv1.ServiceID{Name: name})
226+
serviceInfo, err := g.GetService(ctx, &defangv1.ServiceID{Name: name})
230227
if err != nil {
231228
return "", err
232229
}

src/pkg/cli/tail.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,8 @@ func (cerr *CancelError) Unwrap() error {
9898
func Tail(ctx context.Context, client client.Client, params TailOptions) error {
9999
if params.Service != "" {
100100
params.Service = NormalizeServiceName(params.Service)
101-
// Show a warning if the service doesn't exist (yet);; TODO: could do fuzzy matching and suggest alternatives
102-
if _, err := client.Get(ctx, &defangv1.ServiceID{Name: params.Service}); err != nil {
101+
// Show a warning if the service doesn't exist (yet); TODO: could do fuzzy matching and suggest alternatives
102+
if _, err := client.GetService(ctx, &defangv1.ServiceID{Name: params.Service}); err != nil {
103103
switch connect.CodeOf(err) {
104104
case connect.CodeNotFound:
105105
term.Warn(" ! Service does not exist (yet):", params.Service)

0 commit comments

Comments
 (0)