hawkular-client 0.2.0 → 0.2.1

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 (86) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +2 -1
  4. data/.rubocop.yml +19 -6
  5. data/CHANGES.rdoc +13 -3
  6. data/README.rdoc +9 -3
  7. data/hawkularclient.gemspec +8 -4
  8. data/lib/alerts/alerts_api.rb +202 -32
  9. data/lib/hawkular.rb +35 -67
  10. data/lib/hawkular_all.rb +2 -0
  11. data/lib/inventory/inventory_api.rb +459 -130
  12. data/lib/metrics/metric_api.rb +14 -9
  13. data/lib/operations/operations_api.rb +247 -0
  14. data/lib/tokens/tokens_api.rb +33 -0
  15. data/lib/version.rb +1 -1
  16. data/spec/integration/alerts_spec.rb +272 -20
  17. data/spec/integration/hello-world-definitions.json +46 -0
  18. data/spec/integration/inventory_spec.rb +253 -89
  19. data/spec/integration/metric_spec.rb +36 -0
  20. data/spec/integration/operations_spec.rb +420 -0
  21. data/spec/integration/tokens_spec.rb +45 -0
  22. data/spec/resources/driver.jar +0 -0
  23. data/spec/resources/sample.war +0 -0
  24. data/spec/spec_helper.rb +30 -6
  25. data/spec/unit/base_spec.rb +22 -1
  26. data/spec/unit/canonical_path_spec.rb +92 -0
  27. data/spec/vcr/vcr_setup.rb +3 -4
  28. data/spec/vcr_cassettes/Alert/EndToEnd/Should_create_and_fire_a_trigger.yml +1187 -0
  29. data/spec/vcr_cassettes/Alert/Events/Should_list_events.yml +101 -0
  30. data/spec/vcr_cassettes/Alert/Events/Should_list_events_using_criteria.yml +79 -0
  31. data/spec/vcr_cassettes/Alert/Events/Should_not_list_events_using_criteria.yml +49 -0
  32. data/spec/vcr_cassettes/Alert/Triggers/Should_bulk_load_triggers.yml +225 -0
  33. data/spec/vcr_cassettes/Alert/Triggers/Should_create_a_basic_trigger_with_action.yml +355 -0
  34. data/spec/vcr_cassettes/Alert/Triggers/Should_create_an_action.yml +134 -0
  35. data/spec/vcr_cassettes/Alert/Triggers/Should_create_an_action_for_webhooks.yml +220 -0
  36. data/spec/vcr_cassettes/Alert/Triggers/Should_get_the_action_definitions.yml +218 -0
  37. data/spec/vcr_cassettes/Alert/Triggers/Should_not_create_an_action_for_unknown_plugin.yml +46 -0
  38. data/spec/vcr_cassettes/Alert/Triggers/Should_not_create_an_action_for_unknown_properties.yml +134 -0
  39. data/spec/vcr_cassettes/Counter_metrics/Should_get_metrics_with_limit_and_order.yml +270 -0
  40. data/spec/vcr_cassettes/Inventory/Client_should_listen_on_various_inventory_events.json +47 -0
  41. data/spec/vcr_cassettes/Inventory/Client_should_listen_on_various_inventory_events.yml +191 -0
  42. data/spec/vcr_cassettes/Inventory/Helpers/generate_some_events_for_websocket.yml +507 -0
  43. data/spec/vcr_cassettes/Inventory/Should_List_datasources_with_no_props.yml +74 -69
  44. data/spec/vcr_cassettes/Inventory/{Should_list_types_without_feed.yml → Should_create_a_feed.yml} +29 -32
  45. data/spec/vcr_cassettes/Inventory/Should_create_a_feed_again.yml +211 -0
  46. data/spec/vcr_cassettes/Inventory/Should_create_a_resource_.yml +355 -0
  47. data/spec/vcr_cassettes/Inventory/Should_create_a_resource_with_metric.yml +786 -0
  48. data/spec/vcr_cassettes/Inventory/Should_create_a_resourcetype.yml +205 -0
  49. data/spec/vcr_cassettes/Inventory/Should_create_and_delete_feed.yml +201 -0
  50. data/spec/vcr_cassettes/Inventory/Should_create_and_get_a_resource.yml +419 -0
  51. data/spec/vcr_cassettes/Inventory/Should_list_URLs.yml +39 -27
  52. data/spec/vcr_cassettes/Inventory/Should_list_WildFlys.yml +37 -29
  53. data/spec/vcr_cassettes/Inventory/Should_list_WildFlys_with_props.yml +53 -45
  54. data/spec/vcr_cassettes/Inventory/Should_list_all_the_resource_types.yml +177 -0
  55. data/spec/vcr_cassettes/Inventory/Should_list_children_of_WildFly.yml +230 -56
  56. data/spec/vcr_cassettes/Inventory/Should_list_feeds.yml +27 -24
  57. data/spec/vcr_cassettes/Inventory/Should_list_heap_metrics_for_WildFlys.yml +586 -119
  58. data/spec/vcr_cassettes/Inventory/Should_list_metrics_for_WildFlys.yml +220 -59
  59. data/spec/vcr_cassettes/Inventory/Should_list_metrics_of_given_metric_type.yml +613 -0
  60. data/spec/vcr_cassettes/Inventory/Should_list_metrics_of_given_resource_type.yml +333 -0
  61. data/spec/vcr_cassettes/Inventory/Should_list_recursive_children_of_WildFly.yml +2064 -0
  62. data/spec/vcr_cassettes/Inventory/Should_list_relationships_of_WildFly.yml +460 -0
  63. data/spec/vcr_cassettes/Inventory/Should_list_types_with_bad_feed.yml +26 -25
  64. data/spec/vcr_cassettes/Inventory/Should_list_types_with_feed.yml +102 -36
  65. data/spec/vcr_cassettes/Inventory/Should_not_find_an_unknown_resource.yml +54 -0
  66. data/spec/vcr_cassettes/Inventory/Tenants/Should_Get_Tenant_For_Explicit_Credentials.yml +50 -0
  67. data/spec/vcr_cassettes/Inventory/Tenants/Should_Get_Tenant_For_Implicit_Credentials.yml +50 -0
  68. data/spec/vcr_cassettes/Operation/Helpers/get_tenant.yml +50 -0
  69. data/spec/vcr_cassettes/Operation/Operation/Add_JDBC_driver_should_add_the_driver.json +26 -0
  70. data/spec/vcr_cassettes/Operation/Operation/Add_datasource_should_be_doable.json +26 -0
  71. data/spec/vcr_cassettes/Operation/Operation/Add_deployment_should_be_doable.json +26 -0
  72. data/spec/vcr_cassettes/Operation/Operation/Redeploy_can_be_run_multiple_times_in_parallel.json +40 -0
  73. data/spec/vcr_cassettes/Operation/Operation/Redeploy_should_be_performed_and_eventually_respond_with_success.json +26 -0
  74. data/spec/vcr_cassettes/Operation/Operation/Redeploy_should_not_be_performed_if_resource_path_is_wrong.json +26 -0
  75. data/spec/vcr_cassettes/Operation/Operation/Remove_JDBC_driver_should_be_performed_and_eventually_respond_with_success.json +26 -0
  76. data/spec/vcr_cassettes/Operation/Operation/Remove_datasource_should_be_performed_and_eventually_respond_with_success.json +26 -0
  77. data/spec/vcr_cassettes/Operation/Operation/Remove_deployment_should_be_performed_and_eventually_respond_with_success.json +26 -0
  78. data/spec/vcr_cassettes/Operation/Operation/Undeploy_should_be_performed_and_eventually_respond_with_success.json +26 -0
  79. data/spec/vcr_cassettes/Operation/Operation/should_not_be_possible_to_perform_on_closed_client.json +12 -0
  80. data/spec/vcr_cassettes/Operation/Websocket_connection/should_be_established.json +9 -0
  81. data/spec/vcr_cassettes/Tokens/Should_be_able_to_create_a_new_token_for_an_actual_user.yml +57 -0
  82. data/spec/vcr_cassettes/Tokens/Should_be_able_to_list_the_available_tokens.yml +49 -0
  83. data/spec/vcr_cassettes/Tokens/Should_get_a_401_when_attempting_to_create_a_token_with_a_wrong_password.yml +56 -0
  84. data/spec/vcr_cassettes/Tokens/Should_get_a_401_when_attempting_to_create_a_token_without_a_password.yml +55 -0
  85. metadata +175 -11
  86. data/lib/metrics/version.rb +0 -7
