wavefront-cli 8.5.0 → 9.0.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.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/release.yml +37 -0
  3. data/.github/workflows/test.yml +23 -0
  4. data/.rubocop.yml +10 -9
  5. data/HISTORY.md +15 -0
  6. data/README.md +4 -2
  7. data/lib/wavefront-cli/base.rb +2 -2
  8. data/lib/wavefront-cli/commands/.rubocop.yml +2 -13
  9. data/lib/wavefront-cli/commands/base.rb +10 -9
  10. data/lib/wavefront-cli/commands/derivedmetric.rb +1 -1
  11. data/lib/wavefront-cli/commands/metric.rb +3 -3
  12. data/lib/wavefront-cli/commands/metricspolicy.rb +33 -0
  13. data/lib/wavefront-cli/commands/query.rb +5 -5
  14. data/lib/wavefront-cli/commands/write.rb +12 -12
  15. data/lib/wavefront-cli/config.rb +4 -4
  16. data/lib/wavefront-cli/constants.rb +2 -1
  17. data/lib/wavefront-cli/controller.rb +19 -15
  18. data/lib/wavefront-cli/display/base.rb +3 -2
  19. data/lib/wavefront-cli/display/metricspolicy.rb +15 -0
  20. data/lib/wavefront-cli/display/printer/long.rb +11 -13
  21. data/lib/wavefront-cli/display/printer/sparkline.rb +3 -3
  22. data/lib/wavefront-cli/display/query.rb +1 -1
  23. data/lib/wavefront-cli/display/write.rb +2 -1
  24. data/lib/wavefront-cli/event.rb +2 -2
  25. data/lib/wavefront-cli/event_store.rb +2 -2
  26. data/lib/wavefront-cli/exception.rb +21 -0
  27. data/lib/wavefront-cli/exception_handler.rb +8 -1
  28. data/lib/wavefront-cli/helpers/load_file.rb +2 -2
  29. data/lib/wavefront-cli/maintenancewindow.rb +1 -1
  30. data/lib/wavefront-cli/metricspolicy.rb +42 -0
  31. data/lib/wavefront-cli/opt_handler.rb +3 -4
  32. data/lib/wavefront-cli/output/csv/query.rb +2 -2
  33. data/lib/wavefront-cli/output/hcl/dashboard.rb +6 -6
  34. data/lib/wavefront-cli/output/hcl/stdlib/array.rb +1 -1
  35. data/lib/wavefront-cli/output/wavefront/query.rb +7 -7
  36. data/lib/wavefront-cli/query.rb +1 -1
  37. data/lib/wavefront-cli/settings.rb +3 -4
  38. data/lib/wavefront-cli/stdlib/string.rb +5 -5
  39. data/lib/wavefront-cli/usage.rb +1 -1
  40. data/lib/wavefront-cli/version.rb +1 -1
  41. data/lib/wavefront-cli/write.rb +14 -18
  42. data/spec/.rubocop.yml +2 -17
  43. data/spec/constants.rb +4 -5
  44. data/spec/support/command_base.rb +12 -0
  45. data/spec/support/minitest_assertions.rb +15 -11
  46. data/spec/support/output_tester.rb +2 -2
  47. data/spec/support/supported_commands.rb +3 -1
  48. data/spec/test_mixins/import.rb +2 -2
  49. data/spec/test_mixins/search.rb +9 -7
  50. data/spec/test_mixins/set.rb +1 -1
  51. data/spec/wavefront-cli/account_spec.rb +6 -4
  52. data/spec/wavefront-cli/alert_spec.rb +29 -6
  53. data/spec/wavefront-cli/commands/base_spec.rb +4 -4
  54. data/spec/wavefront-cli/commands/config_spec.rb +3 -3
  55. data/spec/wavefront-cli/config_spec.rb +3 -3
  56. data/spec/wavefront-cli/controller_spec.rb +4 -0
  57. data/spec/wavefront-cli/dashboard_spec.rb +1 -1
  58. data/spec/wavefront-cli/derivedmetric_spec.rb +9 -7
  59. data/spec/wavefront-cli/display/printer/long_spec.rb +5 -3
  60. data/spec/wavefront-cli/display/printer/terse_spec.rb +1 -1
  61. data/spec/wavefront-cli/event_spec.rb +14 -11
  62. data/spec/wavefront-cli/event_store_spec.rb +16 -12
  63. data/spec/wavefront-cli/externallink_spec.rb +5 -3
  64. data/spec/wavefront-cli/maintenancewindow_spec.rb +25 -19
  65. data/spec/wavefront-cli/message_spec.rb +3 -3
  66. data/spec/wavefront-cli/metricspolicy_spec.rb +30 -0
  67. data/spec/wavefront-cli/opt_handler_spec.rb +4 -4
  68. data/spec/wavefront-cli/output/helpers.rb +1 -1
  69. data/spec/wavefront-cli/proxy_spec.rb +1 -1
  70. data/spec/wavefront-cli/query_spec.rb +1 -1
  71. data/spec/wavefront-cli/role_spec.rb +4 -3
  72. data/spec/wavefront-cli/serviceaccount_spec.rb +7 -7
  73. data/spec/wavefront-cli/stdlib/string_spec.rb +3 -1
  74. data/spec/wavefront-cli/usage_spec.rb +1 -1
  75. data/spec/wavefront-cli/{write_spec.rb → write_class_spec.rb} +1 -14
  76. data/wavefront-cli.gemspec +13 -12
  77. metadata +72 -146
  78. data/.travis.yml +0 -20
  79. data/spec/spec_helper.rb +0 -113
