wavefront-cli 3.2.3 → 3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1f911d94d044ca125cbb4ff8fe02762dae660039e58e4dbf549791537742f865
4
- data.tar.gz: abc9a5afadb0fea2c526ccf3a2a652a747ee2663dc31685b1d7bc16cfbf1ff96
3
+ metadata.gz: 6ce4081f6a736ace3019e5c4fc3cadcc91d04e028ea4f04a034250ccef7afc14
4
+ data.tar.gz: 3c00162398ae62804cde46e1cfc7e058d953f22566cd72d63df799e78f0cbf69
5
5
  SHA512:
6
- metadata.gz: c18837c8d87d93c82a7ffdb11b86e2500152930a29ac9c2a284599b9228acfe366a40116e2ad1d1eda869609c8f83c687380a0f0e9f6c501e7eda98c5b6412fb
7
- data.tar.gz: 22db9e18f0f1652564457243fca44869f6675d592e3689a24b88d2d0d0c42891a328190569a9eac98dea39718d97408f8e15f6aef5f659db1abec1eae2005c80
6
+ metadata.gz: fc66b3ce0e7f6942516c79bbed8f93f97d57e4adc3b84f40770bf49a00d26f943e94007307edb5eb71542aaec023374acab623d0fbd712bcc5ed22cb7cf69501
7
+ data.tar.gz: c5263da338dc6472e6beb7d9c221fa30036e8fcbc825ec7d39b4f1688fb75f65a3dd6b68f022c82885a4f906727cd5cd06e4ca90516830218958669cae73b512
data/HISTORY.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.3.0 (10/06/2019)
4
+ * Support negation searches. Search for alerts with targets *not* containing
5
+ `str` with `wf alert search target!~str`.
6
+ * Add `tag pathsearch` command. Searches for tags whose hierarchical names
7
+ begin with the given element(s).
8
+ * Better printing of structured search results. For example `wf alert search
9
+ tags=X`.
10
+ * Support freetext searches. Use `wf <object> search freetext=string` and you
11
+ will be given a list of the objects which match the search along with the
12
+ matching keys. (Not values!) Adding `-l` presents all matching objects in
13
+ full.
14
+
3
15
  ## 3.2.3 (24/05/2019)
4
16
  * Don't print erroneous pagination message when using `list --all`.
