Skip to content

Commit 6b79682

Browse files
committed
feat(cmd): apply env vars consistently across cmd
1 parent 8e8cfc7 commit 6b79682

9 files changed

+210
-27
lines changed

CHANGELOG.md

+9
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
## v2.0.0-alpha.20 [UNRELEASED]
2+
3+
### Features
4+
5+
### Bug Fixes
6+
1. [16225](https://github.com/influxdata/influxdb/pull/16225): Ensures env vars are applied consistently across cmd, and fixes issue where INFLUX_ env var prefix was not set globally.
7+
8+
### UI Improvements
9+
110
## v2.0.0-alpha.21 [2019-12-13]
211

312
### Features

cmd/influx/authorization.go

+14
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/influxdata/influxdb/cmd/influx/internal"
99
"github.com/influxdata/influxdb/http"
1010
"github.com/spf13/cobra"
11+
"github.com/spf13/viper"
1112
)
1213

1314
// AuthorizationCreateFlags are command line args used when creating a authorization
@@ -77,6 +78,10 @@ func authCreateCmd() *cobra.Command {
7778

7879
cmd.Flags().StringVarP(&authCreateFlags.org, "org", "o", "", "The organization name (required)")
7980
cmd.MarkFlagRequired("org")
81+
viper.BindEnv("ORG")
82+
if h := viper.GetString("ORG"); h != "" {
83+
authCreateFlags.org = h
84+
}
8085

8186
cmd.Flags().StringVarP(&authCreateFlags.user, "user", "u", "", "The user name")
8287

@@ -297,7 +302,16 @@ func authFindCmd() *cobra.Command {
297302
cmd.Flags().StringVarP(&authorizationFindFlags.user, "user", "u", "", "The user")
298303
cmd.Flags().StringVarP(&authorizationFindFlags.userID, "user-id", "", "", "The user ID")
299304
cmd.Flags().StringVarP(&authorizationFindFlags.org, "org", "o", "", "The org")
305+
viper.BindEnv("ORG")
306+
if h := viper.GetString("ORG"); h != "" {
307+
authorizationFindFlags.org = h
308+
}
309+
300310
cmd.Flags().StringVarP(&authorizationFindFlags.orgID, "org-id", "", "", "The org ID")
311+
viper.BindEnv("ORG_ID")
312+
if h := viper.GetString("ORG_ID"); h != "" {
313+
authorizationFindFlags.orgID = h
314+
}
301315
cmd.Flags().StringVarP(&authorizationFindFlags.id, "id", "i", "", "The authorization ID")
302316

303317
return cmd

cmd/influx/bucket.go

+27
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/influxdata/influxdb/cmd/influx/internal"
1111
"github.com/influxdata/influxdb/http"
1212
"github.com/spf13/cobra"
13+
"github.com/spf13/viper"
1314
)
1415

1516
// Bucket Command
@@ -43,7 +44,15 @@ func init() {
4344
bucketCreateCmd.Flags().StringVarP(&bucketCreateFlags.name, "name", "n", "", "Name of bucket that will be created")
4445
bucketCreateCmd.Flags().DurationVarP(&bucketCreateFlags.retention, "retention", "r", 0, "Duration in nanoseconds data will live in bucket")
4546
bucketCreateCmd.Flags().StringVarP(&bucketCreateFlags.orgID, "org-id", "", "", "The ID of the organization that owns the bucket")
47+
viper.BindEnv("ORG_ID")
48+
if h := viper.GetString("ORG_ID"); h != "" {
49+
bucketFindFlags.orgID = h
50+
}
4651
bucketCreateCmd.Flags().StringVarP(&bucketCreateFlags.org, "org", "o", "", "The org name")
52+
viper.BindEnv("ORG")
53+
if h := viper.GetString("ORG"); h != "" {
54+
bucketFindFlags.org = h
55+
}
4756
bucketCreateCmd.MarkFlagRequired("name")
4857

4958
bucketCmd.AddCommand(bucketCreateCmd)
@@ -132,9 +141,22 @@ func init() {
132141
}
133142

134143
bucketFindCmd.Flags().StringVarP(&bucketFindFlags.name, "name", "n", "", "The bucket name")
144+
viper.BindEnv("BUCKET_NAME")
145+
if h := viper.GetString("BUCKET_NAME"); h != "" {
146+
bucketFindFlags.name = h
147+
}
135148
bucketFindCmd.Flags().StringVarP(&bucketFindFlags.id, "id", "i", "", "The bucket ID")
136149
bucketFindCmd.Flags().StringVarP(&bucketFindFlags.orgID, "org-id", "", "", "The bucket organization ID")
150+
viper.BindEnv("ORG_ID")
151+
if h := viper.GetString("ORG_ID"); h != "" {
152+
bucketFindFlags.orgID = h
153+
}
154+
137155
bucketFindCmd.Flags().StringVarP(&bucketFindFlags.org, "org", "o", "", "The bucket organization name")
156+
viper.BindEnv("ORG")
157+
if h := viper.GetString("ORG"); h != "" {
158+
bucketFindFlags.org = h
159+
}
138160
bucketFindCmd.Flags().BoolVar(&bucketFindFlags.headers, "headers", true, "To print the table headers; defaults true")
139161

140162
bucketCmd.AddCommand(bucketFindCmd)
@@ -219,6 +241,11 @@ func init() {
219241

220242
bucketUpdateCmd.Flags().StringVarP(&bucketUpdateFlags.id, "id", "i", "", "The bucket ID (required)")
221243
bucketUpdateCmd.Flags().StringVarP(&bucketUpdateFlags.name, "name", "n", "", "New bucket name")
244+
viper.BindEnv("BUCKET_NAME")
245+
if h := viper.GetString("BUCKET_NAME"); h != "" {
246+
bucketFindFlags.name = h
247+
}
248+
222249
bucketUpdateCmd.Flags().DurationVarP(&bucketUpdateFlags.retention, "retention", "r", 0, "New duration data will live in bucket")
223250
bucketUpdateCmd.MarkFlagRequired("id")
224251

cmd/influx/main.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ func influxCmd() *cobra.Command {
8383
cmd.Usage()
8484
},
8585
}
86+
87+
viper.SetEnvPrefix("INFLUX")
88+
8689
cmd.AddCommand(
8790
authCmd(),
8891
bucketCmd,
@@ -99,8 +102,6 @@ func influxCmd() *cobra.Command {
99102
writeCmd,
100103
)
101104

102-
viper.SetEnvPrefix("INFLUX")
103-
104105
cmd.PersistentFlags().StringVarP(&flags.token, "token", "t", "", "API token to be used throughout client calls")
105106
viper.BindEnv("TOKEN")
106107
if h := viper.GetString("TOKEN"); h != "" {

cmd/influx/organization.go

+48-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/influxdata/influxdb/cmd/influx/internal"
1010
"github.com/influxdata/influxdb/http"
1111
"github.com/spf13/cobra"
12+
"github.com/spf13/viper"
1213
)
1314

1415
func organizationCmd() *cobra.Command {
@@ -113,7 +114,15 @@ func orgFindCmd() *cobra.Command {
113114
}
114115

115116
cmd.Flags().StringVarP(&organizationFindFlags.name, "name", "n", "", "The organization name")
117+
viper.BindEnv("ORG")
118+
if h := viper.GetString("ORG"); h != "" {
119+
organizationFindFlags.name = h
120+
}
116121
cmd.Flags().StringVarP(&organizationFindFlags.id, "id", "i", "", "The organization ID")
122+
viper.BindEnv("ORG_ID")
123+
if h := viper.GetString("ORG_ID"); h != "" {
124+
organizationFindFlags.id = h
125+
}
117126

118127
return cmd
119128
}
@@ -174,8 +183,17 @@ func orgUpdateCmd() *cobra.Command {
174183
}
175184

176185
cmd.Flags().StringVarP(&organizationUpdateFlags.id, "id", "i", "", "The organization ID (required)")
177-
cmd.Flags().StringVarP(&organizationUpdateFlags.name, "name", "n", "", "The organization name")
178186
cmd.MarkFlagRequired("id")
187+
viper.BindEnv("ORG_ID")
188+
if h := viper.GetString("ORG_ID"); h != "" {
189+
organizationUpdateFlags.id = h
190+
}
191+
192+
cmd.Flags().StringVarP(&organizationUpdateFlags.name, "name", "n", "", "The organization name")
193+
viper.BindEnv("ORG")
194+
if h := viper.GetString("ORG"); h != "" {
195+
organizationUpdateFlags.name = h
196+
}
179197

180198
return cmd
181199
}
@@ -268,6 +286,10 @@ func orgDeleteCmd() *cobra.Command {
268286

269287
cmd.Flags().StringVarP(&organizationDeleteFlags.id, "id", "i", "", "The organization ID (required)")
270288
cmd.MarkFlagRequired("id")
289+
viper.BindEnv("ORG_ID")
290+
if h := viper.GetString("ORG_ID"); h != "" {
291+
organizationUpdateFlags.id = h
292+
}
271293

272294
return cmd
273295
}
@@ -340,7 +362,15 @@ func orgMembersListCmd() *cobra.Command {
340362
}
341363

342364
cmd.Flags().StringVarP(&organizationMembersListFlags.id, "id", "i", "", "The organization ID")
365+
viper.BindEnv("ORG_ID")
366+
if h := viper.GetString("ORG_ID"); h != "" {
367+
organizationMembersListFlags.id = h
368+
}
343369
cmd.Flags().StringVarP(&organizationMembersListFlags.name, "name", "n", "", "The organization name")
370+
viper.BindEnv("ORG")
371+
if h := viper.GetString("ORG"); h != "" {
372+
organizationMembersListFlags.name = h
373+
}
344374

345375
return cmd
346376
}
@@ -411,7 +441,16 @@ func orgMembersAddCmd() *cobra.Command {
411441
}
412442

413443
cmd.Flags().StringVarP(&organizationMembersAddFlags.id, "id", "i", "", "The organization ID")
444+
viper.BindEnv("ORG_ID")
445+
if h := viper.GetString("ORG_ID"); h != "" {
446+
organizationMembersAddFlags.id = h
447+
}
414448
cmd.Flags().StringVarP(&organizationMembersAddFlags.name, "name", "n", "", "The organization name")
449+
viper.BindEnv("ORG")
450+
if h := viper.GetString("ORG"); h != "" {
451+
organizationMembersAddFlags.name = h
452+
}
453+
415454
cmd.Flags().StringVarP(&organizationMembersAddFlags.memberID, "member", "o", "", "The member ID")
416455
cmd.MarkFlagRequired("member")
417456

@@ -478,7 +517,15 @@ func orgMembersRemoveCmd() *cobra.Command {
478517
}
479518

480519
cmd.Flags().StringVarP(&organizationMembersRemoveFlags.id, "id", "i", "", "The organization ID")
520+
viper.BindEnv("ORG_ID")
521+
if h := viper.GetString("ORG_ID"); h != "" {
522+
organizationMembersAddFlags.id = h
523+
}
481524
cmd.Flags().StringVarP(&organizationMembersRemoveFlags.name, "name", "n", "", "The organization name")
525+
viper.BindEnv("ORG")
526+
if h := viper.GetString("ORG"); h != "" {
527+
organizationMembersRemoveFlags.name = h
528+
}
482529
cmd.Flags().StringVarP(&organizationMembersRemoveFlags.memberID, "member", "o", "", "The member ID")
483530
cmd.MarkFlagRequired("member")
484531

cmd/influx/pkg.go

+17-2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"github.com/influxdata/influxdb/pkger"
2424
"github.com/olekukonko/tablewriter"
2525
"github.com/spf13/cobra"
26+
"github.com/spf13/viper"
2627
input "github.com/tcnksm/go-input"
2728
"gopkg.in/yaml.v3"
2829
)
@@ -93,10 +94,16 @@ func (b *cmdPkgBuilder) cmdPkgApply() *cobra.Command {
9394
cmd.MarkFlagFilename("file", "yaml", "yml", "json")
9495
cmd.Flags().BoolVarP(&b.quiet, "quiet", "q", false, "disable output printing")
9596
cmd.Flags().StringVar(&b.applyOpts.force, "force", "", `TTY input, if package will have destructive changes, proceed if set "true".`)
96-
9797
cmd.Flags().StringVarP(&b.orgID, "org-id", "", "", "The ID of the organization that owns the bucket")
98+
viper.BindEnv("ORG_ID")
99+
if h := viper.GetString("ORG_ID"); h != "" {
100+
b.orgID = h
101+
}
98102
cmd.Flags().StringVarP(&b.org, "org", "o", "", "The name of the organization that owns the bucket")
99-
103+
viper.BindEnv("ORG")
104+
if h := viper.GetString("ORG"); h != "" {
105+
b.org = h
106+
}
100107
cmd.Flags().BoolVarP(&b.hasColor, "color", "c", true, "Enable color in output, defaults true")
101108
cmd.Flags().BoolVar(&b.hasTableBorders, "table-borders", true, "Enable table borders, defaults true")
102109

@@ -298,7 +305,15 @@ func (b *cmdPkgBuilder) cmdPkgExportAll() *cobra.Command {
298305

299306
cmd.Flags().StringVarP(&b.file, "file", "f", "", "output file for created pkg; defaults to std out if no file provided; the extension of provided file (.yml/.json) will dictate encoding")
300307
cmd.Flags().StringVarP(&b.orgID, "org-id", "", "", "organization id")
308+
viper.BindEnv("ORG_ID")
309+
if h := viper.GetString("ORG_ID"); h != "" {
310+
b.orgID = h
311+
}
301312
cmd.Flags().StringVarP(&b.org, "org", "o", "", "The name of the organization that owns the bucket")
313+
viper.BindEnv("ORG")
314+
if h := viper.GetString("ORG"); h != "" {
315+
b.org = h
316+
}
302317
cmd.Flags().StringVarP(&b.meta.Name, "name", "n", "", "name for new pkg")
303318
cmd.Flags().StringVarP(&b.meta.Description, "description", "d", "", "description for new pkg")
304319
cmd.Flags().StringVarP(&b.meta.Version, "version", "v", "", "version for new pkg")

cmd/influx/pkg_test.go

+64-22
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,42 @@ func Test_Pkg(t *testing.T) {
149149
Version: "new version",
150150
},
151151
},
152+
{
153+
pkgFileArgs: pkgFileArgs{
154+
name: "yaml out",
155+
encoding: pkger.EncodingYAML,
156+
filename: "pkg_0.yml",
157+
flags: []flagArg{
158+
{name: "name", val: "new name"},
159+
{name: "description", val: "new desc"},
160+
{name: "version", val: "new version"},
161+
},
162+
envVars: []struct{ key, val string }{{key: "INFLUX_ORG", val: "influxdata"}},
163+
},
164+
expectedMeta: pkger.Metadata{
165+
Name: "new name",
166+
Description: "new desc",
167+
Version: "new version",
168+
},
169+
},
170+
{
171+
pkgFileArgs: pkgFileArgs{
172+
name: "yaml out",
173+
encoding: pkger.EncodingYAML,
174+
filename: "pkg_0.yml",
175+
flags: []flagArg{
176+
{name: "name", val: "new name"},
177+
{name: "description", val: "new desc"},
178+
{name: "version", val: "new version"},
179+
},
180+
envVars: []struct{ key, val string }{{key: "INFLUX_ORG_ID", val: expectedOrgID.String()}},
181+
},
182+
expectedMeta: pkger.Metadata{
183+
Name: "new name",
184+
Description: "new desc",
185+
Version: "new version",
186+
},
187+
},
152188
}
153189

