hawkular-client 0.2.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/.yardopts +1 -0
  4. data/CHANGES.rdoc +17 -4
  5. data/README.rdoc +15 -6
  6. data/api_breaking_changes.rdoc +79 -0
  7. data/hawkularclient.gemspec +6 -5
  8. data/lib/{alerts → hawkular/alerts}/alerts_api.rb +168 -7
  9. data/lib/{hawkular.rb → hawkular/base_client.rb} +7 -44
  10. data/lib/hawkular/hawkular_client.rb +60 -0
  11. data/lib/hawkular/hawkular_client_utils.rb +40 -0
  12. data/lib/{inventory → hawkular/inventory}/inventory_api.rb +167 -142
  13. data/lib/{metrics → hawkular/metrics}/metric_api.rb +1 -0
  14. data/lib/{metrics → hawkular/metrics}/metrics_client.rb +4 -4
  15. data/lib/{metrics → hawkular/metrics}/tenant_api.rb +0 -0
  16. data/lib/{metrics → hawkular/metrics}/types.rb +0 -0
  17. data/lib/{operations → hawkular/operations}/operations_api.rb +11 -8
  18. data/lib/{tokens → hawkular/tokens}/tokens_api.rb +1 -1
  19. data/lib/{version.rb → hawkular/version.rb} +1 -1
  20. data/spec/integration/alerts_spec.rb +200 -0
  21. data/spec/integration/hawkular_client_spec.rb +228 -0
  22. data/spec/integration/inventory_spec.rb +246 -160
  23. data/spec/integration/metric_spec.rb +52 -59
  24. data/spec/integration/operations_spec.rb +53 -29
  25. data/spec/spec_helper.rb +109 -8
  26. data/spec/unit/base_spec.rb +9 -0
  27. data/spec/unit/canonical_path_spec.rb +2 -2
  28. data/spec/vcr/vcr_setup.rb +6 -0
  29. data/spec/vcr_cassettes/Alert/Events/Should_create_an_event.yml +50 -0
  30. data/spec/vcr_cassettes/Alert/Groups/Should_operate_a_complex_group_trigger.yml +1726 -0
  31. data/spec/vcr_cassettes/Counter_metrics/Should_get_metrics_as_bucketed_results.yml +190 -0
  32. data/spec/vcr_cassettes/Counter_metrics/Should_get_metrics_with_limit_and_order.yml +30 -42
  33. data/spec/vcr_cassettes/HawkularClient/and_Inventory_client/Should_both_create_and_delete_feed.yml +287 -0
  34. data/spec/vcr_cassettes/{Inventory/Should_list_URLs.yml → HawkularClient/and_Inventory_client/Should_both_list_WildFlys.yml} +35 -33
  35. data/spec/vcr_cassettes/{Inventory/Should_list_types_with_bad_feed.yml → HawkularClient/and_Inventory_client/Should_both_list_types_with_bad_feed.yml} +16 -19
  36. data/spec/vcr_cassettes/HawkularClient/and_Inventory_client/Should_list_same_types_when_param_is_given.yml +245 -0
  37. data/spec/vcr_cassettes/{Inventory/Should_list_feeds.yml → HawkularClient/and_Inventory_client/Should_list_the_same_feeds.yml} +20 -20
  38. data/spec/vcr_cassettes/HawkularClient/and_Inventory_client/Should_list_the_same_resource_types.yml +249 -0
  39. data/spec/vcr_cassettes/HawkularClient/and_Metrics_client/Should_both_create_and_retrieve_tags_for_Availability.yml +155 -0
  40. data/spec/vcr_cassettes/HawkularClient/and_Metrics_client/Should_both_create_and_return_Availability_using_Hash_parameter.yml +155 -0
  41. data/spec/vcr_cassettes/HawkularClient/and_Metrics_client/Should_both_return_the_version.yml +89 -0
  42. data/spec/vcr_cassettes/HawkularClient/and_Metrics_client/Should_both_work_the_same_way_when_pushing_metric_data_to_non-existing_counter.yml +114 -0
  43. data/spec/vcr_cassettes/{Inventory/Should_list_WildFlys_with_props.yml → HawkularClient/and_Operations_client/Should_both_work_the_same_way.yml} +28 -50
  44. data/spec/vcr_cassettes/HawkularClient/and_Operations_client_Should_both_work_the_same_way.json +44 -0
  45. data/spec/vcr_cassettes/Inventory/Helpers/create_url.yml +48 -0
  46. data/spec/vcr_cassettes/Inventory/Helpers/generate_some_events_for_websocket.yml +4446 -0
  47. data/spec/vcr_cassettes/Inventory/Helpers/get_feeds.yml +54 -0
  48. data/spec/vcr_cassettes/Inventory/Templates/Client_should_listen_on_various_inventory_events.json +47 -0
  49. data/spec/vcr_cassettes/Inventory/{Should_create_a_resourcetype.yml → Templates/Client_should_listen_on_various_inventory_events.yml} +47 -61
  50. data/spec/vcr_cassettes/Inventory/Templates/Helpers/generate_some_events_for_websocket.yml +542 -0
  51. data/spec/vcr_cassettes/Inventory/{Should_List_datasources_with_no_props.yml → Templates/Should_List_datasources_with_no_props.yml} +26 -85
  52. data/spec/vcr_cassettes/Inventory/Templates/Should_create_a_feed.yml +54 -0
  53. data/spec/vcr_cassettes/Inventory/Templates/Should_create_a_feed_again.yml +164 -0
  54. data/spec/vcr_cassettes/Inventory/{Should_create_a_nested_resource_and_metric_on_it.yml → Templates/Should_create_a_nested_resource_and_metric_on_it.yml} +93 -74
  55. data/spec/vcr_cassettes/Inventory/{Should_create_a_resource_.yml → Templates/Should_create_a_resource.yml} +103 -76
  56. data/spec/vcr_cassettes/Inventory/{Should_create_a_resource_with_metric.yml → Templates/Should_create_a_resource_with_metric.yml} +91 -197
  57. data/spec/vcr_cassettes/Inventory/Templates/Should_create_a_resourcetype.yml +154 -0
  58. data/spec/vcr_cassettes/Inventory/Templates/Should_create_and_delete_feed.yml +145 -0
  59. data/spec/vcr_cassettes/Inventory/{Should_create_and_get_a_resource.yml → Templates/Should_create_and_get_a_resource.yml} +35 -20
  60. data/spec/vcr_cassettes/Inventory/Templates/Should_list_URLs.yml +65 -0
  61. data/spec/vcr_cassettes/Inventory/Templates/Should_list_WildFlys.yml +61 -0
  62. data/spec/vcr_cassettes/Inventory/{Should_list_WildFlys.yml → Templates/Should_list_WildFlys_with_props.yml} +36 -33
  63. data/spec/vcr_cassettes/Inventory/Templates/Should_list_all_the_resource_types.yml +126 -0
  64. data/spec/vcr_cassettes/Inventory/{Should_list_children_of_WildFly.yml → Templates/Should_list_children_of_WildFly.yml} +66 -112
  65. data/spec/vcr_cassettes/Inventory/{Should_list_children_of_nested_resource.yml → Templates/Should_list_children_of_nested_resource.yml} +13 -13
  66. data/spec/vcr_cassettes/Inventory/Templates/Should_list_feeds.yml +54 -0
  67. data/spec/vcr_cassettes/Inventory/Templates/Should_list_heap_metrics_for_WildFlys.yml +712 -0
  68. data/spec/vcr_cassettes/Inventory/Templates/Should_list_metrics_for_WildFlys.yml +278 -0
  69. data/spec/vcr_cassettes/Inventory/Templates/Should_list_metrics_of_given_metric_type.yml +530 -0
  70. data/spec/vcr_cassettes/Inventory/Templates/Should_list_metrics_of_given_resource_type.yml +278 -0
  71. data/spec/vcr_cassettes/Inventory/Templates/Should_list_operation_definitions_of_given_resource.yml +185 -0
  72. data/spec/vcr_cassettes/Inventory/Templates/Should_list_operation_definitions_of_given_resource_type.yml +126 -0
  73. data/spec/vcr_cassettes/Inventory/Templates/Should_list_recursive_children_of_WildFly.yml +2369 -0
  74. data/spec/vcr_cassettes/Inventory/Templates/Should_list_relationships_of_WildFly.yml +415 -0
  75. data/spec/vcr_cassettes/Inventory/Templates/Should_list_types_with_bad_feed.yml +51 -0
  76. data/spec/vcr_cassettes/Inventory/Templates/Should_list_types_with_feed.yml +124 -0
  77. data/spec/vcr_cassettes/Inventory/{Should_not_find_an_unknown_resource.yml → Templates/Should_not_find_an_unknown_resource.yml} +14 -13
  78. data/spec/vcr_cassettes/Inventory/{Should_return_config_data_of_given_nested_resource.yml → Templates/Should_return_config_data_of_given_nested_resource.yml} +4 -4
  79. data/spec/vcr_cassettes/Inventory/{Should_return_config_data_of_given_resource.yml → Templates/Should_return_config_data_of_given_resource.yml} +4 -4
  80. data/spec/vcr_cassettes/Inventory/Tenants/Should_Get_Tenant_For_Explicit_Credentials.yml +50 -0
  81. data/spec/vcr_cassettes/Inventory/Tenants/Should_Get_Tenant_For_Implicit_Credentials.yml +50 -0
  82. data/spec/vcr_cassettes/Operation/Helpers/get_feed.yml +54 -0
  83. data/spec/vcr_cassettes/Operation/Helpers/get_tenant.yml +50 -0
  84. data/spec/vcr_cassettes/Operation/Operation/Add_JDBC_driver_should_add_the_driver.json +26 -0
  85. data/spec/vcr_cassettes/Operation/Operation/Add_datasource_should_be_doable.json +26 -0
  86. data/spec/vcr_cassettes/Operation/Operation/Add_deployment_should_be_doable.json +26 -0
  87. data/spec/vcr_cassettes/Operation/Operation/Redeploy_can_be_run_multiple_times_in_parallel.json +40 -0
  88. data/spec/vcr_cassettes/Operation/Operation/Redeploy_should_be_performed_and_eventually_respond_with_success.json +26 -0
  89. data/spec/vcr_cassettes/Operation/Operation/Redeploy_should_not_be_performed_if_resource_path_is_wrong.json +26 -0
  90. data/spec/vcr_cassettes/Operation/Operation/Remove_JDBC_driver_should_be_performed_and_eventually_respond_with_success.json +26 -0
  91. data/spec/vcr_cassettes/Operation/Operation/Remove_datasource_should_be_performed_and_eventually_respond_with_success.json +26 -0
  92. data/spec/vcr_cassettes/Operation/Operation/Remove_deployment_should_be_performed_and_eventually_respond_with_success.json +26 -0
  93. data/spec/vcr_cassettes/Operation/Operation/Undeploy_should_be_performed_and_eventually_respond_with_success.json +26 -0
  94. data/spec/vcr_cassettes/Operation/Operation/should_not_be_possible_to_perform_on_closed_client.json +12 -0
  95. data/spec/vcr_cassettes/Operation/Websocket_connection/should_be_established.json +9 -0
  96. metadata +171 -72
  97. data/lib/hawkular_all.rb +0 -9
  98. data/spec/vcr_cassettes/Inventory/Should_create_a_feed.yml +0 -107
  99. data/spec/vcr_cassettes/Inventory/Should_create_a_feed_again.yml +0 -211
  100. data/spec/vcr_cassettes/Inventory/Should_create_and_delete_feed.yml +0 -201
  101. data/spec/vcr_cassettes/Inventory/Should_list_all_the_resource_types.yml +0 -177
  102. data/spec/vcr_cassettes/Inventory/Should_list_heap_metrics_for_WildFlys.yml +0 -775
  103. data/spec/vcr_cassettes/Inventory/Should_list_metrics_for_WildFlys.yml +0 -333
  104. data/spec/vcr_cassettes/Inventory/Should_list_metrics_of_given_metric_type.yml +0 -613
  105. data/spec/vcr_cassettes/Inventory/Should_list_metrics_of_given_resource_type.yml +0 -333
  106. data/spec/vcr_cassettes/Inventory/Should_list_recursive_children_of_WildFly.yml +0 -2064
  107. data/spec/vcr_cassettes/Inventory/Should_list_relationships_of_WildFly.yml +0 -460
  108. data/spec/vcr_cassettes/Inventory/Should_list_types_with_feed.yml +0 -175