@@ -2,11 +2,13 @@
2
2
 
3
3
  require_relative '../constants'
4
4
 
5
+ # Produces a list of wf's commands
6
+ #
5
7
  class SupportedCommands
6
8
  attr_reader :cmd_dir
7
9
 
8
10
  def initialize
9
- @cmd_dir = ROOT + 'lib' + 'wavefront-cli' + 'commands'
11
+ @cmd_dir = ROOT.join('lib', 'wavefront-cli', 'commands')
10
12
  end
11
13
 
12
14
  def all
@@ -61,11 +61,11 @@ module WavefrontCliTest
61
61
  private
62
62
 
63
63
  def import_file
64
- RES_DIR + 'imports' + "#{api_path}.json"
64
+ RES_DIR.join('imports', "#{api_path}.json")
65
65
  end
66
66
 
67
67
  def update_file
68
- RES_DIR + 'updates' + "#{api_path}.json"
68
+ RES_DIR.join('updates', "#{api_path}.json")
69
69
  end
70
70
  end
71
71
  end
@@ -18,17 +18,19 @@ module WavefrontCliTest
18
18
  sort: { field: 'id', ascending: true })
19
19
  end
20
20
 
21
+ json_body = { limit: 10,
22
+ offset: 0,
23
+ query: [{ key: 'id',
24
+ value: id,
25
+ matchingMethod: 'EXACT',
26
+ negated: false }],
27
+ sort: { field: 'id', ascending: true } }.to_json
28
+
21
29
  assert_noop(
22
30
  "search id=#{id}",
23
31
  'uri: POST https://default.wavefront.com/api/v2/search/' \
24
32
  "#{search_api_path}",
25
- 'body: ' + { limit: 10,
26
- offset: 0,
27
- query: [{ key: 'id',
28
- value: id,
29
- matchingMethod: 'EXACT',
30
- negated: false }],
31
- sort: { field: 'id', ascending: true } }.to_json
33
+ "body: #{json_body}"
32
34
  )
33
35
  assert_abort_on_missing_creds("search id=#{id}")
34
36
  assert_usage('search')
@@ -23,7 +23,7 @@ module WavefrontCliTest
23
23
 
24
24
  def run_command(perm)
25
25
  wf.new("#{cmd_word} set #{set_key}=new_value #{id} " \
26
- "#{perm[:cmdline]}".split)
26
+ "#{perm[:cmdline]}".split)
27
27
  rescue SystemExit => e
28
28
  p e
29
29
  end
@@ -228,10 +228,12 @@ class AccountEndToEndTest < EndToEndTest
228
228
  cmd = "validate #{user_list.join(' ')}"
229
229
 
230
230
  quietly do
231
- assert_cmd_posts(cmd,
232
- '/api/v2/account/validateAccounts',
233
- user_list.to_json,
234
- IO.read(RES_DIR + 'responses' + 'user-validate.json'))
231
+ assert_cmd_posts(
232
+ cmd,
233
+ '/api/v2/account/validateAccounts',
234
+ user_list.to_json,
235
+ File.read(RES_DIR.join('responses', 'user-validate.json'))
236
+ )
235
237
  end