@@ -0,0 +1,46 @@
1
+ {
2
+ "triggers":[
3
+ {
4
+ "trigger":{
5
+ "id": "hello-world-trigger",
6
+ "name": "Hello World Trigger",
7
+ "description": "A mandatory Hello World Trigger",
8
+ "severity": "HIGH",
9
+ "enabled": true,
10
+ "actions":[
11
+ {
12
+ "actionPlugin": "email",
13
+ "actionId": "notify-to-admins"
14
+ }
15
+ ]
16
+ },
17
+ "conditions":[
18
+ {
19
+ "triggerMode": "FIRING",
20
+ "type": "threshold",
21
+ "dataId": "data-x",
22
+ "operator": "LT",
23
+ "threshold": 5
24
+ },
25
+ {
26
+ "triggerMode": "FIRING",
27
+ "type": "threshold",
28
+ "dataId": "data-y",
29
+ "operator": "GT",
30
+ "threshold": 5
31
+ }
32
+ ]
33
+ }
34
+ ],
35
+ "actions":[
36
+ {
37
+ "actionPlugin": "email",
38
+ "actionId": "notify-to-admins",
39
+ "properties": {
40
+ "to": "admins@hawkular.org",
41
+ "cc": "developers@hawkular.org",
42
+ "description": "Notify by email to Admins with cc to Developers"
43
+ }
44
+ }
45
+ ]
46
+ }
@@ -1,87 +1,71 @@
1
1
  require "#{File.dirname(__FILE__)}/../vcr/vcr_setup"
