wavefront-cli 4.2.1 → 4.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.
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
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WavefrontCliTest
4
+ #
5
+ # Mixin to test standard 'set' commands
6
+ #
7
+ module Set
8
+ def test_set
9
+ all_permutations do |p|
10
+ get_stub = _set_get_stub(p)
11
+ put_stub = _set_put_stub(p)
12
+ out, err = capture_io { run_command(p) }
13
+ assert_empty(err)
14
+ assert_equal('No data.', out.strip)
15
+ assert_requested(get_stub)
16
+ assert_requested(put_stub)
17
+ assert_usage('set key=value')
18
+ assert_cannot_noop("set key=value #{id}")
19
+ assert_invalid_id("set key=value #{invalid_id}")
20
+ assert_abort_on_missing_creds("set key=value #{id}")
21
+ end
22
+ end
23
+
24
+ def run_command(perm)
25
+ wf.new("#{cmd_word} set #{set_key}=new_value #{id} " \
26
+ "#{perm[:cmdline]}".split)
27
+ rescue SystemExit => e
28
+ p e
29
+ end
30
+
31
+ def _set_get_stub(perm)
32
+ stub_request(:get,
33
+ "https://#{perm[:endpoint]}/api/v2/#{api_path}/#{id}")
34
+ .with(headers: mk_headers(perm[:token]))
35
+ .to_return(status: 200,
36
+ body: { id: id, set_key => 'old_value' }.to_json,
37
+ headers: {})
38
+ end
39
+
40
+ def _set_put_stub(perm)
41
+ stub_request(:put, "https://#{perm[:endpoint]}/api/v2/#{api_path}/#{id}")
42
+ .with(body: { id: id, set_key => 'new_value' },
43
+ headers: mk_headers(perm[:token]))
44
+ .to_return(status: 200, body: '', headers: {})
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WavefrontCliTest
4
+ #
5
+ # Include this module to get full tag tests
6
+ #
7
+ module Tag
8
+ def test_tags
9
+ assert_repeated_output("No tags set on #{friendly_name} '#{id}'.") do
10
+ assert_cmd_gets("tags #{id}", "/api/v2/#{api_path}/#{id}/tag")
11
+ end
12
+
13
+ assert_noop("tags #{id}",
14
+ 'uri: GET https://default.wavefront.com/api/v2/' \
15
+ "#{api_path}/#{id}/tag")
16
+ assert_invalid_id("tags #{invalid_id}")
17
+ assert_usage('tags')
18
+ assert_abort_on_missing_creds("tags #{id}")
19
+ end
20
+
21
+ def test_tag_set
22
+ assert_repeated_output("Set tags on #{friendly_name} '#{id}'.") do
23
+ assert_cmd_posts("tag set #{id} mytag",
24
+ "/api/v2/#{api_path}/#{id}/tag",
25
+ %w[mytag].to_json)
26
+ end
27
+
28
+ assert_noop("tag set #{id} mytag",
29
+ 'uri: POST https://default.wavefront.com/api/v2/' \
30
+ "#{api_path}/#{id}/tag",
31
+ 'body: ["mytag"]')
32
+
33
+ assert_repeated_output("Set tags on #{friendly_name} '#{id}'.") do
34
+ assert_cmd_posts("tag set #{id} mytag1 mytag2",
35
+ "/api/v2/#{api_path}/#{id}/tag",
36
+ %w[mytag1 mytag2].to_json)
37
+ end
38
+
39
+ assert_noop("tag set #{id} mytag1 mytag2",
40
+ 'uri: POST https://default.wavefront.com/api/v2/' \
41
+ "#{api_path}/#{id}/tag",
42
+ 'body: ["mytag1","mytag2"]')
43
+
44
+ assert_invalid_id("tag set #{invalid_id} mytag")
45
+ assert_usage("tag set #{id}")
46
+ assert_usage('tag set')
47
+ assert_abort_on_missing_creds("tag set #{id} mytag")
48
+ end
49
+
50
+ def test_tag_add
51
+ assert_repeated_output("Tagged #{friendly_name} '#{id}'.") do
52
+ assert_cmd_puts("tag add #{id} mytag",
53
+ "/api/v2/#{api_path}/#{id}/tag/mytag",
54
+ nil)
55
+ end
56
+
57
+ assert_noop("tag add #{id} mytag",
58
+ 'uri: PUT https://default.wavefront.com/api/v2/' \
59
+ "#{api_path}/#{id}/tag/mytag", 'body: null')
60
+
61
+ assert_invalid_id("tag add #{invalid_id} mytag")
62
+ assert_usage("tag add #{id}")
63
+ assert_usage('tag add')
64
+ assert_abort_on_missing_creds("tag add #{id} mytag")
65
+ end
66
+
67
+ def test_tag_delete
68
+ assert_repeated_output("Deleted tag from #{friendly_name} '#{id}'.") do
69
+ assert_cmd_deletes("tag delete #{id} mytag",
70
+ "/api/v2/#{api_path}/#{id}/tag/mytag")
71
+ end
72
+
73
+ assert_noop("tag delete #{id} mytag",
74
+ 'uri: DELETE https://default.wavefront.com/api/v2/' \
75
+ "#{api_path}/#{id}/tag/mytag", 'body: null')
76
+
77
+ assert_invalid_id("tag delete #{invalid_id} mytag")
78
+ assert_usage("tag delete #{id}")
79
+ assert_usage('tag delete')
80
+ assert_abort_on_missing_creds("tag delete #{id} mytag")
81
+ end
82
+
83
+ def test_tag_clear
84
+ assert_repeated_output("Cleared tags on #{friendly_name} '#{id}'.") do
85
+ assert_cmd_posts("tag clear #{id}",
86
+ "/api/v2/#{api_path}/#{id}/tag",
87
+ [].to_json)
88
+ end
89
+
90
+ assert_noop("tag clear #{id}",
91
+ 'uri: POST https://default.wavefront.com/api/v2/' \
92
+ "#{api_path}/#{id}/tag", 'body: []')
93
+
94
+ assert_invalid_id("tag clear #{invalid_id}")
95
+ assert_usage('tag clear')
96
+ assert_abort_on_missing_creds("tag clear #{id}")
97
+ end
98
+ end
99
+ end
@@ -1,119 +1,296 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
- id = '1481553823153'
4
- bad_id = '__bad_id__'
5
- word = 'alert'
6
-
7
- def search_body(val)
8
- { limit: 999,
9
- offset: 0,
10
- query: [
11
- { key: 'status',
12
- value: val,
13
- matchingMethod: 'EXACT',
14
- negated: false }
15
- ],
16
- sort: { field: 'status', ascending: true } }
17
- end
4
+ require_relative '../support/command_base'
5
+ require_relative '../test_mixins/acl'
6
+ require_relative '../test_mixins/tag'
7
+ require_relative '../test_mixins/history'
8
+ require_relative '../../lib/wavefront-cli/alert'
18
9
 