236
238
 
237
239
  assert_noop(cmd,
@@ -21,6 +21,25 @@ class AlertEndToEndTest < EndToEndTest
21
21
  include WavefrontCliTest::History
22
22
  include WavefrontCliTest::Acl
23
23
 
24
+ # This test isn't run if whoever runs it has a config file, because it tests
25
+ # wf's behaviour only if that file does not exist. CI will never have that
26
+ # file.
27
+ #
28
+ def test_no_config_no_envvars
29
+ skip if config?
30
+
31
+ blank_envvars
32
+ wf = WavefrontCliController
33
+
34
+ out, err = capture_io do
35
+ assert_raises(SystemExit) { wf.new(%w[alert list]) }
36
+ end
37
+
38
+ assert_empty(err)
39
+ assert out.start_with?('Credential error. Missing api token.')
40
+ assert_match(/You may also run 'wf config setup'/, out)
41
+ end
42
+
24
43
  def test_latest
25
44
  quietly do
26
45
  assert_cmd_gets("latest #{id}", "/api/v2/alert/#{id}/history")
@@ -48,10 +67,12 @@ class AlertEndToEndTest < EndToEndTest
48
67
  id: id, v: nil, name: nil)
49
68
  end
50
69
 
70
+ json_body = { id: id, name: nil, v: nil }.to_json
71
+
51
72
  assert_noop("clone #{id}",
52
73
  'uri: POST https://default.wavefront.com/api/v2/' \
53
74
  "alert/#{id}/clone",
54
- 'body: ' + { id: id, name: nil, v: nil }.to_json)
75
+ "body: #{json_body}")
55
76
 
56
77
  assert_invalid_id("clone #{invalid_id}")
57
78
  assert_usage('clone')
@@ -65,10 +86,12 @@ class AlertEndToEndTest < EndToEndTest
65
86
  id: id, v: 5, name: nil)
66
87
  end
67
88
 
89
+ json_body = { id: id, name: nil, v: 5 }.to_json
90
+
68
91
  assert_noop("clone #{id} --version 5",
69
92
  'uri: POST https://default.wavefront.com/api/v2/' \
70
93
  "alert/#{id}/clone",
71
- 'body: ' + { id: id, name: nil, v: 5 }.to_json)
94
+ "body: #{json_body}")
72
95
 
73
96
  assert_invalid_id("clone -v 10 #{invalid_id}")
74
97
  assert_usage('clone -v')
@@ -173,7 +196,7 @@ class AlertEndToEndTest < EndToEndTest
173
196
  assert_noop('snoozed',
174
197
  'uri: POST https://default.wavefront.com/api/v2/' \
175
198
  'search/alert',
176
- 'body: ' + state_search('snoozed').to_json)
199
+ "body: #{state_search('snoozed').to_json}")
177
200
 
178
201
  assert_abort_on_missing_creds('snoozed')
179
202
  end
@@ -193,7 +216,7 @@ class AlertEndToEndTest < EndToEndTest
193
216
  assert_noop('firing',
194
217
  'uri: POST https://default.wavefront.com/api/v2/' \
195
218
  'search/alert',
196
- 'body: ' + state_search('firing').to_json)
219
+ "body: #{state_search('firing').to_json}")
197
220
 
198
221
  assert_abort_on_missing_creds('firing')
199
222
  end
@@ -213,7 +236,7 @@ class AlertEndToEndTest < EndToEndTest
213
236
  assert_noop('currently firing',
214
237
  'uri: POST https://default.wavefront.com/api/v2/' \
215
238
  'search/alert',
216
- 'body: ' + state_search('firing').to_json)
239
+ "body: #{state_search('firing').to_json}")
217
240
 
218
241
  assert_abort_on_missing_creds('currently firing')
219
242
  end
@@ -233,7 +256,7 @@ class AlertEndToEndTest < EndToEndTest
233
256
  assert_noop('currently in_maintenance',
234
257
  'uri: POST https://default.wavefront.com/api/v2/' \
235
258
  'search/alert',
236
- 'body: ' + state_search('in_maintenance').to_json)
259
+ "body: #{state_search('in_maintenance').to_json}")
237
260
 
238
261
  assert_abort_on_missing_creds('currently in_maintenance')
239
262
  end
@@ -68,11 +68,11 @@ class WavefrontCommmandBaseTest < MiniTest::Test
68
68
  assert wf.commands.start_with?("Usage:\n")