2
2
  require "#{File.dirname(__FILE__)}/../spec_helper"
3
+ require 'securerandom'
3
4
 
4
5
  module Hawkular::Inventory::RSpec
5
- INVENTORY_BASE = 'http://localhost:8080/hawkular/inventory'
6
- describe 'Tenants', :vcr do
6
+ describe 'Inventory/Tenants', :vcr do
7
7
  it 'Should Get Tenant For Explicit Credentials' do
8
+ # get the client for given endpoint for given credentials
8
9
  creds = { username: 'jdoe', password: 'password' }
9
-
10
- client = Hawkular::Inventory::InventoryClient.new(INVENTORY_BASE, creds)
10
+ client = Hawkular::Inventory::InventoryClient.create(entrypoint: 'http://localhost:8080/hawkular/inventory',
11
+ credentials: creds)
11
12
 
12
13
  tenant = client.get_tenant(creds)
13
14
 
14
- expect tenant.nil?
15
- expect tenant.eql?('28026b36-8fe4-4332-84c8-524e173a68bf')
15
+ expect(tenant).to eq('28026b36-8fe4-4332-84c8-524e173a68bf')
16
16
  end
17
17
 
18
18
  it 'Should Get Tenant For Implicit Credentials' do
19
19
  creds = { username: 'jdoe', password: 'password' }
20
-
21
- client = Hawkular::Inventory::InventoryClient.new(INVENTORY_BASE, creds)
20
+ client = Hawkular::Inventory::InventoryClient.create(credentials: creds)
22
21
 
23
22
  tenant = client.get_tenant
24
23
 
25
- expect tenant.nil?
26
-
27
- expect tenant.eql?('28026b36-8fe4-4332-84c8-524e173a68bf')
24
+ expect(tenant).to eq('28026b36-8fe4-4332-84c8-524e173a68bf')
28
25
  end
29
26
  end
30
27
 
31
- describe 'Inventory', :vcr do
32
- it 'Should list feeds' do
33
- creds = { username: 'jdoe', password: 'password' }
34
-
35
- client = Hawkular::Inventory::InventoryClient.new(INVENTORY_BASE, creds)
36
- client.impersonate
28
+ describe 'Inventory', vcr: { decode_compressed_response: true } do
29
+ before(:all) do
30
+ @creds = {
31
+ username: 'jdoe',
32
+ password: 'password'
33
+ }
34
+ @client = Hawkular::Inventory::InventoryClient.create(credentials: @creds)
35
+ @state = {
36
+ hostname: 'localhost.localdomain',
37
+ feed: nil
38
+ }
39
+ end
37
40
 