@@ -113,6 +113,7 @@ module Hawkular::Metrics
113
113
  # @param id [String] metric definition id
114
114
  # @param starts [Integer] optional timestamp (default now - 8h)
115
115
  # @param ends [Integer] optional timestamp (default now)
116
+ # @param buckets [Integer] optional desired number of buckets over the specified timerange
116
117
  # @param bucketDuration [String] optional interval (default no aggregation)
117
118
  # @param percentiles [String] optional percentiles to calculate
118
119
  # @param limit [Integer] optional limit the number of data points returned
@@ -1,12 +1,12 @@
1
1
 
2
- require 'hawkular'
2
+ require 'hawkular/base_client'
3
3
  require 'json'
4
4
  require 'rest-client'
5
5
  require 'English'
6
6
 
7
- require 'metrics/types'
8
- require 'metrics/tenant_api'
9
- require 'metrics/metric_api'
7
+ require 'hawkular/metrics/types'
8
+ require 'hawkular/metrics/tenant_api'
9
+ require 'hawkular/metrics/metric_api'
10
10
 
11
11
  # Metrics module provides access to Hawkular Metrics REST API
12
12
  # @see http://www.hawkular.org/docs/rest/rest-metrics.html Hawkular Metrics REST API Documentation
File without changes
File without changes
@@ -1,4 +1,4 @@
1
- require 'hawkular'
1
+ require 'hawkular/base_client'
2
2
  require 'websocket-client-simple'