69
69
  assert wf.commands.match(/ --help$/)
70
70
 
71
- wf.commands(600).split("\n")[1..-1].each do |c|
71
+ wf.commands(600).split("\n")[1..].each do |c|
72
72
  next if skip_cmd && c.match(skip_cmd)
73
73
 
74
74
  assert_match(/^ \w+/, c)
75
- assert_includes(c, CMN) unless c =~ /--help$/
75
+ assert_includes(c, CMN) unless /--help$/.match?(c)
76
76
  end
77
77
  end
78
78
 
@@ -80,7 +80,7 @@ class WavefrontCommmandBaseTest < MiniTest::Test
80
80
  assert wf.options(600).start_with?("Global options:\n")
81
81
  assert_match(/\nOptions:/, wf.options)
82
82
 
83
- wf.options(600).split("\n")[1..-1].each do |o|
83
+ wf.options(600).split("\n")[1..].each do |o|
84
84
  next if o == 'Global options:' || o == 'Options:' || o.empty?
85
85
 
86
86
  assert_instance_of(String, o)
@@ -88,7 +88,7 @@ class WavefrontCommmandBaseTest < MiniTest::Test
88
88
  refute o.end_with?('.')
89
89
  end
90
90
 
91
- assert_equal(1, wf.options.split("\n").select(&:empty?).size)
91
+ assert_equal(1, wf.options.split("\n").count(&:empty?))
92
92
  end
93
93
 
94
94
  def test_opt_row
@@ -20,7 +20,7 @@ class WavefrontCommmandConfigTest < WavefrontCommmandBaseTest
20
20
  refute wf.options(600).start_with?("Global options:\n")
21
21
  assert_match(/Options:\n/, wf.options)
22
22
 
23
- wf.options(600).split("\n")[1..-1].each do |o|
23
+ wf.options(600).split("\n")[1..].each do |o|
24
24
  next if o == 'Global options:' || o == 'Options:' || o.empty?
25
25
 
26
26
  assert_instance_of(String, o)
@@ -28,14 +28,14 @@ class WavefrontCommmandConfigTest < WavefrontCommmandBaseTest
28
28
  refute o.end_with?('.')
29
29
  end
30
30
 
31
- assert_equal(wf.options.split("\n").select(&:empty?).size, 0)
31
+ assert_equal(wf.options.split("\n").count(&:empty?), 0)
32
32
  end
33
33
 
34
34
  def test_commands
35
35
  assert wf.commands.start_with?("Usage:\n")
36
36
  assert wf.commands.match(/ --help$/)
37
37
 
38
- wf.commands(600).split("\n")[1..-1].each do |c|
38
+ wf.commands(600).split("\n")[1..].each do |c|
39
39
  next if skip_cmd && c.match(skip_cmd)
40
40
 
41
41
  assert_match(/^ \w+/, c)
@@ -6,7 +6,7 @@ require 'minitest/autorun'
6
6
  require_relative '../constants'
7
7
  require_relative '../../lib/wavefront-cli/config'
8
8
 
9
- DEF_CF = Pathname.new(ENV['HOME']) + '.wavefront'
9
+ DEF_CF = Pathname.new(Dir.home).join('.wavefront')
10
10
  CONF_TMP = Pathname.new('/tmp/outfile')
11
11
 
12
12
  # Test CLI configuration command
@@ -56,7 +56,7 @@ class WavefrontCliConfigTest < MiniTest::Test
56
56
  out, err = capture_io { assert_instance_of(IniFile, wf.base_config) }
57
57
  assert_empty(err)
58
58
 
59
- if (Pathname.new(ENV['HOME']) + '.wavefront').exist?
59
+ if Pathname.new(Dir.home).join('.wavefront').exist?
60
60
  assert_empty(out)
61
61
  else
62
62
  assert_match(/Creating new configuration file at/, out)
@@ -196,7 +196,7 @@ class WavefrontCliConfigTest < MiniTest::Test
196
196
  assert_equal(
197
197
  "[other]\ntoken = abcdefab-0123-abcd-0123-abcdefabcdef\n" \
198
198
  "endpoint = other.wavefront.com\nproxy = otherwf.localnet\n\n",
199
- IO.read(CONF_TMP)
199
+ File.read(CONF_TMP)
200
200
  )
201
201
 