5
17
  * Require 3.3.2 of [the SDK](https://github.com/snltd/wavefront-sdk).
@@ -456,15 +456,41 @@ module WavefrontCli
456
456
 
457
457
  # Turn a list of search conditions into an API query
458
458
  #
459
+ # @param conds [Array]
460
+ # @return [Array[Hash]]
461
+ #
459
462
  def conds_to_query(conds)
460
- conds.each_with_object([]) do |cond, aggr|
461
- key, value = cond.split(/\W/, 2)
462
- q = { key: key, value: value }
463
- q[:matchingMethod] = 'EXACT' if cond.start_with?("#{key}=")
464
- q[:matchingMethod] = 'STARTSWITH' if cond.start_with?("#{key}^")
465
- aggr.<< q
463
+ conds.map do |cond|
464
+ key, value = cond.split(SEARCH_SPLIT, 2)
465
+ { key: key, value: value }.merge(matching_method(cond))
466
+ end
467
+ end
468
+
469
+ # rubocop:disable Metrics/CyclomaticComplexity
470
+ # rubocop:disable Metrics/MethodLength
471
+ # @param cond [String] a search condition, like "key=value"
472
+ # @return [Hash] of matchingMethod and negated
473
+ #
474
+ def matching_method(cond)
475
+ case cond
476
+ when /^\w+~/
477
+ { matchingMethod: 'CONTAINS', negated: false }
478
+ when /^\w+!~/
479
+ { matchingMethod: 'CONTAINS', negated: true }
480
+ when /^\w+=/
481
+ { matchingMethod: 'EXACT', negated: false }
482
+ when /^\w+!=/
483
+ { matchingMethod: 'EXACT', negated: true }
484
+ when /^\w+\^/
485
+ { matchingMethod: 'STARTSWITH', negated: false }
486
+ when /^\w+!\^/
487
+ { matchingMethod: 'STARTSWITH', negated: true }
488
+ else
489
+ raise(WavefrontCli::Exception::UnparseableSearchPattern, cond)
466
490
  end
467
491
  end
492
+ # rubocop:enable Metrics/CyclomaticComplexity
493
+ # rubocop:enable Metrics/MethodLength
468
494
 
469
495
  # Most things will re-import with the POST method if you remove
470
496
  # the ID.
@@ -23,6 +23,18 @@ module WavefrontCli
23
23
  def do_tag_clear
24
24
  wf.tag_set(options[:'<id>'], [])
25
25
  end
26
+
27
+ def do_tag_pathsearch
28
+ require 'wavefront-sdk/search'
29
+ wfs = Wavefront::Search.new(mk_creds, mk_opts)
30
+
31
+ query = { key: 'tags',
32
+ value: options[:'<word>'],
33
+ matchingMethod: 'TAGPATH',
34
+ negated: false }
35
+
36
+ wfs.search(search_key, query, range_hash)
37
+ end
26
38
  end
27
39
  end
28
40
  end
@@ -23,11 +23,7 @@ class WavefrontCommandAlert < WavefrontCommandBase
23
23
  "update #{CMN} <key=value> <id>",
24
24
  "unsnooze #{CMN} <id>",
25
25
  "search #{CMN} [-al] [-o offset] [-L limit] <condition>...",
26
- "tags #{CMN} <id>",
27
- "tag set #{CMN} <id> <tag>...",
28
- "tag clear #{CMN} <id>",
29
- "tag add #{CMN} <id> <tag>",
30
- "tag delete #{CMN} <id> <tag>",
26
+ tag_commands,
31
27
  "currently #{CMN} <state>",
32
28
  "queries #{CMN} [-b] [<id>]",
33
29
  "install #{CMN} <id>",
@@ -41,7 +41,8 @@ class WavefrontCommandBase
41
41
  "tag set #{CMN} <id> <tag>...",
42
42
  "tag clear #{CMN} <id>",
43
43
  "tag add #{CMN} <id> <tag>",
44
- "tag delete #{CMN} <id> <tag>"]
44
+ "tag delete #{CMN} <id> <tag>",
45
+ "tag pathsearch #{CMN} [-al] [-o offset] [-L limit] <word>"]
45
46
  end
46
47
 
47
48
  # Anything which takes ACLs provides the same interface
@@ -23,5 +23,9 @@ module WavefrontCli
23
23
  # Default configuration file
24
24
  #
25
25
  DEFAULT_CONFIG = (Pathname.new(ENV['HOME']) + '.wavefront').freeze
26
+
27
+ # Split regex for searches
28
+ #
29
+ SEARCH_SPLIT = /\^|!\^|=|!=|~|!~/
26
30
  end
27
31
  end
@@ -140,6 +140,8 @@ class WavefrontCliController
140
140
  abort "Cannot find user group '#{e.message}'."
141
141
  rescue Wavefront::Exception::UnsupportedWriter => e
142
142
  abort "Unsupported writer '#{e.message}'."
143
+ rescue WavefrontCli::Exception::ImpossibleSearch
144
+ abort 'Search on non-existent key. Please use a top-level field.'
143
145
  rescue StandardError => e
144
146
  warn "general error: #{e}"
145
147
  warn "Backtrace:\n\t#{e.backtrace.join("\n\t")}"
@@ -219,15 +219,44 @@ module WavefrontDisplay
219
219
  end
220
220
 
221
221
  def do_search_brief
222
- display_keys = ([:id] + options[:'<condition>'].map do |c|
223
- c.split(/\W/, 2).first.to_sym
224
- end).uniq
222
+ search_keys = search_display_keys
225
223
 
226
224
  if data.empty?
227
225
  puts 'No matches.'
226
+ elsif search_keys.include?(:freetext)
227
+ display_brief_freetext_results
228
228
  else
229
- multicolumn(*display_keys)
229
+ multicolumn(*search_keys)
230
230
  end
