@@ -9,14 +9,12 @@ import (
9
9
"os/exec"
10
10
"path/filepath"
11
11
"regexp"
12
- "sort"
13
12
"strings"
14
13
"time"
15
14
16
15
"github.com/AlecAivazis/survey/v2"
17
16
_ "github.com/DefangLabs/defang/src/cmd/cli/autoload"
18
17
"github.com/DefangLabs/defang/src/pkg"
19
- "github.com/DefangLabs/defang/src/pkg/auth"
20
18
"github.com/DefangLabs/defang/src/pkg/cli"
21
19
cliClient "github.com/DefangLabs/defang/src/pkg/cli/client"
22
20
"github.com/DefangLabs/defang/src/pkg/cli/client/byoc"
59
57
modelId = os .Getenv ("DEFANG_MODEL_ID" ) // for Pro users only
60
58
nonInteractive = ! hasTty
61
59
org string
62
- tenantFlag string
63
60
providerID = cliClient .ProviderID (pkg .Getenv ("DEFANG_PROVIDER" , "auto" ))
64
61
verbose = false
65
62
)
@@ -166,7 +163,6 @@ func SetupCommands(ctx context.Context, version string) {
166
163
RootCmd .PersistentFlags ().StringVarP (& cluster , "cluster" , "s" , pcluster .DefangFabric , "Defang cluster to connect to" )
167
164
RootCmd .PersistentFlags ().MarkHidden ("cluster" )
168
165
RootCmd .PersistentFlags ().StringVar (& org , "org" , os .Getenv ("DEFANG_ORG" ), "override GitHub organization name (tenant)" )
169
- RootCmd .PersistentFlags ().StringVar (& tenantFlag , "tenant" , "" , "select tenant by name" )
170
166
RootCmd .PersistentFlags ().VarP (& providerID , "provider" , "P" , fmt .Sprintf (`bring-your-own-cloud provider; one of %v` , cliClient .AllProviders ()))
171
167
// RootCmd.Flag("provider").NoOptDefVal = "auto" NO this will break the "--provider aws"
172
168
RootCmd .PersistentFlags ().BoolVarP (& verbose , "verbose" , "v" , false , "verbose logging" ) // backwards compat: only used by tail
@@ -219,9 +215,6 @@ func SetupCommands(ctx context.Context, version string) {
219
215
// Whoami Command
220
216
RootCmd .AddCommand (whoamiCmd )
221
217
222
- // Tenants Command
223
- RootCmd .AddCommand (tenantsCmd )
224
-
225
218
// Logout Command
226
219
RootCmd .AddCommand (logoutCmd )
227
220
@@ -372,18 +365,6 @@ var RootCmd = &cobra.Command{
372
365
}
373
366
}
374
367
375
- // Configure tenant selection based on --tenant flag
376
- if f := cmd .Root ().Flag ("tenant" ); f != nil && f .Changed {
377
- // Highest precedence: explicit --tenant flag
378
- auth .SetSelectedTenantName (tenantFlag )
379
- } else if envTenant := os .Getenv ("DEFANG_TENANT" ); strings .TrimSpace (envTenant ) != "" {
380
- // Next precedence: DEFANG_TENANT environment variable
381
- auth .SetSelectedTenantName (envTenant )
382
- } else {
383
- // Default behavior: auto-select tenant by JWT subject if no explicit name is provided
384
- auth .SetAutoSelectBySub (true )
385
- }
386
-
387
368
client , err = cli .Connect (ctx , getCluster ())
388
369
389
370
if v , err := client .GetVersions (ctx ); err == nil {
@@ -395,8 +376,6 @@ var RootCmd = &cobra.Command{
395
376
}
396
377
}
397
378
398
- // (deliberately skip tenant resolution here to avoid blocking non-auth commands)
399
-
400
379
// Check if we are correctly logged in, but only if the command needs authorization
401
380
if _ , ok := cmd .Annotations [authNeeded ]; ! ok {
402
381
return nil
@@ -408,80 +387,7 @@ var RootCmd = &cobra.Command{
408
387
err = login .InteractiveRequireLoginAndToS (ctx , client , getCluster ())
409
388
}
410
389
411
- if err != nil {
412
- return err
413
- }
414
-
415
- // Ensure tenant is resolved post-login as we now have a token
416
- if tok := pcluster .GetExistingToken (getCluster ()); tok != "" {
417
- if err2 := auth .ResolveAndSetTenantFromToken (ctx , tok ); err2 != nil {
418
- return err2
419
- }
420
- // log the tenant name and id
421
- term .Debug ("Selected tenant:" , auth .GetSelectedTenantName (), "(" , auth .GetSelectedTenantID (), ")" )
422
- }
423
-
424
- return nil
425
- },
426
- }
427
-
428
- var tenantsCmd = & cobra.Command {
429
- Use : "tenants" ,
430
- Args : cobra .NoArgs ,
431
- Annotations : authNeededAnnotation ,
432
- Short : "List tenants available to the logged-in user" ,
433
- RunE : func (cmd * cobra.Command , args []string ) error {
434
- ctx := cmd .Context ()
435
- tok := pcluster .GetExistingToken (getCluster ())
436
- if strings .TrimSpace (tok ) == "" {
437
- return errors .New ("not logged in; run 'defang login'" )
438
- }
439
-
440
- tenants , err := auth .ListTenantsFromToken (ctx , tok )
441
- if err != nil {
442
- return err
443
- }
444
-
445
- // Sort by name for stable output
446
- sort .Slice (tenants , func (i , j int ) bool { return strings .ToLower (tenants [i ].Name ) < strings .ToLower (tenants [j ].Name ) })
447
-
448
- if len (tenants ) == 0 {
449
- term .Info ("No tenants found" )
450
- return nil
451
- }
452
-
453
- currentID := auth .GetSelectedTenantID ()
454
- currentName := auth .GetSelectedTenantName ()
455
-
456
- // Compute longest name for aligned output
457
- maxNameLen := 0
458
- for _ , t := range tenants {
459
- if l := len (t .Name ); l > maxNameLen {
460
- maxNameLen = l
461
- }
462
- }
463
-
464
- for _ , t := range tenants {
465
- selected := t .ID == currentID || (currentID == "" && t .Name == currentName && strings .TrimSpace (currentName ) != "" )
466
- marker := "-"
467
- if selected {
468
- marker = "*" // highlight selected
469
- }
470
-
471
- var line string
472
- if verbose {
473
- line = fmt .Sprintf ("%s %-*s (%s)\n " , marker , maxNameLen , t .Name , t .ID )
474
- } else {
475
- line = fmt .Sprintf ("%s %s\n " , marker , t .Name )
476
- }
477
-
478
- if selected {
479
- term .Printc (term .BrightCyan , line )
480
- } else {
481
- term .Printc (term .InfoColor , line )
482
- }
483
- }
484
- return nil
390
+ return err
485
391
},
486
392
}
487
393
0 commit comments