202
202
  assert_raises(WavefrontCli::Exception::ProfileNotFound) do
@@ -52,6 +52,7 @@ class WavefrontCliHelpTest < MiniTest::Test
52
52
  end
53
53
  end
54
54
 
55
+ # rubocop:disable Style/RedundantBegin
55
56
  def test_command_help
56
57
  SupportedCommands.new.all.each do |cmd|
57
58
  begin
@@ -66,6 +67,7 @@ class WavefrontCliHelpTest < MiniTest::Test
66
67
  end
67
68
  end
68
69
  end
70
+ # rubocop:enable Style/RedundantBegin
69
71
 
70
72
  def test_malformed_config
71
73
  capture_io do
@@ -92,9 +94,11 @@ end
92
94
  # tested above.
93
95
  #
94
96
  # rubocop:disable Lint/MissingSuper
97
+ # rubocop:disable Style/RedundantInitialize
95
98
  class Giblets < WavefrontCliController
96
99
  def initialize; end
97
100
  end
101
+ # rubocop:enable Style/RedundantInitialize
98
102
  # rubocop:enable Lint/MissingSuper
99
103
 
100
104
  # Here's the subclass
@@ -45,7 +45,7 @@ class DashboardEndToEndTest < EndToEndTest
45
45
  assert_repeated_output('No favourites.') do
46
46
  all_permutations do |perm|
47
47
  stub_request(:post, "https://#{perm[:endpoint]}/api/v2/search" \
48
- '/dashboard')
48
+ '/dashboard')
49
49
  .with(body: { limit: 999,
50
50
  offset: 0,
51
51
  query: [{ key: 'favorite',
@@ -30,16 +30,18 @@ class DerivedMetricEndToEndTest < EndToEndTest
30
30
  query: 'ts(series)')
31
31
  end
32
32
 
33
+ json_body = {
34
+ query: 'ts(series)',
35
+ name: 'mymetric',
36
+ minutes: 5,
37
+ includeObsoleteMetrics: false,
38
+ processRateMinutes: 1
39
+ }.to_json
40
+
33
41
  assert_noop('create mymetric ts(series)',
34
42
  'uri: POST https://default.wavefront.com/api/v2/' \
35
43
  'derivedmetric',
36
- 'body: ' + {
37
- query: 'ts(series)',
38
- name: 'mymetric',
39
- minutes: 5,
40
- includeObsoleteMetrics: false,
41
- processRateMinutes: 1
42
- }.to_json)
44
+ "body: #{json_body}")
43
45
 
44
46
  assert_usage('create')
45
47
  assert_abort_on_missing_creds("create #{id} ts(series)")
@@ -78,6 +78,7 @@ class TestWavefrontDisplayPrinterLong < MiniTest::Test
78
78
  assert_equal(22, pr.longest_key_col(input))
79
79
  end
80
80
 
81
+ # rubocop:disable Layout/LineContinuationLeadingSpace
81
82
  def test_to_s
82
83
  assert_equal("today\n" \
83
84
  " weather sunny\n" \
@@ -92,24 +93,25 @@ class TestWavefrontDisplayPrinterLong < MiniTest::Test
92
93
  key1: 'val1', key2: 'val2'
93
94
  ).to_s)
94
95
  end
96
+ # rubocop:enable Layout/LineContinuationLeadingSpace
95
97
 
96
98
  def test_end_to_end
97
99
  input, expected = OutputTester.new.in_and_out('user-input.json',
98
100
  'user-human-long')
99
101
  output = WavefrontDisplayPrinter::Long.new(input).to_s
100
- assert_equal(expected, output + "\n")
102
+ assert_equal(expected, "#{output}\n")
101
103
 
102
104
  input, expected = OutputTester.new.in_and_out('user-input.json',
103
105
  'user-human-long-no_sep')
104
106
  output = WavefrontDisplayPrinter::Long.new(input, nil, nil,
105
107
  separator: false).to_s
106
- assert_equal(expected, output + "\n")
108
+ assert_equal(expected, "#{output}\n")
107
109
  end
108
110
 
109
111
  def test_end_to_end_fold
110
112
  input, expected = OutputTester.new.in_and_out('alert-input.json',
111
113
  'alert-human-long')
112
114
  output = WavefrontDisplayPrinter::Long.new(input).to_s
113
- assert_equal(expected, output + "\n")
115
+ assert_equal(expected, "#{output}\n")
114
116
  end
115
117
  end
@@ -61,6 +61,6 @@ class WavefrontDisplayPrinterTerse < MiniTest::Test
61
61
  input, expected = OutputTester.new.in_and_out('alerts-input.json',
62
62
  'alerts-human-terse')
63
63
  out = WavefrontDisplayPrinter::Terse.new(input, %i[id status name]).to_s
64
- assert_equal(expected, out + "\n")
64
+ assert_equal(expected, "#{out}\n")
65
65
  end
66
66
  end
@@ -16,11 +16,11 @@ class EventEndToEndTest < EndToEndTest
16
16
  attr_reader :test_state_dir
17
17
 
18
18
  include Wavefront::Mixins
19
- # include WavefrontCliTest::Describe
20
- # include WavefrontCliTest::Delete
21
- # include WavefrontCliTest::Search
22
- # #include WavefrontCliTest::Set
23
- # include WavefrontCliTest::Tag
19
+ include WavefrontCliTest::Describe
20
+ include WavefrontCliTest::Delete
21
+ include WavefrontCliTest::Search
22
+ include WavefrontCliTest::Set
23
+ include WavefrontCliTest::Tag
24
24
 
25
25
  def before_setup
26
26
  @test_state_dir = Pathname.new(Dir.mktmpdir)
@@ -99,7 +99,7 @@ class EventEndToEndTest < EndToEndTest
99
99
  assert state_file.exist?
100
100
  assert_equal(
101
101
  "{\"hosts\":[],\"description\":null,\"severity\":null,\"tags\":[]}\n",
102
- IO.read(state_file)
102
+ File.read(state_file)
103
103
  )
104
104
 
105
105
  assert_abort_on_missing_creds("create #{event_name}")
@@ -131,7 +131,7 @@ class EventEndToEndTest < EndToEndTest
131
131
  assert state_file.exist?
132
132
  assert_equal('{"hosts":["host1","host2"],"description":"reason",' \
133
133
  "\"severity\":null,\"tags\":[\"mytag\"]}\n",
134
- IO.read(state_file))
134
+ File.read(state_file))
135
135
  end