231
+ rescue KeyError
232
+ raise WavefrontCli::Exception::ImpossibleSearch
233
+ end
234
+
235
+ # For freetext searches, we just display the matching fields in "brief"
236
+ # mode.
237
+ #
238
+ def display_brief_freetext_results
239
+ search_keys = freetext_keys
240
+
241
+ data.map! do |d|
242
+ mf = d.select do |_k, v|
243
+ search_keys.any? { |s| v.to_s.include?(s) }
244
+ end
245
+
246
+ { id: d[:id], matching_fields: mf.to_h.keys }
247
+ end
248
+
249
+ multicolumn(:id, :matching_fields)
250
+ end
251
+
252
+ def freetext_keys
253
+ options[:'<condition>'].map { |c| c.split(SEARCH_SPLIT, 2).last }
254
+ end
255
+
256
+ def search_display_keys
257
+ ([:id] + options[:'<condition>'].map do |c|
258
+ c.split(SEARCH_SPLIT, 2).first.to_sym
259
+ end).uniq
231
260
  end
232
261
 
233
262
  def do_search
@@ -262,6 +291,16 @@ module WavefrontDisplay
262
291
  end
263
292
  end
264
293
 
294
+ def do_tag_pathsearch
295
+ if data.empty?
296
+ puts 'No matches.'
297
+ elsif options[:long]
298
+ long_output
299
+ else
300
+ multicolumn(:id, :name)
301
+ end
302
+ end
303
+
265
304
  def do_queries
266
305
  if options[:brief]
267
306
  multicolumn(:condition)
@@ -2,7 +2,7 @@ require_relative '../../stdlib/array'
2
2
 
3
3
  module WavefrontDisplayPrinter
4
4
  #
5
- # Print things which are per-row. The terse listings, primarily
5
+ # Print values which are per-row. The terse listings, primarily
6
6
  #
7
7
  class Terse
8
8
  attr_reader :data, :fmt
@@ -20,11 +20,21 @@ module WavefrontDisplayPrinter
20
20
  end
21
21
 
22
22
  def stringify(data, keys)
23
- data.map { |e| e.tap { keys.each { |k| e[k] = to_list(e[k]) } } }
23
+ data.map { |e| e.tap { keys.each { |k| e[k] = to_string(e[k]) } } }
24
24
  end
25
25
 
26
- def to_list(thing)
27
- thing.is_a?(Array) ? thing.join(', ') : thing
26
+ def to_string(value)
27
+ if value.is_a?(Array)
28
+ value.join(', ')
29
+ elsif value.is_a?(Map)
30
+ map_to_string(value)
31
+ else
32
+ value
33
+ end
34
+ end
35
+
36
+ def map_to_string(value)
37
+ format('%s=%s', value.keys[0], value.values.join(','))
28
38
  end
29
39
 
30
40
  def to_s
@@ -8,6 +8,7 @@ module WavefrontCli
8
8
  class MandatoryValue < RuntimeError; end
9
9
  class ConfigFileNotFound < IOError; end
10
10
  class FileNotFound < IOError; end
11
+ class ImpossibleSearch < RuntimeError; end
11
12
  class InsufficientData < RuntimeError; end
12
13
  class InvalidInput < RuntimeError; end
13
14
  class InvalidValue < RuntimeError; end
@@ -17,6 +18,7 @@ module WavefrontCli
17
18
  class UnhandledCommand < RuntimeError; end
18
19
  class UnparseableInput < RuntimeError; end
19
20
  class UnparseableResponse < RuntimeError; end
21
+ class UnparseableSearchPattern < RuntimeError; end
20
22
  class UnsupportedFileFormat < RuntimeError; end
21
23
  class UnsupportedNoop < RuntimeError; end
22
24
  class UnsupportedOperation < RuntimeError; end
@@ -1 +1 @@
1
- WF_CLI_VERSION = '3.2.3'.freeze
1
+ WF_CLI_VERSION = '3.3.0'.freeze
data/spec/spec_helper.rb CHANGED
@@ -75,7 +75,6 @@ CANNED_RESPONSE = DummyResponse.new
75
75
  # requisite display methods are called.
76
76
  #
77
77
  # @param cmd [String] command line args to supply to the Wavefront
78
- # command
79
78
  # @param call [Hash]
80
79
  # @param spies [Array[Hash]] array of spies to set up, for stubbing
81
80
  # methods in any class. Hash has keys :class, :method, :return.
@@ -265,6 +264,52 @@ def missing_creds(cmd, subcmds)
265
264
  end
266
265
  end
267
266
 
