Skip to content

Commit 0130db7

Browse files
authored
feat: add basic support for org env vars (#423)
* feat: add basic support for organization env vars * Added --organization-name to add/update variable * Added list organization-variables * fix: align add variable value response with list variable * docs: update docs for commands related to org env vars
1 parent 03165bb commit 0130db7

File tree

8 files changed

+194
-33
lines changed

8 files changed

+194
-33
lines changed

cmd/helpers.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,18 @@ func buildVarsToMap(slice []string) ([]schema.EnvKeyValueInput, error) {
8484

8585
return result, nil
8686
}
87+
88+
// getEnvVarType determines if the user intends to manipulate an api env var
89+
// for an organization, project, or environment.
90+
func getEnvVarType(org string, project string, env string) (string, error) {
91+
switch {
92+
case org != "" && project == "" && env == "":
93+
return "organization", nil
94+
case org == "" && project != "" && env == "":
95+
return "project", nil
96+
case org == "" && project != "" && env != "":
97+
return "environment", nil
98+
}
99+
100+
return "", fmt.Errorf("missing argument: Use either an organization name, a project name, or a project name and environment name")
101+
}

cmd/list.go

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1290,6 +1290,76 @@ var listOrganizationsCmd = &cobra.Command{
12901290
},
12911291
}
12921292

