wavefront-cli 2.8.0 → 2.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +11 -0
- data/HISTORY.md +17 -0
- data/Rakefile +1 -1
- data/bin/wf +1 -1
- data/lib/wavefront-cli/base.rb +46 -18
- data/lib/wavefront-cli/base_write.rb +49 -33
- data/lib/wavefront-cli/commands/.rubocop.yml +7 -0
- data/lib/wavefront-cli/commands/alert.rb +0 -1
- data/lib/wavefront-cli/commands/base.rb +1 -1
- data/lib/wavefront-cli/commands/link.rb +5 -0
- data/lib/wavefront-cli/commands/window.rb +1 -0
- data/lib/wavefront-cli/commands/write.rb +1 -1
- data/lib/wavefront-cli/controller.rb +51 -21
- data/lib/wavefront-cli/derivedmetric.rb +4 -0
- data/lib/wavefront-cli/display/alert.rb +2 -0
- data/lib/wavefront-cli/display/base.rb +18 -11
- data/lib/wavefront-cli/display/metric.rb +13 -5
- data/lib/wavefront-cli/display/printer/long.rb +12 -8
- data/lib/wavefront-cli/display/printer/sparkline.rb +2 -2
- data/lib/wavefront-cli/display/printer/terse.rb +3 -1
- data/lib/wavefront-cli/display/query.rb +7 -3
- data/lib/wavefront-cli/display/write.rb +2 -0
- data/lib/wavefront-cli/event.rb +27 -16
- data/lib/wavefront-cli/exception.rb +8 -0
- data/lib/wavefront-cli/externallink.rb +30 -0
- data/lib/wavefront-cli/maintenancewindow.rb +2 -2
- data/lib/wavefront-cli/output/hcl/base.rb +21 -18
- data/lib/wavefront-cli/output/hcl/dashboard.rb +13 -38
- data/lib/wavefront-cli/output/hcl/notificant.rb +4 -2
- data/lib/wavefront-cli/output/hcl/stdlib/array.rb +22 -0
- data/lib/wavefront-cli/output/hcl/stdlib/string.rb +9 -0
- data/lib/wavefront-cli/output/wavefront/base.rb +3 -0
- data/lib/wavefront-cli/output/wavefront/query.rb +2 -2
- data/lib/wavefront-cli/query.rb +2 -0
- data/lib/wavefront-cli/report.rb +5 -2
- data/lib/wavefront-cli/{string.rb → stdlib/string.rb} +16 -12
- data/lib/wavefront-cli/version.rb +1 -1
- data/lib/wavefront-cli/write.rb +12 -4
- data/spec/spec_helper.rb +41 -24
- data/spec/wavefront-cli/commands/link_spec.rb +1 -1
- data/spec/wavefront-cli/derivedmetric_spec.rb +2 -2
- data/spec/wavefront-cli/display/base_spec.rb +2 -0
- data/spec/wavefront-cli/display/printer/long_spec.rb +1 -0
- data/spec/wavefront-cli/externallink_spec.rb +52 -4
- data/spec/wavefront-cli/output/hcl_spec.rb +3 -1
- data/spec/wavefront-cli/output/ruby_spec.rb +5 -5
- data/spec/wavefront-cli/output/wavefront/query_spec.rb +14 -9
- data/spec/wavefront-cli/output/wavefront_spec.rb +3 -1
- data/spec/wavefront-cli/query_spec.rb +2 -0
- data/spec/wavefront-cli/{string_spec.rb → stdlib/string_spec.rb} +3 -3
- data/wavefront-cli.gemspec +7 -7
- metadata +34 -30
@@ -11,7 +11,7 @@ class WavefrontCommandWrite < WavefrontCommandBase
|
|
11
11
|
['point [-DnViq] [-c file] [-P profile] [-E proxy] [-t time] ' \
|
12
12
|
'[-p port] [-H host] [-T tag...] <metric> <value>',
|
13
13
|
'file [-DnViq] [-c file] [-P profile] [-E proxy] [-H host] ' \
|
14
|
-
'[-p port] [-F
|
14
|
+
'[-p port] [-F infileformat] [-m metric] [-T tag...] <file>']
|
15
15
|
end
|
16
16
|
|
17
17
|
def _options
|
@@ -31,8 +31,8 @@ class WavefrontCliController
|
|
31
31
|
cmd, opts = parse_args
|
32
32
|
@opts = parse_opts(opts)
|
33
33
|
pp @opts if @opts[:debug]
|
34
|
-
|
35
|
-
run_command(
|
34
|
+
cli_class_obj = load_cli_class(cmd, @opts)
|
35
|
+
run_command(cli_class_obj)
|
36
36
|
end
|
37
37
|
|
38
38
|
# What you see when you do 'wf --help'
|
@@ -57,6 +57,7 @@ class WavefrontCliController
|
|
57
57
|
# Parse the input. The first Docopt.docopt handles the default
|
58
58
|
# options, the second works on the command.
|
59
59
|
#
|
60
|
+
# rubocop:disable Metrics/AbcSize
|
60
61
|
def parse_args
|
61
62
|
Docopt.docopt(usage[:default], version: WF_CLI_VERSION, argv: args)
|
62
63
|
rescue Docopt::Exit => e
|
@@ -72,34 +73,61 @@ class WavefrontCliController
|
|
72
73
|
abort e.message
|
73
74
|
end
|
74
75
|
end
|
76
|
+
# rubocop:enable Metrics/AbcSize
|
75
77
|
|
76
|
-
def parse_opts(
|
77
|
-
WavefrontCli::OptHandler.new(
|
78
|
+
def parse_opts(options)
|
79
|
+
WavefrontCli::OptHandler.new(options).opts
|
78
80
|
end
|
79
81
|
|
80
|
-
# Get the
|
82
|
+
# Get the CLI class we need to run the command we've been given.
|
81
83
|
#
|
82
84
|
# @param cmd [String]
|
83
|
-
|
85
|
+
# @return WavefrontCli::cmd
|
86
|
+
#
|
87
|
+
# rubocop:disable Metrics/AbcSize
|
88
|
+
def load_cli_class(cmd, opts)
|
84
89
|
require_relative File.join('.', cmds[cmd].sdk_file)
|
85
90
|
Object.const_get('WavefrontCli').const_get(cmds[cmd].sdk_class).new(opts)
|
86
91
|
rescue WavefrontCli::Exception::UnhandledCommand
|
87
|
-
abort 'Fatal error. Unsupported command.'
|
88
|
-
rescue
|
89
|
-
|
92
|
+
abort 'Fatal error. Unsupported command. Please open a Github issue.'
|
93
|
+
rescue WavefrontCli::Exception::InvalidInput => e
|
94
|
+
abort "Invalid input. #{e.message}"
|
95
|
+
rescue RuntimeError => e
|
96
|
+
abort "Unable to run command. #{e.message}."
|
90
97
|
end
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
98
|
+
# rubocop:enable Metrics/AbcSize
|
99
|
+
|
100
|
+
# rubocop:disable Metrics/AbcSize
|
101
|
+
# rubocop:disable Metrics/MethodLength
|
102
|
+
def run_command(cli_class_obj)
|
103
|
+
cli_class_obj.validate_opts
|
104
|
+
cli_class_obj.run
|
105
|
+
rescue WavefrontCli::Exception::CredentialError => e
|
106
|
+
abort "Credential error. #{e.message}"
|
95
107
|
rescue WavefrontCli::Exception::UnsupportedOutput => e
|
96
108
|
abort e.message
|
109
|
+
rescue WavefrontCli::Exception::InsufficientData => e
|
110
|
+
abort "Insufficient data. #{e.message}"
|
111
|
+
rescue WavefrontCli::Exception::UnsupportedFileFormat
|
112
|
+
abort 'Unsupported file format.'
|
113
|
+
rescue WavefrontCli::Exception::UnparseableInput => e
|
114
|
+
abort "Cannot parse input. #{e.message}"
|
115
|
+
rescue WavefrontCli::Exception::FileNotFound
|
116
|
+
abort 'File not found.'
|
117
|
+
rescue WavefrontCli::Exception::UnparseableInput
|
118
|
+
abort 'Cannot parse input.'
|
119
|
+
rescue WavefrontCli::Exception::SystemError => e
|
120
|
+
abort "Host system error. #{e.message}"
|
121
|
+
rescue WavefrontCli::Exception::UnsupportedOperation => e
|
122
|
+
abort "Unsupported operation.\n#{e.message}"
|
97
123
|
rescue StandardError => e
|
98
|
-
|
99
|
-
|
100
|
-
|
124
|
+
warn "general error: #{e}"
|
125
|
+
warn "re-run with '-D' for stack trace." unless opts[:debug]
|
126
|
+
warn "Backtrace:\n\t#{e.backtrace.join("\n\t")}" if opts[:debug]
|
101
127
|
abort
|
102
128
|
end
|
129
|
+
# rubocop:enable Metrics/MethodLength
|
130
|
+
# rubocop:enable Metrics/AbcSize
|
103
131
|
|
104
132
|
# Each command is defined in its own file. Dynamically load all
|
105
133
|
# those commands.
|
@@ -117,9 +145,9 @@ class WavefrontCliController
|
|
117
145
|
# @param f [Pathname] path of file to load
|
118
146
|
# return [Class] new class object defining command.
|
119
147
|
#
|
120
|
-
def import_command(
|
121
|
-
return if
|
122
|
-
k_name =
|
148
|
+
def import_command(path)
|
149
|
+
return if path.extname != '.rb' || path.basename.to_s == 'base.rb'
|
150
|
+
k_name = path.basename.to_s[0..-4]
|
123
151
|
require(CMD_DIR + k_name)
|
124
152
|
Object.const_get("WavefrontCommand#{k_name.capitalize}").new
|
125
153
|
end
|
@@ -129,7 +157,9 @@ class WavefrontCliController
|
|
129
157
|
# @param h [Hash] options hash
|
130
158
|
# return [Hash] h with modified keys
|
131
159
|
#
|
132
|
-
def sanitize_keys(
|
133
|
-
|
160
|
+
def sanitize_keys(options)
|
161
|
+
options.each_with_object({}) do |(k, v), r|
|
162
|
+
r[k.to_s.delete('-').to_sym] = v
|
163
|
+
end
|
134
164
|
end
|
135
165
|
end
|
@@ -13,6 +13,7 @@ module WavefrontCli
|
|
13
13
|
wf.describe(options[:'<id>'], options[:version])
|
14
14
|
end
|
15
15
|
|
16
|
+
# rubocop:disable Metrics/AbcSize
|
16
17
|
def do_delete
|
17
18
|
word = if wf.describe(options[:'<id>']).status.code == 200
|
18
19
|
'Soft'
|
@@ -25,6 +26,7 @@ module WavefrontCli
|
|
25
26
|
|
26
27
|
wf.delete(options[:'<id>'])
|
27
28
|
end
|
29
|
+
# rubocop:enable Metrics/AbcSize
|
28
30
|
|
29
31
|
def do_history
|
30
32
|
wf.history(options[:'<id>'])
|
@@ -34,6 +36,7 @@ module WavefrontCli
|
|
34
36
|
wf.create(build_body)
|
35
37
|
end
|
36
38
|
|
39
|
+
# rubocop:disable Metrics/AbcSize
|
37
40
|
def build_body
|
38
41
|
ret = { query: options[:'<query>'],
|
39
42
|
name: options[:'<name>'],
|
@@ -45,6 +48,7 @@ module WavefrontCli
|
|
45
48
|
ret[:tags] = options[:ctag] if valid_tags?
|
46
49
|
ret
|
47
50
|
end
|
51
|
+
# rubocop:enable Metrics/AbcSize
|
48
52
|
|
49
53
|
def valid_tags?
|
50
54
|
!options[:ctag].empty? && validate_tags(options[:ctag])
|
@@ -48,10 +48,12 @@ module WavefrontDisplay
|
|
48
48
|
puts "Unsnoozed alert '#{options[:'<id>']}'."
|
49
49
|
end
|
50
50
|
|
51
|
+
# rubocop:disable Metrics/AbcSize
|
51
52
|
def do_summary
|
52
53
|
kw = data.keys.map(&:size).max + 2
|
53
54
|
data.delete_if { |_k, v| v.zero? } unless options[:all]
|
54
55
|
data.sort.each { |k, v| puts format("%-#{kw}s%s", k, v) }
|
55
56
|
end
|
57
|
+
# rubocop:enable Metrics/AbcSize
|
56
58
|
end
|
57
59
|
end
|
@@ -118,17 +118,20 @@ module WavefrontDisplay
|
|
118
118
|
|
119
119
|
# if this is a section of a larger dataset, say so
|
120
120
|
#
|
121
|
+
# rubocop:disable Metrics/AbcSize
|
121
122
|
def pagination_line
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
else
|
128
|
-
puts 'List shows paginated output. Use -o and -L for more.'
|
129
|
-
end
|
123
|
+
return unless raw.respond_to?(:moreItems) && raw.moreItems == true
|
124
|
+
|
125
|
+
if raw.respond_to?(:offset) && raw.respond_to?(:limit)
|
126
|
+
puts 'List shows paginated output. Use -o and -L for more.'
|
127
|
+
return
|
130
128
|
end
|
129
|
+
|
130
|
+
enditem = raw.limit > 0 ? raw.offset + raw.limit - 1 : 0
|
131
|
+
puts format('List shows items %d to %d. Use -o and -L for more.',
|
132
|
+
raw.offset, enditem)
|
131
133
|
end
|
134
|
+
# rubocop:enable Metrics/AbcSize
|
132
135
|
|
133
136
|
# Give it a key-value hash, and it will return the size of the first
|
134
137
|
# column to use when formatting that data.
|
@@ -264,9 +267,10 @@ module WavefrontDisplay
|
|
264
267
|
# used for unit tests.
|
265
268
|
# return [String] a human-readable timestamp
|
266
269
|
#
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
+
# rubocop:disable Metrics/MethodLength
|
271
|
+
def human_time(time, force_utc = false)
|
272
|
+
raise ArgumentError unless time.is_a?(Numeric) || time.is_a?(String)
|
273
|
+
str = time.to_s
|
270
274
|
|
271
275
|
if str =~ /^\d{13}$/
|
272
276
|
fmt = '%Q'
|
@@ -278,9 +282,12 @@ module WavefrontDisplay
|
|
278
282
|
raise ArgumentError
|
279
283
|
end
|
280
284
|
|
285
|
+
# rubocop:disable Style/DateTime
|
281
286
|
ret = DateTime.strptime(str, fmt).to_time
|
287
|
+
# rubocop:enable Style/DateTime
|
282
288
|
ret = ret.utc if force_utc
|
283
289
|
ret.strftime(out_fmt)
|
284
290
|
end
|
291
|
+
# rubocop:enable Metrics/MethodLength
|
285
292
|
end
|
286
293
|
end
|
@@ -6,16 +6,24 @@ module WavefrontDisplay
|
|
6
6
|
#
|
7
7
|
class Metric < Base
|
8
8
|
def do_describe
|
9
|
-
if
|
10
|
-
puts 'No matches.'
|
11
|
-
exit
|
12
|
-
end
|
9
|
+
bail_out if no_data
|
13
10
|
|
14
11
|
@data = data['hosts'].map do |h, _aggr|
|
15
12
|
{ host: h[:host], last_update: human_time(h[:last_update]) }
|
16
|
-
end
|
13
|
+
end
|
14
|
+
|
15
|
+
@data.sort_by { |h| h[:last_update] }.reverse
|
17
16
|
|
18
17
|
multicolumn(:host, :last_update)
|
19
18
|
end
|
19
|
+
|
20
|
+
def no_data?
|
21
|
+
data.empty? || data.hosts.empty?
|
22
|
+
end
|
23
|
+
|
24
|
+
def bail_out
|
25
|
+
puts 'No matches.'
|
26
|
+
exit
|
27
|
+
end
|
20
28
|
end
|
21
29
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require_relative 'base'
|
2
|
-
require_relative '../../string'
|
2
|
+
require_relative '../../stdlib/string'
|
3
3
|
|
4
4
|
module WavefrontDisplayPrinter
|
5
5
|
#
|
@@ -27,11 +27,12 @@ module WavefrontDisplayPrinter
|
|
27
27
|
# @kw [Integer] the width of the first (key) column.
|
28
28
|
# @returns [Nil]
|
29
29
|
#
|
30
|
-
|
30
|
+
# rubocop:disable Metrics/AbcSize
|
31
|
+
def _two_columns(data, key_col_width = nil, fields = nil)
|
31
32
|
[data].flatten.each do |item|
|
32
33
|
preen_fields(item, fields)
|
33
|
-
|
34
|
-
@kw
|
34
|
+
key_col_width ||= key_width(item)
|
35
|
+
@kw ||= key_col_width
|
35
36
|
mk_indent(indent)
|
36
37
|
item.each { |k, v| parse_line(k, v) }
|
37
38
|
add_line(nil) if indent.zero?
|
@@ -41,6 +42,7 @@ module WavefrontDisplayPrinter
|
|
41
42
|
@kw += 2
|
42
43
|
mk_indent(indent)
|
43
44
|
end
|
45
|
+
# rubocop:enable Metrics/AbcSize
|
44
46
|
|
45
47
|
# Drop any fields not required.
|
46
48
|
#
|
@@ -149,8 +151,8 @@ module WavefrontDisplayPrinter
|
|
149
151
|
# Add a horizontal rule, from the start of the second column to
|
150
152
|
# just shy of the end of the terminal
|
151
153
|
#
|
152
|
-
def add_rule(
|
153
|
-
add_line(nil, '-' * (TW -
|
154
|
+
def add_rule(key_col_width)
|
155
|
+
add_line(nil, '-' * (TW - key_col_width - 4))
|
154
156
|
end
|
155
157
|
|
156
158
|
# Make the string which is prepended to each line. Stepping is
|
@@ -170,12 +172,14 @@ module WavefrontDisplayPrinter
|
|
170
172
|
# @param val [String, Numeric] what to print in the second column
|
171
173
|
# @param tw [Integer] terminal width
|
172
174
|
#
|
173
|
-
|
175
|
+
# rubocop:disable Metrics/AbcSize
|
176
|
+
def mk_line(key, value = '', term_width = TW)
|
174
177
|
return indent_str + ' ' * kw + value if !key || key.empty?
|
175
178
|
|
176
179
|
indent_str + format("%-#{kw}s%s", key, value)
|
177
|
-
.fold(
|
180
|
+
.fold(term_width, kw + indent_str.size, '').rstrip
|
178
181
|
end
|
182
|
+
# rubocop:enable Metrics/AbcSize
|
179
183
|
|
180
184
|
# Add a line, prepped by #mk_line() to the out array.
|
181
185
|
#
|
@@ -21,8 +21,8 @@ class WavefrontSparkline
|
|
21
21
|
# the given range. The `rescue` clause handles occasions when
|
22
22
|
# Wavefront returns NaN as a value, or if the range is zero.
|
23
23
|
#
|
24
|
-
def sized_block(
|
25
|
-
BLOCKS[(
|
24
|
+
def sized_block(val, range)
|
25
|
+
BLOCKS[(val / range * (BLOCKS.length - 1)).floor]
|
26
26
|
rescue StandardError
|
27
27
|
BLOCKS.first
|
28
28
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require_relative 'base'
|
2
2
|
|
3
3
|
module WavefrontDisplayPrinter
|
4
|
-
|
4
|
+
#
|
5
5
|
# Print things which are per-row. The terse listings, primarily
|
6
6
|
#
|
7
7
|
class Terse < Base
|
@@ -26,6 +26,7 @@ module WavefrontDisplayPrinter
|
|
26
26
|
#
|
27
27
|
# @return [Hash] with the same keys as :keys and Integer values
|
28
28
|
#
|
29
|
+
# rubocop:disable Metrics/AbcSize
|
29
30
|
def longest_keys
|
30
31
|
keys.each_with_object(Hash[*keys.map { |k| [k, 0] }.flatten]) \
|
31
32
|
do |k, aggr|
|
@@ -37,6 +38,7 @@ module WavefrontDisplayPrinter
|
|
37
38
|
end
|
38
39
|
end
|
39
40
|
end
|
41
|
+
# rubocop:enable Metrics/AbcSize
|
40
42
|
|
41
43
|
# Print multiple column output. This method does no word
|
42
44
|
# wrapping.
|
@@ -6,6 +6,7 @@ module WavefrontDisplay
|
|
6
6
|
# Format human-readable output for queries.
|
7
7
|
#
|
8
8
|
class Query < Base
|
9
|
+
# rubocop:disable Metrics/AbcSize
|
9
10
|
def do_default
|
10
11
|
d_obj = { name: data.name,
|
11
12
|
query: data.query,
|
@@ -19,14 +20,15 @@ module WavefrontDisplay
|
|
19
20
|
@data = d_obj
|
20
21
|
long_output
|
21
22
|
end
|
23
|
+
# rubocop:enable Metrics/AbcSize
|
22
24
|
|
23
25
|
def mk_timeseries(data)
|
24
|
-
return []
|
26
|
+
return [] unless data.key?(:timeseries)
|
25
27
|
|
26
28
|
data[:timeseries].each do |s|
|
27
29
|
unless options[:nospark]
|
28
30
|
s[:sparkline] = WavefrontSparkline.new(s[:data]).sparkline
|
29
|
-
s.reorder!(
|
31
|
+
s.reorder!(label: nil, sparkline: nil)
|
30
32
|
end
|
31
33
|
|
32
34
|
s[:data] = humanize_series(s[:data])
|
@@ -54,7 +56,7 @@ module WavefrontDisplay
|
|
54
56
|
if data.empty?
|
55
57
|
puts 'No aliases defined.'
|
56
58
|
else
|
57
|
-
data.
|
59
|
+
data.each_key { |k| puts k.to_s[2..-1] }
|
58
60
|
end
|
59
61
|
end
|
60
62
|
|
@@ -67,6 +69,7 @@ module WavefrontDisplay
|
|
67
69
|
data
|
68
70
|
end
|
69
71
|
|
72
|
+
# rubocop:disable Metrics/MethodLength
|
70
73
|
def humanize_series(data)
|
71
74
|
last_date = nil
|
72
75
|
|
@@ -84,6 +87,7 @@ module WavefrontDisplay
|
|
84
87
|
last_date = date
|
85
88
|
format('%-12s %s %s', ds, time, val)
|
86
89
|
end
|
90
|
+
# rubocop:enable Metrics/MethodLength
|
87
91
|
end
|
88
92
|
end
|
89
93
|
end
|
@@ -4,10 +4,12 @@ module WavefrontDisplay
|
|
4
4
|
# Format human-readable output when writing points.
|
5
5
|
#
|
6
6
|
class Write < Base
|
7
|
+
# rubocop:disable Metrics/AbcSize
|
7
8
|
def do_point
|
8
9
|
report unless options[:quiet] || (data[:unsent] + data[:rejected] > 0)
|
9
10
|
exit(data.rejected.zero? && data.unsent.zero? ? 0 : 1)
|
10
11
|
end
|
12
|
+
# rubocop:enable Metrics/AbcSize
|
11
13
|
|
12
14
|
def do_file
|
13
15
|
do_point
|
data/lib/wavefront-cli/event.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
require 'fileutils'
|
2
|
+
require 'open3'
|
2
3
|
require 'wavefront-sdk/mixins'
|
3
4
|
require_relative 'base'
|
4
|
-
require 'open3'
|
5
5
|
|
6
6
|
EVENT_STATE_DIR = Pathname.new('/var/tmp/wavefront')
|
7
|
+
|
7
8
|
module WavefrontCli
|
8
9
|
#
|
9
10
|
# CLI coverage for the v2 'event' API.
|
10
11
|
#
|
11
|
-
class Event <
|
12
|
+
class Event < Base
|
12
13
|
attr_reader :state_dir
|
13
14
|
include Wavefront::Mixins
|
14
15
|
|
@@ -32,7 +33,7 @@ module WavefrontCli
|
|
32
33
|
# You can override the options generated by docopt. This is how
|
33
34
|
# #wrap() works.
|
34
35
|
#
|
35
|
-
# rubocop:disable Metrics/
|
36
|
+
# rubocop:disable Metrics/AbcSize
|
36
37
|
def do_create(opts = nil)
|
37
38
|
opts ||= options
|
38
39
|
|
@@ -50,6 +51,7 @@ module WavefrontCli
|
|
50
51
|
|
51
52
|
resp
|
52
53
|
end
|
54
|
+
# rubocop:enable Metrics/AbcSize
|
53
55
|
|
54
56
|
# The user doesn't have to give us an event ID. If no event
|
55
57
|
# name is given, we'll pop the last event off the stack. If an
|
@@ -57,6 +59,7 @@ module WavefrontCli
|
|
57
59
|
# name, we'll look for something on the stack. If it does look
|
58
60
|
# like a real event, we'll make and API call straight away.
|
59
61
|
#
|
62
|
+
# rubocop:disable Metrics/AbcSize
|
60
63
|
def do_close(id = nil)
|
61
64
|
id ||= options[:'<id>']
|
62
65
|
ev_file = id =~ /^\d{13}:.+/ ? state_dir + id : nil
|
@@ -68,6 +71,7 @@ module WavefrontCli
|
|
68
71
|
ev_file.unlink if ev_file && ev_file.exist? && res.status.code == 200
|
69
72
|
res
|
70
73
|
end
|
74
|
+
# rubocop:enable Metrics/AbcSize
|
71
75
|
|
72
76
|
def do_show
|
73
77
|
events = local_event_list
|
@@ -95,6 +99,10 @@ module WavefrontCli
|
|
95
99
|
|
96
100
|
# return [Hash] body for #create() method
|
97
101
|
#
|
102
|
+
# rubocop:disable Metrics/AbcSize
|
103
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
104
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
105
|
+
# rubocop:disable Metrics/MethodLength
|
98
106
|
def create_body(opts, t_start)
|
99
107
|
body = { name: opts[:'<event>'],
|
100
108
|
startTime: t_start,
|
@@ -114,6 +122,10 @@ module WavefrontCli
|
|
114
122
|
|
115
123
|
body
|
116
124
|
end
|
125
|
+
# rubocop:enable Metrics/MethodLength
|
126
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
127
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
128
|
+
# rubocop:enable Metrics/AbcSize
|
117
129
|
|
118
130
|
# @return a local event from the stack directory
|
119
131
|
#
|
@@ -130,15 +142,14 @@ module WavefrontCli
|
|
130
142
|
def local_event_list
|
131
143
|
state_dir.children
|
132
144
|
rescue Errno::ENOENT
|
133
|
-
raise
|
145
|
+
raise(WavefrontCli::Exception::SystemError,
|
146
|
+
'There is no event state directory on this host.')
|
134
147
|
end
|
135
148
|
|
136
149
|
# Run a command, stream stderr and stdout to the screen (they
|
137
150
|
# get combined -- could be an issue for someone somewhere) and
|
138
151
|
# return the command's exit code
|
139
152
|
#
|
140
|
-
# rubocop:disable Lint/AssignmentInCondition
|
141
|
-
#
|
142
153
|
def run_wrapped_cmd(cmd)
|
143
154
|
separator = '-' * (TW - 4)
|
144
155
|
|
@@ -146,7 +157,9 @@ module WavefrontCli
|
|
146
157
|
ret = nil
|
147
158
|
|
148
159
|
Open3.popen2e(cmd) do |_in, out, thr|
|
160
|
+
# rubocop:disable Lint/AssignmentInCondition
|
149
161
|
while l = out.gets do STDERR.puts(l) end
|
162
|
+
# rubocop:enable Lint/AssignmentInCondition
|
150
163
|
ret = thr.value.exitstatus
|
151
164
|
end
|
152
165
|
|
@@ -160,21 +173,19 @@ module WavefrontCli
|
|
160
173
|
#
|
161
174
|
def create_state_file(id, hosts = [])
|
162
175
|
fname = state_dir + id
|
163
|
-
|
164
|
-
begin
|
165
|
-
File.open(fname, 'w') { hosts.to_s }
|
166
|
-
rescue StandardError
|
167
|
-
raise 'Event was created but state file was not.'
|
168
|
-
end
|
169
|
-
|
176
|
+
File.open(fname, 'w') { hosts.to_s }
|
170
177
|
puts "Event state recorded at #{fname}."
|
178
|
+
rescue StandardError
|
179
|
+
puts 'NOTICE: event was created but state file was not.'
|
171
180
|
end
|
172
181
|
|
173
182
|
def create_state_dir
|
174
183
|
FileUtils.mkdir_p(state_dir)
|
175
|
-
|
176
|
-
|
177
|
-
|
184
|
+
raise unless state_dir.exist? && state_dir.directory? &&
|
185
|
+
state_dir.writable?
|
186
|
+
rescue StandardError
|
187
|
+
raise(WavefrontCli::Exception::SystemError,
|
188
|
+
"Cannot create writable system directory at '#{state_dir}'.")
|
178
189
|
end
|
179
190
|
|
180
191
|
def validate_input
|