Skip to content

Commit b74500f

Browse files
authored
Merge pull request #11 from silinternational/feature/refactor-flags
move flags to a new package shared between main and multiregion
2 parents dd1a76b + 47e1672 commit b74500f

File tree

4 files changed

+79
-76
lines changed

4 files changed

+79
-76
lines changed

cmd/cli/flags/flags.go

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package flags
2+
3+
import (
4+
"log"
5+
6+
"github.com/spf13/cobra"
7+
"github.com/spf13/viper"
8+
)
9+
10+
// Root-level persistent flags
11+
const (
12+
Config = "config"
13+
Org = "org"
14+
Idp = "idp"
15+
Region = "region"
16+
ReadOnlyMode = "read-only-mode"
17+
)
18+
19+
// Persistent flags for multiregion commands
20+
const (
21+
DomainName = "domain-name"
22+
Env = "env"
23+
Region2 = "region2"
24+
TfcToken = "tfc-token"
25+
OrgAlternate = "org-alternate"
26+
TfcTokenAlternate = "tfc-token-alternate"
27+
)
28+
29+
func NewStringFlag(command *cobra.Command, name, shorthand string, value, usage string) {
30+
var s string
31+
32+
if shorthand == "" {
33+
command.PersistentFlags().StringVar(&s, name, value, usage)
34+
} else {
35+
command.PersistentFlags().StringVarP(&s, name, shorthand, value, usage)
36+
}
37+
if err := viper.BindPFlag(name, command.PersistentFlags().Lookup(name)); err != nil {
38+
log.Fatalln("Error: unable to bind flag:", err)
39+
}
40+
}
41+
42+
func NewBoolFlag(command *cobra.Command, name, shorthand string, value bool, usage string) {
43+
var b bool
44+
if shorthand == "" {
45+
command.PersistentFlags().BoolVar(&b, name, value, usage)
46+
} else {
47+
command.PersistentFlags().BoolVarP(&b, name, shorthand, value, usage)
48+
}
49+
if err := viper.BindPFlag(name, command.PersistentFlags().Lookup(name)); err != nil {
50+
log.Fatalln("Error: unable to bind flag:", err)
51+
}
52+
}

cmd/cli/multiregion/dns.go

+5-3
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import (
1313
"github.com/hashicorp/go-tfe"
1414
"github.com/spf13/cobra"
1515
"github.com/spf13/viper"
16+
17+
"github.com/silinternational/idp-cli/cmd/cli/flags"
1618
)
1719

