forked from hashicorp/nomad
-
Notifications
You must be signed in to change notification settings - Fork 0
/
acl_token_update.go
132 lines (104 loc) · 3.01 KB
/
acl_token_update.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package command
import (
"fmt"
"strings"
"github.com/posener/complete"
)
type ACLTokenUpdateCommand struct {
Meta
}
func (c *ACLTokenUpdateCommand) Help() string {
helpText := `
Usage: nomad acl token update <token_accessor_id>
Update is used to update an existing ACL token. Requires a management token.
General Options:
` + generalOptionsUsage() + `
Update Options:
-name=""
Sets the human readable name for the ACL token.
-type="client"
Sets the type of token. Must be one of "client" (default), or "management".
-global=false
Toggles the global mode of the token. Global tokens are replicated to all regions.
-policy=""
Specifies a policy to associate with the token. Can be specified multiple times,
but only with client type tokens.
`
return strings.TrimSpace(helpText)
}
func (c *ACLTokenUpdateCommand) AutocompleteFlags() complete.Flags {
return mergeAutocompleteFlags(c.Meta.AutocompleteFlags(FlagSetClient),
complete.Flags{
"name": complete.PredictAnything,
"type": complete.PredictAnything,
"global": complete.PredictNothing,
"policy": complete.PredictAnything,
})
}
func (c *ACLTokenUpdateCommand) AutocompleteArgs() complete.Predictor {
return complete.PredictNothing
}
func (c *ACLTokenUpdateCommand) Synopsis() string {
return "Update an existing ACL token"
}
func (*ACLTokenUpdateCommand) Name() string { return "acl token update" }
func (c *ACLTokenUpdateCommand) Run(args []string) int {
var name, tokenType string
var global bool
var policies []string
flags := c.Meta.FlagSet(c.Name(), FlagSetClient)
flags.Usage = func() { c.Ui.Output(c.Help()) }
flags.StringVar(&name, "name", "", "")
flags.StringVar(&tokenType, "type", "client", "")
flags.BoolVar(&global, "global", false, "")
flags.Var((funcVar)(func(s string) error {
policies = append(policies, s)
return nil
}), "policy", "")
if err := flags.Parse(args); err != nil {
return 1
}
// Check that we got exactly one argument
args = flags.Args()
if l := len(args); l != 1 {
c.Ui.Error("This command takes one argument: <token_accessor_id>")
c.Ui.Error(commandErrorText(c))
return 1
}
tokenAccessorID := args[0]
// Get the HTTP client
client, err := c.Meta.Client()
if err != nil {
c.Ui.Error(fmt.Sprintf("Error initializing client: %s", err))
return 1
}
// Get the specified token
token, _, err := client.ACLTokens().Info(tokenAccessorID, nil)
if err != nil {
c.Ui.Error(fmt.Sprintf("Error fetching token: %s", err))
return 1
}
// Create the updated token
if name != "" {
token.Name = name
}
if tokenType != "" {
token.Type = tokenType
}
// This will default to false if the user does not specify it
if global != token.Global {
token.Global = global
}
if len(policies) != 0 {
token.Policies = policies
}
// Update the token
updatedToken, _, err := client.ACLTokens().Update(token, nil)
if err != nil {
c.Ui.Error(fmt.Sprintf("Error updating token: %s", err))
return 1
}
// Format the output
c.Ui.Output(formatKVACLToken(updatedToken))
return 0
}