136
136
 
137
137
  def test_create_instantaneous_with_start_time
@@ -170,21 +170,24 @@ class EventEndToEndTest < EndToEndTest
170
170
  end
171
171
 
172
172
  def test_close_with_local_events_pop
173
+ @single_perm = true
174
+
173
175
  setup_test_state_dir
174
- assert((state_dir + '1568133440530:ev3:0').exist?)
176
+ assert state_dir.join('1568133440530:ev3:0').exist?
175
177
 
176
178
  quietly do
177
179
  assert_cmd_posts('close', '/api/v2/event/1568133440530:ev3:0/close')
178
180
  end
179
181
 
180
- refute((state_dir + '1568133440530:ev3:0').exist?)
181
- assert((state_dir + '1568133440520:ev2:0').exist?)
182
+ refute state_dir.join('1568133440530:ev3:0').exist?
183
+ assert state_dir.join('1568133440520:ev2:0').exist?
182
184
 
183
185
  quietly do
184
186
  assert_cmd_posts('close', '/api/v2/event/1568133440520:ev2:0/close')
185
187
  end
186
188
 
187
- refute((state_dir + '1568133440520:ev2:0').exist?)
189
+ refute state_dir.join('1568133440520:ev2:0').exist?
190
+ @single_perm = false
188
191
  end
189
192
 
190
193
  def test_wrap
@@ -53,7 +53,7 @@ class Test < MiniTest::Test
53
53
  end
54
54
 
55
55
  def test_create_dir_ok
56
- dir = TEST_EVENT_STORE_DIR + 'testdir'
56
+ dir = TEST_EVENT_STORE_DIR.join('testdir')
57
57
  refute dir.exist?
58
58
  wf.create_dir(dir)
59
59
  assert dir.exist?
@@ -64,13 +64,13 @@ class Test < MiniTest::Test
64
64
  setup_test_state_dir
65
65
 
66
66
  x = wf.list
67
- assert(x.all? { |e| e.is_a?(Pathname) })
67
+ assert(x.all?(Pathname))
68
68
  assert_equal(4, x.size)
69
-
70
69
  empty_test_state_dir
71
70
  end
72
71
 
73
72
  def test_list_empty_stack