3
3
  require 'json'
4
4
 
@@ -20,13 +20,13 @@ class Proc
20
20
  end
21
21
  end
22
22
 
23
- # Operations module allows invoking operation on the wildfly agent.
23
+ # Operations module allows invoking operation on the WildFly agent.
24
24
  module Hawkular::Operations
25
25
  # Client class to interact with the agent via websockets
26
26
  class OperationsClient < Hawkular::BaseClient
27
27
  include WebSocket::Client
28
28
 
29
- attr_accessor :ws
29
+ attr_accessor :ws, :session_id
30
30
 
31
31
  # helper for parsing the "OperationName=json_payload" messages
32
32
  class WebSocket::Frame::Data
@@ -46,13 +46,15 @@ module Hawkular::Operations
46
46
  # @param [Hash] args Arguments for client
47
47
  #
48
48
  # @option args [String] :host base url of Hawkular - e.g http://localhost:8080
49
- # @option args [Hash{String=>String}] :credentials Hash of {username, password} or token
49
+ # @option args [Hash{String=>String}] :credentials Hash of (username password) or token
50
+ # @option args [Fixnum] :wait_time Time in seconds describing how long the constructor should block - handshake
50
51
  #
51
52
  # @example
52
53
  # Hawkular::Operations::OperationsClient.new(credentials: {username: 'jdoe', password: 'password'})