154190
cmdFn := func() *cobra.Command {
@@ -294,28 +330,6 @@ func Test_Pkg(t *testing.T) {
294330
Version: "new version",
295331
},
296332
},
297-
{
298-
pkgFileArgs: pkgFileArgs{
299-
name: "mixed",
300-
encoding: pkger.EncodingYAML,
301-
filename: "pkg_0.yml",
302-
flags: []flagArg{
303-
{name: "name", val: "new name"},
304-
{name: "description", val: "new desc"},
305-
{name: "version", val: "new version"},
306-
},
307-
},
308-
bucketIDs: []influxdb.ID{1, 2},
309-
dashIDs: []influxdb.ID{3, 4},
310-
labelIDs: []influxdb.ID{5, 6},
311-
varIDs: []influxdb.ID{7, 8},
312-
telegrafIDs: []influxdb.ID{9, 10},
313-
expectedMeta: pkger.Metadata{
314-
Name: "new name",
315-
Description: "new desc",
316-
Version: "new version",
317-
},
318-
},
319333
}
320334

321335
cmdFn := func() *cobra.Command {
@@ -418,15 +432,43 @@ type pkgFileArgs struct {
418432
filename string
419433
encoding pkger.Encoding
420434
flags []flagArg
435+
envVars []struct {
436+
key, val string
437+
}
421438
}
422439

423440
func testPkgWrites(t *testing.T, newCmdFn func() *cobra.Command, args pkgFileArgs, assertFn func(t *testing.T, pkg *pkger.Pkg)) {
441+
t.Helper()
424442
wrappedCmdFn := func() *cobra.Command {
425443
cmd := newCmdFn()
426444
cmd.SetArgs([]string{}) // clears mess from test runner coming into cobra cli via stdin
427445
return cmd
428446
}
429447

448+
// we'll memoize the current env vars if defined in args.envVars, then set the env vars defined in each test
449+
var initialEnvVars []struct{ key, val string }
450+
for _, envVar := range args.envVars {
451+
if k := os.Getenv(envVar.key); k != "" {
452+
initialEnvVars = append(initialEnvVars, struct{ key, val string }{
453+
key: envVar.key,
454+
val: os.Getenv(envVar.key),
455+
})
456+
}
457+
458+
require.NoError(t, os.Setenv(envVar.key, envVar.val))
459+
}
460+
461+
defer func() {
462+
// unset the env vars set by the test
463+
for _, envVar := range args.envVars {
464+
require.NoError(t, os.Unsetenv(envVar.key))
465+
}
466+
467+
// set the test env vars back to the initial state
468+
for _, envVar := range initialEnvVars {
469+
require.NoError(t, os.Setenv(envVar.key, envVar.val))
470+
}
471+
}()
430472
t.Run(path.Join(args.name, "file"), testPkgWritesFile(wrappedCmdFn, args, assertFn))
431473
t.Run(path.Join(args.name, "buffer"), testPkgWritesToBuffer(wrappedCmdFn, args, assertFn))
432474
}

0 commit comments

Comments
 (0)