19
- require_relative '../spec_helper'
20
- require_relative "../../lib/wavefront-cli/#{word}"
21
-
22
- describe "#{word} command" do
23
- missing_creds(word, ['list',
24
- "describe #{id}",
25
- "snooze #{id}",
26
- 'queries',
27
- 'snoozed',
28
- "clone #{id}",
29
- "install #{id}",
30
- "uninstall #{id}",
31
- 'firing',
32
- 'currently firing',
33
- 'summary',
34
- "acls #{id}",
35
- "acl grant view on #{id} to testuser1",
36
- "acl revoke modify on #{id} from group1",
37
- "delete #{id}",
38
- "undelete #{id}",
39
- "history #{id}"])
40
- list_tests(word)
41
- cmd_to_call(word, "describe #{id}", path: "/api/v2/#{word}/#{id}")
42
- cmd_to_call(word, "describe -v 7 #{id}",
43
- path: "/api/v2/#{word}/#{id}/history/7")
44
- cmd_to_call(word, "history #{id}", path: "/api/v2/#{word}/#{id}/history")
45
- cmd_to_call(word, "latest #{id}", path: "/api/v2/#{word}/#{id}/history")
46
-
47
- it 'deletes with a check on inTrash' do
48
- stub_request(:get,
49
- 'https://other.wavefront.com/api/v2/alert/1481553823153')
50
- .with(headers: { 'Accept': '*/*',
51
- 'Accept-Encoding':
52
- 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
53
- 'Authorization': 'Bearer 0123456789-ABCDEF',
54
- 'User-Agent': /wavefront.*/ })
55
- .to_return(status: 200, body: '', headers: {})
56
- cmd_to_call(word, "delete #{id}",
57
- method: :delete, path: "/api/v2/#{word}/#{id}")
58
- end
59
-
60
- cmd_to_call(word, "clone #{id}",
61
- method: :post, path: "/api/v2/#{word}/#{id}/clone")
62
- cmd_to_call(word, "clone #{id} -v 5",
63
- method: :post,
64
- path: "/api/v2/#{word}/#{id}/clone",
65
- body: { id: id, v: 5, name: nil })
66
- cmd_to_call(word, "undelete #{id}",
67
- method: :post, path: "/api/v2/#{word}/#{id}/undelete")
68
- cmd_to_call(word, "snooze #{id}",
69
- method: :post, path: "/api/v2/#{word}/#{id}/snooze")
70
- cmd_to_call(word, "snooze -T 800 #{id}",
71
- method: :post,
72
- path: "/api/v2/#{word}/#{id}/snooze?seconds=800")
73
- cmd_to_call(word, "unsnooze #{id}",
74
- method: :post, path: "/api/v2/#{word}/#{id}/unsnooze")
75
- cmd_to_call(word, "install #{id}",
76
- method: :post, path: "/api/v2/#{word}/#{id}/install")
77
- cmd_to_call(word, "uninstall #{id}",
78
- method: :post, path: "/api/v2/#{word}/#{id}/uninstall")
79
- cmd_to_call(word, 'summary', path: "/api/v2/#{word}/summary")
80
- invalid_ids(word, ["describe #{bad_id}", "delete #{bad_id}",
81
- "undelete #{bad_id}", "snooze #{bad_id}",
82
- "install #{bad_id}", "uninstall #{bad_id}",
83
- "snooze -T 500 #{bad_id}"])
84
- cmd_to_call(word, 'snoozed',
85
- method: :post,
86
- path: "/api/v2/search/#{word}",
87
- body: search_body('snoozed'))
88
- cmd_to_call(word, 'firing',
89
- method: :post,
90
- path: "/api/v2/search/#{word}",
91
- body: search_body('firing'))
92
- cmd_to_call(word, 'currently firing',
93
- method: :post,
94
- path: "/api/v2/search/#{word}",
95
- body: search_body('firing'))
96
- cmd_to_call(word, 'currently in_maintenance',
97
- method: :post,
98
- path: "/api/v2/search/#{word}",
99
- body: search_body('in_maintenance'))
100
- cmd_to_call(word, 'queries', path: "/api/v2/#{word}?limit=999&offset=0")
101
- search_tests(word, id)
102
- tag_tests(word, id, bad_id)
103
- noop_tests(word, id, true)
104
- test_list_output(word)
105
- acl_tests(word, id, bad_id)
106
- end
10
+ # Ensure 'alert' commands produce the correct API calls.
11
+ #
12
+ class AlertEndToEndTest < EndToEndTest
13
+ include WavefrontCliTest::Import
14
+ include WavefrontCliTest::Set
15
+ include WavefrontCliTest::DeleteUndelete
16
+ include WavefrontCliTest::Dump
17
+ include WavefrontCliTest::List
18
+ include WavefrontCliTest::Describe
19
+ include WavefrontCliTest::Search
20
+ include WavefrontCliTest::Tag
21
+ include WavefrontCliTest::History
22
+ include WavefrontCliTest::Acl
23
+
24
+ def test_latest
25
+ quietly do
26
+ assert_cmd_gets("latest #{id}", "/api/v2/alert/#{id}/history")
27
+ end
28
+
29
+ assert_noop("latest #{id}",
30
+ 'uri: GET https://default.wavefront.com/api/v2/' \
31
+ "alert/#{id}/history")
32
+
33
+ assert_invalid_id("latest #{invalid_id}")
34
+ assert_usage('latest')
35
+ assert_abort_on_missing_creds("latest #{id}")
36
+ end
37
+
38
+ def test_queries
39
+ quietly do
40
+ assert_cmd_gets('queries', '/api/v2/alert?limit=999&offset=0')
41
+ end
42
+ end
43
+
44
+ def test_clone
45
+ quietly do
46
+ assert_cmd_posts("clone #{id}",
47
+ "/api/v2/alert/#{id}/clone",
48
+ id: id, v: nil, name: nil)
49
+ end
50
+
51
+ assert_noop("clone #{id}",
52
+ 'uri: POST https://default.wavefront.com/api/v2/' \
53
+ "alert/#{id}/clone",
54
+ 'body: ' + { id: id, name: nil, v: nil }.to_json)
55
+
56
+ assert_invalid_id("clone #{invalid_id}")
57
+ assert_usage('clone')
58
+ assert_abort_on_missing_creds("clone #{id}")
59
+ end
60
+
61
+ def test_clone_v
62
+ quietly do
63
+ assert_cmd_posts("clone #{id} -v5",
64
+ "/api/v2/alert/#{id}/clone",
65
+ id: id, v: 5, name: nil)
66
+ end
67
+
68
+ assert_noop("clone #{id} --version 5",
69
+ 'uri: POST https://default.wavefront.com/api/v2/' \
70
+ "alert/#{id}/clone",
71
+ 'body: ' + { id: id, name: nil, v: 5 }.to_json)
72
+
73
+ assert_invalid_id("clone -v 10 #{invalid_id}")
74
+ assert_usage('clone -v')
75
+ assert_abort_on_missing_creds("clone -v5 #{id}")
76
+ end
77
+
78
+ def test_snooze
79
+ assert_repeated_output("Snoozed alert '#{id}' indefinitely.") do
80
+ assert_cmd_posts("snooze #{id}", "/api/v2/alert/#{id}/snooze")
81
+ end
82
+
83
+ assert_noop("snooze #{id}",
84
+ 'uri: POST https://default.wavefront.com/api/v2/' \
85
+ "alert/#{id}/snooze",
86
+ 'body: null')
87
+ assert_usage('snooze')
88
+ assert_abort_on_missing_creds("snooze #{id}")
89
+ end
90
+
91
+ def test_snooze_t
92
+ assert_repeated_output("Snoozed alert '#{id}' for 800 seconds.") do
93
+ assert_cmd_posts("snooze -T 800 #{id}",
94
+ "/api/v2/alert/#{id}/snooze?seconds=800")
95
+ end
96
+
97
+ assert_noop("snooze -T 800 #{id}",
98
+ 'uri: POST https://default.wavefront.com/api/v2/' \
99
+ "alert/#{id}/snooze",
100
+ 'body: null')
101
+ assert_usage('snooze -T')
102
+ assert_invalid_id("snooze -T 100 #{invalid_id}")
103
+ assert_abort_on_missing_creds("snooze -T 800 #{id}")
104
+ end
105
+
106
+ def test_unsnooze
107
+ assert_repeated_output("Unsnoozed alert '#{id}'.") do
108
+ assert_cmd_posts("unsnooze #{id}",
109
+ "/api/v2/alert/#{id}/unsnooze")
110
+ end
111
+
112
+ assert_noop("unsnooze #{id}",
113
+ 'uri: POST https://default.wavefront.com/api/v2/' \
114
+ "alert/#{id}/unsnooze",
115
+ 'body: null')
116
+ assert_invalid_id("unsnooze #{invalid_id}")
117
+ assert_usage('unsnooze')
118
+ assert_abort_on_missing_creds("unsnooze #{id}")
119
+ end
120
+
121
+ def test_install
122
+ quietly do
123
+ assert_cmd_posts("install #{id}",
124
+ "/api/v2/alert/#{id}/install")
125
+ end
126
+
127
+ assert_noop("install #{id}",
128
+ 'uri: POST https://default.wavefront.com/api/v2/' \
129
+ "alert/#{id}/install",
130
+ 'body: null')
131
+ assert_invalid_id("install #{invalid_id}")
132
+ assert_usage('install')
133
+ assert_abort_on_missing_creds("install #{id}")
134
+ end
135
+
136
+ def test_uninstall
137
+ quietly do
138
+ assert_cmd_posts("uninstall #{id}",
139
+ "/api/v2/alert/#{id}/uninstall")
140
+ end
141
+
142
+ assert_noop("uninstall #{id}",
143
+ 'uri: POST https://default.wavefront.com/api/v2/' \
144
+ "alert/#{id}/uninstall",
145
+ 'body: null')
146
+ assert_invalid_id("uninstall #{invalid_id}")
147
+ assert_usage('uninstall')
148
+ assert_abort_on_missing_creds("uninstall #{id}")
149
+ end
150
+
151
+ def test_summary
152
+ quietly { assert_cmd_gets('summary', '/api/v2/alert/summary') }
153
+
154
+ assert_noop(
155
+ 'summary',
156
+ 'uri: GET https://default.wavefront.com/api/v2/alert/summary'
157
+ )
158
+ assert_abort_on_missing_creds('summary')
159
+ end
160
+
161
+ def test_snoozed
162
+ out, err = capture_io do
163
+ assert_raises(SystemExit) do
164
+ assert_cmd_posts('snoozed',
165
+ '/api/v2/search/alert',
166
+ state_search('snoozed').to_json)
167
+ end
168
+ end
169
+
170
+ assert_empty(err)
171
+ assert_equal('No alerts are currently snoozed.', out.rstrip)
172
+
173
+ assert_noop('snoozed',
174
+ 'uri: POST https://default.wavefront.com/api/v2/' \
175
+ 'search/alert',
176
+ 'body: ' + state_search('snoozed').to_json)
177
+
178
+ assert_abort_on_missing_creds('snoozed')
179
+ end
180
+
181
+ def test_firing
182
+ out, err = capture_io do
183
+ assert_raises(SystemExit) do
184
+ assert_cmd_posts('firing',
185
+ '/api/v2/search/alert',
186
+ state_search('firing').to_json)
187
+ end
188
+ end
189
+
190
+ assert_empty(err)
191
+ assert_equal('No alerts are currently firing.', out.rstrip)
192
+
193
+ assert_noop('firing',
194
+ 'uri: POST https://default.wavefront.com/api/v2/' \
195
+ 'search/alert',
196
+ 'body: ' + state_search('firing').to_json)
197
+
198
+ assert_abort_on_missing_creds('firing')
199
+ end
200
+
201
+ def test_currently_firing
202
+ out, err = capture_io do
203
+ assert_raises(SystemExit) do
204
+ assert_cmd_posts('currently firing',
205
+ '/api/v2/search/alert',
206
+ state_search('firing').to_json)
207
+ end
208
+ end
209
+
210
+ assert_empty(err)
211
+ assert_equal('No alerts are currently firing.', out.rstrip)
212
+
213
+ assert_noop('currently firing',
214
+ 'uri: POST https://default.wavefront.com/api/v2/' \
215
+ 'search/alert',
216
+ 'body: ' + state_search('firing').to_json)
217
+
218
+ assert_abort_on_missing_creds('currently firing')
219
+ end
220
+
221
+ def test_currently_in_maintenance
222
+ out, err = capture_io do
223
+ assert_raises(SystemExit) do
224
+ assert_cmd_posts('currently in_maintenance',
225
+ '/api/v2/search/alert',
226
+ state_search('in_maintenance').to_json)
227
+ end
228
+ end
229
+
230
+ assert_empty(err)
231
+ assert_equal('No alerts are currently in_maintenance.', out.rstrip)
232
+
233
+ assert_noop('currently in_maintenance',
234
+ 'uri: POST https://default.wavefront.com/api/v2/' \
235
+ 'search/alert',
236
+ 'body: ' + state_search('in_maintenance').to_json)
237
+
238
+ assert_abort_on_missing_creds('currently in_maintenance')
239
+ end
240
+
241
+ private
242
+
243
+ def id
244
+ '1481553823153'
245
+ end
246
+
247
+ def invalid_id
248
+ '__BAD__'
249
+ end
250
+
251
+ def cmd_word
252
+ 'alert'
253
+ end
254
+
255
+ def state_search(state)
256
+ { limit: 999,
257
+ offset: 0,
258
+ query: [{ key: 'status',
259
+ value: state,
260
+ matchingMethod: 'EXACT',
261
+ negated: false }],
262
+ sort: { field: 'status', ascending: true } }
263
+ end
264
+
265
+ def import_fields
266
+ %i[condition displayExpression resolveAfterMinutes minutes severity
267
+ tags target name]
268
+ end
107
269
 