53
54
  def initialize(args)
54
55
  args[:host] ||= 'localhost:8080'
55
56
  args[:credentials] ||= {}
57
+ args[:wait_time] ||= 0.5
56
58
  super(args[:host], args[:credentials])
57
59
  # note: if we start using the secured WS, change the protocol to wss://
58
60
  url = "ws://#{entrypoint}/hawkular/command-gateway/ui/ws"
@@ -66,7 +68,7 @@ module Hawkular::Operations
66
68
  end
67
69
  end
68
70
  end
69
- sleep 1
71
+ sleep args[:wait_time]
70
72
  end
71
73
 
72
74
  # Closes the WebSocket connection
@@ -74,7 +76,7 @@ module Hawkular::Operations
74
76
  @ws.close
75
77
  end
76
78
 
77
- # Invokes a generic operation on the Wildfly agent
79
+ # Invokes a generic operation on the WildFly agent
78
80
  # (the operation name must be specified in the hash)
79
81
  # Note: if success and failure callbacks are omitted, the client will not wait for the Response message
80
82
  # @param hash [Hash{String=>Object}] a hash containing: resourcePath [String] denoting the resource on
@@ -87,7 +89,7 @@ module Hawkular::Operations
87
89
  invoke_operation_helper(hash, &callback)
88
90
  end
89
91
 
90
- # Invokes operation on the wildfly agent that has it's own message type
92
+ # Invokes operation on the WildFly agent that has it's own message type
91
93
  # @param operation_payload [Hash{String=>Object}] a hash containing: resourcePath [String] denoting
92
94
  # the resource on which the operation is about to run
93
95
  # @param operation_name [String] the name of the operation. This must correspond with the message type, they can be
@@ -202,6 +204,7 @@ module Hawkular::Operations
202
204
  end
203
205
 
204
206
  def handle_message(operation_name, operation_payload, &callback)
207
+ client = @ws
205
208
  # register a callback handler
206
209
  @ws.on :message do |msg|
207
210
  parsed = msg.data.to_msg_hash
@@ -233,7 +236,7 @@ module Hawkular::Operations
233
236
 
234
237
  def prepare_payload_hash(ignored_params, hash)
235
238
  # it filters out ignored params and convert keys from snake_case to camelCase
236
- hash.select { |k, _| !ignored_params.include? k }.map { |k, v| [to_camel_case(k.to_s).to_sym, v] }.to_h
239
+ Hash[hash.select { |k, _| !ignored_params.include? k }.map { |k, v| [to_camel_case(k.to_s).to_sym, v] }]
237
240
  end
238
241
 
239
242
  def to_camel_case(str)
@@ -1,4 +1,4 @@
1
- require 'hawkular'
1
+ require 'hawkular/base_client'
2
2
 
3
3
  # Token module provides access to the Secret Store REST API.
4
4
  module Hawkular::Token
@@ -4,5 +4,5 @@
4
4
  # @see https://github.com/hawkular
5
5
  module Hawkular
6
6
  # Version of the Hawkular Ruby Gem
7
- VERSION = '0.2.2'
7
+ VERSION = '1.0.0'
8
8
  end
@@ -166,6 +166,189 @@ module Hawkular::Alerts::RSpec
166
166
  end
167
167
  end
168
168
 