267
+ def search_tests(word, id, klass = nil, pth = nil)
268
+ pth ||= word
269
+ cmd_to_call(word,
270
+ "search id=#{id}",
271
+ { method: :post, path: "/api/v2/search/#{pth}",
272
+ body: { limit: 10,
273
+ offset: 0,
274
+ query: [{ key: 'id',
275
+ value: id,
276
+ matchingMethod: 'EXACT',
277
+ negated: false }],
278
+ sort: { field: 'id', ascending: true } },
279
+ headers: JSON_POST_HEADERS },
280
+ klass)
281
+
282
+ cmd_to_call(word,
283
+ "search id=#{id} thing!^word",
284
+ { method: :post, path: "/api/v2/search/#{pth}",
285
+ body: { limit: 10,
286
+ offset: 0,
287
+ query: [{ key: 'id',
288
+ value: id,
289
+ matchingMethod: 'EXACT',
290
+ negated: false },
291
+ { key: 'thing',
292
+ value: 'word',
293
+ matchingMethod: 'STARTSWITH',
294
+ negated: true }],
295
+ sort: { field: 'id', ascending: true } },
296
+ headers: JSON_POST_HEADERS },
297
+ klass)
298
+
299
+ cmd_to_call(word,
300
+ 'search id!~avoid',
301
+ { method: :post, path: "/api/v2/search/#{pth}",
302
+ body: { limit: 10,
303
+ offset: 0,
304
+ query: [{ key: 'id',
305
+ value: 'avoid',
306
+ matchingMethod: 'CONTAINS',
307
+ negated: true }],
308
+ sort: { field: 'id', ascending: true } },
309
+ headers: JSON_POST_HEADERS },
310
+ klass)
311
+ end
312
+
268
313
  # Generic list tests, needed by most commands
269
314
  #
270
315
  def list_tests(cmd, pth = nil, klass = nil)
@@ -10,7 +10,8 @@ def search_body(val)
10
10
  query: [
11
11
  { key: 'status',
12
12
  value: val,
13
- matchingMethod: 'EXACT' }
13
+ matchingMethod: 'EXACT',
14
+ negated: false }
14
15
  ],
15
16
  sort: { field: 'status', ascending: true } }
16
17
  end
@@ -66,15 +67,6 @@ describe "#{word} command" do
66
67
  method: :post, path: "/api/v2/#{word}/#{id}/undelete")
67
68
  cmd_to_call(word, "snooze #{id}",
68
69
  method: :post, path: "/api/v2/#{word}/#{id}/snooze")
69
- cmd_to_call(word, "search id=#{id}",
70
- method: :post, path: "/api/v2/search/#{word}",
71
- body: { limit: 10,
72
- offset: 0,
73
- query: [{ key: 'id',
74
- value: id,
75
- matchingMethod: 'EXACT' }],
76
- sort: { field: 'id', ascending: true } },
77
- headers: JSON_POST_HEADERS)
78
70
  cmd_to_call(word, "snooze -T 800 #{id}",
79
71
  method: :post,
80
72
  path: "/api/v2/#{word}/#{id}/snooze?seconds=800")
@@ -106,6 +98,7 @@ describe "#{word} command" do
106
98
  path: "/api/v2/search/#{word}",
107
99
  body: search_body('in_maintenance'))
108
100
  cmd_to_call(word, 'queries', path: "/api/v2/#{word}?limit=999&offset=0")
101
+ search_tests(word, id)
109
102
  tag_tests(word, id, bad_id)
110
103
  noop_tests(word, id, true)
111
104
  test_list_output(word)
@@ -49,6 +49,59 @@ class WavefrontCliBaseTest < MiniTest::Test
49
49
 
50
50
  def test_dispatch
51
51
  assert_raises(WavefrontCli::Exception::UnhandledCommand) { wf.dispatch }