73
+ wf = WavefrontCli::EventStore.new({}, TEST_EVENT_STORE_DIR)
74
74
  out, err = capture_io { assert_raises(SystemExit) { wf.list } }
75
75
  assert_empty(out)
76
76
  assert_equal("No locally recorded events.\n", err)
@@ -79,9 +79,9 @@ class Test < MiniTest::Test
79
79
  def test_pop_event
80
80
  setup_test_state_dir
81
81
 
82
- assert (wf.dir + '1568133440530:ev3:0').exist?
82
+ assert wf.dir.join('1568133440530:ev3:0').exist?
83
83
  assert_equal('1568133440530:ev3:0', wf.pop_event!)
84
- refute (wf.dir + '1568133440530:ev3:0').exist?
84
+ refute wf.dir.join('1568133440530:ev3:0').exist?
85
85
 
86
86
  empty_test_state_dir
87
87
  end
@@ -89,9 +89,9 @@ class Test < MiniTest::Test
89
89
  def test_pop_event_named
90
90
  setup_test_state_dir
91
91
 
92
- assert (wf.dir + '1568133440515:ev1:1').exist?
92
+ assert wf.dir.join('1568133440515:ev1:1').exist?
93
93
  assert_equal('1568133440515:ev1:1', wf.pop_event!('ev1'))
94
- refute (wf.dir + '1568133440515:ev1:1').exist?
94
+ refute wf.dir.join('1568133440515:ev1:1').exist?
95
95
 
96
96
  empty_test_state_dir
97
97
  end
@@ -99,14 +99,15 @@ class Test < MiniTest::Test
99
99
  def test_event_specific
100
100
  setup_test_state_dir
101
101
 
102
- assert (wf.dir + '1568133440515:ev1:1').exist?
102
+ assert wf.dir.join('1568133440515:ev1:1').exist?
103
103
  assert_equal('1568133440515:ev1:1', wf.event('1568133440515:ev1:1'))
104
- assert (wf.dir + '1568133440515:ev1:1').exist?
104
+ assert wf.dir.join('1568133440515:ev1:1').exist?
105
105
 
106
106
  empty_test_state_dir
107
107
  end
108
108
 
109
109
  def test_pop_event_empty_stack
110
+ wf = WavefrontCli::EventStore.new({}, TEST_EVENT_STORE_DIR)
110
111
  out, err = capture_io { assert_raises(SystemExit) { wf.pop_event! } }
111
112
  assert_empty(out)
112
113
  assert_equal("No locally recorded events.\n", err)
@@ -148,9 +149,12 @@ class Test < MiniTest::Test
148
149
  def test_create
149
150
  refute (wf.dir + id).exist?
150
151
  out, err = capture_io { wf.create!(id) }
151
- assert_match(/Event state recorded at .*1481553823153:testev:0./, out)
152
+ assert_match(/Event state recorded at .*#{id}./, out)
152
153
  assert_empty(err)
153
- assert (wf.dir + id).exist?
154
+ event_file = wf.dir + id
155
+ assert event_file.exist?
156
+ event_file.unlink
157
+ refute event_file.exist?
154
158
  end
155
159
 
156
160
  def test_create_with_nostate
@@ -161,7 +165,7 @@ class Test < MiniTest::Test
161
165
  private
162
166
 
163
167
  def id
164
- '1481553823153:testev:0'
168
+ '1481553823153:testevstore:0'
165
169
  end
166
170
 
167
171
  def dummy_event_files
@@ -24,11 +24,13 @@ class ExternalLinkEndToEndTest < EndToEndTest
24
24
  description: 'mydescription')
25
25
  end
26
26
 
27
+ json_body = { name: 'myname',
28
+ template: 'mytemplate',
29
+ description: 'mydescription' }.to_json
30
+
27
31
  assert_noop('create myname mydescription mytemplate',
28
32
  'uri: POST https://default.wavefront.com/api/v2/extlink',
29
- 'body: ' + { name: 'myname',
30
- template: 'mytemplate',
31
- description: 'mydescription' }.to_json)
33
+ "body: #{json_body}")
32
34
 
33
35
  assert_abort_on_missing_creds('create myname mydescription mytemplate')
34
36
  assert_usage('create myname mydescription')
@@ -42,15 +42,17 @@ class MaintenanceWindowEndToEndTest < EndToEndTest
42
42
  title: 'test_window')
43
43
  end
44
44
 