169
+ describe 'Alert/Groups', vcr: { decode_compressed_response: true } do
170
+ before(:each) do
171
+ @client = Hawkular::Alerts::AlertsClient.new(ALERTS_BASE, creds)
172
+ end
173
+
174
+ it 'Should operate a complex group trigger' do
175
+ # Create a group trigger
176
+ t = Hawkular::Alerts::Trigger.new({})
177
+ t.enabled = false
178
+ t.id = 'a-group-trigger'
179
+ t.name = 'A Group Trigger'
180
+ t.severity = :HIGH
181
+ t.description = 'A Group Trigger generated from test'
182
+
183
+ # Create a condition
184
+ c = Hawkular::Alerts::Trigger::Condition.new({})
185
+ c.trigger_mode = :FIRING
186
+ c.type = :THRESHOLD
187
+ c.data_id = 'my-metric-id'
188
+ c.operator = :LT
189
+ c.threshold = 5
190
+
191
+ # Create a group condition
192
+ # no members yet
193
+ gc = Hawkular::Alerts::Trigger::GroupConditionsInfo.new([c])
194
+
195
+ # Create a member
196
+ m1 = Hawkular::Alerts::Trigger::GroupMemberInfo.new
197
+ m1.group_id = 'a-group-trigger'
198
+ m1.member_id = 'member1'
199
+ m1.member_name = 'Member One'
200
+ m1.data_id_map = { 'my-metric-id' => 'my-metric-id-member1' }
201
+
202
+ # Create a second member
203
+ m2 = Hawkular::Alerts::Trigger::GroupMemberInfo.new
204
+ m2.group_id = 'a-group-trigger'
205
+ m2.member_id = 'member2'
206
+ m2.member_name = 'Member Two'
207
+ m2.data_id_map = { 'my-metric-id' => 'my-metric-id-member2' }
208
+
209
+ # Create a dampening for the group trigger
210
+ d = Hawkular::Alerts::Trigger::Dampening.new(
211
+ 'triggerId' => 'a-group-trigger',
212
+ 'triggerMode' => :FIRING,
213
+ 'type' => :STRICT,
214
+ 'evalTrueSetting' => 2,
215
+ 'evalTotalSetting' => 2
216
+ )
217
+
218
+ # Create a second condition
219
+ c2 = Hawkular::Alerts::Trigger::Condition.new({})
220
+ c2.trigger_mode = :FIRING
221
+ c2.type = :THRESHOLD
222
+ c2.data_id = 'my-metric-id2'
223
+ c2.operator = :GT
224
+ c2.threshold = 50
225
+
226
+ # Create the second group condition
227
+ # member2 is an orphan so, no need to update it into the data_id_member_map
228
+ gc2 = Hawkular::Alerts::Trigger::GroupConditionsInfo.new([c, c2])
229
+ gc2.data_id_member_map = {
230
+ 'my-metric-id' => { 'member1' => 'my-metric-id-member1' },
231
+ 'my-metric-id2' => { 'member1' => 'my-metric-id2-member1' }
232
+ }
233
+
234
+ # Create a third condition of type compare
235
+ c3 = Hawkular::Alerts::Trigger::Condition.new({})
236
+ c3.trigger_mode = :FIRING
237
+ c3.type = :COMPARE
238
+ c3.data_id = 'my-metric-id3'
239
+ c3.operator = :GT
240
+ c3.data2_id = 'my-metric-id4'
241
+ c3.data2_multiplier = 1
242
+
243
+ # Create the thrid group condition
244
+ # member 2 is still an orphan, no need to update it into the data_id_member_map
245
+ gc3 = Hawkular::Alerts::Trigger::GroupConditionsInfo.new([c, c2, c3])
246
+ gc3.data_id_member_map = {
247
+ 'my-metric-id' => { 'member1' => 'my-metric-id-member1' },
248
+ 'my-metric-id2' => { 'member1' => 'my-metric-id2-member1' },
249
+ 'my-metric-id3' => { 'member1' => 'my-metric-id3-member1' },
250
+ 'my-metric-id4' => { 'member1' => 'my-metric-id4-member1' }
251
+ }
252
+
253
+ begin
254
+ group_trigger = @client.create_group_trigger t
255
+ expect(group_trigger).not_to be_nil
256
+ expect(group_trigger.type).to eq('GROUP')
257
+
258
+ created_conditions = @client.set_group_conditions t.id, :FIRING, gc
259
+ expect(created_conditions.size).to be(1)
260
+
261
+ member1 = @client.create_member_trigger m1
262
+ expect(member1.type).to eq('MEMBER')
263
+
264
+ full_member1 = @client.get_single_trigger member1.id, true
265
+ expect(full_member1).not_to be_nil
266
+ expect(full_member1.id).to eq('member1')
267
+ expect(full_member1.conditions.size).to be(1)
268
+ expect(full_member1.conditions[0].data_id).to eq('my-metric-id-member1')
269
+
270
+ members = @client.list_members t.id
271
+ expect(members.size).to be(1)
272
+
273
+ member2 = @client.create_member_trigger m2
274
+ expect(member2.type).to eq('MEMBER')
275
+
276
+ full_member2 = @client.get_single_trigger member2.id, true
277
+ expect(full_member2).not_to be_nil
278
+ expect(full_member2.id).to eq('member2')
279
+ expect(full_member2.conditions.size).to be(1)
280
+ expect(full_member2.conditions[0].data_id).to eq('my-metric-id-member2')
281
+
282
+ members = @client.list_members t.id
283
+ expect(members.size).to be(2)
284
+
285
+ member2 = @client.orphan_member member2.id
286
+ expect(member2.type).to eq('ORPHAN')
287
+
288
+ members = @client.list_members t.id
289
+ expect(members.size).to be(1)
290
+
291
+ orphans = @client.list_members t.id, true
292
+ expect(orphans.size).to be(2)
293
+
294
+ group_dampening = @client.create_group_dampening d
295
+ expect(group_dampening).not_to be_nil
296
+ expect(group_dampening.type).to eq('STRICT')
297
+
298
+ full_member1 = @client.get_single_trigger member1.id, true
299
+ expect(full_member1).not_to be_nil
300
+ expect(full_member1.id).to eq('member1')
301
+ expect(full_member1.dampenings.size).to be(1)
302
+ expect(full_member1.dampenings[0].eval_true_setting).to be(2)
303
+ expect(full_member1.dampenings[0].eval_total_setting).to be(2)
304
+
305
+ group_trigger.tags = { 'group-tname' => 'group-tvalue' }
306
+ group_trigger = @client.update_group_trigger group_trigger
307
+
308
+ full_member1 = @client.get_single_trigger member1.id, false
309
+ expect(full_member1).not_to be_nil
310
+ expect(full_member1.tags['group-tname']).to eq('group-tvalue')
311
+
312
+ created_conditions = @client.set_group_conditions t.id, :FIRING, gc2
313
+ expect(created_conditions.size).to be(2)
314
+
315
+ full_member1 = @client.get_single_trigger member1.id, true
316
+ expect(full_member1).not_to be_nil
317
+ expect(full_member1.conditions.size).to be(2)
318
+
319
+ group_dampening.type = :RELAXED_COUNT
320
+ group_dampening.eval_true_setting = 2
321
+ group_dampening.eval_total_setting = 4
322
+ group_dampening = @client.update_group_dampening group_dampening
323
+
324
+ group_trigger.context = { 'alert-profiles' => 'profile1' }
325
+ @client.update_group_trigger group_trigger
326
+
327
+ @client.delete_group_dampening group_dampening.trigger_id, group_dampening.dampening_id
328
+
329
+ full_member1 = @client.get_single_trigger member1.id, true
330
+ expect(full_member1).not_to be_nil
331
+ expect(full_member1.context['alert-profiles']).to eq('profile1')
332
+ expect(full_member1.dampenings.size).to be(0)
333
+
334
+ created_conditions = @client.set_group_conditions t.id, :FIRING, gc3
335
+ expect(created_conditions.size).to be(3)
336
+
337
+ full_member1 = @client.get_single_trigger member1.id, true
338
+ expect(full_member1).not_to be_nil
339
+ expect(full_member1.conditions.size).to be(3)
340
+ ensure
341
+ # rubocop:disable Lint/HandleExceptions
342
+ begin
343
+ @client.delete_group_trigger(t.id)
344
+ rescue
345
+ # I am not interested
346
+ end
347
+ # rubocop:enable Lint/HandleExceptions
348
+ end
349
+ end
350
+ end
351
+
169
352
  describe 'Alert/Alerts', :vcr do