108
- class TestAlertMethods < CliMethodTest
109
- def test_import_method
110
- import_tester(:window,
111
- %i[condition displayExpression resolveAfterMinutes
112
- minutes severity tags target name],
113
- %i[id])
270
+ # rubocop:disable Metrics/LineLength
271
+ def import_data
272
+ { name: 'PKS - too many containers not running',
273
+ condition: 'sum(ts(pks.kube.pod.container.status.running.gauge)) / (sum(ts(pks.kube.pod.container.status.running.gauge)) + sum(ts(pks.kube.pod.container.status.waiting.gauge)) + sum(ts(pks.kube.pod.container.status.terminated.gauge))) < 0.8',
274
+ minutes: 5,
275
+ target: 'target:9wltLtYXsP8Je2kI',
276
+ severity: 'SEVERE',
277
+ displayExpression: 'sum(ts(pks.kube.pod.container.status.running.gauge)) / (sum(ts(pks.kube.pod.container.status.running.gauge)) + sum(ts(pks.kube.pod.container.status.waiting.gauge)) + sum(ts(pks.kube.pod.container.status.terminated.gauge)))',
278
+ tags: { customerTags: ['pks'] },
279
+ additionalInformation: nil,
280
+ resolveAfterMinutes: 5,
281
+ resolveMinutes: 5 }
114
282
  end
115
283
 
116
- def cliclass
117
- WavefrontCli::Alert
284
+ def update_data
285
+ { name: 'PKS - too many containers not running',
286
+ condition: 'sum(ts(pks.kube.pod.container.status.running.gauge)) / (sum(ts(pks.kube.pod.container.status.running.gauge)) + sum(ts(pks.kube.pod.container.status.waiting.gauge)) + sum(ts(pks.kube.pod.container.status.terminated.gauge))) < 0.8',
287
+ minutes: 5,
288
+ target: 'target:9wltLtYXsP8Je2kI',
289
+ severity: 'SEVERE',
290
+ displayExpression: 'sum(ts(pks.kube.pod.container.status.running.gauge)) / (sum(ts(pks.kube.pod.container.status.running.gauge)) + sum(ts(pks.kube.pod.container.status.waiting.gauge)) + sum(ts(pks.kube.pod.container.status.terminated.gauge)))',
291
+ tags: { customerTags: ['pks'] },
292
+ resolveAfterMinutes: 5,
293
+ id: '1556812163465' }
118
294
  end
295
+ # rubocop:enable Metrics/LineLength
119
296
  end