From 3a6d82139a5da1a1d42483939b9a7f7cb8113e33 Mon Sep 17 00:00:00 2001 From: dschaller Date: Tue, 10 Sep 2024 10:52:30 -0700 Subject: [PATCH 1/4] [env] add project filter to ls command --- CHANGELOG.md | 3 +++ cmd/esc/cli/env.go | 59 +++++++++++-------------------------------- cmd/esc/cli/env_ls.go | 14 +++++++--- 3 files changed, 29 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2bf5ed9..45f5fc89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,9 @@ CHANGELOG - Add command to clone environments. [#376](https://github.com/pulumi/esc/pull/376) +- Add project filter flag to env ls command. + [#](https://github.com/pulumi/esc/pull/) + ## 0.9.2 - Add commands to manage environment tags. diff --git a/cmd/esc/cli/env.go b/cmd/esc/cli/env.go index 2b9441c2..8692128a 100644 --- a/cmd/esc/cli/env.go +++ b/cmd/esc/cli/env.go @@ -89,21 +89,15 @@ type environmentRef struct { hasAmbiguousPath bool } -func (r *environmentRef) Id() string { - s := fmt.Sprintf("%s/%s", r.projectName, r.envName) - - if r.version != "" { - s = fmt.Sprintf("%s@%s", s, r.version) - } - return s -} - func (r *environmentRef) String() string { - s := r.Id() + s := fmt.Sprintf("%s/%s", r.projectName, r.envName) if r.orgName != "" { s = fmt.Sprintf("%s/%s", r.orgName, s) } + if r.version != "" { + s = fmt.Sprintf("%s@%s", s, r.version) + } return s } @@ -153,24 +147,17 @@ func (cmd *envCommand) parseRef(refStr string) environmentRef { } // getEnvRef returns an environment reference corresponding to the given ref string -// and a bool indicating if the environment reference is relative. -// -// If `refString` is only a version (i.e. "@123") and a non-nil environmentRef `rel` is provided, -// the returned environment reference is "relative" and will default to the provided environmentRef's values -func (cmd *envCommand) getEnvRef(refString string, rel *environmentRef) (environmentRef, bool) { +// If a non-nil environmentRef is provided, default to its values if only a sole version is specified +func (cmd *envCommand) getEnvRef(refString string, rel *environmentRef) environmentRef { envRef := cmd.parseRef(refString) - isRelative := false - // If refString is only a version, copy fields from `rel` if rel != nil && envRef.envName == "" && envRef.version != "" { envRef.orgName = rel.orgName envRef.projectName = rel.projectName envRef.envName = rel.envName - - isRelative = true } - return envRef, isRelative + return envRef } // Get an environment reference when creating a new environment @@ -186,18 +173,14 @@ func (cmd *envCommand) getNewEnvRef( cmd.envNameFlag, args = args[0], args[1:] } - ref, isRelative := cmd.getEnvRef(cmd.envNameFlag, nil) + ref := cmd.getEnvRef(cmd.envNameFlag, nil) if !ref.hasAmbiguousPath { - if !strings.Contains(cmd.envNameFlag, "/") && !isRelative { - cmd.printDeprecatedNameMessage(cmd.envNameFlag, ref) - } - return ref, args, nil } // Check if project at / exists. Assume not if listing environments errors - allEnvs, _ := cmd.listEnvironments(ctx, "") + allEnvs, _ := cmd.listEnvironments(ctx, "", "") existsProject := false for _, e := range allEnvs { if strings.EqualFold(e.Project, ref.projectName) { @@ -226,7 +209,6 @@ func (cmd *envCommand) getNewEnvRef( } if !existsProject && existsLegacyPath { - cmd.printDeprecatedNameMessage(cmd.envNameFlag, legacyRef) return legacyRef, args, nil } @@ -256,13 +238,9 @@ func (cmd *envCommand) getExistingEnvRefWithRelative( refString string, rel *environmentRef, ) (environmentRef, error) { - ref, isRelative := cmd.getEnvRef(refString, rel) + ref := cmd.getEnvRef(refString, rel) if !ref.hasAmbiguousPath { - if !strings.Contains(refString, "/") && !isRelative { - cmd.printDeprecatedNameMessage(refString, ref) - } - return ref, nil } @@ -288,14 +266,14 @@ func (cmd *envCommand) getExistingEnvRefWithRelative( // Require unambiguous path if both paths exist if exists && existsLegacyPath { - return ref, ambiguousIdentifierError{ - legacyRef: legacyRef, - ref: ref, - } + return ref, fmt.Errorf( + "ambiguous path provided\n\nEnvironments found at both '%s' and '%s'.\nPlease specify the full path as //", + ref.String(), + legacyRef.String(), + ) } if existsLegacyPath { - cmd.printDeprecatedNameMessage(refString, legacyRef) return legacyRef, nil } @@ -395,10 +373,3 @@ func (cmd *envCommand) writePropertyEnvironmentDiagnostics(out io.Writer, diags return nil } - -func (cmd *envCommand) printDeprecatedNameMessage(name string, ref environmentRef) { - msg := fmt.Sprintf( - "%sWarning: Referring to an environment name ('%s') without a project is deprecated.\nPlease use '%s/%s' or '%s' instead.%s", - colors.SpecWarning, name, ref.orgName, ref.Id(), ref.Id(), colors.Reset) - fmt.Fprintln(cmd.esc.stderr, cmd.esc.colors.Colorize(msg)) -} diff --git a/cmd/esc/cli/env_ls.go b/cmd/esc/cli/env_ls.go index 3d6abc90..8796e62f 100644 --- a/cmd/esc/cli/env_ls.go +++ b/cmd/esc/cli/env_ls.go @@ -13,7 +13,10 @@ import ( ) func newEnvLsCmd(env *envCommand) *cobra.Command { - var orgFilter string + var ( + orgFilter string + projectFilter string + ) cmd := &cobra.Command{ Use: "ls", @@ -30,7 +33,7 @@ func newEnvLsCmd(env *envCommand) *cobra.Command { return err } - allEnvs, err := env.listEnvironments(ctx, orgFilter) + allEnvs, err := env.listEnvironments(ctx, orgFilter, projectFilter) if err != nil { return err } @@ -56,11 +59,13 @@ func newEnvLsCmd(env *envCommand) *cobra.Command { cmd.PersistentFlags().StringVarP( &orgFilter, "organization", "o", "", "Filter returned stacks to those in a specific organization") + cmd.PersistentFlags().StringVarP( + &projectFilter, "project", "p", "", "Filter returned stacks to those in a specific project") return cmd } -func (env *envCommand) listEnvironments(ctx context.Context, orgFilter string) ([]client.OrgEnvironment, error) { +func (env *envCommand) listEnvironments(ctx context.Context, orgFilter, projectFilter string) ([]client.OrgEnvironment, error) { user := env.esc.account.Username continuationToken, allEnvs := "", []client.OrgEnvironment(nil) for { @@ -72,6 +77,9 @@ func (env *envCommand) listEnvironments(ctx context.Context, orgFilter string) ( if e.Organization == user { e.Organization = "" } + if projectFilter != "" && e.Project != projectFilter { + continue + } allEnvs = append(allEnvs, e) } if nextToken == "" { From ec3b363a0511601bd2a848f5183a74bb3227d0e1 Mon Sep 17 00:00:00 2001 From: dschaller Date: Tue, 10 Sep 2024 10:53:25 -0700 Subject: [PATCH 2/4] update changelog with PR # --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 45f5fc89..bcb04ba1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ CHANGELOG [#376](https://github.com/pulumi/esc/pull/376) - Add project filter flag to env ls command. - [#](https://github.com/pulumi/esc/pull/) + [#382](https://github.com/pulumi/esc/pull/382) ## 0.9.2 From 39dae9e5ea3adca9fa7e93a96a1988ec2cee0799 Mon Sep 17 00:00:00 2001 From: dschaller Date: Tue, 10 Sep 2024 10:59:13 -0700 Subject: [PATCH 3/4] resolve merge issues --- cmd/esc/cli/env.go | 57 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/cmd/esc/cli/env.go b/cmd/esc/cli/env.go index 8692128a..63a5f2dd 100644 --- a/cmd/esc/cli/env.go +++ b/cmd/esc/cli/env.go @@ -89,18 +89,24 @@ type environmentRef struct { hasAmbiguousPath bool } -func (r *environmentRef) String() string { +func (r *environmentRef) Id() string { s := fmt.Sprintf("%s/%s", r.projectName, r.envName) - if r.orgName != "" { - s = fmt.Sprintf("%s/%s", r.orgName, s) - } if r.version != "" { s = fmt.Sprintf("%s@%s", s, r.version) } return s } +func (r *environmentRef) String() string { + s := r.Id() + + if r.orgName != "" { + s = fmt.Sprintf("%s/%s", r.orgName, s) + } + return s +} + func (cmd *envCommand) parseRef(refStr string) environmentRef { var orgName, projectName, envNameAndVersion string @@ -147,17 +153,24 @@ func (cmd *envCommand) parseRef(refStr string) environmentRef { } // getEnvRef returns an environment reference corresponding to the given ref string -// If a non-nil environmentRef is provided, default to its values if only a sole version is specified -func (cmd *envCommand) getEnvRef(refString string, rel *environmentRef) environmentRef { +// and a bool indicating if the environment reference is relative. +// +// If `refString` is only a version (i.e. "@123") and a non-nil environmentRef `rel` is provided, +// the returned environment reference is "relative" and will default to the provided environmentRef's values +func (cmd *envCommand) getEnvRef(refString string, rel *environmentRef) (environmentRef, bool) { envRef := cmd.parseRef(refString) + isRelative := false + // If refString is only a version, copy fields from `rel` if rel != nil && envRef.envName == "" && envRef.version != "" { envRef.orgName = rel.orgName envRef.projectName = rel.projectName envRef.envName = rel.envName + + isRelative = true } - return envRef + return envRef, isRelative } // Get an environment reference when creating a new environment @@ -173,9 +186,13 @@ func (cmd *envCommand) getNewEnvRef( cmd.envNameFlag, args = args[0], args[1:] } - ref := cmd.getEnvRef(cmd.envNameFlag, nil) + ref, isRelative := cmd.getEnvRef(cmd.envNameFlag, nil) if !ref.hasAmbiguousPath { + if !strings.Contains(cmd.envNameFlag, "/") && !isRelative { + cmd.printDeprecatedNameMessage(cmd.envNameFlag, ref) + } + return ref, args, nil } @@ -209,6 +226,7 @@ func (cmd *envCommand) getNewEnvRef( } if !existsProject && existsLegacyPath { + cmd.printDeprecatedNameMessage(cmd.envNameFlag, legacyRef) return legacyRef, args, nil } @@ -238,9 +256,13 @@ func (cmd *envCommand) getExistingEnvRefWithRelative( refString string, rel *environmentRef, ) (environmentRef, error) { - ref := cmd.getEnvRef(refString, rel) + ref, isRelative := cmd.getEnvRef(refString, rel) if !ref.hasAmbiguousPath { + if !strings.Contains(refString, "/") && !isRelative { + cmd.printDeprecatedNameMessage(refString, ref) + } + return ref, nil } @@ -266,14 +288,14 @@ func (cmd *envCommand) getExistingEnvRefWithRelative( // Require unambiguous path if both paths exist if exists && existsLegacyPath { - return ref, fmt.Errorf( - "ambiguous path provided\n\nEnvironments found at both '%s' and '%s'.\nPlease specify the full path as //", - ref.String(), - legacyRef.String(), - ) + return ref, ambiguousIdentifierError{ + legacyRef: legacyRef, + ref: ref, + } } if existsLegacyPath { + cmd.printDeprecatedNameMessage(refString, legacyRef) return legacyRef, nil } @@ -373,3 +395,10 @@ func (cmd *envCommand) writePropertyEnvironmentDiagnostics(out io.Writer, diags return nil } + +func (cmd *envCommand) printDeprecatedNameMessage(name string, ref environmentRef) { + msg := fmt.Sprintf( + "%sWarning: Referring to an environment name ('%s') without a project is deprecated.\nPlease use '%s/%s' or '%s' instead.%s", + colors.SpecWarning, name, ref.orgName, ref.Id(), ref.Id(), colors.Reset) + fmt.Fprintln(cmd.esc.stderr, cmd.esc.colors.Colorize(msg)) +} From e692f41a8af81acc126b5c781945912229d731a6 Mon Sep 17 00:00:00 2001 From: dschaller Date: Tue, 10 Sep 2024 12:13:16 -0700 Subject: [PATCH 4/4] s/stacks/environments/ --- cmd/esc/cli/env_ls.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/esc/cli/env_ls.go b/cmd/esc/cli/env_ls.go index 8796e62f..8044102e 100644 --- a/cmd/esc/cli/env_ls.go +++ b/cmd/esc/cli/env_ls.go @@ -58,9 +58,9 @@ func newEnvLsCmd(env *envCommand) *cobra.Command { } cmd.PersistentFlags().StringVarP( - &orgFilter, "organization", "o", "", "Filter returned stacks to those in a specific organization") + &orgFilter, "organization", "o", "", "Filter returned environments to those in a specific organization") cmd.PersistentFlags().StringVarP( - &projectFilter, "project", "p", "", "Filter returned stacks to those in a specific project") + &projectFilter, "project", "p", "", "Filter returned environments to those in a specific project") return cmd }