wavefront-cli 4.0.2 → 4.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/HISTORY.md +8 -0
- data/LICENSE.txt +1 -1
- data/README.md +1 -1
- data/lib/wavefront-cli/alert.rb +3 -3
- data/lib/wavefront-cli/base.rb +74 -38
- data/lib/wavefront-cli/commands/alert.rb +1 -0
- data/lib/wavefront-cli/commands/cloudintegration.rb +1 -0
- data/lib/wavefront-cli/commands/dashboard.rb +1 -0
- data/lib/wavefront-cli/commands/derivedmetric.rb +1 -0
- data/lib/wavefront-cli/commands/link.rb +1 -0
- data/lib/wavefront-cli/commands/notificant.rb +1 -0
- data/lib/wavefront-cli/commands/savedsearch.rb +1 -0
- data/lib/wavefront-cli/commands/user.rb +1 -0
- data/lib/wavefront-cli/commands/usergroup.rb +1 -0
- data/lib/wavefront-cli/commands/webhook.rb +1 -0
- data/lib/wavefront-cli/commands/window.rb +1 -0
- data/lib/wavefront-cli/version.rb +1 -1
- data/spec/spec_helper.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 48f9a11ef858f502c05d4c4d89080a31267f70d96430e88e44deba5b2f929015
|
4
|
+
data.tar.gz: a1bbc741a8379fb2a5783688a858b8c12b5d020a1501d58478042fc303ca43c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 759172c664ff1b81f2e199afceb052a61f31f4c91b7f72ea69ad5e511dc19d7397d9731d7e03269d75b88bd3baa52bfedc3bc289c166a84b590fb71ea9bc7a11
|
7
|
+
data.tar.gz: 5c7a9545f5ea086dce5bc02588ddf678ebad99321e55c68026a9e12ad0645b5a4a0bffcffac155ca238ad79370cd00cf146bd8033780f83dfabe2d7322b6c378
|
data/HISTORY.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 4.1.0 (27/06/2019)
|
4
|
+
* Add `dump` subcommand for all importable object types. Produces
|
5
|
+
JSON or YAML output.
|
6
|
+
* Allow batch importing of objects. Works with files produced by
|
7
|
+
`dump` subcommand, or by manually creating a JSON or YAML array of
|
8
|
+
objects. Batch imports are automatically detected by the `import`
|
9
|
+
subcommand.
|
10
|
+
|
3
11
|
## 4.0.2 (20/06/2019)
|
4
12
|
* Allow importing of dashboards which have a URL but not an ID.
|
5
13
|
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -18,7 +18,7 @@ SDK](https://github.com/snltd/wavefront-sdk) and requires Ruby >=
|
|
18
18
|
2.3. It has no "native extension" dependencies.
|
19
19
|
|
20
20
|
For a far more comprehensive overview/tutorial, please read [this
|
21
|
-
article](
|
21
|
+
article](https://sysdef.xyz/article/wavefront-cli).
|
22
22
|
|
23
23
|
```
|
24
24
|
$ wf --help
|
data/lib/wavefront-cli/alert.rb
CHANGED
@@ -11,7 +11,7 @@ module WavefrontCli
|
|
11
11
|
include WavefrontCli::Mixin::Acl
|
12
12
|
|
13
13
|
def import_fields
|
14
|
-
%
|
14
|
+
%i[name condition minutes target severity displayExpression
|
15
15
|
tags additionalInformation resolveAfterMinutes]
|
16
16
|
end
|
17
17
|
|
@@ -128,8 +128,8 @@ module WavefrontCli
|
|
128
128
|
import_fields.each_with_object({}) { |k, a| a[k.to_sym] = raw[k] }
|
129
129
|
.tap do |ret|
|
130
130
|
|
131
|
-
if raw.key?(
|
132
|
-
ret[:resolveMinutes] = raw[
|
131
|
+
if raw.key?(:resolveAfterMinutes)
|
132
|
+
ret[:resolveMinutes] = raw[:resolveAfterMinutes]
|
133
133
|
end
|
134
134
|
|
135
135
|
if raw.key?('customerTagsWithCounts')
|
data/lib/wavefront-cli/base.rb
CHANGED
@@ -143,9 +143,10 @@ module WavefrontCli
|
|
143
143
|
end
|
144
144
|
|
145
145
|
# To allow a user to default to different output formats for
|
146
|
-
# different object, we are able to define a format for
|
147
|
-
# instance, `alertformat` or `
|
148
|
-
# such a
|
146
|
+
# different object types, we are able to define a format for
|
147
|
+
# each class. instance, `alertformat` or `proxyformat`. This
|
148
|
+
# method returns such a symbol appropriate for the inheriting
|
149
|
+
# class.
|
149
150
|
#
|
150
151
|
# @return [Symbol] name of the option or config-file key which
|
151
152
|
# sets the default output format for this class
|
@@ -164,25 +165,15 @@ module WavefrontCli
|
|
164
165
|
# @raise WavefrontCli::Exception::UnhandledCommand if the
|
165
166
|
# command does not match a `do_` method.
|
166
167
|
#
|
167
|
-
# rubocop:disable Metrics/AbcSize
|
168
168
|
def dispatch
|
169
|
+
# Look through each deconstructed method name and see if the
|
170
|
+
# user supplied an option for each component. Call the first
|
171
|
+
# one that matches. The order will ensure we match
|
172
|
+
# "do_delete_tags" before we match "do_delete".
|
169
173
|
#
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
m_list = methods.select { |m| m.to_s.start_with?('do_') }.map do |m|
|
174
|
-
m.to_s.split('_')[1..-1]
|
175
|
-
end
|
176
|
-
|
177
|
-
# Sort that array of arrays by length, longest first. Then look
|
178
|
-
# through each deconstructed method name and see if the user
|
179
|
-
# supplied an option for each component. Call the first one that
|
180
|
-
# matches. The order will ensure we match "do_delete_tags" before
|
181
|
-
# we match "do_delete".
|
182
|
-
#
|
183
|
-
m_list.sort_by(&:length).reverse_each do |m|
|
184
|
-
if m.reject { |w| options[w.to_sym] }.empty?
|
185
|
-
method = (%w[do] + m).join('_')
|
174
|
+
method_word_list.reverse_each do |w_list|
|
175
|
+
if w_list.reject { |w| options[w.to_sym] }.empty?
|
176
|
+
method = name_of_do_method(w_list)
|
186
177
|
return display(public_send(method), method)
|
187
178
|
end
|
188
179
|
end
|
@@ -193,7 +184,19 @@ module WavefrontCli
|
|
193
184
|
|
194
185
|
raise WavefrontCli::Exception::UnhandledCommand
|
195
186
|
end
|
196
|
-
|
187
|
+
|
188
|
+
def name_of_do_method(word_list)
|
189
|
+
(%w[do] + word_list).join('_')
|
190
|
+
end
|
191
|
+
|
192
|
+
# Take a list of do_ methods, remove the 'do_' from their name,
|
193
|
+
# and break them into arrays of '_' separated words. The array
|
194
|
+
# is sorted by length, longest first.
|
195
|
+
#
|
196
|
+
def method_word_list
|
197
|
+
do_methods = methods.select { |m| m.to_s.start_with?('do_') }
|
198
|
+
do_methods.map { |m| m.to_s.split('_')[1..-1] }.sort_by(&:length)
|
199
|
+
end
|
197
200
|
|
198
201
|
# Display a Ruby object as JSON, YAML, or human-readable. We
|
199
202
|
# provide a default method to format human-readable output, but
|
@@ -208,7 +211,6 @@ module WavefrontCli
|
|
208
211
|
# @param method [String] the name of the method which produced
|
209
212
|
# this output. Used to find a suitable humanize method.
|
210
213
|
#
|
211
|
-
# rubocop:disable Metrics/AbcSize
|
212
214
|
def display(data, method)
|
213
215
|
if no_api_response.include?(method)
|
214
216
|
return display_no_api_response(data, method)
|
@@ -216,18 +218,22 @@ module WavefrontCli
|
|
216
218
|
|
217
219
|
exit if options[:noop]
|
218
220
|
|
221
|
+
check_response_blocks(data)
|
222
|
+
status_error_handler(data, method)
|
223
|
+
handle_response(data.response, format_var, method)
|
224
|
+
end
|
225
|
+
|
226
|
+
def status_error_handler(data, method)
|
227
|
+
return if check_status(data.status)
|
228
|
+
handle_error(method, data.status.code) if format_var == :human
|
229
|
+
display_api_error(data.status)
|
230
|
+
end
|
231
|
+
|
232
|
+
def check_response_blocks(data)
|
219
233
|
%i[status response].each do |b|
|
220
234
|
abort "no #{b} block in API response" unless data.respond_to?(b)
|
221
235
|
end
|
222
|
-
|
223
|
-
unless check_status(data.status)
|
224
|
-
handle_error(method, data.status.code) if format_var == :human
|
225
|
-
display_api_error(data.status)
|
226
|
-
end
|
227
|
-
|
228
|
-
handle_response(data.response, format_var, method)
|
229
236
|
end
|
230
|
-
# rubocop:enable Metrics/AbcSize
|
231
237
|
|
232
238
|
# Classes can provide methods which give the user information on
|
233
239
|
# a given error code. They are named #handle_errcode_xxx, and
|
@@ -384,24 +390,51 @@ module WavefrontCli
|
|
384
390
|
end
|
385
391
|
|
386
392
|
# rubocop:disable Metrics/AbcSize
|
393
|
+
def do_dump
|
394
|
+
items = wf.list(ALL_PAGE_SIZE, :all).response.items
|
395
|
+
|
396
|
+
if options[:format] == 'yaml'
|
397
|
+
ok_exit items.to_yaml
|
398
|
+
elsif options[:format] == 'json'
|
399
|
+
ok_exit items.to_json
|
400
|
+
else
|
401
|
+
abort format("Dump format must be 'json' or 'yaml'. (Tried '%s')",
|
402
|
+
options[:format])
|
403
|
+
end
|
404
|
+
end
|
405
|
+
# rubocop:enable Metrics/AbcSize
|
406
|
+
|
387
407
|
def do_import
|
388
408
|
raw = load_file(options[:'<file>'])
|
389
|
-
|
409
|
+
errs = 0
|
390
410
|
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
411
|
+
[raw].flatten.each do |obj|
|
412
|
+
resp = import_object(obj)
|
413
|
+
next if options[:noop]
|
414
|
+
errs += 1 unless resp.ok?
|
415
|
+
puts import_message(obj, resp)
|
396
416
|
end
|
397
417
|
|
418
|
+
exit errs
|
419
|
+
end
|
420
|
+
|
421
|
+
def import_message(obj, resp)
|
422
|
+
format('%-15s %-10s %s',
|
423
|
+
obj[:id] || obj[:url],
|
424
|
+
resp.ok? ? 'IMPORTED' : 'FAILED',
|
425
|
+
resp.status.message)
|
426
|
+
end
|
427
|
+
|
428
|
+
def import_object(raw)
|
429
|
+
raw = preprocess_rawfile(raw) if respond_to?(:preprocess_rawfile)
|
430
|
+
prepped = import_to_create(raw)
|
431
|
+
|
398
432
|
if options[:update]
|
399
433
|
import_update(raw)
|
400
434
|
else
|
401
435
|
wf.create(prepped)
|
402
436
|
end
|
403
437
|
end
|
404
|
-
# rubocop:enable Metrics/AbcSize
|
405
438
|
|
406
439
|
def import_update(raw)
|
407
440
|
wf.update(raw[:id], raw, false)
|
@@ -508,8 +541,11 @@ module WavefrontCli
|
|
508
541
|
#
|
509
542
|
def import_to_create(raw)
|
510
543
|
raw.each_with_object({}) do |(k, v), a|
|
511
|
-
a[k.to_sym] = v unless k ==
|
544
|
+
a[k.to_sym] = v unless k == :id
|
512
545
|
end
|
546
|
+
rescue StandardError => e
|
547
|
+
puts e if options[:debug]
|
548
|
+
raise WavefrontCli::Exception::UnparseableInput
|
513
549
|
end
|
514
550
|
|
515
551
|
# Return a detailed description of one item, if an ID has been
|
@@ -14,6 +14,7 @@ class WavefrontCommandAlert < WavefrontCommandBase
|
|
14
14
|
"history #{CMN} [-o offset] [-L limit] <id>",
|
15
15
|
"clone #{CMN} [-v version] <id>",
|
16
16
|
"latest #{CMN} <id>",
|
17
|
+
"dump #{CMN}",
|
17
18
|
"import #{CMN} [-u] <file>",
|
18
19
|
"snooze #{CMN} [-T time] <id>",
|
19
20
|
"set #{CMN} <key=value> <id>",
|
@@ -6,6 +6,7 @@ class WavefrontCommandDashboard < WavefrontCommandBase
|
|
6
6
|
def _commands
|
7
7
|
["list #{CMN} [-alN] [-O fields] [-o offset] [-L limit]",
|
8
8
|
"describe #{CMN} [-v version] <id>",
|
9
|
+
"dump #{CMN}",
|
9
10
|
"import #{CMN} [-u] <file>",
|
10
11
|
"set #{CMN} <key=value> <id>",
|
11
12
|
"delete #{CMN} <id>",
|
@@ -20,6 +20,7 @@ class WavefrontCommandDerivedmetric < WavefrontCommandBase
|
|
20
20
|
"describe #{CMN} [-v version] <id>",
|
21
21
|
"create #{CMN} [-d description] [-T tag...] [-b] [-i interval] " \
|
22
22
|
'[-r range] <name> <query>',
|
23
|
+
"dump #{CMN}",
|
23
24
|
"import #{CMN} [-u] <file>",
|
24
25
|
"set #{CMN} <key=value> <id>",
|
25
26
|
"delete #{CMN} <id>",
|
@@ -21,6 +21,7 @@ class WavefrontCommandLink < WavefrontCommandBase
|
|
21
21
|
"create #{CMN} [-m regex] [-s regex] [-p str=regex...] <name> " \
|
22
22
|
'<description> <template>',
|
23
23
|
"delete #{CMN} <id>",
|
24
|
+
"dump #{CMN}",
|
24
25
|
"import #{CMN} [-u] <file>",
|
25
26
|
"set #{CMN} <key=value> <id>",
|
26
27
|
"search #{CMN} [-al] [-o offset] [-L limit] <condition>..."]
|
@@ -23,6 +23,7 @@ class WavefrontCommandSavedsearch < WavefrontCommandBase
|
|
23
23
|
["list #{CMN} [-al] [-O fields] [-o offset] [-L limit]",
|
24
24
|
"describe #{CMN} <id>",
|
25
25
|
"delete #{CMN} <id>",
|
26
|
+
"dump #{CMN}",
|
26
27
|
"import #{CMN} [-u] <file>",
|
27
28
|
"search #{CMN} [-al] [-o offset] [-L limit] <condition>..."]
|
28
29
|
end
|
@@ -18,6 +18,7 @@ class WavefrontCommandUser < WavefrontCommandBase
|
|
18
18
|
"invite #{CMN} [-m permission...] [-g group...] <id>",
|
19
19
|
"set #{CMN} <key=value> <id>",
|
20
20
|
"delete #{CMN} <user>...",
|
21
|
+
"dump #{CMN}",
|
21
22
|
"import #{CMN} [-u] <file>",
|
22
23
|
"groups #{CMN} <id>",
|
23
24
|
"join #{CMN} <id> <group>...",
|
@@ -7,6 +7,7 @@ class WavefrontCommandWebhook < WavefrontCommandBase
|
|
7
7
|
["list #{CMN} [-al] [-O fields] [-o offset] [-L limit]",
|
8
8
|
"describe #{CMN} <id>",
|
9
9
|
"delete #{CMN} <id>",
|
10
|
+
"dump #{CMN}",
|
10
11
|
"import #{CMN} [-u] <file>",
|
11
12
|
"set #{CMN} <key=value> <id>",
|
12
13
|
"search #{CMN} [-al] [-o offset] [-L limit] <condition>..."]
|
@@ -23,6 +23,7 @@ class WavefrontCommandWindow < WavefrontCommandBase
|
|
23
23
|
"close #{CMN} <id>",
|
24
24
|
"extend #{CMN} (by|to) <time> <id>",
|
25
25
|
"delete #{CMN} <id>",
|
26
|
+
"dump #{CMN}",
|
26
27
|
"import #{CMN} [-u] <file>",
|
27
28
|
"set #{CMN} <key=value> <id>",
|
28
29
|
"search #{CMN} [-al] [-o offset] [-L limit] <condition>...",
|
@@ -1 +1 @@
|
|
1
|
-
WF_CLI_VERSION = '4.0
|
1
|
+
WF_CLI_VERSION = '4.1.0'.freeze
|
data/spec/spec_helper.rb
CHANGED
@@ -430,7 +430,7 @@ class CliMethodTest < MiniTest::Test
|
|
430
430
|
end
|
431
431
|
|
432
432
|
def import_tester(word, have_fields, do_not_have_fields = [])
|
433
|
-
input =
|
433
|
+
input = wf.load_file(RES_DIR + 'imports' + "#{word}.json")
|
434
434
|
x = wf.import_to_create(input)
|
435
435
|
assert_instance_of(Hash, x)
|
436
436
|
have_fields.each { |f| assert_includes(x.keys, f) }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wavefront-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0
|
4
|
+
version: 4.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Fisher
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-06-
|
11
|
+
date: 2019-06-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: docopt
|