52
- # assert_equal(wf_cmd.dispatch, nil)
52
+ end
53
+
54
+ def test_conds_to_query
55
+ assert_equal([{ key: 'mykey',
56
+ value: 'myvalue',
57
+ matchingMethod: 'EXACT',
58
+ negated: false }],
59
+ wf.conds_to_query(%w[mykey=myvalue]))
60
+
61
+ assert_equal([{ key: 'mykey',
62
+ value: 'myvalue',
63
+ matchingMethod: 'EXACT',
64
+ negated: true }],
65
+ wf.conds_to_query(%w[mykey!=myvalue]))
66
+
67
+ assert_equal([{ key: 'mykey',
68
+ value: 'myvalue',
69
+ matchingMethod: 'CONTAINS',
70
+ negated: true }],
71
+ wf.conds_to_query(%w[mykey!~myvalue]))
72
+
73
+ assert_equal([{ key: 'mykey',
74
+ value: 'myvalue',
75
+ matchingMethod: 'STARTSWITH',
76
+ negated: false }],
77
+ wf.conds_to_query(%w[mykey^myvalue]))
78
+
79
+ assert_equal([{ key: 'mykey',
80
+ value: 'myvalue',
81
+ matchingMethod: 'EXACT',
82
+ negated: true }],
83
+ wf.conds_to_query(%w[mykey!=myvalue]))
84
+
85
+ assert_raises(WavefrontCli::Exception::UnparseableSearchPattern) do
86
+ wf.conds_to_query(%w[what!nonsense])
87
+ end
88
+ end
89
+
90
+ def test_matching_method
91
+ assert_equal({ matchingMethod: 'EXACT', negated: true },
92
+ wf.matching_method('key!=val'))
93
+ assert_equal({ matchingMethod: 'EXACT', negated: false },
94
+ wf.matching_method('key=val'))
95
+ assert_equal({ matchingMethod: 'STARTSWITH', negated: false },
96
+ wf.matching_method('key^val'))
97
+ assert_equal({ matchingMethod: 'STARTSWITH', negated: true },
98
+ wf.matching_method('key!^val'))
99
+ assert_equal({ matchingMethod: 'CONTAINS', negated: false },
100
+ wf.matching_method('key~val'))
101
+ assert_equal({ matchingMethod: 'CONTAINS', negated: true },
102
+ wf.matching_method('key!~val'))
103
+ assert_raises(WavefrontCli::Exception::UnparseableSearchPattern) do
104
+ wf.matching_method('what nonsense')
105
+ end
53
106
  end
54
107
  end
@@ -13,19 +13,11 @@ describe 'cloudintegration command' do
13
13
  "undelete #{id}"])
14
14
  list_tests(word, 'cloudintegration', k)
15
15
  noop_tests(word, id, false, 'cloudintegration', k)
16
+ search_tests(word, id, k)
16
17
  cmd_to_call(word, "describe #{id}",
17
18
  { path: "/api/v2/cloudintegration/#{id}" }, k)
18
19
  cmd_to_call(word, "delete #{id}",
19
20
  { method: :delete, path: "/api/v2/cloudintegration/#{id}" }, k)
20
- cmd_to_call(word, "search -L 100 id~#{id}",
21
- { method: :post, path: '/api/v2/search/cloudintegration',
22
- body: { limit: '100',
23
- offset: 0,
24
- query: [{ key: 'id',
25
- value: id,
26
- matchingMethod: 'CONTAINS' }],
27
- sort: { field: 'id', ascending: true } },
28
- headers: JSON_POST_HEADERS }, WavefrontCli::CloudIntegration)
29
21
  cmd_to_call(word, "undelete #{id}",
30
22
  { method: :post,
31
23
  path: "/api/v2/cloudintegration/#{id}/undelete" }, k)
@@ -48,7 +48,7 @@ class WavefrontCommmandBaseTest < MiniTest::Test
48
48
 
49
49
  cmds.each do |o|
50
50
  assert_instance_of(String, o)
51
- assert_match(/^tags* .* <id>/, o)
51
+ assert_match(/^tags* /, o)
52
52
  end
53
53
  end
54
54
 
@@ -30,15 +30,6 @@ describe "#{word} command" do
30
30
  method: :delete, path: "/api/v2/#{word}/#{id}")
31
31
  end
32
32
 