38
- feeds = client.list_feeds
41
+ it 'Should list feeds' do
42
+ feeds = @client.list_feeds
39
43
 
40
44
  expect(feeds.size).to be(1)
45
+ @state[:feed] = feeds[0] unless feeds[0].nil?
41
46
  end
42
47
 
43
- it 'Should list types without feed' do
44
- creds = { username: 'jdoe', password: 'password' }
45
-
46
- client = Hawkular::Inventory::InventoryClient.new(INVENTORY_BASE, creds)
47
- client.impersonate
48
-
49
- types = client.list_resource_types
50
-
51
- expect(types.size).to be(17)
48
+ it 'Should list all the resource types' do
49
+ types = @client.list_resource_types
50
+ expect(types.size).to be(19)
52
51
  end
53
52
 
54
53
  it 'Should list types with feed' do
55
- creds = { username: 'jdoe', password: 'password' }
56
-
57
- client = Hawkular::Inventory::InventoryClient.new(INVENTORY_BASE, creds)
58
- client.impersonate
54
+ types = @client.list_resource_types(@state[:feed])
59
55
 
60
- types = client.list_resource_types('snert')
61
-
62
- expect(types.size).to be(16)
56
+ expect(types.size).to be(18)
63
57
  end
64
58
 
65
59
  it 'Should list types with bad feed' do
66
- creds = { username: 'jdoe', password: 'password' }
67
-
68
- client = Hawkular::Inventory::InventoryClient.new(INVENTORY_BASE, creds)
69
- client.impersonate
70
-
71
60
  type = 'does not exist'
72
- types = client.list_resource_types(type)
61
+ types = @client.list_resource_types(type)
73
62
  expect(type).to eq('does not exist')
74
63
 
75
64
  expect(types.size).to be(0)
76
65
  end
77
66
 
78
67
  it 'Should list WildFlys' do
79
- creds = { username: 'jdoe', password: 'password' }
80
-
81
- client = Hawkular::Inventory::InventoryClient.new(INVENTORY_BASE, creds)
82
- client.impersonate
83
-
84
- resources = client.list_resources_for_type('snert', 'WildFly Server')
68
+ resources = @client.list_resources_for_type(@state[:feed], 'WildFly Server')
85
69
 
86
70
  expect(resources.size).to be(1)
87
71
  wf = resources.first
@@ -89,25 +73,15 @@ module Hawkular::Inventory::RSpec
89
73
  end
90
74
 
91
75
  it 'Should list WildFlys with props' do
92
- creds = { username: 'jdoe', password: 'password' }
93
-
94
- client = Hawkular::Inventory::InventoryClient.new(INVENTORY_BASE, creds)
95
- client.impersonate
96
-
97
- resources = client.list_resources_for_type('snert', 'WildFly Server', true)
76
+ resources = @client.list_resources_for_type(@state[:feed], 'WildFly Server', true)
98
77
 
99
78
  expect(resources.size).to be(1)
100
79
  wf = resources.first
101
- expect(wf.properties['Hostname']).to eq('snert')
80
+ expect(wf.properties['Hostname']).to eq(@state[:hostname])
102
81
  end
103
82
 
104
83
  it 'Should List datasources with no props' do
105
- creds = { username: 'jdoe', password: 'password' }
106
-
107
- client = Hawkular::Inventory::InventoryClient.new(INVENTORY_BASE, creds)
108
- client.impersonate
109
-
110
- resources = client.list_resources_for_type('snert', 'Datasource', true)
84
+ resources = @client.list_resources_for_type(@state[:feed], 'Datasource', true)
111
85
 
112
86
  expect(resources.size).to be(2)
113
87
  wf = resources.first
@@ -115,71 +89,261 @@ module Hawkular::Inventory::RSpec
115
89
  end
116
90
 
117
91
  it 'Should list URLs' do
118
- creds = { username: 'jdoe', password: 'password' }
119
-
120
- client = Hawkular::Inventory::InventoryClient.new(INVENTORY_BASE, creds)
121
- client.impersonate
122
-
123
- resources = client.list_resources_for_type(nil, 'URL')
92
+ resources = @client.list_resources_for_type(nil, 'URL')
124
93
 
125
94
  expect(resources.size).to be(1)
126
95
  resource = resources[0]