1820
type DnsCommand struct {
@@ -65,7 +67,7 @@ func runDnsCommand(failback bool) {
6567
func newDnsCommand(pFlags PersistentFlags, failback bool) *DnsCommand {
6668
d := DnsCommand{
6769
testMode: pFlags.readOnlyMode,
68-
domainName: viper.GetString(flagDomainName),
70+
domainName: viper.GetString(flags.DomainName),
6971
}
7072

7173
if d.domainName == "" {
@@ -305,7 +307,7 @@ func (d *DnsCommand) findTfcWorkspace(ctx context.Context, workspaceName string)
305307
return
306308
}
307309

308-
fmt.Printf("Workspace %s not found using %s, trying %s\n", workspaceName, flagTfcToken, flagTfcTokenAlternate)
310+
fmt.Printf("Workspace %s not found using %s, trying %s\n", workspaceName, flags.TfcToken, flags.TfcTokenAlternate)
309311

310312
config.Token = d.tfcTokenAlt
311313
client, err = tfe.NewClient(config)
@@ -316,7 +318,7 @@ func (d *DnsCommand) findTfcWorkspace(ctx context.Context, workspaceName string)
316318

317319
w, err = client.Workspaces.Read(ctx, d.tfcOrgAlt, workspaceName)
318320
if err != nil {
319-
err = fmt.Errorf("error reading Terraform workspace %s using %s: %s", workspaceName, flagTfcTokenAlternate, err)
321+
err = fmt.Errorf("error reading Terraform workspace %s using %s: %s", workspaceName, flags.TfcTokenAlternate, err)
320322
return
321323
}
322324

cmd/cli/multiregion/multiregion.go

+16-52
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,8 @@ import (
1010

1111
"github.com/spf13/cobra"
1212
"github.com/spf13/viper"
13-
)
1413

15-
const (
16-
flagDomainName = "domain-name"
17-
flagEnv = "env"
18-
flagRegion2 = "region2"
19-
flagTfcToken = "tfc-token"
20-
flagOrgAlternate = "org-alternate"
21-
flagTfcTokenAlternate = "tfc-token-alternate"
14+
"github.com/silinternational/idp-cli/cmd/cli/flags"
2215
)
2316

2417
const envProd = "prod"
@@ -36,41 +29,12 @@ func SetupMultiregionCmd(parentCommand *cobra.Command) {
3629
InitSetupCmd(multiregionCmd)
3730
InitStatusCmd(multiregionCmd)
3831

39-
var domainName string
40-
multiregionCmd.PersistentFlags().StringVar(&domainName, flagDomainName, "", "Domain name")
41-
if err := viper.BindPFlag(flagDomainName, multiregionCmd.PersistentFlags().Lookup(flagDomainName)); err != nil {
42-
outputFlagError(multiregionCmd, err)
43-
}
44-
45-
var env string
46-
multiregionCmd.PersistentFlags().StringVar(&env, flagEnv, envProd, "Execution environment")
47-
if err := viper.BindPFlag(flagEnv, multiregionCmd.PersistentFlags().Lookup(flagEnv)); err != nil {
48-
outputFlagError(multiregionCmd, err)
49-
}
50-
51-
var region2 string
52-
multiregionCmd.PersistentFlags().StringVar(&region2, flagRegion2, "", "Secondary AWS region")
53-
if err := viper.BindPFlag(flagRegion2, multiregionCmd.PersistentFlags().Lookup(flagRegion2)); err != nil {
54-
outputFlagError(multiregionCmd, err)
55-
}
56-
57-
var tfcToken string
58-
multiregionCmd.PersistentFlags().StringVar(&tfcToken, flagTfcToken, "", "Token for Terraform Cloud authentication")
59-
if err := viper.BindPFlag(flagTfcToken, multiregionCmd.PersistentFlags().Lookup(flagTfcToken)); err != nil {
60-
outputFlagError(multiregionCmd, err)
61-
}
62-
63-
var orgAlt string
64-
multiregionCmd.PersistentFlags().StringVar(&orgAlt, flagOrgAlternate, "", "Alternate Terraform Cloud organization")
65-
if err := viper.BindPFlag(flagOrgAlternate, multiregionCmd.PersistentFlags().Lookup(flagOrgAlternate)); err != nil {
66-
outputFlagError(multiregionCmd, err)
67-
}
68-
69-
var tfcTokenAlt string
70-
multiregionCmd.PersistentFlags().StringVar(&tfcTokenAlt, flagTfcTokenAlternate, "", "Alternate token for Terraform Cloud")
71-
if err := viper.BindPFlag(flagTfcTokenAlternate, multiregionCmd.PersistentFlags().Lookup(flagTfcTokenAlternate)); err != nil {
72-
outputFlagError(multiregionCmd, err)
73-
}
32+
flags.NewStringFlag(multiregionCmd, flags.DomainName, "", "", "Domain name")
33+
flags.NewStringFlag(multiregionCmd, flags.Env, "", envProd, "Execution environment")
34+
flags.NewStringFlag(multiregionCmd, flags.Region2, "", "", "Secondary AWS region")
35+
flags.NewStringFlag(multiregionCmd, flags.TfcToken, "", "", "Token for Terraform Cloud authentication")
36+
flags.NewStringFlag(multiregionCmd, flags.OrgAlternate, "", "", "Alternate Terraform Cloud organization")
37+
flags.NewStringFlag(multiregionCmd, flags.TfcTokenAlternate, "", "", "Alternate token for Terraform Cloud")
7438
}
7539

7640
func outputFlagError(cmd *cobra.Command, err error) {
@@ -91,19 +55,19 @@ type PersistentFlags struct {
9155

9256
func getPersistentFlags() PersistentFlags {
9357
pFlags := PersistentFlags{
94-
env: getRequiredParam(flagEnv),
95-
idp: getRequiredParam("idp"),
96-
org: getRequiredParam("org"),
97-
tfcToken: getRequiredParam(flagTfcToken),
98-
secondaryRegion: getRequiredParam(flagRegion2),
99-
readOnlyMode: viper.GetBool("read-only-mode"),
100-
tfcTokenAlt: getOption(flagTfcTokenAlternate, ""),
101-
orgAlt: getOption(flagOrgAlternate, viper.GetString(flagOrgAlternate)),
58+
env: getRequiredParam(flags.Env),
59+
idp: getRequiredParam(flags.Idp),
60+
org: getRequiredParam(flags.Org),
61+
tfcToken: getRequiredParam(flags.TfcToken),
62+
secondaryRegion: getRequiredParam(flags.Region2),
63+
readOnlyMode: viper.GetBool(flags.ReadOnlyMode),
64+
tfcTokenAlt: getOption(flags.TfcTokenAlternate, ""),
65+
orgAlt: getOption(flags.OrgAlternate, viper.GetString(flags.OrgAlternate)),
10266
}
10367

10468
if pFlags.orgAlt != "" && pFlags.tfcTokenAlt == "" {
10569
log.Fatalf("%[1]s was specified without %[2]s. Please include %[2]s or remove %[1]s.",
106-
flagOrgAlternate, flagTfcTokenAlternate)
70+
flags.OrgAlternate, flags.TfcTokenAlternate)
10771
}
10872

10973
if pFlags.orgAlt == "" {

cmd/cli/root.go

+6-21
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ package main
66
import (
77
"errors"
88
"fmt"
9-
"log"
109
"os"
1110

1211
"github.com/spf13/cobra"
1312
"github.com/spf13/viper"
1413

14+
"github.com/silinternational/idp-cli/cmd/cli/flags"
1515
"github.com/silinternational/idp-cli/cmd/cli/multiregion"
1616
)
1717

@@ -28,27 +28,12 @@ It can be used to check the status of the IdP. It can also be used to establish
2828
in a second AWS region, and to initiate a secondary region failover action.`,
2929
}
3030

31-
rootCmd.PersistentFlags().StringVar(&configFile, "config", "", "Config file")
31+
rootCmd.PersistentFlags().StringVar(&configFile, flags.Config, "", "Config file")
3232

33-
var org string
34-
rootCmd.PersistentFlags().StringVar(&org, "org", "", requiredPrefix+"Terraform Cloud organization")
35-
if err := viper.BindPFlag("org", rootCmd.PersistentFlags().Lookup("org")); err != nil {
36-
log.Fatalln("Error: unable to bind flag:", err)
37-
}
38-
39-
var idp string
40-
rootCmd.PersistentFlags().StringVar(&idp, "idp", "", requiredPrefix+"IDP key (short name)")
41-
if err := viper.BindPFlag("idp", rootCmd.PersistentFlags().Lookup("idp")); err != nil {
42-
log.Fatalln("Error: unable to bind flag:", err)
43-
}
44-
45-
var readOnly bool
46-
rootCmd.PersistentFlags().BoolVarP(&readOnly, "read-only-mode", "r", false,
47-
`read-only mode persists no changes`,
48-
)
49-
if err := viper.BindPFlag("read-only-mode", rootCmd.PersistentFlags().Lookup("read-only-mode")); err != nil {
50-
log.Fatalln("Error: unable to bind flag:", err)
51-
}
33+
flags.NewStringFlag(rootCmd, flags.Org, "", "", requiredPrefix+"Terraform Cloud organization")
34+
flags.NewStringFlag(rootCmd, flags.Idp, "", "", requiredPrefix+"IDP key (short name)")
35+
flags.NewStringFlag(rootCmd, flags.Region, "", "", "AWS region")
36+
flags.NewBoolFlag(rootCmd, flags.ReadOnlyMode, "r", false, "read-only mode persists no changes")
5237

5338
SetupVersionCmd(rootCmd)
5439
multiregion.SetupMultiregionCmd(rootCmd)

0 commit comments

Comments
 (0)