170
353
  it 'Should list alerts' do
171
354
  client = Hawkular::Alerts::AlertsClient.new(ALERTS_BASE, creds)
@@ -286,6 +469,23 @@ module Hawkular::Alerts::RSpec
286
469
  expect(events).to_not be_nil
287
470
  expect(events.size).to be(0)
288
471
  end
472
+
473
+ it 'Should create an event' do
474
+ the_id = "test-event@#{Time.new.to_i}"
475
+ VCR.use_cassette('Alert/Events/Should_create_an_event',
476
+ erb: { id: the_id }, record: :none,
477
+ decode_compressed_response: true
478
+ ) do
479
+ client = Hawkular::Alerts::AlertsClient.new(ALERTS_BASE, creds)
480
+
481
+ the_event = client.create_event(the_id, 'MyCategory', 'Li la lu',
482
+ context: { message: 'This is a test' },
483
+ tags: { tag_name: 'tag-value' })
484
+
485
+ expect(the_event['id']).to eql(the_id)
486
+ expect(the_event['category']).to eql('MyCategory')
487
+ end
488
+ end
289
489
  end
290
490
 
291
491
  describe 'Alert/EndToEnd', vcr: { decode_compressed_response: true } do
@@ -0,0 +1,228 @@
1
+ require "#{File.dirname(__FILE__)}/../vcr/vcr_setup"
2
+ require "#{File.dirname(__FILE__)}/../spec_helper"
3
+ require 'securerandom'
4
+
5
+ # examples that tests the main client which delegates all the calls to Hawkular component clients
6
+ module Hawkular::Client::RSpec
7
+ describe 'HawkularClient' do
8
+ before(:all) do
9
+ @creds = {
10
+ username: 'jdoe',
11
+ password: 'password'
12
+ }
13
+ @hawkular_client = Hawkular::Client.new(credentials: @creds)
14
+ @state = {
15
+ hostname: 'localhost.localdomain',
16
+ feed: nil
17
+ }
18
+ end
19
+
20
+ it 'Should fail when calling method with unknown prefix' do
21
+ expect { @hawkular_client.ynventori_list_feeds }.to raise_error(RuntimeError)
22
+ expect { @hawkular_client.list_feeds }.to raise_error(RuntimeError)
23
+ end
24
+
25
+ it 'Should fail when calling unknown method with known client prefix' do
26
+ expect { @hawkular_client.inventory_lyst_feeds }.to raise_error(NoMethodError)
27
+ end
28
+
29
+ context 'and Inventory client', vcr: { decode_compressed_response: true } do
30
+ before(:all) do
31
+ @client = Hawkular::Inventory::InventoryClient.create(credentials: @creds)
32
+ end
33
+
34
+ it 'Should list the same feeds' do
35
+ feeds1 = @client.list_feeds
36
+ feeds2 = @hawkular_client.inventory_list_feeds
37
+
38
+ expect(feeds1).to match_array(feeds2)
39
+ @state[:feed] = feeds1[0] unless feeds1[0].nil?
40
+ end
41
+
42
+ it 'Should list the same resource types' do
43
+ types1 = @client.list_resource_types
44
+ types2 = @hawkular_client.inventory_list_resource_types
45
+
46
+ expect(types1).to match_array(types2)
47
+ end
48
+
49
+ it 'Should list same types when param is given' do
50
+ types1 = @client.list_resource_types(@state[:feed])
51
+ types2 = @hawkular_client.inventory_list_resource_types(@state[:feed])
52
+
53
+ expect(types1).to match_array(types2)
54
+ end
55
+
56
+ it 'Should both list types with bad feed' do
57
+ type = 'does not exist'
58
+ types1 = @client.list_resource_types(type)
59
+ types2 = @hawkular_client.inventory_list_resource_types(type)
60
+
61
+ expect(types1).to match_array(types2)
62
+ end
63
+
64
+ it 'Should both list WildFlys' do
65
+ path = Hawkular::Inventory::CanonicalPath.new(feed_id: @state[:feed],
66
+ resource_type_id: hawk_escape_id('WildFly Server'))
67
+ resources1 = @client.list_resources_for_type(path.to_s)
68
+ resources2 = @hawkular_client.inventory_list_resources_for_type(path)
69
+
70
+ expect(resources1).to match_array(resources2)
71
+ end
72
+
73
+ it 'Should both create and delete feed' do
74
+ feed_id1 = 'feed_1123sdn'
75
+ feed_id2 = 'feed_1124sdn'
76
+ @client.create_feed feed_id1
77
+ @hawkular_client.inventory_create_feed feed_id2
78
+
79
+ feed_list = @client.list_feeds
80
+ expect(feed_list).to include(feed_id1)
81
+ expect(feed_list).to include(feed_id2)
82
+
83
+ @client.delete_feed feed_id2
84
+ @hawkular_client.inventory.delete_feed feed_id1
85
+
86
+ feed_list = @hawkular_client.inventory_list_feeds
87
+ expect(feed_list).not_to include(feed_id1)
88
+ expect(feed_list).not_to include(feed_id2)
89
+ end
90
+ end
91
+
92
+ context 'and Metrics client' do
93
+ include Hawkular::Metrics::RSpec
94
+
95
+ before(:all) do
96
+ @client = Hawkular::Metrics::Client.new('http://localhost:8080/hawkular/metrics', @creds)
97
+ end
98
+
99
+ it 'Should both work the same way when pushing metric data to non-existing counter' do
100
+ id = SecureRandom.uuid
101
+
102
+ VCR.use_cassette('HawkularClient/and_Metrics_client/Should both work the same way when' \
103
+ ' pushing metric data to non-existing counter',
104
+ erb: { id: id }, record: :none, decode_compressed_response: true
105
+ ) do
106
+ @client.counters.push_data(id, value: 4)
107
+
108
+ data = @hawkular_client.metrics.counters.get_data(id)
109
+ expect(data.size).to be 1
110
+ counter = @hawkular_client.metrics.counters.get(id)
111
+ expect(counter.id).to eql(id)
112
+ end
113
+ end
114
+
115
+ it 'Should both create and return Availability using Hash parameter' do
116
+ id1 = SecureRandom.uuid
117
+ id2 = SecureRandom.uuid
118
+ VCR.use_cassette(
119
+ 'HawkularClient/and_Metrics_client/Should both create and return Availability using Hash parameter',
120
+ erb: { id1: id1, id2: id2 }, record: :none, decode_compressed_response: true
121
+ ) do
122
+ @client.avail.create(id: id1, dataRetention: 123, tags: { some: 'value' })
123
+ metric = @hawkular_client.metrics.avail.get(id1)
124
+ expect(metric.id).to eql(id1)
125
+ expect(metric.data_retention).to eql(123)
126
+
127
+ @hawkular_client.metrics.avail.create(id: id2, dataRetention: 321, tags: { some: 'value' })
128
+ metric = @client.avail.get(id2)
129
+ expect(metric.id).to eql(id2)
130
+ expect(metric.data_retention).to eql(321)
131
+ end
132
+ end
133
+
134
+ it 'Should both update tags for Availability' do
135
+ id1 = SecureRandom.uuid
136
+ id2 = SecureRandom.uuid
137
+
138
+ VCR.use_cassette('HawkularClient/and_Metrics_client/Should both create and retrieve tags for Availability',
139
+ erb: { id1: id1, id2: id2 }, record: :none, decode_compressed_response: true
140
+ ) do
141
+ @client.avail.create(id: id1, tags: { myTag: id1 })
142
+ metric = @hawkular_client.metrics.avail.get(id1)
143
+ expect(metric.id).to eql(id1)
144
+
145
+ @hawkular_client.metrics.avail.create(id: id2, tags: { myTag: id2 })
146
+ metric = @client.avail.get(id2)
147
+ expect(metric.id).to eql(id2)
148
+ end
149
+ end
150
+
151
+ it 'Should both return the version' do
152
+ VCR.use_cassette('HawkularClient/and_Metrics_client/Should both return the version') do
153
+ data1 = @client.fetch_version_and_status
154
+ data2 = @hawkular_client.metrics.fetch_version_and_status
155
+ expect(data1).to eql(data2)
156
+ end
157
+ end
158
+ end
159
+
160
+ context 'and Operations client', vcr: { decode_compressed_response: true } do
161
+ include Hawkular::Operations::RSpec
162
+
163
+ WebSocketVCR.configure do |c|
164
+ c.hook_uris = ['localhost:8080']
165
+ end
166
+
167
+ let(:example) do |e|
168
+ e
169
+ end
170
+
171
+ it 'Should both work the same way', :websocket do
172
+ tenant_id = @hawkular_client.inventory_get_tenant
173
+ tenant_id2 = @hawkular_client.inventory.get_tenant
174
+ expect(tenant_id).to eql(tenant_id2)
175
+
176
+ feed_id = @hawkular_client.inventory.list_feeds.first
177
+ wf_server_resource_id = 'Local~~'
178
+ alerts_war_resource_id = 'Local~%2Fdeployment%3Dhawkular-alerts-actions-email.war'
179
+
180
+ WebSocketVCR.record(example, self) do
181
+ path = Hawkular::Inventory::CanonicalPath.new(tenant_id: tenant_id,
182
+ feed_id: feed_id,
183
+ resource_ids: [wf_server_resource_id, alerts_war_resource_id])
184
+
185
+ redeploy = {
186
+ operationName: 'Redeploy',
187
+ resourcePath: path.to_s
188
+ }
189
+
190
+ actual_data = {}
191
+ client = Hawkular::Operations::OperationsClient.new(credentials: @creds)
192
+ client.invoke_generic_operation(redeploy) do |on|
193
+ on.success do |data|
194
+ actual_data[:data] = data
195
+ end
196
+ on.failure do |error|
197
+ actual_data[:data] = {}
198
+ puts 'error callback was called, reason: ' + error.to_s
199
+ end
200
+ end
201
+
202
+ actual_data = wait_for actual_data
203
+ expect(actual_data['status']).to eq('OK')
204
+
205
+ # now do the same on the main client
206
+ actual_data = {}
207
+ @hawkular_client.operations_invoke_generic_operation(redeploy) do |on|
208
+ on.success do |data|
209
+ actual_data[:data] = data
210
+ end
211
+ on.failure do |error|
212
+ actual_data[:data] = {}
213
+ puts 'error callback was called, reason: ' + error.to_s
214
+ end
215
+ end
216
+
217
+ actual_data = wait_for actual_data
218
+ expect(actual_data['status']).to eq('OK')
219
+ end
220
+ end
221
+
222
+ xit 'Should both reuse the websocket connection', :websocket do
223
+ WebSocketVCR.record(example, self) do
224
+ end
225
+ end
226
+ end
227
+ end
228
+ end