wavefront-cli 4.2.1 → 4.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (190) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +1 -0
  3. data/.rubocop.yml +1 -14
  4. data/.travis.yml +4 -4
  5. data/Gemfile +2 -0
  6. data/HISTORY.md +82 -60
  7. data/Rakefile +2 -0
  8. data/bin/wf +1 -0
  9. data/lib/wavefront-cli/alert.rb +13 -5
  10. data/lib/wavefront-cli/apitoken.rb +2 -0
  11. data/lib/wavefront-cli/base.rb +95 -47
  12. data/lib/wavefront-cli/cloudintegration.rb +6 -0
  13. data/lib/wavefront-cli/command_mixins/acl.rb +6 -1
  14. data/lib/wavefront-cli/command_mixins/tag.rb +2 -0
  15. data/lib/wavefront-cli/commands/.rubocop.yml +3 -4
  16. data/lib/wavefront-cli/commands/alert.rb +2 -1
  17. data/lib/wavefront-cli/commands/apitoken.rb +6 -0
  18. data/lib/wavefront-cli/commands/base.rb +30 -21
  19. data/lib/wavefront-cli/commands/cloudintegration.rb +2 -0
  20. data/lib/wavefront-cli/commands/config.rb +2 -0
  21. data/lib/wavefront-cli/commands/dashboard.rb +2 -0
  22. data/lib/wavefront-cli/commands/derivedmetric.rb +2 -0
  23. data/lib/wavefront-cli/commands/event.rb +3 -1
  24. data/lib/wavefront-cli/commands/integration.rb +2 -1
  25. data/lib/wavefront-cli/commands/link.rb +2 -0
  26. data/lib/wavefront-cli/commands/message.rb +2 -0
  27. data/lib/wavefront-cli/commands/metric.rb +2 -0
  28. data/lib/wavefront-cli/commands/notificant.rb +2 -0
  29. data/lib/wavefront-cli/commands/proxy.rb +2 -0
  30. data/lib/wavefront-cli/commands/query.rb +2 -0
  31. data/lib/wavefront-cli/commands/savedsearch.rb +2 -0
  32. data/lib/wavefront-cli/commands/serviceaccount.rb +58 -0
  33. data/lib/wavefront-cli/commands/settings.rb +2 -0
  34. data/lib/wavefront-cli/commands/source.rb +3 -1
  35. data/lib/wavefront-cli/commands/user.rb +4 -1
  36. data/lib/wavefront-cli/commands/usergroup.rb +3 -0
  37. data/lib/wavefront-cli/commands/webhook.rb +2 -0
  38. data/lib/wavefront-cli/commands/window.rb +2 -0
  39. data/lib/wavefront-cli/commands/write.rb +2 -0
  40. data/lib/wavefront-cli/config.rb +23 -12
  41. data/lib/wavefront-cli/constants.rb +10 -4
  42. data/lib/wavefront-cli/controller.rb +53 -22
  43. data/lib/wavefront-cli/dashboard.rb +3 -0
  44. data/lib/wavefront-cli/derivedmetric.rb +12 -11
  45. data/lib/wavefront-cli/display/alert.rb +7 -4
  46. data/lib/wavefront-cli/display/apitoken.rb +2 -0
  47. data/lib/wavefront-cli/display/base.rb +34 -8
  48. data/lib/wavefront-cli/display/cloudintegration.rb +4 -2
  49. data/lib/wavefront-cli/display/dashboard.rb +2 -0
  50. data/lib/wavefront-cli/display/derivedmetric.rb +2 -0
  51. data/lib/wavefront-cli/display/distribution.rb +2 -0
  52. data/lib/wavefront-cli/display/event.rb +2 -0
  53. data/lib/wavefront-cli/display/externallink.rb +2 -0
  54. data/lib/wavefront-cli/display/integration.rb +2 -0
  55. data/lib/wavefront-cli/display/maintenancewindow.rb +2 -0
  56. data/lib/wavefront-cli/display/message.rb +7 -3
  57. data/lib/wavefront-cli/display/metric.rb +3 -1
  58. data/lib/wavefront-cli/display/notificant.rb +3 -1
  59. data/lib/wavefront-cli/display/printer/long.rb +36 -11
  60. data/lib/wavefront-cli/display/printer/sparkline.rb +3 -0
  61. data/lib/wavefront-cli/display/printer/terse.rb +6 -1
  62. data/lib/wavefront-cli/display/proxy.rb +2 -0
  63. data/lib/wavefront-cli/display/query.rb +35 -24
  64. data/lib/wavefront-cli/display/savedsearch.rb +2 -0
  65. data/lib/wavefront-cli/display/serviceaccount.rb +60 -0
  66. data/lib/wavefront-cli/display/settings.rb +2 -0
  67. data/lib/wavefront-cli/display/source.rb +18 -4
  68. data/lib/wavefront-cli/display/user.rb +56 -10
  69. data/lib/wavefront-cli/display/usergroup.rb +25 -19
  70. data/lib/wavefront-cli/display/webhook.rb +2 -0
  71. data/lib/wavefront-cli/display/write.rb +6 -2
  72. data/lib/wavefront-cli/event.rb +83 -62
  73. data/lib/wavefront-cli/exception.rb +3 -0
  74. data/lib/wavefront-cli/externallink.rb +6 -4
  75. data/lib/wavefront-cli/integration.rb +2 -0
  76. data/lib/wavefront-cli/maintenancewindow.rb +28 -17
  77. data/lib/wavefront-cli/message.rb +4 -0
  78. data/lib/wavefront-cli/metric.rb +4 -1
  79. data/lib/wavefront-cli/notificant.rb +2 -0
  80. data/lib/wavefront-cli/opt_handler.rb +2 -0
  81. data/lib/wavefront-cli/output/base.rb +8 -3
  82. data/lib/wavefront-cli/output/csv.rb +2 -0
  83. data/lib/wavefront-cli/output/csv/base.rb +2 -0
  84. data/lib/wavefront-cli/output/csv/query.rb +14 -7
  85. data/lib/wavefront-cli/output/hcl.rb +2 -0
  86. data/lib/wavefront-cli/output/hcl/alert.rb +2 -0
  87. data/lib/wavefront-cli/output/hcl/base.rb +10 -4
  88. data/lib/wavefront-cli/output/hcl/dashboard.rb +17 -8
  89. data/lib/wavefront-cli/output/hcl/notificant.rb +2 -0
  90. data/lib/wavefront-cli/output/hcl/stdlib/array.rb +2 -0
  91. data/lib/wavefront-cli/output/hcl/stdlib/string.rb +2 -0
  92. data/lib/wavefront-cli/output/json.rb +2 -0
  93. data/lib/wavefront-cli/output/ruby.rb +2 -0
  94. data/lib/wavefront-cli/output/wavefront.rb +2 -0
  95. data/lib/wavefront-cli/output/wavefront/query.rb +7 -4
  96. data/lib/wavefront-cli/output/yaml.rb +2 -0
  97. data/lib/wavefront-cli/proxy.rb +15 -3
  98. data/lib/wavefront-cli/query.rb +14 -12
  99. data/lib/wavefront-cli/savedsearch.rb +2 -0
  100. data/lib/wavefront-cli/serviceaccount.rb +179 -0
  101. data/lib/wavefront-cli/settings.rb +2 -0
  102. data/lib/wavefront-cli/source.rb +2 -0
  103. data/lib/wavefront-cli/stdlib/array.rb +3 -0
  104. data/lib/wavefront-cli/stdlib/string.rb +17 -11
  105. data/lib/wavefront-cli/user.rb +10 -4
  106. data/lib/wavefront-cli/usergroup.rb +4 -2
  107. data/lib/wavefront-cli/version.rb +3 -1
  108. data/lib/wavefront-cli/webhook.rb +2 -0
  109. data/lib/wavefront-cli/write.rb +80 -46
  110. data/spec/.rubocop.yml +3 -16
  111. data/spec/constants.rb +21 -0
  112. data/spec/spec_helper.rb +8 -422
  113. data/spec/support/command_base.rb +82 -0
  114. data/spec/support/minitest_assertions.rb +262 -0
  115. data/spec/support/output_tester.rb +32 -0
  116. data/spec/support/supported_commands.rb +19 -0
  117. data/spec/test_mixins/acl.rb +169 -0
  118. data/spec/test_mixins/delete.rb +25 -0
  119. data/spec/test_mixins/deleteundelete.rb +106 -0
  120. data/spec/test_mixins/describe.rb +24 -0
  121. data/spec/test_mixins/dump.rb +43 -0
  122. data/spec/test_mixins/general.rb +11 -0
  123. data/spec/test_mixins/history.rb +35 -0
  124. data/spec/test_mixins/import.rb +65 -0
  125. data/spec/test_mixins/list.rb +29 -0
  126. data/spec/test_mixins/search.rb +98 -0
  127. data/spec/test_mixins/set.rb +47 -0
  128. data/spec/test_mixins/tag.rb +99 -0
  129. data/spec/wavefront-cli/alert_spec.rb +288 -111
  130. data/spec/wavefront-cli/apitoken_spec.rb +53 -24
  131. data/spec/wavefront-cli/base_spec.rb +9 -27
  132. data/spec/wavefront-cli/cloudintegration_spec.rb +65 -29
  133. data/spec/wavefront-cli/commands/alert_spec.rb +1 -0
  134. data/spec/wavefront-cli/commands/base_spec.rb +15 -13
  135. data/spec/wavefront-cli/commands/cloudintegration_spec.rb +1 -0
  136. data/spec/wavefront-cli/commands/config_spec.rb +3 -0
  137. data/spec/wavefront-cli/commands/dashboard_spec.rb +1 -0
  138. data/spec/wavefront-cli/commands/derivedmetric_spec.rb +1 -0
  139. data/spec/wavefront-cli/commands/event_spec.rb +1 -0
  140. data/spec/wavefront-cli/commands/link_spec.rb +1 -0
  141. data/spec/wavefront-cli/commands/message_spec.rb +1 -0
  142. data/spec/wavefront-cli/commands/metric_spec.rb +1 -0
  143. data/spec/wavefront-cli/commands/proxy_spec.rb +1 -0
  144. data/spec/wavefront-cli/commands/query_spec.rb +1 -0
  145. data/spec/wavefront-cli/commands/webhook_spec.rb +1 -0
  146. data/spec/wavefront-cli/commands/window_spec.rb +1 -0
  147. data/spec/wavefront-cli/commands/write_spec.rb +1 -0
  148. data/spec/wavefront-cli/config_spec.rb +25 -14
  149. data/spec/wavefront-cli/controller_spec.rb +13 -3
  150. data/spec/wavefront-cli/dashboard_spec.rb +125 -76
  151. data/spec/wavefront-cli/derivedmetric_spec.rb +83 -67
  152. data/spec/wavefront-cli/display/base_spec.rb +5 -7
  153. data/spec/wavefront-cli/display/printer/long_spec.rb +20 -16
  154. data/spec/wavefront-cli/display/printer/terse_spec.rb +5 -4
  155. data/spec/wavefront-cli/event_spec.rb +360 -18
  156. data/spec/wavefront-cli/externallink_spec.rb +92 -58
  157. data/spec/wavefront-cli/integration_spec.rb +129 -31
  158. data/spec/wavefront-cli/maintenancewindow_spec.rb +270 -32
  159. data/spec/wavefront-cli/message_spec.rb +73 -30
  160. data/spec/wavefront-cli/metric_spec.rb +60 -22
  161. data/spec/wavefront-cli/notificant_spec.rb +45 -32
  162. data/spec/wavefront-cli/opt_handler_spec.rb +4 -1
  163. data/spec/wavefront-cli/output/csv/query_spec.rb +21 -19
  164. data/spec/wavefront-cli/output/csv_spec.rb +5 -2
  165. data/spec/wavefront-cli/output/hcl_spec.rb +5 -2
  166. data/spec/wavefront-cli/output/helpers.rb +18 -0
  167. data/spec/wavefront-cli/output/json_spec.rb +3 -1
  168. data/spec/wavefront-cli/output/ruby_spec.rb +3 -1
  169. data/spec/wavefront-cli/output/wavefront/query_spec.rb +3 -1
  170. data/spec/wavefront-cli/output/wavefront_spec.rb +6 -4
  171. data/spec/wavefront-cli/output/yaml_spec.rb +3 -1
  172. data/spec/wavefront-cli/proxy_spec.rb +49 -27
  173. data/spec/wavefront-cli/query_spec.rb +174 -92
  174. data/spec/wavefront-cli/resources/responses/query.json +1 -0
  175. data/spec/wavefront-cli/resources/updates/alert.json +15 -0
  176. data/spec/wavefront-cli/resources/updates/dashboard.json +1 -0
  177. data/spec/wavefront-cli/savedsearch_spec.rb +35 -18
  178. data/spec/wavefront-cli/serviceaccount_spec.rb +399 -0
  179. data/spec/wavefront-cli/settings_spec.rb +42 -11
  180. data/spec/wavefront-cli/source_spec.rb +120 -23
  181. data/spec/wavefront-cli/stdlib/array_spec.rb +2 -1
  182. data/spec/wavefront-cli/stdlib/string_spec.rb +9 -6
  183. data/spec/wavefront-cli/user_spec.rb +278 -108
  184. data/spec/wavefront-cli/usergroup_spec.rb +152 -102
  185. data/spec/wavefront-cli/webhook_spec.rb +30 -15
  186. data/spec/wavefront-cli/write_spec.rb +25 -1
  187. data/wavefront-cli.gemspec +5 -3
  188. metadata +65 -21
  189. data/spec/wavefront-cli/commands/spec_helper.rb +0 -3
  190. data/spec/wavefront-cli/display/spec_helper.rb +0 -3
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
4
+ require 'minitest/autorun'
5
+ require_relative '../../../support/output_tester'
3
6
  require_relative '../../../../lib/wavefront-cli/display/printer/terse'