33
- cmd_to_call(word, "search id=#{id}",
34
- method: :post, path: "/api/v2/search/#{word}",
35
- body: { limit: 10,
36
- offset: 0,
37
- query: [{ key: 'id',
38
- value: id,
39
- matchingMethod: 'EXACT' }],
40
- sort: { field: 'id', ascending: true } },
41
- headers: JSON_POST_HEADERS)
42
33
  cmd_to_call(word,
43
34
  'favs',
44
35
  method: :post,
@@ -47,7 +38,8 @@ describe "#{word} command" do
47
38
  offset: 0,
48
39
  query: [{ key: 'favorite',
49
40
  value: 'true',
50
- matchingMethod: 'EXACT' }],
41
+ matchingMethod: 'EXACT',
42
+ negated: false }],
51
43
  sort: { field: 'id',
52
44
  ascending: true } }.to_json)
53
45
 
@@ -74,6 +66,7 @@ describe "#{word} command" do
74
66
  invalid_ids(word, ["describe #{bad_id}", "delete #{bad_id}",
75
67
  "undelete #{bad_id}"])
76
68
  tag_tests(word, id, bad_id)
69
+ search_tests(word, id)
77
70
  test_list_output(word)
78
71
  acl_tests(word, id, bad_id)
79
72
  end
@@ -15,6 +15,7 @@ describe "#{word} command" do
15
15
  "undelete #{id}", "history #{id}"])
16
16
  list_tests(word, nil, k)
17
17
  noop_tests(word, id, true, word, k)
18
+ search_tests(word, id, k)
18
19
  cmd_to_call(word, "describe #{id}", { path: "/api/v2/#{word}/#{id}" }, k)
19
20
  cmd_to_call(word, "describe -v 7 #{id}",
20
21
  { path: "/api/v2/#{word}/#{id}/history/7" }, k)
@@ -34,16 +35,6 @@ describe "#{word} command" do
34
35
  { method: :delete, path: "/api/v2/#{word}/#{id}" }, k)
35
36
  end
36
37
 
37
- cmd_to_call(word, "search id=#{id}",
38
- { method: :post, path: "/api/v2/search/#{word}",
39
- body: { limit: 10,
40
- offset: 0,
41
- query: [{ key: 'id',
42
- value: id,
43
- matchingMethod: 'EXACT' }],
44
- sort: { field: 'id', ascending: true } },
45
- headers: JSON_POST_HEADERS }, k)
46
-
47
38
  cmd_to_call(word, "undelete #{id}",
48
39
  { method: :post, path: "/api/v2/#{word}/#{id}/undelete" }, k)
49
40
  invalid_ids(word, ["describe #{bad_id}", "delete #{bad_id}",
@@ -44,9 +44,9 @@ class WavefrontDisplayPrinterTerse < MiniTest::Test
44
44
  [:things]))
45
45
  end
46
46
 
47
- def test_to_list
48
- assert_equal('a, b, c', wf.to_list(%w[a b c]))
49
- assert_equal('abc', wf.to_list('abc'))
47
+ def test_to_string
48
+ assert_equal('a, b, c', wf.to_string(%w[a b c]))
49
+ assert_equal('abc', wf.to_string('abc'))
50
50
  end
51
51
 
52
52
  def test_end_to_end
@@ -16,14 +16,6 @@ describe "#{word} command" do
16
16
  cmd_to_call(word, "close #{id}",
17
17
  method: :post, path: "/api/v2/#{word}/#{id}/close")
18
18
  tag_tests(word, id, bad_id)
19
- cmd_to_call(word, "search -o 11 id=#{id}",
20
- method: :post, path: "/api/v2/search/#{word}",
21
- body: { limit: 10,
22
- offset: '11',
23
- query: [{ key: 'id',
24
- value: id,
25
- matchingMethod: 'EXACT' }],
26
- sort: { field: 'id', ascending: true } },
27
- headers: JSON_POST_HEADERS)
19
+ search_tests(word, id)
28
20
  test_list_output(word)
29
21
  end
@@ -12,20 +12,11 @@ describe "#{word} command" do
12
12
  missing_creds(word, ['list', "describe #{id}", "delete #{id}"])
13
13
  list_tests(word, 'extlink', k)
14
14
  noop_tests(word, id, false, 'extlink', k)
15
+ search_tests(word, id, k, 'extlink')
15
16
  cmd_to_call(word, "describe #{id}", { path: "/api/v2/extlink/#{id}" }, k)
16
17
  cmd_to_call(word, "delete #{id}",
17
18
  { method: :delete, path: "/api/v2/extlink/#{id}" }, k)