1293+
var listOrganizationVariablesCmd = &cobra.Command{
1294+
Use: "organization-variables",
1295+
Aliases: []string{"org-v"},
1296+
Short: "List variables for an organization (alias: org-v)",
1297+
PreRunE: func(_ *cobra.Command, _ []string) error {
1298+
return validateTokenE(cmdLagoon)
1299+
},
1300+
RunE: func(cmd *cobra.Command, args []string) error {
1301+
organizationName, err := cmd.Flags().GetString("organization-name")
1302+
if err != nil {
1303+
return err
1304+
}
1305+
if err := requiredInputCheck("Organization name", organizationName); err != nil {
1306+
return err
1307+
}
1308+
reveal, err := cmd.Flags().GetBool("reveal")
1309+
if err != nil {
1310+
return err
1311+
}
1312+
debug, err := cmd.Flags().GetBool("debug")
1313+
if err != nil {
1314+
return err
1315+
}
1316+
current := lagoonCLIConfig.Current
1317+
token := lagoonCLIConfig.Lagoons[current].Token
1318+
lc := lclient.New(
1319+
lagoonCLIConfig.Lagoons[current].GraphQL,
1320+
lagoonCLIVersion,
1321+
lagoonCLIConfig.Lagoons[current].Version,
1322+
&token,
1323+
debug)
1324+
envvars, err := lagoon.GetEnvVariablesByOrganizationName(context.TODO(), organizationName, lc)
1325+
if err != nil {
1326+
return err
1327+
}
1328+
data := []output.Data{}
1329+
for _, envvar := range *envvars {
1330+
env := []string{
1331+
returnNonEmptyString(fmt.Sprintf("%v", envvar.ID)),
1332+
returnNonEmptyString(fmt.Sprintf("%v", organizationName)),
1333+
}
1334+
env = append(env, returnNonEmptyString(fmt.Sprintf("%v", envvar.Scope)))
1335+
env = append(env, returnNonEmptyString(fmt.Sprintf("%v", envvar.Name)))
1336+
if reveal {
1337+
env = append(env, fmt.Sprintf("%v", envvar.Value))
1338+
outputOptions.MultiLine = true
1339+
}
1340+
data = append(data, env)
1341+
}
1342+
header := []string{
1343+
"ID",
1344+
"Organization",
1345+
}
1346+
header = append(header, "Scope")
1347+
header = append(header, "Name")
1348+
if reveal {
1349+
header = append(header, "Value")
1350+
}
1351+
if len(data) == 0 {
1352+
return handleNilResults("There are no variables for organization '%s'\n", cmd, organizationName)
1353+
}
1354+
r := output.RenderOutput(output.Table{
1355+
Header: header,
1356+
Data: data,
1357+
}, outputOptions)
1358+
fmt.Fprintf(cmd.OutOrStdout(), "%s", r)
1359+
return nil
1360+
},
1361+
}
1362+
12931363
var listEnvironmentServicesCmd = &cobra.Command{
12941364
Use: "environment-services",
12951365
Aliases: []string{"es"},
@@ -1384,6 +1454,7 @@ func init() {
13841454
listCmd.AddCommand(listOrganizationGroupsCmd)
13851455
listCmd.AddCommand(listOrganizationDeployTargetsCmd)
13861456
listCmd.AddCommand(listOrganizationsCmd)
1457+
listCmd.AddCommand(listOrganizationVariablesCmd)
13871458
listCmd.AddCommand(listEnvironmentServicesCmd)
13881459
listAllUsersCmd.Flags().StringP("email", "E", "", "The email address of a user")
13891460
listUsersGroupsCmd.Flags().StringP("email", "E", "", "The email address of a user")
@@ -1398,6 +1469,8 @@ func init() {
13981469
listOrganizationGroupsCmd.Flags().StringP("organization-name", "O", "", "Name of the organization to list associated groups for")
13991470
listOrganizationDeployTargetsCmd.Flags().StringP("organization-name", "O", "", "Name of the organization to list associated deploy targets for")
14001471
listOrganizationDeployTargetsCmd.Flags().Uint("id", 0, "ID of the organization to list associated deploy targets for")
1472+
listOrganizationVariablesCmd.Flags().StringP("organization-name", "O", "", "Name of the organization to list associated variables for")
1473+
listOrganizationVariablesCmd.Flags().BoolP("reveal", "", false, "Reveal the variable values")
14011474
listDeployTargetsCmd.Flags().Bool("wide", false, "Display additional information about deploytargets")
14021475
listDeployTargetsCmd.Flags().Bool("show-token", false, "Display the token for deploytargets")
14031476
listProjectsCmd.Flags().Bool("wide", false, "Display additional information about projects")

cmd/variables.go

Lines changed: 51 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,15 @@ func addOrUpdateVariable(cmd *cobra.Command, args []string) error {
5050
if err != nil {
5151
return err
5252
}
53-
if err := requiredInputCheck("Project name", cmdProjectName, "Variable name", varName); err != nil {
53+
organizationName, err := cmd.Flags().GetString("organization-name")
54+
if err != nil {
55+
return err
56+
}
57+
_, err = getEnvVarType(organizationName, cmdProjectName, cmdProjectEnvironment)
58+
if err != nil {
59+
return err
60+
}
61+
if err := requiredInputCheck("Variable name", varName); err != nil {
5462
return err
5563
}
5664

@@ -64,40 +72,44 @@ func addOrUpdateVariable(cmd *cobra.Command, args []string) error {
6472
debug)
6573

6674
in := &schema.EnvVariableByNameInput{
67-
Project: cmdProjectName,
68-
Environment: cmdProjectEnvironment,
69-
Scope: schema.EnvVariableScope(strings.ToUpper(varScope)),
70-
Name: varName,
71-
Value: varValue,
75+
Organization: organizationName,
76+
Project: cmdProjectName,
77+
Environment: cmdProjectEnvironment,
78+
Scope: schema.EnvVariableScope(strings.ToUpper(varScope)),
79+
Name: varName,
80+
Value: varValue,
7281
}
7382
envvar, err := lagoon.AddOrUpdateEnvVariableByName(context.TODO(), in, lc)
7483
if err != nil {
7584
return err
7685
}
7786

7887
if envvar.ID != 0 {
79-
data := []output.Data{}
88+
header := []string{
89+
"ID",
90+
}
8091
env := []string{
8192
returnNonEmptyString(fmt.Sprintf("%v", envvar.ID)),
82-
returnNonEmptyString(fmt.Sprintf("%v", cmdProjectName)),
8393
}
84-
if cmdProjectEnvironment != "" {
85-
env = append(env, returnNonEmptyString(fmt.Sprintf("%v", cmdProjectEnvironment)))
94+
if organizationName != "" {
95+
header = append(header, "Organization")
96+
env = append(env, returnNonEmptyString(fmt.Sprintf("%v", organizationName)))
8697
}
87-
env = append(env, returnNonEmptyString(fmt.Sprintf("%v", envvar.Scope)))
88-
env = append(env, returnNonEmptyString(fmt.Sprintf("%v", envvar.Name)))
89-
env = append(env, returnNonEmptyString(fmt.Sprintf("%v", envvar.Value)))
90-
data = append(data, env)
91-
header := []string{
92-
"ID",
93-
"Project",
98+
if cmdProjectName != "" {
99+
header = append(header, "Project")
100+
env = append(env, returnNonEmptyString(fmt.Sprintf("%v", cmdProjectName)))
94101
}
95102
if cmdProjectEnvironment != "" {
96103
header = append(header, "Environment")
104+
env = append(env, returnNonEmptyString(fmt.Sprintf("%v", cmdProjectEnvironment)))
97105
}
98106
header = append(header, "Scope")
107+
env = append(env, returnNonEmptyString(fmt.Sprintf("%v", envvar.Scope)))
99108
header = append(header, "Name")
109+
env = append(env, returnNonEmptyString(fmt.Sprintf("%v", envvar.Name)))
100110
header = append(header, "Value")
111+
env = append(env, fmt.Sprintf("%v", envvar.Value))
112+
data := []output.Data{env}
101113
r := output.RenderOutput(output.Table{
102114
Header: header,
103115
Data: data,
@@ -126,12 +138,24 @@ var deleteVariableCmd = &cobra.Command{
126138
if err != nil {
127139
return err
128140
}
129-
if err := requiredInputCheck("Project name", cmdProjectName, "Variable name", varName); err != nil {
141+
organizationName, err := cmd.Flags().GetString("organization-name")
142+
if err != nil {
143+
return err
144+
}
145+
envVarType, err := getEnvVarType(organizationName, cmdProjectName, cmdProjectEnvironment)
146+
if err != nil {
147+
return err
148+
}
149+
if err := requiredInputCheck("Variable name", varName); err != nil {
130150
return err
131151
}
132152

133-
deleteMsg := fmt.Sprintf("You are attempting to delete variable '%s' from project '%s', are you sure?", varName, cmdProjectName)
134-
if cmdProjectEnvironment != "" {
153+
var deleteMsg string
154+
if envVarType == "organization" {
155+
deleteMsg = fmt.Sprintf("You are attempting to delete variable '%s' from organization '%s', are you sure?", varName, organizationName)
156+
} else if envVarType == "project" {
157+
deleteMsg = fmt.Sprintf("You are attempting to delete variable '%s' from project '%s', are you sure?", varName, cmdProjectName)
158+
} else if envVarType == "environment" {
135159
deleteMsg = fmt.Sprintf("You are attempting to delete variable '%s' from environment '%s' in project '%s', are you sure?", varName, cmdProjectEnvironment, cmdProjectName)
136160
}
137161
if yesNo(deleteMsg) {
@@ -144,9 +168,10 @@ var deleteVariableCmd = &cobra.Command{
144168
&token,
145169
debug)
146170
in := &schema.DeleteEnvVariableByNameInput{
147-
Project: cmdProjectName,
148-
Environment: cmdProjectEnvironment,
149-
Name: varName,
171+
Organization: organizationName,
172+
Project: cmdProjectName,
173+
Environment: cmdProjectEnvironment,
174+
Name: varName,
150175
}
151176
deleteResult, err := lagoon.DeleteEnvVariableByName(context.TODO(), in, lc)
152177
if err != nil {
@@ -166,8 +191,11 @@ func init() {
166191
addVariableCmd.Flags().StringP("name", "N", "", "Name of the variable to add")
167192
addVariableCmd.Flags().StringP("value", "V", "", "Value of the variable to add")
168193
addVariableCmd.Flags().StringP("scope", "S", "", "Scope of the variable[global, build, runtime, container_registry, internal_container_registry]")
194+
addVariableCmd.Flags().StringP("organization-name", "O", "", "Name of the organization to add variable to")
169195
updateVariableCmd.Flags().StringP("name", "N", "", "Name of the variable to update")
170196
updateVariableCmd.Flags().StringP("value", "V", "", "Value of the variable to update")
171197
updateVariableCmd.Flags().StringP("scope", "S", "", "Scope of the variable[global, build, runtime, container_registry, internal_container_registry]")
198+
updateVariableCmd.Flags().StringP("organization-name", "O", "", "Name of the organization to update variable for")
172199
deleteVariableCmd.Flags().StringP("name", "N", "", "Name of the variable to delete")
200+
deleteVariableCmd.Flags().StringP("organization-name", "O", "", "Name of the organization to delete variable from")
173201
}

docs/commands/lagoon_add_variable.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ lagoon add variable [flags]
99
### Options
1010

1111
```
12-
-h, --help help for variable
13-
-N, --name string Name of the variable to add
14-
-S, --scope string Scope of the variable[global, build, runtime, container_registry, internal_container_registry]
15-
-V, --value string Value of the variable to add
12+
-h, --help help for variable
13+
-N, --name string Name of the variable to add
14+
-O, --organization-name string Name of the organization to add variable to
15+
-S, --scope string Scope of the variable[global, build, runtime, container_registry, internal_container_registry]
16+
-V, --value string Value of the variable to add
1617
```
1718

1819
### Options inherited from parent commands

docs/commands/lagoon_delete_variable.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ lagoon delete variable [flags]
1313
### Options
1414

1515
```
16-
-h, --help help for variable
17-
-N, --name string Name of the variable to delete
16+
-h, --help help for variable
17+
-N, --name string Name of the variable to delete
18+
-O, --organization-name string Name of the organization to delete variable from
1819
```
1920

2021
### Options inherited from parent commands

docs/commands/lagoon_list.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ List projects, environments, deployments, variables or notifications
5050
* [lagoon list organization-groups](lagoon_list_organization-groups.md) - List groups in an organization
5151
* [lagoon list organization-projects](lagoon_list_organization-projects.md) - List projects in an organization
5252
* [lagoon list organization-users](lagoon_list_organization-users.md) - List users in an organization
53+
* [lagoon list organization-variables](lagoon_list_organization-variables.md) - List variables for an organization (alias: org-v)
5354
* [lagoon list organizations](lagoon_list_organizations.md) - List all organizations
5455
* [lagoon list project-groups](lagoon_list_project-groups.md) - List groups in a project (alias: pg)
5556
* [lagoon list projects](lagoon_list_projects.md) - List all projects you have access to (alias: p)
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
## lagoon list organization-variables
2+
3+
List variables for an organization (alias: org-v)
4+
5+
```
6+
lagoon list organization-variables [flags]
7+
```
8+
9+
### Options
10+
11+
```
12+
-h, --help help for organization-variables
13+
-O, --organization-name string Name of the organization to list associated variables for
14+
--reveal Reveal the variable values
15+
```
16+
17+
### Options inherited from parent commands
18+
19+
```
20+
--config-file string Path to the config file to use (must be *.yml or *.yaml)
21+
--debug Enable debugging output (if supported)
22+
-e, --environment string Specify an environment to use
23+
--force Force yes on prompts (if supported)
24+
-l, --lagoon string The Lagoon instance to interact with
25+
--no-header No header on table (if supported)
26+
--output-csv Output as CSV (if supported)
27+
--output-json Output as JSON (if supported)
28+
--pretty Make JSON pretty (if supported)
29+
-p, --project string Specify a project to use
30+
--skip-update-check Skip checking for updates
31+
-i, --ssh-key string Specify path to a specific SSH key to use for lagoon authentication
32+
--ssh-publickey string Specify path to a specific SSH public key to use for lagoon authentication using ssh-agent.
33+
This will override any public key identities defined in configuration
34+
--strict-host-key-checking string Similar to SSH StrictHostKeyChecking (accept-new, no, ignore) (default "accept-new")
35+
-v, --verbose Enable verbose output to stderr (if supported)
36+
```
37+
38+
### SEE ALSO
39+
40+
* [lagoon list](lagoon_list.md) - List projects, environments, deployments, variables or notifications
41+

docs/commands/lagoon_update_variable.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ lagoon update variable [flags]
99
### Options
1010

1111
```
12-
-h, --help help for variable
13-
-N, --name string Name of the variable to update
14-
-S, --scope string Scope of the variable[global, build, runtime, container_registry, internal_container_registry]
15-
-V, --value string Value of the variable to update
12+
-h, --help help for variable
13+
-N, --name string Name of the variable to update
14+
-O, --organization-name string Name of the organization to update variable for
15+
-S, --scope string Scope of the variable[global, build, runtime, container_registry, internal_container_registry]
16+
-V, --value string Value of the variable to update
1617
```
1718

1819
### Options inherited from parent commands

0 commit comments

Comments
 (0)