4
- require_relative '../spec_helper'
5
- require_relative '../../../spec_helper'
6
7
 
7
8
  TERSE_DATA = [{ id: 'id1', name: 'name1', fa: 1, fb: 2, fc: 3 },
8
9
  { id: 'id2', name: 'name2', fa: 11, fb: 21, fc: 31 }].freeze
@@ -50,8 +51,8 @@ class WavefrontDisplayPrinterTerse < MiniTest::Test
50
51
  end
51
52
 
52
53
  def test_end_to_end
53
- input, expected = OUTPUT_TESTER.in_and_out('alerts-input.json',
54
- 'alerts-human-terse')
54
+ input, expected = OutputTester.new.in_and_out('alerts-input.json',
55
+ 'alerts-human-terse')
55
56
  out = WavefrontDisplayPrinter::Terse.new(input, %i[id status name]).to_s
56
57
  assert_equal(expected, out + "\n")
57
58
  end
@@ -1,21 +1,363 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
- id = '1481553823153:testev'
4
- bad_id = '__bad_id__'
5
- word = 'event'
6
-
7
- require_relative '../spec_helper'
8
- require_relative "../../lib/wavefront-cli/#{word}"
9
-
10
- describe "#{word} command" do
11
- missing_creds(word, ['list', "describe #{id}", "create #{id}",
12
- "close #{id}", "delete #{id}"])
13
- cmd_to_call(word, "describe #{id}", path: "/api/v2/#{word}/#{id}")
14
- cmd_to_call(word, "create -N #{id}",
15
- method: :post, path: "/api/v2/#{word}")
16
- cmd_to_call(word, "close #{id}",
17
- method: :post, path: "/api/v2/#{word}/#{id}/close")
18
- tag_tests(word, id, bad_id)
19
- search_tests(word, id)
20
- test_list_output(word)
4
+ require 'tmpdir'
5
+ require_relative '../support/command_base'
6
+ require_relative '../../lib/wavefront-cli/event'
7
+ require 'wavefront-sdk/support/mixins'
8
+
9
+ TEST_EVENT_DIR = Pathname.new('/tmp/wf_event_test')
10
+
11
+ # Test the 'event' command behaves as it should. Unit tests for class methods
12
+ # come later.
13
+ #
14
+ class EventEndToEndTest < EndToEndTest
15
+ attr_reader :test_state_dir
16
+ include Wavefront::Mixins
17
+
18
+ include WavefrontCliTest::Describe
19
+ include WavefrontCliTest::Delete
20
+ # Ones above work, ones below don't
21
+ # include WavefrontCliTest::Search
22
+ # include WavefrontCliTest::Set
23
+ # include WavefrontCliTest::Tags
24
+
25
+ def before_setup
26
+ @test_state_dir = Pathname.new(Dir.mktmpdir)
27
+ ENV['WF_EVENT_STATE_DIR'] = test_state_dir.to_s
28
+ end
29
+
30
+ def teardown
31
+ FileUtils.rm_r(test_state_dir)
32
+ end
33
+
34
+ def cmd_instance
35
+ cmd_class.new(event_state_dir: TEST_EVENT_DIR)
36
+ puts cmd_class
37
+ end
38
+
39
+ def test_list_no_options
40
+ str = '/api/v2/event\?' \
41
+ 'earliestStartTimeEpochMillis=\d{13}+&' \
42
+ 'latestStartTimeEpochMillis=\d{13}+&' \
43
+ 'limit=100'
44
+
45
+ quietly { assert_cmd_gets('list', Regexp.new(str)) }
46
+ end
47
+
48
+ def test_list_start_and_end_time
49
+ quietly do
50
+ assert_cmd_gets("list #{start_and_end_opts}",
51
+ '/api/v2/event?earliestStartTimeEpochMillis=' \
52
+ "#{epoch_time[0]}&latestStartTimeEpochMillis=" \
53
+ "#{epoch_time[1]}&limit=100")
54
+ end
55
+ end
56
+
57
+ def test_list_start_and_end_time_offset_and_cursor
58
+ quietly do
59
+ assert_cmd_gets("list #{start_and_end_opts} -o #{id} --limit 8",
60
+ '/api/v2/event' \
61
+ "?earliestStartTimeEpochMillis=#{epoch_time[0]}" \
62
+ "&latestStartTimeEpochMillis=#{epoch_time[1]}" \
63
+ "&cursor=#{id}" \
64
+ '&limit=8')
65
+ end
66
+ end
67
+
68
+ def test_create
69
+ mock_id = "#{start_time}:#{event_name}:1"
70
+ state_file = state_dir + mock_id
71
+
72
+ out, err = capture_io do
73
+ assert_cmd_posts("create #{event_name}",
74
+ '/api/v2/event',
75
+ { name: event_name,
76
+ startTime: a_ms_timestamp,
77
+ annotations: {},
78
+ hosts: [],
79
+ tags: [] },
80
+ { name: event_name,
81
+ id: mock_id,
82
+ startTime: start_time,
83
+ tags: [] }.to_json)
84
+ end
85
+
86
+ assert_empty(err)
87
+ assert_match(/^Event state recorded at #{state_file}\.\n/, out)
88
+ assert state_file.exist?
89
+ assert_equal(
90
+ "{\"hosts\":[],\"description\":null,\"severity\":null,\"tags\":[]}\n",
91
+ IO.read(state_file)
92
+ )
93
+
94
+ assert_abort_on_missing_creds("create #{event_name}")
95
+ end
96
+
97
+ def test_create_with_hosts
98
+ mock_id = "#{start_time}:#{event_name}:1"
99
+ state_file = state_dir + mock_id
100
+ refute state_file.exist?
101
+
102
+ out, err = capture_io do
103
+ assert_cmd_posts('create -d reason -H host1 -H host2 -g ' \
104
+ "mytag #{event_name}",
105
+ '/api/v2/event',
106
+ { name: event_name,
107
+ startTime: a_ms_timestamp,
108
+ annotations: { details: 'reason' },
109
+ hosts: %w[host1 host2],
110
+ tags: %w[mytag] },
111
+ { name: event_name,
112
+ id: mock_id,
113
+ startTime: start_time,
114
+ hosts: %w[host1 host2],
115
+ tags: %w[mytag] }.to_json)
116
+ end
117
+
118
+ assert_empty(err)
119
+ assert_match(/^Event state recorded at #{state_file}\.\n/, out)
120
+ assert state_file.exist?
121
+ assert_equal('{"hosts":["host1","host2"],"description":"reason",' \
122
+ "\"severity\":null,\"tags\":[\"mytag\"]}\n",
123
+ IO.read(state_file))
124
+ end
125
+
126
+ def test_create_instantaneous_with_start_time
127
+ out, err = capture_io do
128
+ assert_cmd_posts("create -i -s #{start_time} -g tag1 " \
129
+ "-g tag2 #{event_name}",
130
+ '/api/v2/event',
131
+ { name: event_name,
132
+ startTime: start_time,
133
+ endTime: start_time + 1,
134
+ annotations: {},
135
+ hosts: [],
136
+ tags: %w[tag1 tag2] },
137
+ { name: event_name,
138
+ annotations: {},
139
+ id: "#{start_time}:#{event_name}:1",
140
+ endTime: start_time + 1,
141
+ startTime: start_time,
142
+ tags: %w[tag1 tag2] }.to_json)
143
+ end
144
+
145
+ assert_empty(err)
146
+ assert_match(/^id 1481553823153:test_event:1\n/, out)
147
+ assert_match(/\nannotations <none>\n/, out)
148
+ assert_match(/\ntags tag1\n tag2\n/, out)
149
+ end
150
+
151
+ def test_close_named_event
152
+ quietly do
153
+ assert_cmd_posts('close 1568133440520:ev2:0',
154
+ '/api/v2/event/1568133440520:ev2:0/close')
155
+ end
156
+
157
+ assert_abort_on_missing_creds("close #{id}")
158
+ end
159
+
160
+ def test_close_with_no_local_events
161
+ quietly { assert_cmd_posts("close #{id}", "/api/v2/event/#{id}/close") }
162
+ assert_exits_with('No locally recorded events.', 'close')
163
+ end
164
+
165
+ def test_close_with_local_events_no_match
166
+ setup_test_state_dir
167
+ assert_exits_with("No locally stored event matches 'X'.", 'close X')
168
+ end
169
+
170
+ def test_close_with_local_events_pop
171
+ setup_test_state_dir
172
+ assert((state_dir + '1568133440530:ev3:0').exist?)
173
+
174
+ quietly do
175
+ assert_cmd_posts('close', '/api/v2/event/1568133440530:ev3:0/close')
176
+ end
177
+
178
+ refute((state_dir + '1568133440530:ev3:0').exist?)
179
+ assert((state_dir + '1568133440520:ev2:0').exist?)
180
+
181
+ quietly do
182
+ assert_cmd_posts('close', '/api/v2/event/1568133440520:ev2:0/close')
183
+ end
184
+
185
+ refute((state_dir + '1568133440520:ev2:0').exist?)
186
+ end
187
+
188
+ def test_wrap
189
+ mock_id = "#{start_time}:#{event_name}:1"
190
+ state_file = state_dir + mock_id
191
+
192
+ all_permutations do |p|
193
+ open_stub = wrap_open_stub(p, mock_id)
194
+ close_stub = wrap_close_stub(p, mock_id)
195
+
196
+ out, err = capture_io do
197
+ assert_raises(SystemExit) do
198
+ wf.new('event wrap -C date -d reason -g mytag ' \
199
+ "#{event_name} #{p[:cmdline]}".split)
200
+ end
201
+ end
202
+
203
+ lines = out.split("\n")
204
+
205
+ assert_equal("Event state recorded at #{state_file}.", lines[0])
206
+ assert_equal('Command output follows, on STDERR:', lines[1])
207
+ assert_match(/^-+$/, lines[2])
208
+ assert_match(/^-+$/, lines[3])
209
+ refute_empty(err)
210
+ assert_requested(open_stub)
211
+ assert_requested(close_stub)
212
+ end
213
+ end
214
+
215
+ def test_show
216
+ setup_test_state_dir
217
+
218
+ out, err = capture_io do
219
+ assert_raises(SystemExit) { wf.new("event show -c #{CF}".split) }
220
+ end
221
+
222
+ assert_empty(err)
223
+ assert_equal("1568133440530:ev3:0\n1568133440520:ev2:0\n" \
224
+ "1568133440515:ev1:1\n1568133440510:ev1:0\n", out)
225
+ end
226
+
227
+ private
228
+
229
+ def id
230
+ '1481553823153:testev'
231
+ end
232
+
233
+ def event_name
234
+ 'test_event'
235
+ end
236
+
237
+ def invalid_id
238
+ '__BAD__'
239
+ end
240
+
241
+ def cmd_word
242
+ 'event'
243
+ end
244
+
245
+ def start_time
246
+ 1_481_553_823_153
247
+ end
248
+
249
+ def import_fields
250
+ %i[method title creatorId triggers template]
251
+ end
252
+
253
+ def state_dir
254
+ test_state_dir + (Etc.getlogin || 'notty')
255
+ end
256
+
257
+ def setup_test_state_dir
258
+ FileUtils.mkdir_p(state_dir)
259
+
260
+ %w[1568133440510:ev1:0
261
+ 1568133440515:ev1:1
262
+ 1568133440520:ev2:0
263
+ 1568133440530:ev3:0].each do |f|
264
+ File.open(state_dir + f, 'w') { |fh| fh.puts('dummy_data') }
265
+ end
266
+ end
267
+
268
+ def wrap_open_stub(perm, mock_id)
269
+ stub_request(:post, "https://#{perm[:endpoint]}/api/v2/event")
270
+ .with(body: { name: event_name,
271
+ startTime: a_ms_timestamp,
272
+ annotations: { details: 'reason' },
273
+ hosts: [],
274
+ tags: %w[mytag] })
275
+ .to_return(body: { name: event_name,
276
+ id: mock_id,
277
+ startTime: start_time,
278
+ hosts: [],
279
+ tags: %w[mytag] }.to_json,
280
+ status: 200)
281
+ end
282
+
283
+ def wrap_close_stub(perm, mock_id)
284
+ stub_request(:post,
285
+ "https://#{perm[:endpoint]}/api/v2/event/#{mock_id}/close")
286
+ .with(body: 'null')
287
+ end
288
+ end
289
+
290
+ # Unit tests for class methods
291
+ #
292
+ class EventMethodTests < Minitest::Test
293
+ attr_reader :wf, :wfse
294
+
295
+ def setup
296
+ @wf = WavefrontCli::Event.new({})
297
+ @wfse = WavefrontCli::Event.new(start: wall_time[0],
298
+ end: wall_time[1],
299
+ limit: 55,
300
+ cursor: '1481553823153:testev')
301
+ end
302
+
303
+ def test_create_dir_ok
304
+ base = Pathname.new(Dir.mktmpdir)
305
+ dir = base + 'testdir'
306
+ refute dir.exist?
307
+ wf.create_dir(dir)
308
+ assert dir.exist?
309
+ dir.unlink
310
+ base.unlink
311
+ end
312
+
313
+ def test_create_dir_fail
314
+ spy = Spy.on(FileUtils, :mkdir_p).and_return(false)
315
+
316
+ assert_raises(WavefrontCli::Exception::SystemError) do
317
+ wf.create_dir(Pathname.new('/any/old/directory'))
318
+ end
319
+
320
+ assert spy.has_been_called?
321
+ spy.unhook
322
+ end
323
+
324
+ def test_list_args_defaults
325
+ x = wf.list_args
326
+ assert_instance_of(Array, x)
327
+ assert_equal(4, x.size)
328
+ assert_in_delta(((Time.now - 600).to_i * 1000), x[0], 1000)
329
+ assert_in_delta((Time.now.to_i * 1000), x[1], 1000)
330
+ assert_equal(100, x[2])
331
+ assert_nil(x[3])
332
+ end
333
+
334
+ def test_list_args_options
335
+ x = wfse.list_args
336
+ assert_instance_of(Array, x)
337
+ assert_equal(4, x.size)
338
+ assert_equal(epoch_ms_time[0], x[0])
339
+ assert_equal(epoch_ms_time[1], x[1])
340
+ assert_equal(55, x[2])
341
+ assert_equal('1481553823153:testev', x[3])
342
+ end
343
+
344
+ def test_window_start
345
+ assert_kind_of(Numeric, wf.window_start)
346
+ assert_equal(epoch_ms_time[0], wfse.window_start)
347
+ end
348
+
349
+ def test_window_end
350
+ assert_kind_of(Numeric, wf.window_end)
351
+ assert_equal(epoch_ms_time[1], wfse.window_end)
352
+ end
353
+
354
+ private
355
+
356
+ def wall_time
357
+ [Time.at(1_568_112_000), Time.at(1_568_112_999)]
358
+ end
359
+
360
+ def epoch_ms_time
361
+ wall_time.map { |t| (t.to_i * 1000) }
362
+ end
21
363
  end
@@ -1,63 +1,97 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
- require_relative '../spec_helper'
4
+ require_relative '../support/command_base'
4
5
  require_relative '../../lib/wavefront-cli/externallink'
5
6
 
6
- id = 'lq6rPlSg2CFMSrg6'
7
- bad_id = '__BAD__'
8
- k = WavefrontCli::ExternalLink
9
- word = 'link'
10
-
11
- describe "#{word} command" do
12
- missing_creds(word, ['list', "describe #{id}", "delete #{id}"])
13
- list_tests(word, 'extlink', k)
14
- noop_tests(word, id, false, 'extlink', k)
15
- search_tests(word, id, k, 'extlink')
16
- cmd_to_call(word, "describe #{id}", { path: "/api/v2/extlink/#{id}" }, k)
17
- cmd_to_call(word, "delete #{id}",
18
- { method: :delete, path: "/api/v2/extlink/#{id}" }, k)
19
- invalid_ids(word, ["describe #{bad_id}", "delete #{bad_id}"])
20
-
21
- cmd_to_call(word, 'create name description template',
22
- { method: :post,
23
- path: '/api/v2/extlink',
24
- body: {
25
- name: 'name',
26
- template: 'template',
27
- description: 'description'
28
- }.to_json,
29
- headers: JSON_POST_HEADERS },
30
- WavefrontCli::ExternalLink)
31
-
32
- cmd_to_call(word, 'create -m metricregex -s sourceregex name ' \
33
- 'description template',
34
- { method: :post,
35
- path: '/api/v2/extlink',
36
- body: {
37
- name: 'name',
38
- template: 'template',
39
- description: 'description',
40
- metricFilterRegex: 'metricregex',
41
- sourceFilterRegex: 'sourceregex'
42
- }.to_json,
43
- headers: JSON_POST_HEADERS },
44
- WavefrontCli::ExternalLink)
45
-
46
- cmd_to_call(word, 'create -p key1=reg1 -p key2=reg2 ' \
47
- '-m metricregex name description template',
48
- { method: :post,
49
- path: '/api/v2/extlink',
50
- body: {
51
- name: 'name',
52
- template: 'template',
53
- description: 'description',
54
- metricFilterRegex: 'metricregex',
55
- pointFilterRegex: {
56
- key1: 'reg1',
57
- key2: 'reg2'
58
- }
59
- }.to_json,
60
- headers: JSON_POST_HEADERS },
61
- WavefrontCli::ExternalLink)
62
- test_list_output(word, k)
7
+ # Ensure 'link' commands produce the correct API calls.
8
+ #
9
+ class ExternalLinkEndToEndTest < EndToEndTest
10
+ include WavefrontCliTest::List
11
+ include WavefrontCliTest::Describe
12
+ include WavefrontCliTest::Dump
13
+ # include WavefrontCliTest::Import
14
+ include WavefrontCliTest::Set
15
+ include WavefrontCliTest::Delete
16
+ include WavefrontCliTest::Search
17
+
18
+ def test_create_without_options
19
+ quietly do
20
+ assert_cmd_posts('create myname mydescription mytemplate',
21
+ '/api/v2/extlink',
22
+ name: 'myname',
23
+ template: 'mytemplate',
24
+ description: 'mydescription')
25
+ end
26
+
27
+ assert_noop('create myname mydescription mytemplate',
28
+ 'uri: POST https://default.wavefront.com/api/v2/extlink',
29
+ 'body: ' + { name: 'myname',
30
+ template: 'mytemplate',
31
+ description: 'mydescription' }.to_json)
32
+
33
+ assert_abort_on_missing_creds('create myname mydescription mytemplate')
34
+ assert_usage('create myname mydescription')
35
+ assert_usage('create myname')
36
+ end
37
+
38
+ def test_create_with_regexes
39
+ quietly do
40
+ assert_cmd_posts('create -m metricregex -s sourceregex myname ' \
41
+ 'mydescription mytemplate',
42
+ '/api/v2/extlink',
43
+ name: 'myname',
44
+ template: 'mytemplate',
45
+ description: 'mydescription',
46
+ metricFilterRegex: 'metricregex',
47
+ sourceFilterRegex: 'sourceregex')
48
+ end
49
+ end
50
+
51
+ def test_create_with_keys_and_regexes
52
+ quietly do
53
+ assert_cmd_posts('create -p key1=reg1 -p key2=reg2 ' \
54
+ '-m metricregex myname mydescription mytemplate',
55
+ '/api/v2/extlink',
56
+ name: 'myname',
57
+ template: 'mytemplate',
58
+ description: 'mydescription',
59
+ metricFilterRegex: 'metricregex',
60
+ pointFilterRegex: {
61
+ key1: 'reg1',
62
+ key2: 'reg2'
63
+ })
64
+ end
65
+ end
66
+
67
+ private
68
+
69
+ def id
70
+ 'lq6rPlSg2CFMSrg6'
71
+ end
72
+
73
+ def invalid_id
74
+ '__BAD__'
75
+ end
76
+
77
+ def cmd_word
78
+ 'link'
79
+ end
80
+
81
+ def api_path
82
+ 'extlink'
83
+ end
84
+
85
+ def sdk_class_name
86
+ 'ExternalLink'
87
+ end
88
+
89
+ def friendly_name
90
+ 'external link'
91
+ end
92
+
93
+ def import_fields
94
+ %i[condition displayExpression resolveAfterMinutes minutes severity
95
+ tags target name]
96
+ end
63
97
  end