127
96
  expect(resource.instance_of? Hawkular::Inventory::Resource).to be_truthy
128
- expect(resource.properties.size).to be(5)
97
+ expect(resource.properties.size).to be(6)
129
98
  expect(resource.properties['url']).to eq('http://bsd.de')
130
99
  end
131
100
 
132
101
  it 'Should list metrics for WildFlys' do
133
- creds = { username: 'jdoe', password: 'password' }
134
-
135
- client = Hawkular::Inventory::InventoryClient.new(INVENTORY_BASE, creds)
136
- client.impersonate
137
-
138
- resources = client.list_resources_for_type('snert', 'WildFly Server')
102
+ resources = @client.list_resources_for_type(@state[:feed], 'WildFly Server')
139
103
  expect(resources.size).to be(1)
140
104
 
141
105
  wild_fly = resources[0]
142
106
 
143
- metrics = client.list_metrics_for_resource(wild_fly)
107
+ metrics = @client.list_metrics_for_resource(wild_fly)
144
108
 
145
109
  expect(metrics.size).to be(14)
146
110
  end
147
111
 
148
112
  it 'Should list children of WildFly' do
149
- creds = { username: 'jdoe', password: 'password' }
113
+ resources = @client.list_resources_for_type(@state[:feed], 'WildFly Server')
114
+ expect(resources.size).to be(1)
115
+
116
+ wild_fly = resources[0]
150
117
 
151
- client = Hawkular::Inventory::InventoryClient.new(INVENTORY_BASE, creds)
152
- client.impersonate
118
+ children = @client.list_child_resources(wild_fly)
153
119
 
154
- resources = client.list_resources_for_type('snert', 'WildFly Server')
155
- expect(resources.size).to be(1)
120
+ expect(children.size).to be(21)
121
+ end
156
122
 
123
+ it 'Should list recursive children of WildFly' do
124
+ resources = @client.list_resources_for_type(@state[:feed], 'WildFly Server')
157
125
  wild_fly = resources[0]
158
126
 
159
- metrics = client.list_child_resources(wild_fly)
127
+ children = @client.list_child_resources(wild_fly, recursive: true)
160
128
 
161
- expect(metrics.size).to be(21)
129
+ expect(children.size).to be(211)
162
130
  end
163
131
 
164
- it 'Should list heap metrics for WildFlys' do
165
- creds = { username: 'jdoe', password: 'password' }
132
+ it 'Should list relationships of WildFly' do
133
+ resources = @client.list_resources_for_type(@state[:feed], 'WildFly Server')
134
+ wild_fly = resources[0]
166
135
 
167
- client = Hawkular::Inventory::InventoryClient.new(INVENTORY_BASE, creds)
168
- client.impersonate
136
+ rels = @client.list_relationships(wild_fly)
137
+
138
+ expect(rels.size).to be(59)
139
+ end
169
140
 
170
- resources = client.list_resources_for_type('snert', 'WildFly Server')
141
+ it 'Should list heap metrics for WildFlys' do
142
+ resources = @client.list_resources_for_type(@state[:feed], 'WildFly Server')
171
143
  expect(resources.size).to be(1)
172
144
 
173
145
  wild_fly = resources[0]
174
146
 
175
- metrics = client.list_metrics_for_resource(wild_fly, type: 'GAUGE', match: 'Metrics~Heap')
147
+ metrics = @client.list_metrics_for_resource(wild_fly, type: 'GAUGE', match: 'Metrics~Heap')
176
148
  expect(metrics.size).to be(3)
177
149
 
178
- metrics = client.list_metrics_for_resource(wild_fly, match: 'Metrics~Heap')
150
+ metrics = @client.list_metrics_for_resource(wild_fly, match: 'Metrics~Heap')
179
151
  expect(metrics.size).to be(3)
180
152
 