18
19
  invalid_ids(word, ["describe #{bad_id}", "delete #{bad_id}"])
19
- cmd_to_call(word, "search -L 100 id~#{id}",
20
- { method: :post,
21
- path: '/api/v2/search/extlink',
22
- body: { limit: '100',
23
- offset: 0,
24
- query: [{ key: 'id',
25
- value: id,
26
- matchingMethod: 'CONTAINS' }],
27
- sort: { field: 'id', ascending: true } },
28
- headers: JSON_POST_HEADERS }, WavefrontCli::ExternalLink)
29
20
 
30
21
  cmd_to_call(word, 'create name description template',
31
22
  { method: :post,
@@ -12,22 +12,12 @@ describe "#{word} command" do
12
12
  missing_creds(word, ['list', "describe #{id}", "delete #{id}"])
13
13
  list_tests(word, 'maintenancewindow', k)
14
14
  noop_tests(word, id, false, 'maintenancewindow', k)
15
+ search_tests(word, id, k, 'maintenancewindow')
15
16
  cmd_to_call(word, "describe #{id}",
16
17
  { path: "/api/v2/maintenancewindow/#{id}" }, k)
17
18
  cmd_to_call(word, "delete #{id}",
18
19
  { method: :delete, path: "/api/v2/maintenancewindow/#{id}" }, k)
19
20
  invalid_ids(word, ["describe #{bad_id}", "delete #{bad_id}"])
20
- cmd_to_call(word, "search -o 100 id=#{id}",
21
- { method: :post, path: '/api/v2/search/maintenancewindow',
22
- body: { limit: 10,
23
- offset: '100',
24
- query: [{ key: 'id',
25
- value: id,
26
- matchingMethod: 'EXACT' }],
27
- sort: { field: 'id', ascending: true } },
28
- headers: JSON_POST_HEADERS },
29
- WavefrontCli::MaintenanceWindow)
30
-
31
21
  cmd_to_call(word, 'create -d testing -H shark tester',
32
22
  { method: :post, path: '/api/v2/maintenancewindow',
33
23
  body: {
@@ -18,18 +18,9 @@ describe "#{word} command" do
18
18
  "delete #{bad_id}",
19
19
  "test #{bad_id}",
20
20
  "update #{bad_id} key=value"])
21
- list_tests(word)
22
21
  cmd_to_call(word, "describe #{id}", path: "/api/v2/#{word}/#{id}")
23
-
24
- cmd_to_call(word, "search id=#{id}",
25
- method: :post, path: "/api/v2/search/#{word}",
26
- body: { limit: 10,
27
- offset: 0,
28
- query: [{ key: 'id',
29
- value: id,
30
- matchingMethod: 'EXACT' }],
31
- sort: { field: 'id', ascending: true } },
32
- headers: JSON_POST_HEADERS)
22
+ list_tests(word)
23
+ search_tests(word, id)
33
24
  noop_tests(word, id)
34
25
  test_list_output(word)
35
26
  end
@@ -25,15 +25,6 @@ describe "#{word} command" do
25
25
  invalid_ids(word, ["describe #{bad_id}", "delete #{bad_id}",
26
26
  "undelete #{bad_id}", "rename #{bad_id} newname"])
27
27
  invalid_something(word, ["rename #{id} '(>_<)'"], 'proxy name')
28
- cmd_to_call(word, "search -o 10 id=#{id}",
29
- method: :post, path: "/api/v2/search/#{word}",
30
- body: { limit: 10,
31
- offset: '10',
32
- query: [{ key: 'id',
33
- value: id,
34
- matchingMethod: 'EXACT' }],
35
- sort: { field: 'id', ascending: true } },
36
- headers: JSON_POST_HEADERS)
37
-
28
+ search_tests(word, id)
38
29
  test_list_output(word)
39
30
  end
@@ -12,18 +12,10 @@ describe "#{word} command" do
12
12
  missing_creds(word, ['list', "describe #{id}", "delete #{id}"])
13
13
  list_tests(word, 'savedsearch', k)
14
14
  noop_tests(word, id, false, 'savedsearch', k)
15
+ search_tests(word, id, k, 'savedsearch')
15
16
  cmd_to_call(word, "describe #{id}", { path: "/api/v2/#{word}/#{id}" }, k)
16
17
  cmd_to_call(word, "delete #{id}",
17
18
  { method: :delete, path: "/api/v2/#{word}/#{id}" }, k)
18
19
  invalid_ids(word, ["describe #{bad_id}", "delete #{bad_id}"])
19
- cmd_to_call(word, "search -L 100 id~#{id}",
20
- { method: :post, path: '/api/v2/search/savedsearch',
21
- body: { limit: '100',
22
- offset: 0,
23
- query: [{ key: 'id',
24
- value: id,
25
- matchingMethod: 'CONTAINS' }],
26
- sort: { field: 'id', ascending: true } },
27
- headers: JSON_POST_HEADERS }, WavefrontCli::SavedSearch)
28
20
  test_list_output(word, k)
29
21
  end
@@ -18,17 +18,9 @@ describe "#{word} command" do
18
18
  method: :delete, path: "/api/v2/#{word}/#{id}")
19
19
  invalid_ids(word, ["describe #{bad_id}", "clear #{bad_id}"])
20
20
  tag_tests(word, id, bad_id)
21
- cmd_to_call(word, "search -f json id^#{id}",
22
- method: :post, path: "/api/v2/search/#{word}",
23
- body: { limit: 10,
24
- offset: 0,
25
- query: [{ key: 'id',
26
- value: id,
27
- matchingMethod: 'STARTSWITH' }],
28
- sort: { field: 'id', ascending: true } },
29
- headers: JSON_POST_HEADERS)
30
21
  cmd_noop(word, 'list',
31
22
  ['GET https://metrics.wavefront.com/api/v2/source'])
32
23
  cmd_noop(word, 'describe src',
33
24
  ['GET https://metrics.wavefront.com/api/v2/source/src'])
25
+ search_tests(word, id)
34
26
  end
@@ -89,15 +89,7 @@ describe "#{word} command" do
89
89
  body: 'group=agent_management',
90
90
  headers: hdrs)
91
91
 
92
- cmd_to_call(word, "search -L 40 id=#{id}",
93
- { method: :post, path: "/api/v2/search/#{word}",
94
- body: { limit: '40',
95
- offset: 0,
96
- query: [{ key: 'id',
97
- value: id,
98
- matchingMethod: 'EXACT' }],
99
- sort: { field: 'id', ascending: true } },
100
- headers: JSON_POST_HEADERS }, WavefrontCli::User)
92
+ search_tests(word, id)
101
93
 
102
94
  invalid_ids(word, ["describe #{bad_id}",
103
95
  "delete #{bad_id}",
@@ -84,14 +84,7 @@ describe "#{word} command" do
84
84
  path: "/api/v2/#{word}/revoke/#{priv1}",
85
85
  body: [gid1].to_json }, k)
86
86
 
87
- cmd_to_call(word, 'search -L 40 id=string',
88
- { method: :post, path: "/api/v2/search/#{word}",
89
- body: { limit: '40',
90
- offset: 0,
91
- query: [{ key: 'id',
92
- value: 'string',
93
- matchingMethod: 'EXACT' }],
94
- sort: { field: 'id', ascending: true } } }, k)
87
+ search_tests(word, gid1, k)
95
88
 
96
89
  invalid_ids(word, ["describe #{bad_id}",
97
90
  "delete #{bad_id}",
@@ -15,14 +15,6 @@ describe "#{word} command" do
15
15
  cmd_to_call(word, "delete #{id}", method: :delete,
16
16
  path: "/api/v2/#{word}/#{id}")
17
17
  invalid_ids(word, ["describe #{bad_id}", "delete #{bad_id}"])
18
- cmd_to_call(word, "search -o 100 -L 100 id~#{id}",
19
- method: :post, path: "/api/v2/search/#{word}",
20
- body: { limit: '100',
21
- offset: '100',
22
- query: [{ key: 'id',
23
- value: id,
24
- matchingMethod: 'CONTAINS' }],
25
- sort: { field: 'id', ascending: true } },
26
- headers: JSON_POST_HEADERS)
18
+ search_tests(word, id)
27
19
  test_list_output(word)
28
20
  end
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: 3.2.3
4
+ version: 3.3.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-05-24 00:00:00.000000000 Z
11
+ date: 2019-06-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: docopt