45
+ json_body = { title: 'test_window',
46
+ startTimeInSeconds: 1_566_776_337,
47
+ endTimeInSeconds: 1_566_776_399,
48
+ reason: 'testing',
49
+ relevantHostNames: %w[shark box] }.to_json
50
+
45
51
  assert_noop(
46
52
  'create --desc testing -H shark -s 1566776337 -H box ' \
47
53
  '-e 1566776399 test_window',
48
54
  'uri: POST https://default.wavefront.com/api/v2/maintenancewindow',
49
- 'body: ' + { title: 'test_window',
50
- startTimeInSeconds: 1_566_776_337,
51
- endTimeInSeconds: 1_566_776_399,
52
- reason: 'testing',
53
- relevantHostNames: %w[shark box] }.to_json
55
+ "body: #{json_body}"
54
56
  )
55
57
  end
56
58
 
@@ -172,16 +174,18 @@ class MaintenanceWindowEndToEndTest < EndToEndTest
172
174
  end
173
175
  end
174
176
 
177
+ json_body = { limit: 999,
178
+ offset: 0,
179
+ query: [{ key: 'runningState',
180
+ value: 'ongoing',
181
+ matchingMethod: 'EXACT' }],
182
+ sort: { field: 'runningState',
183
+ ascending: true } }.to_json
184
+
175
185
  assert_noop(
176
186
  'ongoing',
177
187
  'uri: POST https://default.wavefront.com/api/v2/search/maintenancewindow',
178
- 'body: ' + { limit: 999,
179
- offset: 0,
180
- query: [{ key: 'runningState',
181
- value: 'ongoing',
182
- matchingMethod: 'EXACT' }],
183
- sort: { field: 'runningState',
184
- ascending: true } }.to_json
188
+ "body: #{json_body}"
185
189
  )
186
190
 
187
191
  assert_empty(err)
@@ -198,16 +202,18 @@ class MaintenanceWindowEndToEndTest < EndToEndTest
198
202
  end
199
203
  end
200
204
 
205
+ json_body = { limit: 999,
206
+ offset: 0,
207
+ query: [{ key: 'runningState',
208
+ value: 'pending',
209
+ matchingMethod: 'EXACT' }],
210
+ sort: { field: 'runningState',
211
+ ascending: true } }.to_json
212
+
201
213
  assert_noop(
202
214
  'pending',
203
215
  'uri: POST https://default.wavefront.com/api/v2/search/maintenancewindow',
204
- 'body: ' + { limit: 999,
205
- offset: 0,
206
- query: [{ key: 'runningState',
207
- value: 'pending',
208
- matchingMethod: 'EXACT' }],
209
- sort: { field: 'runningState',
210
- ascending: true } }.to_json
216
+ "body: #{json_body}"
211
217
  )
212
218
 
213
219
  assert_empty(err)
@@ -15,11 +15,11 @@ class MessageEndToEndTest < EndToEndTest
15
15
  '/api/v2/message?limit=100&offset=0&unreadOnly=true')
16
16
  end
17
17
 
18
+ params = { offset: 0, limit: 100, unreadOnly: true }
19
+
18
20
  assert_noop('list',
19
21
  'uri: GET https://default.wavefront.com/api/v2/message',
20
- 'params: ' + {
21
- offset: 0, limit: 100, unreadOnly: true
22
- }.to_s)
22
+ "params: #{params}")
23
23
 
24
24
  assert_abort_on_missing_creds('list')
25
25
  end
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require_relative '../support/command_base'
5
+ require_relative '../../lib/wavefront-cli/metricspolicy'
6
+
7
+ # Ensure 'metricspolicy' commands produce the correct API calls.
8
+ #
9
+ class MetricsPolicyEndToEndTest < EndToEndTest
10
+ def test_describe
11
+ quietly do
12
+ assert_cmd_gets('describe', '/api/v2/metricspolicy')
13
+ assert_cmd_gets('describe -v4', '/api/v2/metricspolicy/history/4')
14
+ end
15
+ end
16
+
17
+ def _test_revert
18
+ quietly do
19
+ assert_cmd_posts('revert 2', '/api/v2/metricspolicy/revert/2')
20
+ end
21
+ end
22
+
23
+ def cmd_word
24
+ 'metricspolicy'
25
+ end
26
+
27
+ def sdk_class_name
28
+ 'MetricsPolicy'
29
+ end
30
+ end