181
- metrics = client.list_metrics_for_resource(wild_fly, type: 'GAUGE')
182
- expect(metrics.size).to be(10)
153
+ metrics = @client.list_metrics_for_resource(wild_fly, type: 'GAUGE')
154
+ expect(metrics.size).to be(8)
155
+ end
156
+
157
+ it 'Should list metrics of given metric type' do
158
+ metrics = @client.list_metrics_for_metric_type(@state[:feed], 'Total Space')
159
+
160
+ expect(metrics.size).to be(7)
161
+ end
162
+
163
+ it 'Should list metrics of given resource type' do
164
+ metrics = @client.list_metrics_for_resource_type(@state[:feed], 'WildFly Server')
165
+
166
+ expect(metrics.size).to be(14)
167
+ end
168
+
169
+ it 'Should create a feed' do
170
+ feed_id = 'feed_1123sdncisud6237ui23hjbdscuzsad'
171
+ ret = @client.create_feed feed_id
172
+ expect(ret).to_not be_nil
173
+ expect(ret['id']).to eq(feed_id)
174
+ end
175
+
176
+ it 'Should create and delete feed' do
177
+ feed_id = 'feed_1123sdn'
178
+ ret = @client.create_feed feed_id
179
+ expect(ret).to_not be_nil
180
+ expect(ret['id']).to eq(feed_id)
181
+
182
+ @client.delete_feed feed_id
183
+
184
+ feed_list = @client.list_feeds
185
+ expect(feed_list).not_to include(feed_id)
186
+ end
187
+
188
+ it 'Should create a feed again' do
189
+ feed_id = 'feed_1123sdncisud6237ui2378789vvgX'
190
+ @client.create_feed feed_id
191
+ @client.create_feed feed_id
192
+ end
193
+
194
+ it 'Should create a resourcetype' do
195
+ feed_id = 'feed_may_exist'
196
+ @client.create_feed feed_id
197
+
198
+ ret = @client.create_resource_type feed_id, 'rt-123', 'ResourceType'
199
+ expect(ret.id).to eq('rt-123')
200
+ expect(ret.name).to eq('ResourceType')
201
+ expect(ret.path).to include('/rt;rt-123')
202
+ expect(ret.path).to include('/f;feed_may_exist')
203
+ end
204
+
205
+ it 'Should create a resource ' do
206
+ feed_id = 'feed_may_exist'
207
+ @client.create_feed feed_id
208
+ ret = @client.create_resource_type feed_id, 'rt-123', 'ResourceType'
209
+ type_path = ret.path
210
+
211
+ @client.create_resource feed_id, type_path, 'r123', 'My Resource', 'version' => 1.0
212
+
213
+ r = @client.get_resource(feed_id, 'r123', false)
214
+ expect(r.id).to eq('r123')
215
+ expect(r.properties).not_to be_empty
216
+ end
217
+
218
+ it 'Should create a resource with metric' do
219
+ feed_id = 'feed_may_exist'
220
+ @client.create_feed feed_id
221
+ ret = @client.create_resource_type feed_id, 'rt-123', 'ResourceType'
222
+ type_path = ret.path
223
+
224
+ @client.create_resource feed_id, type_path, 'r124', 'My Resource', 'version' => 1.0
225
+
226
+ r = @client.get_resource(feed_id, 'r124', false)
227
+ expect(r.id).to eq('r124')
228
+ expect(r.properties).not_to be_empty
229
+
230
+ r = @client.create_metric_type feed_id, 'mt-124'
231
+ expect(r).not_to be_nil
232
+ expect(r.id).to eq('mt-124')
233
+
234
+ m = @client.create_metric_for_resource feed_id, 'm-124', r.path, 'r124'
235
+ expect(m).not_to be_nil
236
+ expect(m.id).to eq('m-124')
237
+ expect(m.name).to eq('m-124')
238
+
239
+ m = @client.create_metric_for_resource feed_id, 'm-124-1', r.path, 'r124', 'Metric1'
240
+ expect(m).not_to be_nil
241
+ expect(m.id).to eq('m-124-1')
242
+ expect(m.name).to eq('Metric1')
243
+ end
244
+
245
+ it 'Should create and get a resource' do
246
+ feed_id = 'feed_may_exist'
247
+ @client.create_feed feed_id
248
+ ret = @client.create_resource_type feed_id, 'rt-123', 'ResourceType'
249
+ type_path = ret.path
250
+
251
+ @client.create_resource feed_id, type_path, 'r125', 'My Resource', 'version' => 1.0
252
+
253
+ r = @client.get_resource(feed_id, 'r125', true)
254
+ expect(r.id).to eq('r125')
255
+ expect(r.properties).not_to be_empty
256
+ end
257
+
258
+ it 'Should not find an unknown resource' do
259
+ feed_id = 'feed_may_exist'
260
+
261
+ expect { @client.get_resource(feed_id, '*bla does not exist*') }
262
+ .to raise_error(Hawkular::BaseClient::HawkularException, /No Resource found/)
263
+ end
264
+
265
+ it 'Should reject unknown metric type' do
266
+ feed_id = 'feed_may_exist'
267
+
268
+ expect { @client.create_metric_type feed_id, 'abc', 'FOOBaR' }.to raise_error(RuntimeError, /Unknown type FOOBAR/)
269
+ end
270
+
271
+ let(:example) do |e|
272
+ e
273
+ end
274
+
275
+ it 'Client should listen on various inventory events', :websocket do
276
+ VCR::WebSocket.configure do |c|
277
+ c.hook_uris = ['localhost:8080']
278
+ end
279
+
280
+ VCR::WebSocket.record(example, self) do
281
+ # TODO: erb
282
+ # prefix = SecureRandom.uuid
283
+ prefix = 'random'
284
+
285
+ id_1 = prefix + '-r126'
286
+ id_2 = prefix + '-r127'
287
+ id_3 = prefix + '-r128'
288
+
289
+ new_resource_events = {}
290
+ resources_closable = @client.events do |resource|
291
+ new_resource_events[resource.id] = resource
292
+ end
293
+
294
+ deleted_feed_events = {}
295
+ feed_deleted_closable = @client.events('feed', 'deleted') do |feed|
296
+ deleted_feed_events[feed.id] = feed
297
+ end
298
+
299
+ new_resource_types_events = {}
300
+ resource_type_closable = @client.events('resourcetype') do |resource_type|
301
+ new_resource_types_events[resource_type.id] = resource_type
302
+ end
303
+
304
+ registered_feed_events = {}
305
+ feeds_closable = @client.events('feed', 'created') do |feed|
306
+ registered_feed_events[feed.id] = feed
307
+ end
308
+
309
+ feed_id = prefix + '-feed'
310
+ resource_type_id = prefix + '-rt-123'
311
+ resource_type_name = 'ResourceType'
312
+
313
+ VCR.use_cassette('Inventory/Helpers/generate_some_events_for_websocket') do
314
+ @client.create_feed feed_id
315
+ ret = @client.create_resource_type feed_id, resource_type_id, resource_type_name
316
+ type_path = ret.path
317
+
318
+ # create 3 resources
319
+ @client.create_resource feed_id, type_path, id_1, 'My Resource 1', 'version' => 1.0
320
+ @client.create_resource feed_id, type_path, id_2, 'My Resource 2', 'version' => 1.1
321
+ resources_closable.close
322
+ @client.create_resource feed_id, type_path, id_3, 'My Resource 3', 'version' => 1.2
323
+
324
+ @client.delete_feed feed_id
325
+ end
326
+
327
+ # wait for the data
328
+ sleep 2 if !VCR::WebSocket.cassette || VCR::WebSocket.cassette.recording?
329
+ [feed_deleted_closable, resource_type_closable, feeds_closable].each(&:close)
330
+ expect(new_resource_events[id_1]).not_to be_nil
331
+ expect(new_resource_events[id_1].properties['version']).to eq(1.0)
332
+ expect(new_resource_events[id_2]).not_to be_nil
333
+ expect(new_resource_events[id_2].properties['version']).to eq(1.1)
334
+ # resource with id_3 should not be among events, because we stopped listening before creating the 3rd one
335
+ expect(new_resource_events[id_3]).to be_nil
336
+
337
+ expect(registered_feed_events[feed_id]).not_to be_nil
338
+ expect(registered_feed_events[feed_id].id).to eq(feed_id)
339
+
340
+ expect(deleted_feed_events[feed_id]).not_to be_nil
341
+ expect(deleted_feed_events[feed_id].id).to eq(feed_id)
342
+
343
+ expect(new_resource_types_events[resource_type_id]).not_to be_nil
344
+ expect(new_resource_types_events[resource_type_id].id).to eq(resource_type_id)
345
+ expect(new_resource_types_events[resource_type_id].name).to eq(resource_type_name)
346
+ end
183
347
  end
184
348
 
185
349
  # TODO: enable when inventory supports it