wavefront-cli 4.2.1 → 4.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.codeclimate.yml +1 -0
- data/.rubocop.yml +1 -14
- data/.travis.yml +4 -4
- data/Gemfile +2 -0
- data/HISTORY.md +82 -60
- data/Rakefile +2 -0
- data/bin/wf +1 -0
- data/lib/wavefront-cli/alert.rb +13 -5
- data/lib/wavefront-cli/apitoken.rb +2 -0
- data/lib/wavefront-cli/base.rb +95 -47
- data/lib/wavefront-cli/cloudintegration.rb +6 -0
- data/lib/wavefront-cli/command_mixins/acl.rb +6 -1
- data/lib/wavefront-cli/command_mixins/tag.rb +2 -0
- data/lib/wavefront-cli/commands/.rubocop.yml +3 -4
- data/lib/wavefront-cli/commands/alert.rb +2 -1
- data/lib/wavefront-cli/commands/apitoken.rb +6 -0
- data/lib/wavefront-cli/commands/base.rb +30 -21
- data/lib/wavefront-cli/commands/cloudintegration.rb +2 -0
- data/lib/wavefront-cli/commands/config.rb +2 -0
- data/lib/wavefront-cli/commands/dashboard.rb +2 -0
- data/lib/wavefront-cli/commands/derivedmetric.rb +2 -0
- data/lib/wavefront-cli/commands/event.rb +3 -1
- data/lib/wavefront-cli/commands/integration.rb +2 -1
- data/lib/wavefront-cli/commands/link.rb +2 -0
- data/lib/wavefront-cli/commands/message.rb +2 -0
- data/lib/wavefront-cli/commands/metric.rb +2 -0
- data/lib/wavefront-cli/commands/notificant.rb +2 -0
- data/lib/wavefront-cli/commands/proxy.rb +2 -0
- data/lib/wavefront-cli/commands/query.rb +2 -0
- data/lib/wavefront-cli/commands/savedsearch.rb +2 -0
- data/lib/wavefront-cli/commands/serviceaccount.rb +58 -0
- data/lib/wavefront-cli/commands/settings.rb +2 -0
- data/lib/wavefront-cli/commands/source.rb +3 -1
- data/lib/wavefront-cli/commands/user.rb +4 -1
- data/lib/wavefront-cli/commands/usergroup.rb +3 -0
- data/lib/wavefront-cli/commands/webhook.rb +2 -0
- data/lib/wavefront-cli/commands/window.rb +2 -0
- data/lib/wavefront-cli/commands/write.rb +2 -0
- data/lib/wavefront-cli/config.rb +23 -12
- data/lib/wavefront-cli/constants.rb +10 -4
- data/lib/wavefront-cli/controller.rb +53 -22
- data/lib/wavefront-cli/dashboard.rb +3 -0
- data/lib/wavefront-cli/derivedmetric.rb +12 -11
- data/lib/wavefront-cli/display/alert.rb +7 -4
- data/lib/wavefront-cli/display/apitoken.rb +2 -0
- data/lib/wavefront-cli/display/base.rb +34 -8
- data/lib/wavefront-cli/display/cloudintegration.rb +4 -2
- data/lib/wavefront-cli/display/dashboard.rb +2 -0
- data/lib/wavefront-cli/display/derivedmetric.rb +2 -0
- data/lib/wavefront-cli/display/distribution.rb +2 -0
- data/lib/wavefront-cli/display/event.rb +2 -0
- data/lib/wavefront-cli/display/externallink.rb +2 -0
- data/lib/wavefront-cli/display/integration.rb +2 -0
- data/lib/wavefront-cli/display/maintenancewindow.rb +2 -0
- data/lib/wavefront-cli/display/message.rb +7 -3
- data/lib/wavefront-cli/display/metric.rb +3 -1
- data/lib/wavefront-cli/display/notificant.rb +3 -1
- data/lib/wavefront-cli/display/printer/long.rb +36 -11
- data/lib/wavefront-cli/display/printer/sparkline.rb +3 -0
- data/lib/wavefront-cli/display/printer/terse.rb +6 -1
- data/lib/wavefront-cli/display/proxy.rb +2 -0
- data/lib/wavefront-cli/display/query.rb +35 -24
- data/lib/wavefront-cli/display/savedsearch.rb +2 -0
- data/lib/wavefront-cli/display/serviceaccount.rb +60 -0
- data/lib/wavefront-cli/display/settings.rb +2 -0
- data/lib/wavefront-cli/display/source.rb +18 -4
- data/lib/wavefront-cli/display/user.rb +56 -10
- data/lib/wavefront-cli/display/usergroup.rb +25 -19
- data/lib/wavefront-cli/display/webhook.rb +2 -0
- data/lib/wavefront-cli/display/write.rb +6 -2
- data/lib/wavefront-cli/event.rb +83 -62
- data/lib/wavefront-cli/exception.rb +3 -0
- data/lib/wavefront-cli/externallink.rb +6 -4
- data/lib/wavefront-cli/integration.rb +2 -0
- data/lib/wavefront-cli/maintenancewindow.rb +28 -17
- data/lib/wavefront-cli/message.rb +4 -0
- data/lib/wavefront-cli/metric.rb +4 -1
- data/lib/wavefront-cli/notificant.rb +2 -0
- data/lib/wavefront-cli/opt_handler.rb +2 -0
- data/lib/wavefront-cli/output/base.rb +8 -3
- data/lib/wavefront-cli/output/csv.rb +2 -0
- data/lib/wavefront-cli/output/csv/base.rb +2 -0
- data/lib/wavefront-cli/output/csv/query.rb +14 -7
- data/lib/wavefront-cli/output/hcl.rb +2 -0
- data/lib/wavefront-cli/output/hcl/alert.rb +2 -0
- data/lib/wavefront-cli/output/hcl/base.rb +10 -4
- data/lib/wavefront-cli/output/hcl/dashboard.rb +17 -8
- data/lib/wavefront-cli/output/hcl/notificant.rb +2 -0
- data/lib/wavefront-cli/output/hcl/stdlib/array.rb +2 -0
- data/lib/wavefront-cli/output/hcl/stdlib/string.rb +2 -0
- data/lib/wavefront-cli/output/json.rb +2 -0
- data/lib/wavefront-cli/output/ruby.rb +2 -0
- data/lib/wavefront-cli/output/wavefront.rb +2 -0
- data/lib/wavefront-cli/output/wavefront/query.rb +7 -4
- data/lib/wavefront-cli/output/yaml.rb +2 -0
- data/lib/wavefront-cli/proxy.rb +15 -3
- data/lib/wavefront-cli/query.rb +14 -12
- data/lib/wavefront-cli/savedsearch.rb +2 -0
- data/lib/wavefront-cli/serviceaccount.rb +179 -0
- data/lib/wavefront-cli/settings.rb +2 -0
- data/lib/wavefront-cli/source.rb +2 -0
- data/lib/wavefront-cli/stdlib/array.rb +3 -0
- data/lib/wavefront-cli/stdlib/string.rb +17 -11
- data/lib/wavefront-cli/user.rb +10 -4
- data/lib/wavefront-cli/usergroup.rb +4 -2
- data/lib/wavefront-cli/version.rb +3 -1
- data/lib/wavefront-cli/webhook.rb +2 -0
- data/lib/wavefront-cli/write.rb +80 -46
- data/spec/.rubocop.yml +3 -16
- data/spec/constants.rb +21 -0
- data/spec/spec_helper.rb +8 -422
- data/spec/support/command_base.rb +82 -0
- data/spec/support/minitest_assertions.rb +262 -0
- data/spec/support/output_tester.rb +32 -0
- data/spec/support/supported_commands.rb +19 -0
- data/spec/test_mixins/acl.rb +169 -0
- data/spec/test_mixins/delete.rb +25 -0
- data/spec/test_mixins/deleteundelete.rb +106 -0
- data/spec/test_mixins/describe.rb +24 -0
- data/spec/test_mixins/dump.rb +43 -0
- data/spec/test_mixins/general.rb +11 -0
- data/spec/test_mixins/history.rb +35 -0
- data/spec/test_mixins/import.rb +65 -0
- data/spec/test_mixins/list.rb +29 -0
- data/spec/test_mixins/search.rb +98 -0
- data/spec/test_mixins/set.rb +47 -0
- data/spec/test_mixins/tag.rb +99 -0
- data/spec/wavefront-cli/alert_spec.rb +288 -111
- data/spec/wavefront-cli/apitoken_spec.rb +53 -24
- data/spec/wavefront-cli/base_spec.rb +9 -27
- data/spec/wavefront-cli/cloudintegration_spec.rb +65 -29
- data/spec/wavefront-cli/commands/alert_spec.rb +1 -0
- data/spec/wavefront-cli/commands/base_spec.rb +15 -13
- data/spec/wavefront-cli/commands/cloudintegration_spec.rb +1 -0
- data/spec/wavefront-cli/commands/config_spec.rb +3 -0
- data/spec/wavefront-cli/commands/dashboard_spec.rb +1 -0
- data/spec/wavefront-cli/commands/derivedmetric_spec.rb +1 -0
- data/spec/wavefront-cli/commands/event_spec.rb +1 -0
- data/spec/wavefront-cli/commands/link_spec.rb +1 -0
- data/spec/wavefront-cli/commands/message_spec.rb +1 -0
- data/spec/wavefront-cli/commands/metric_spec.rb +1 -0
- data/spec/wavefront-cli/commands/proxy_spec.rb +1 -0
- data/spec/wavefront-cli/commands/query_spec.rb +1 -0
- data/spec/wavefront-cli/commands/webhook_spec.rb +1 -0
- data/spec/wavefront-cli/commands/window_spec.rb +1 -0
- data/spec/wavefront-cli/commands/write_spec.rb +1 -0
- data/spec/wavefront-cli/config_spec.rb +25 -14
- data/spec/wavefront-cli/controller_spec.rb +13 -3
- data/spec/wavefront-cli/dashboard_spec.rb +125 -76
- data/spec/wavefront-cli/derivedmetric_spec.rb +83 -67
- data/spec/wavefront-cli/display/base_spec.rb +5 -7
- data/spec/wavefront-cli/display/printer/long_spec.rb +20 -16
- data/spec/wavefront-cli/display/printer/terse_spec.rb +5 -4
- data/spec/wavefront-cli/event_spec.rb +360 -18
- data/spec/wavefront-cli/externallink_spec.rb +92 -58
- data/spec/wavefront-cli/integration_spec.rb +129 -31
- data/spec/wavefront-cli/maintenancewindow_spec.rb +270 -32
- data/spec/wavefront-cli/message_spec.rb +73 -30
- data/spec/wavefront-cli/metric_spec.rb +60 -22
- data/spec/wavefront-cli/notificant_spec.rb +45 -32
- data/spec/wavefront-cli/opt_handler_spec.rb +4 -1
- data/spec/wavefront-cli/output/csv/query_spec.rb +21 -19
- data/spec/wavefront-cli/output/csv_spec.rb +5 -2
- data/spec/wavefront-cli/output/hcl_spec.rb +5 -2
- data/spec/wavefront-cli/output/helpers.rb +18 -0
- data/spec/wavefront-cli/output/json_spec.rb +3 -1
- data/spec/wavefront-cli/output/ruby_spec.rb +3 -1
- data/spec/wavefront-cli/output/wavefront/query_spec.rb +3 -1
- data/spec/wavefront-cli/output/wavefront_spec.rb +6 -4
- data/spec/wavefront-cli/output/yaml_spec.rb +3 -1
- data/spec/wavefront-cli/proxy_spec.rb +49 -27
- data/spec/wavefront-cli/query_spec.rb +174 -92
- data/spec/wavefront-cli/resources/responses/query.json +1 -0
- data/spec/wavefront-cli/resources/updates/alert.json +15 -0
- data/spec/wavefront-cli/resources/updates/dashboard.json +1 -0
- data/spec/wavefront-cli/savedsearch_spec.rb +35 -18
- data/spec/wavefront-cli/serviceaccount_spec.rb +399 -0
- data/spec/wavefront-cli/settings_spec.rb +42 -11
- data/spec/wavefront-cli/source_spec.rb +120 -23
- data/spec/wavefront-cli/stdlib/array_spec.rb +2 -1
- data/spec/wavefront-cli/stdlib/string_spec.rb +9 -6
- data/spec/wavefront-cli/user_spec.rb +278 -108
- data/spec/wavefront-cli/usergroup_spec.rb +152 -102
- data/spec/wavefront-cli/webhook_spec.rb +30 -15
- data/spec/wavefront-cli/write_spec.rb +25 -1
- data/wavefront-cli.gemspec +5 -3
- metadata +65 -21
- data/spec/wavefront-cli/commands/spec_helper.rb +0 -3
- data/spec/wavefront-cli/display/spec_helper.rb +0 -3
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require_relative 'base'
|
|
2
4
|
|
|
3
5
|
# Define the event command.
|
|
@@ -20,7 +22,7 @@ class WavefrontCommandEvent < WavefrontCommandBase
|
|
|
20
22
|
"wrap #{CMN} [-C command] [-d description] [-S severity] [-T type] " \
|
|
21
23
|
'[-H host...] [-g tag...] <event>',
|
|
22
24
|
tag_commands,
|
|
23
|
-
|
|
25
|
+
"show #{CMN}"]
|
|
24
26
|
end
|
|
25
27
|
|
|
26
28
|
def _options
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require_relative 'base'
|
|
2
4
|
|
|
3
5
|
# Define the integration command.
|
|
@@ -18,7 +20,6 @@ class WavefrontCommandIntegration < WavefrontCommandBase
|
|
|
18
20
|
"alert install #{CMN} <id>",
|
|
19
21
|
"alert uninstall #{CMN} <id>",
|
|
20
22
|
"installed #{CMN}",
|
|
21
|
-
"manifests #{CMN}",
|
|
22
23
|
"search #{CMN} [-al] [-o offset] [-L limit] <condition>..."]
|
|
23
24
|
end
|
|
24
25
|
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'base'
|
|
4
|
+
|
|
5
|
+
# Define the service account command.
|
|
6
|
+
#
|
|
7
|
+
class WavefrontCommandServiceaccount < WavefrontCommandBase
|
|
8
|
+
def thing
|
|
9
|
+
'service account'
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def sdk_file
|
|
13
|
+
'serviceaccount'
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def sdk_class
|
|
17
|
+
'ServiceAccount'
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def _commands
|
|
21
|
+
["list #{CMN} [-l] [-O fields]",
|
|
22
|
+
"describe #{CMN} <id>",
|
|
23
|
+
"create #{CMN} [-I] [-d description] [-m permission...] [-g group...] " \
|
|
24
|
+
'[-k usertoken...] <id>',
|
|
25
|
+
"activate #{CMN} <id>",
|
|
26
|
+
"deactivate #{CMN} <id>",
|
|
27
|
+
"dump #{CMN}",
|
|
28
|
+
"groups #{CMN} <id>",
|
|
29
|
+
"privileges #{CMN} <id>",
|
|
30
|
+
"join #{CMN} <id> <group>...",
|
|
31
|
+
"leave #{CMN} <id> <group>...",
|
|
32
|
+
"grant #{CMN} <privilege> to <id>",
|
|
33
|
+
"revoke #{CMN} <privilege> from <id>",
|
|
34
|
+
"set #{CMN} <key=value> <id>",
|
|
35
|
+
"import #{CMN} [-u] <file>",
|
|
36
|
+
"apitoken list #{CMN} [-O fields] <id>",
|
|
37
|
+
"apitoken create #{CMN} [-N name] <id>",
|
|
38
|
+
"apitoken delete #{CMN} <id> <token_id>",
|
|
39
|
+
"apitoken rename #{CMN} <id> <token_id> <name>",
|
|
40
|
+
"search #{CMN} [-al] [-o offset] [-L limit] <condition>..."]
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def _options
|
|
44
|
+
[common_options,
|
|
45
|
+
"-l, --long list #{things} in detail",
|
|
46
|
+
"-a, --all list all #{things}",
|
|
47
|
+
"-o, --offset=n start from nth #{thing}",
|
|
48
|
+
"-L, --limit=COUNT number of #{things} to list",
|
|
49
|
+
'-O, --fields=F1,F2,... only show given fields',
|
|
50
|
+
"-u, --update update an existing #{thing}",
|
|
51
|
+
"-I, --inactive create an inactive #{thing}",
|
|
52
|
+
"-d, --desc=STRING description of #{thing}",
|
|
53
|
+
"-m, --permission=STRING give #{thing} this permission",
|
|
54
|
+
"-g, --group=STRING add #{thing} to this user group",
|
|
55
|
+
'-N, --name=STRING name of token',
|
|
56
|
+
'-k, --usertoken=STRING API token']
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require_relative 'base'
|
|
2
4
|
|
|
3
5
|
# Define the source command.
|
|
@@ -13,7 +15,7 @@ class WavefrontCommandSource < WavefrontCommandBase
|
|
|
13
15
|
"description set #{CMN} <id> <description>",
|
|
14
16
|
"description clear #{CMN} <id>",
|
|
15
17
|
"clear #{CMN} <id>",
|
|
16
|
-
"search #{CMN} [-o
|
|
18
|
+
"search #{CMN} [-al] [-o cursor] [-L limit] <condition>...",
|
|
17
19
|
tag_commands]
|
|
18
20
|
end
|
|
19
21
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require_relative 'base'
|
|
2
4
|
|
|
3
5
|
# Define the user command.
|
|
@@ -16,11 +18,11 @@ class WavefrontCommandUser < WavefrontCommandBase
|
|
|
16
18
|
"describe #{CMN} <id>",
|
|
17
19
|
"create #{CMN} [-e] [-m permission...] [-g group...] <id>",
|
|
18
20
|
"invite #{CMN} [-m permission...] [-g group...] <id>",
|
|
19
|
-
"set #{CMN} <key=value> <id>",
|
|
20
21
|
"delete #{CMN} <user>...",
|
|
21
22
|
"dump #{CMN}",
|
|
22
23
|
"import #{CMN} [-u] <file>",
|
|
23
24
|
"groups #{CMN} <id>",
|
|
25
|
+
"privileges #{CMN} <id>",
|
|
24
26
|
"join #{CMN} <id> <group>...",
|
|
25
27
|
"leave #{CMN} <id> <group>...",
|
|
26
28
|
"grant #{CMN} <privilege> to <id>",
|
|
@@ -31,6 +33,7 @@ class WavefrontCommandUser < WavefrontCommandBase
|
|
|
31
33
|
def _options
|
|
32
34
|
[common_options,
|
|
33
35
|
"-l, --long list #{things} in detail",
|
|
36
|
+
"-a, --all list all #{things}",
|
|
34
37
|
"-o, --offset=n start from nth #{thing}",
|
|
35
38
|
"-L, --limit=COUNT number of #{things} to list",
|
|
36
39
|
'-O, --fields=F1,F2,... only show given fields',
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require_relative 'base'
|
|
2
4
|
|
|
3
5
|
# Define the usergroup command.
|
|
@@ -39,6 +41,7 @@ class WavefrontCommandUsergroup < WavefrontCommandBase
|
|
|
39
41
|
def _options
|
|
40
42
|
[common_options,
|
|
41
43
|
"-l, --long list #{things} in detail",
|
|
44
|
+
"-a, --all list all #{things}",
|
|
42
45
|
"-o, --offset=n start from nth #{thing}",
|
|
43
46
|
"-L, --limit=COUNT number of #{things} to list",
|
|
44
47
|
'-O, --fields=F1,F2,... only show given fields',
|
data/lib/wavefront-cli/config.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'inifile'
|
|
2
4
|
require_relative 'exception'
|
|
3
5
|
require_relative 'base'
|
|
@@ -32,7 +34,7 @@ module WavefrontCli
|
|
|
32
34
|
test: proc { |v| %w[human json yaml].include?(v) } }
|
|
33
35
|
].freeze
|
|
34
36
|
|
|
35
|
-
RX = /^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}
|
|
37
|
+
RX = /^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$/.freeze
|
|
36
38
|
|
|
37
39
|
def initialize(options)
|
|
38
40
|
@options = options
|
|
@@ -57,11 +59,11 @@ module WavefrontCli
|
|
|
57
59
|
require 'wavefront-sdk/defs/version'
|
|
58
60
|
require_relative 'display/base'
|
|
59
61
|
|
|
60
|
-
info = { 'wf version':
|
|
61
|
-
'wf path':
|
|
62
|
-
'SDK version':
|
|
63
|
-
'SDK location':
|
|
64
|
-
'Ruby version':
|
|
62
|
+
info = { 'wf version': WF_CLI_VERSION,
|
|
63
|
+
'wf path': CMD_PATH.realpath.to_s,
|
|
64
|
+
'SDK version': WF_SDK_VERSION,
|
|
65
|
+
'SDK location': WF_SDK_LOCATION.to_s,
|
|
66
|
+
'Ruby version': RUBY_VERSION,
|
|
65
67
|
'Ruby platform': Gem::Platform.local.os.capitalize }
|
|
66
68
|
|
|
67
69
|
WavefrontDisplay::Base.new(info).long_output
|
|
@@ -90,11 +92,15 @@ module WavefrontCli
|
|
|
90
92
|
def create_profile(profile)
|
|
91
93
|
puts "Creating profile '#{profile}'."
|
|
92
94
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
+
prof_arr = ["[#{profile}]"]
|
|
96
|
+
|
|
97
|
+
CONFIGURABLES.each do |c|
|
|
98
|
+
prof_arr.<< format('%<key>s=%<value>s',
|
|
99
|
+
key: c[:key],
|
|
100
|
+
value: read_thing(c))
|
|
95
101
|
end
|
|
96
102
|
|
|
97
|
-
IniFile.new(content:
|
|
103
|
+
IniFile.new(content: prof_arr.join("\n"))
|
|
98
104
|
end
|
|
99
105
|
|
|
100
106
|
def do_delete
|
|
@@ -114,7 +120,9 @@ module WavefrontCli
|
|
|
114
120
|
|
|
115
121
|
def do_envvars
|
|
116
122
|
%w[WAVEFRONT_ENDPOINT WAVEFRONT_TOKEN WAVEFRONT_PROXY].each do |v|
|
|
117
|
-
puts format('%-
|
|
123
|
+
puts format('%-20<var>s %<value>s',
|
|
124
|
+
var: v,
|
|
125
|
+
value: ENV[v] || 'unset')
|
|
118
126
|
end
|
|
119
127
|
end
|
|
120
128
|
|
|
@@ -127,8 +135,8 @@ module WavefrontCli
|
|
|
127
135
|
end
|
|
128
136
|
|
|
129
137
|
def input_prompt(label, default)
|
|
130
|
-
ret = format('
|
|
131
|
-
ret.<< format(' [
|
|
138
|
+
ret = format(' %<label>s', label: label)
|
|
139
|
+
ret.<< format(' [%<value>s]', value: default) unless default.nil?
|
|
132
140
|
ret + ':> '
|
|
133
141
|
end
|
|
134
142
|
|
|
@@ -152,15 +160,18 @@ module WavefrontCli
|
|
|
152
160
|
def validate_input(input, default, test)
|
|
153
161
|
if input.empty?
|
|
154
162
|
raise WavefrontCli::Exception::MandatoryValue if default.nil?
|
|
163
|
+
|
|
155
164
|
input = default
|
|
156
165
|
end
|
|
157
166
|
|
|
158
167
|
return input if test.call(input)
|
|
168
|
+
|
|
159
169
|
raise WavefrontCli::Exception::InvalidValue
|
|
160
170
|
end
|
|
161
171
|
|
|
162
172
|
def present?
|
|
163
173
|
return true if config_file.exist?
|
|
174
|
+
|
|
164
175
|
raise WavefrontCli::Exception::ConfigFileNotFound, config_file
|
|
165
176
|
end
|
|
166
177
|
|
|
@@ -1,18 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'pathname'
|
|
2
4
|
|
|
3
5
|
module WavefrontCli
|
|
4
6
|
# Universal truths
|
|
5
7
|
#
|
|
6
8
|
module Constants
|
|
7
|
-
HUMAN_TIME_FORMAT = '%F %T'
|
|
8
|
-
HUMAN_TIME_FORMAT_MS = '%F %T.%3N'
|
|
9
|
+
HUMAN_TIME_FORMAT = '%F %T'
|
|
10
|
+
HUMAN_TIME_FORMAT_MS = '%F %T.%3N'
|
|
9
11
|
|
|
10
12
|
# The CLI will use these options if they are not supplied on the
|
|
11
13
|
# command line or in a config file.
|
|
12
14
|
#
|
|
13
15
|
DEFAULT_OPTS = {
|
|
14
16
|
endpoint: 'metrics.wavefront.com',
|
|
15
|
-
format:
|
|
17
|
+
format: :human
|
|
16
18
|
}.freeze
|
|
17
19
|
|
|
18
20
|
# How many objects to get in each request when we are asked for
|
|
@@ -26,6 +28,10 @@ module WavefrontCli
|
|
|
26
28
|
|
|
27
29
|
# Split regex for searches
|
|
28
30
|
#
|
|
29
|
-
SEARCH_SPLIT =
|
|
31
|
+
SEARCH_SPLIT = /\^|!\^|=|!=|~|!~/.freeze
|
|
32
|
+
|
|
33
|
+
# Where we store local event information
|
|
34
|
+
#
|
|
35
|
+
EVENT_STATE_DIR = Pathname.new('/var/tmp/wavefront')
|
|
30
36
|
end
|
|
31
37
|
end
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
# For development against a local checkout of the SDK, uncomment
|
|
2
4
|
# this definition
|
|
3
5
|
#
|
|
4
6
|
# DEVELOPMENT = true
|
|
5
7
|
|
|
6
8
|
if defined?(DEVELOPMENT)
|
|
7
|
-
dir = Pathname.new(
|
|
9
|
+
dir = Pathname.new(__dir__).realpath.parent.parent.parent
|
|
8
10
|
$LOAD_PATH.<< dir + 'lib'
|
|
9
11
|
$LOAD_PATH.<< dir + 'wavefront-sdk' + 'lib'
|
|
10
12
|
end
|
|
@@ -17,7 +19,7 @@ require_relative 'exception'
|
|
|
17
19
|
require_relative 'opt_handler'
|
|
18
20
|
require_relative 'stdlib/string'
|
|
19
21
|
|
|
20
|
-
CMD_DIR = Pathname.new(
|
|
22
|
+
CMD_DIR = Pathname.new(__dir__) + 'commands'
|
|
21
23
|
|
|
22
24
|
# Dynamically generate a CLI interface from files which describe
|
|
23
25
|
# each subcomand.
|
|
@@ -33,20 +35,36 @@ class WavefrontCliController
|
|
|
33
35
|
@usage = docopt_hash
|
|
34
36
|
cmd, opts = parse_args
|
|
35
37
|
@opts = parse_opts(opts)
|
|
36
|
-
cli_class_obj =
|
|
38
|
+
cli_class_obj = cli_class(cmd, @opts)
|
|
37
39
|
run_command(cli_class_obj)
|
|
38
40
|
end
|
|
39
41
|
|
|
40
42
|
# What you see when you do 'wf --help'
|
|
41
43
|
# @return [String]
|
|
42
44
|
#
|
|
45
|
+
# rubocop:disable Metrics/MethodLength
|
|
43
46
|
def default_help
|
|
44
|
-
s =
|
|
45
|
-
|
|
47
|
+
s = ['Wavefront CLI',
|
|
48
|
+
'',
|
|
49
|
+
'Usage:',
|
|
50
|
+
" #{CMD} command [options]",
|
|
51
|
+
" #{CMD} --version",
|
|
52
|
+
" #{CMD} --help",
|
|
53
|
+
'',
|
|
54
|
+
'Commands:',
|
|
55
|
+
'']
|
|
56
|
+
|
|
57
|
+
cmds.sort.each do |k, v|
|
|
58
|
+
s.<< format(' %-18<command>s %<desc>s',
|
|
59
|
+
command: k,
|
|
60
|
+
desc: v.description)
|
|
61
|
+
end
|
|
46
62
|
|
|
47
|
-
|
|
48
|
-
s.<< "
|
|
63
|
+
s.<< ''
|
|
64
|
+
s.<< "Use '#{CMD} <command> --help' for further information."
|
|
65
|
+
s.join("\n")
|
|
49
66
|
end
|
|
67
|
+
# rubocop:enable Metrics/MethodLength
|
|
50
68
|
|
|
51
69
|
# @return [Hash] command descriptions for docopt.
|
|
52
70
|
#
|
|
@@ -59,23 +77,25 @@ class WavefrontCliController
|
|
|
59
77
|
# Parse the input. The first Docopt.docopt handles the default
|
|
60
78
|
# options, the second works on the command.
|
|
61
79
|
#
|
|
62
|
-
# rubocop:disable Metrics/AbcSize
|
|
63
80
|
def parse_args
|
|
64
81
|
Docopt.docopt(usage[:default], version: WF_CLI_VERSION, argv: args)
|
|
65
82
|
rescue Docopt::Exit => e
|
|
66
83
|
cmd = args.empty? ? nil : args.first.to_sym
|
|
67
84
|
|
|
68
85
|
abort e.message unless usage.key?(cmd)
|
|
86
|
+
parse_cmd(cmd)
|
|
87
|
+
end
|
|
69
88
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
89
|
+
# Parse a command.
|
|
90
|
+
# @param cmd [String] given command
|
|
91
|
+
#
|
|
92
|
+
def parse_cmd(cmd)
|
|
93
|
+
[cmd, sanitize_keys(Docopt.docopt(usage[cmd], argv: args))]
|
|
94
|
+
rescue Docopt::DocoptLanguageError => e
|
|
95
|
+
abort "Mangled command description:\n#{e.message}"
|
|
96
|
+
rescue Docopt::Exit => e
|
|
97
|
+
abort e.message
|
|
77
98
|
end
|
|
78
|
-
# rubocop:enable Metrics/AbcSize
|
|
79
99
|
|
|
80
100
|
def parse_opts(options)
|
|
81
101
|
WavefrontCli::OptHandler.new(options).opts
|
|
@@ -86,10 +106,8 @@ class WavefrontCliController
|
|
|
86
106
|
# @param cmd [String]
|
|
87
107
|
# @return WavefrontCli::cmd
|
|
88
108
|
#
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
require_relative File.join('.', cmds[cmd].sdk_file)
|
|
92
|
-
Object.const_get('WavefrontCli').const_get(cmds[cmd].sdk_class).new(opts)
|
|
109
|
+
def cli_class(cmd, opts)
|
|
110
|
+
load_cli_class(cmd, opts)
|
|
93
111
|
rescue WavefrontCli::Exception::UnhandledCommand
|
|
94
112
|
abort 'Fatal error. Unsupported command. Please open a Github issue.'
|
|
95
113
|
rescue WavefrontCli::Exception::InvalidInput => e
|
|
@@ -97,10 +115,14 @@ class WavefrontCliController
|
|
|
97
115
|
rescue RuntimeError => e
|
|
98
116
|
abort "Unable to run command. #{e.message}."
|
|
99
117
|
end
|
|
100
|
-
# rubocop:enable Metrics/AbcSize
|
|
101
118
|
|
|
102
|
-
|
|
119
|
+
def load_cli_class(cmd, opts)
|
|
120
|
+
require_relative File.join('.', cmds[cmd].sdk_file)
|
|
121
|
+
Object.const_get('WavefrontCli').const_get(cmds[cmd].sdk_class).new(opts)
|
|
122
|
+
end
|
|
123
|
+
|
|
103
124
|
# rubocop:disable Metrics/MethodLength
|
|
125
|
+
# rubocop:disable Metrics/AbcSize
|
|
104
126
|
def run_command(cli_class_obj)
|
|
105
127
|
cli_class_obj.validate_opts
|
|
106
128
|
cli_class_obj.run
|
|
@@ -112,6 +134,10 @@ class WavefrontCliController
|
|
|
112
134
|
handle_missing_credentials(e)
|
|
113
135
|
rescue WavefrontCli::Exception::MandatoryValue
|
|
114
136
|
abort 'A value must be supplied.'
|
|
137
|
+
rescue Wavefront::Exception::InvalidPermission => e
|
|
138
|
+
abort "'#{e}' is not a valid privilege."
|
|
139
|
+
rescue Wavefront::Exception::InvalidUserGroupId => e
|
|
140
|
+
abort "'#{e}' is not a valid user group id."
|
|
115
141
|
rescue WavefrontCli::Exception::InvalidValue => e
|
|
116
142
|
abort "Invalid value for #{e}."
|
|
117
143
|
rescue WavefrontCli::Exception::ProfileExists => e
|
|
@@ -122,10 +148,14 @@ class WavefrontCliController
|
|
|
122
148
|
abort 'File not found.'
|
|
123
149
|
rescue WavefrontCli::Exception::InsufficientData => e
|
|
124
150
|
abort "Insufficient data. #{e.message}"
|
|
151
|
+
rescue WavefrontCli::Exception::InvalidQuery => e
|
|
152
|
+
abort "Invalid query. API message: '#{e.message}'."
|
|
125
153
|
rescue WavefrontCli::Exception::SystemError => e
|
|
126
154
|
abort "Host system error. #{e.message}"
|
|
127
155
|
rescue WavefrontCli::Exception::UnparseableInput => e
|
|
128
156
|
abort "Cannot parse input. #{e.message}"
|
|
157
|
+
rescue WavefrontCli::Exception::UnparseableSearchPattern
|
|
158
|
+
abort 'Searches require a key, a value, and a match operator.'
|
|
129
159
|
rescue WavefrontCli::Exception::UnsupportedFileFormat
|
|
130
160
|
abort 'Unsupported file format.'
|
|
131
161
|
rescue WavefrontCli::Exception::UnsupportedOperation => e
|
|
@@ -188,6 +218,7 @@ class WavefrontCliController
|
|
|
188
218
|
#
|
|
189
219
|
def import_command(path)
|
|
190
220
|
return if path.extname != '.rb' || path.basename.to_s == 'base.rb'
|
|
221
|
+
|
|
191
222
|
k_name = path.basename.to_s[0..-4]
|
|
192
223
|
require(CMD_DIR + k_name)
|
|
193
224
|
Object.const_get("WavefrontCommand#{k_name.capitalize}").new
|