zenoss_client 0.7.0 → 0.10.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.
- checksums.yaml +4 -4
- data/.travis.yml +8 -9
- data/README.rdoc +87 -0
- data/VERSION +1 -1
- data/lib/zenoss/connection.rb +1 -0
- data/lib/zenoss/events/event.rb +14 -2
- data/lib/zenoss/jsonapi/device_router.rb +28 -0
- data/lib/zenoss/jsonapi/report_router.rb +5 -1
- data/lib/zenoss/model/devices/device.rb +5 -0
- data/test/fixtures/vcr_cassettes/6_2_1_initial_connection.yml +232 -0
- data/test/fixtures/vcr_cassettes/6_2_1_test_0001_returns_an_Array_of_devices_when_searched_by_name.yml +107 -0
- data/test/fixtures/vcr_cassettes/6_2_1_test_0002_returns_device_uptime_when_asked.yml +131 -0
- data/test/fixtures/vcr_cassettes/6_2_1_test_0003_returns_an_Array_of_events_for_a_device.yml +100 -0
- data/test/fixtures/vcr_cassettes/6_2_1_test_0004_returns_an_Array_of_historical_events_for_a_device.yml +100 -0
- data/test/fixtures/vcr_cassettes/6_2_1_test_0005_returns_info_for_a_device_in_the_form_of_a_Hash.yml +265 -0
- data/test/fixtures/vcr_cassettes/6_2_1_test_0006_returns_an_Array_of_events_for_all_devices.yml +100 -0
- data/test/fixtures/vcr_cassettes/6_2_1_test_0007_fetches_the_report_tree.yml +164 -0
- data/test/fixtures/vcr_cassettes/6_2_1_test_0008_fetches_available_report_types_and_returns_a_Hash.yml +100 -0
- data/test/fixtures/vcr_cassettes/6_2_1_test_0009_renames_the_device.yml +184 -0
- data/test/fixtures/vcr_cassettes/6_2_1_test_0010_sets_info_for_a_device.yml +100 -0
- data/test/fixtures/vcr_cassettes/6_2_1_test_0011_sets_info_for_a_device_on_a_device_object.yml +100 -0
- data/test/fixtures/vcr_cassettes/6_2_1_test_0012_remodels_a_device.yml +99 -0
- data/test/test_helper.rb +14 -0
- data/test/zenoss_client_test.rb +89 -2
- data/test/zenoss_model_device_test.rb +25 -0
- data/zenoss_client.gemspec +7 -6
- metadata +30 -106
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4b19b969c4c6e18b9a4e012dfb56b627c5bdd43e960cdc64a8d7a9e5036df389
|
4
|
+
data.tar.gz: ab09ef31c00e1e38aa6761448c84190c7bf5ee90868d97e12f2bb1aa1eef733c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b86a0b85a3e8f36c9cc1a360e4620eff9da777389b732de7083782f9d925f353df261b647b7e8b46de29a4f035d73b116e62fb9d64d5cbcb68fb7e0d2040118e
|
7
|
+
data.tar.gz: aa516bb6da3f17bc94871fdc1dda6ee0582737eda7ba5e9aee33e5095aa0b2fcf9261c152ddd30d06217c36fca1df364c2f0c9f8c69d476b08831976bf258750
|
data/.travis.yml
CHANGED
@@ -1,16 +1,15 @@
|
|
1
1
|
language: ruby
|
2
2
|
script: bundle exec rake test
|
3
3
|
rvm:
|
4
|
-
-
|
5
|
-
- 2.0.0
|
4
|
+
- 2.0.0-p648
|
6
5
|
- 2.1.10
|
7
|
-
- 2.2.
|
8
|
-
- 2.3.
|
9
|
-
- 2.4.
|
10
|
-
- 2.5.
|
11
|
-
-
|
12
|
-
-
|
6
|
+
- 2.2.10
|
7
|
+
- 2.3.8
|
8
|
+
- 2.4.10
|
9
|
+
- 2.5.8
|
10
|
+
- 2.6.6
|
11
|
+
- 2.7.1
|
13
12
|
|
14
13
|
install:
|
15
|
-
- gem install bundler
|
14
|
+
- gem install bundler -v 1.17.3
|
16
15
|
- bundle install --jobs=3 --retry=3
|
data/README.rdoc
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
h1. zenoss_client: A Ruby library for JSON/REST access to Zenoss
|
2
|
+
|
3
|
+
This is a work-in-progress to create an easy to use client JSON/REST API for
|
4
|
+
Zenoss (http://www.zenoss.com) written in Ruby. I love Zenoss as a product,
|
5
|
+
but I am much more efficient in Ruby than Python so I decided to start
|
6
|
+
hacking this library together. It is very incomplete and I am just adding
|
7
|
+
functionality as I need it or it is requested.
|
8
|
+
|
9
|
+
Cheers,
|
10
|
+
|
11
|
+
Dan Wanek
|
12
|
+
|
13
|
+
h2. CHANGES SINCE THE 0.1.x BRANCH
|
14
|
+
|
15
|
+
Starting with 0.5.0 I am trying to incorporate as much of the new JSON API
|
16
|
+
into this library as possible because the type conversion hackery that was
|
17
|
+
present in the REST code is largely unnecessary. Please note that the
|
18
|
+
initialization is much different because we are using the sign-in form auth
|
19
|
+
instead of the Basic auth of the previous version. This is because the JSON
|
20
|
+
calls do not support Basic authentication.
|
21
|
+
|
22
|
+
There is still much work that needs to be done in order to fully implement
|
23
|
+
all of the JSON methods. For now many of the older features fall back to
|
24
|
+
REST and some of those will always rely on REST because they are not
|
25
|
+
currently supported in the JSON API.
|
26
|
+
|
27
|
+
|
28
|
+
h2. REQUIREMENTS:
|
29
|
+
Gems:
|
30
|
+
|
31
|
+
* tzinfo: For Python DateTime to Ruby DateTime conversion
|
32
|
+
|
33
|
+
|
34
|
+
h2. UNSUPPORTED REST METHODS:
|
35
|
+
Some methods within Zope are unsupported due to type conversion issues.
|
36
|
+
I have created a work-around but you must add a custom Python script
|
37
|
+
to Zope in order to do this. Please see this blog post for information
|
38
|
+
on how add the custom script:
|
39
|
+
|
40
|
+
http://distributed-frostbite.blogspot.com/2010/04/using-ruby-with-zenoss-part-1.html
|
41
|
+
|
42
|
+
UPDATE: The script itself is now part of the source tree and can be found here: tools/callZenossMethod.py
|
43
|
+
It should still be installed in the same fashion as the blog post steps through.
|
44
|
+
|
45
|
+
== TO USE:
|
46
|
+
A gem is now available. 'gem install zenoss_client'
|
47
|
+
|
48
|
+
<pre>
|
49
|
+
<code>
|
50
|
+
require 'zenoss'
|
51
|
+
require 'date'
|
52
|
+
|
53
|
+
server = 'https://zenhost:port/zport/dmd'
|
54
|
+
user, pass = 'zuser', 'zpass'
|
55
|
+
@zen = Zenoss.connect server, user, pass
|
56
|
+
dev = (@zen.find_devices_by_name 'myservername').first
|
57
|
+
|
58
|
+
# Get RRD data for this device
|
59
|
+
rrdpts = dev.get_rrd_data_points
|
60
|
+
datapoints = dev.fetch_rrd_value rrdpts.first.name, (DateTime.now - 1)
|
61
|
+
|
62
|
+
# Get the uptime of the device
|
63
|
+
dev.sys_uptime
|
64
|
+
|
65
|
+
# Get a list of events for this system
|
66
|
+
dev.get_events
|
67
|
+
</code>
|
68
|
+
</pre>
|
69
|
+
|
70
|
+
Have fun and let me know what needs to be fixed / added.
|
71
|
+
|
72
|
+
== Testing
|
73
|
+
You can invoke a series of minitest based spec test using the supplied
|
74
|
+
tests and rake task. Simply run the following to kick off the tests
|
75
|
+
@bundle exec rake test@
|
76
|
+
|
77
|
+
You should see output similar to the following (The number of tests will
|
78
|
+
of course grow over time):
|
79
|
+
@3 tests, 6 assertions, 0 failures, 0 errors, 0 skips@
|
80
|
+
|
81
|
+
If you get any failures, you should of course address them
|
82
|
+
|
83
|
+
Since the test suite requires a working Zenoss installation to test against,
|
84
|
+
some docker files are provided under test/docker. From a docker host, clone this
|
85
|
+
repo, cd to the appropriate test/docker/ subdirectory, and run @sh start.sh@ to
|
86
|
+
build and start the container. Once the container is running, you should be able
|
87
|
+
to run the tests as described above.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.10.1
|
data/lib/zenoss/connection.rb
CHANGED
data/lib/zenoss/events/event.rb
CHANGED
@@ -28,8 +28,20 @@ module Zenoss
|
|
28
28
|
def initialize(zenoss,zhash)
|
29
29
|
@zenoss = zenoss
|
30
30
|
super zhash
|
31
|
-
self.firstTime
|
32
|
-
self.lastTime
|
31
|
+
self.firstTime &&= convert_time(self.firstTime)
|
32
|
+
self.lastTime &&= convert_time(self.lastTime)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Converts a string or float to a Time object
|
36
|
+
# Zenoss version 4 emits the time format as a string
|
37
|
+
# Zenoss version 6 emits the time as a float
|
38
|
+
# @return[Time]
|
39
|
+
def convert_time(time)
|
40
|
+
if time.is_a?(String)
|
41
|
+
Time.parse(time)
|
42
|
+
else
|
43
|
+
Time.at(time)
|
44
|
+
end
|
33
45
|
end
|
34
46
|
|
35
47
|
def detail(history = false)
|
@@ -61,6 +61,34 @@ module Zenoss
|
|
61
61
|
json_request('DeviceRouter', 'getInfo', [data])
|
62
62
|
end
|
63
63
|
|
64
|
+
# @param [Hash] opts arguments to pass to setInfo
|
65
|
+
# @option opts [String] :uid required; device id in Zenoss
|
66
|
+
def set_info(opts = {})
|
67
|
+
if @zenoss_version && @zenoss_version > '6'
|
68
|
+
json_request('DeviceRouter', 'setInfo', [opts])
|
69
|
+
else
|
70
|
+
raise ZenossError, 'setInfo method on DeviceRouter is only allowed '\
|
71
|
+
'for version 6 and above'
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# @param [String] uid required; device id in Zenoss
|
76
|
+
# @param [String] plugins takes a string. A plugin respresents a Modeler
|
77
|
+
# plugin such as cisco.snmp.Interfaces
|
78
|
+
# @param [Boolean] background whether to schedule a job in background
|
79
|
+
def remodel(uid, plugins = nil, background = false)
|
80
|
+
if @zenoss_version && @zenoss_version > '6'
|
81
|
+
data = {}
|
82
|
+
data[:deviceUid] = uid
|
83
|
+
data[:collectPlugins] = plugins || ''
|
84
|
+
data[:background] = background
|
85
|
+
json_request('DeviceRouter', 'remodel', [data])
|
86
|
+
else
|
87
|
+
raise ZenossError, 'remodel method on DeviceRouter is only allowed '\
|
88
|
+
'for version 6 and above'
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
64
92
|
# =============== Non-API Helper methods ===============
|
65
93
|
|
66
94
|
# This method will allow you to search for devices by name. If you put a partial name
|
@@ -26,7 +26,11 @@ module Zenoss
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def get_report_tree(id = '/zport/dmd/Reports')
|
29
|
-
|
29
|
+
if @zenoss_version && @zenoss_version > '6'
|
30
|
+
json_request('ReportRouter', 'asyncGetTree', [id])
|
31
|
+
else
|
32
|
+
json_request('ReportRouter', 'getTree', [{:id => id}])
|
33
|
+
end
|
30
34
|
end
|
31
35
|
|
32
36
|
end # ReportRouter
|
@@ -50,6 +50,11 @@ module Zenoss
|
|
50
50
|
@zenoss.get_info(self.uid, keys)
|
51
51
|
end
|
52
52
|
|
53
|
+
def set_info(opts = {})
|
54
|
+
opts[:uid] = self.uid
|
55
|
+
@zenoss.set_info(opts)
|
56
|
+
end
|
57
|
+
|
53
58
|
# ------------------ Legacy REST Calls ------------------ #
|
54
59
|
|
55
60
|
# Move this Device to the given DeviceClass.
|
@@ -0,0 +1,232 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: http://localhost:8080/zport/dmd/zport/acl_users/cookieAuthHelper/login
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: __ac_name=admin&__ac_password=zenoss&submitted=true&came_from=http://localhost:8080/zport/dmd
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- HTTPClient/1.0 (2.8.3, ruby 2.3.3 (2016-11-21))
|
12
|
+
Accept:
|
13
|
+
- "*/*"
|
14
|
+
Date:
|
15
|
+
- Wed, 15 Apr 2020 20:38:47 GMT
|
16
|
+
Content-Type:
|
17
|
+
- application/x-www-form-urlencoded
|
18
|
+
Cookie: ''
|
19
|
+
response:
|
20
|
+
status:
|
21
|
+
code: 302
|
22
|
+
message: Found
|
23
|
+
headers:
|
24
|
+
Content-Length:
|
25
|
+
- '25'
|
26
|
+
Content-Type:
|
27
|
+
- text/plain; charset=utf-8
|
28
|
+
Date:
|
29
|
+
- Wed, 15 Apr 2020 20:38:50 GMT
|
30
|
+
Location:
|
31
|
+
- "/zport/dmd?submitted=true"
|
32
|
+
Server: ''
|
33
|
+
Set-Cookie: ''
|
34
|
+
Strict-Transport-Security:
|
35
|
+
- max-age=31536000
|
36
|
+
X-Frame-Options:
|
37
|
+
- SAMEORIGIN
|
38
|
+
X-Xss-Protection:
|
39
|
+
- 1; mode=block
|
40
|
+
body:
|
41
|
+
encoding: UTF-8
|
42
|
+
string: "/zport/dmd?submitted=true"
|
43
|
+
http_version:
|
44
|
+
recorded_at: Wed, 15 Apr 2020 20:38:51 GMT
|
45
|
+
- request:
|
46
|
+
method: post
|
47
|
+
uri: http://localhost:8080/zport/dmd//zport/dmd?submitted=true
|
48
|
+
body:
|
49
|
+
encoding: UTF-8
|
50
|
+
string: __ac_name=admin&__ac_password=zenoss&submitted=true&came_from=http://localhost:8080/zport/dmd
|
51
|
+
headers:
|
52
|
+
User-Agent:
|
53
|
+
- HTTPClient/1.0 (2.8.3, ruby 2.3.3 (2016-11-21))
|
54
|
+
Accept:
|
55
|
+
- "*/*"
|
56
|
+
Date:
|
57
|
+
- Wed, 15 Apr 2020 20:38:51 GMT
|
58
|
+
Content-Type:
|
59
|
+
- application/x-www-form-urlencoded
|
60
|
+
Cookie: ''
|
61
|
+
response:
|
62
|
+
status:
|
63
|
+
code: 200
|
64
|
+
message: OK
|
65
|
+
headers:
|
66
|
+
Cache-Control:
|
67
|
+
- max-age=0, no-cache
|
68
|
+
Content-Type:
|
69
|
+
- text/html; charset=utf-8
|
70
|
+
Date:
|
71
|
+
- Wed, 15 Apr 2020 20:38:51 GMT
|
72
|
+
Server: ''
|
73
|
+
Set-Cookie: ''
|
74
|
+
Strict-Transport-Security:
|
75
|
+
- max-age=31536000
|
76
|
+
Vary:
|
77
|
+
- Accept-Encoding
|
78
|
+
X-Frame-Options:
|
79
|
+
- SAMEORIGIN
|
80
|
+
X-Page-Speed:
|
81
|
+
- 1.11.33.4-0
|
82
|
+
X-Xss-Protection:
|
83
|
+
- 1; mode=block
|
84
|
+
Transfer-Encoding:
|
85
|
+
- chunked
|
86
|
+
body:
|
87
|
+
encoding: UTF-8
|
88
|
+
string: "\\n\\n <!DOCTYPE html>\\n<html>\\n"
|
89
|
+
http_version:
|
90
|
+
recorded_at: Wed, 15 Apr 2020 20:38:52 GMT
|
91
|
+
- request:
|
92
|
+
method: post
|
93
|
+
uri: http://localhost:8080/zport/dmd/zport/dmd/device_router
|
94
|
+
body:
|
95
|
+
encoding: UTF-8
|
96
|
+
string: __ac_name=admin&__ac_password=zenoss&submitted=true&came_from=https%3A%2F%2Fhttp:://localhost:8080/zport/dmd%2Fzport%2Fdmd
|
97
|
+
headers:
|
98
|
+
User-Agent:
|
99
|
+
- HTTPClient/1.0 (2.8.3, ruby 2.3.3 (2016-11-21))
|
100
|
+
Accept:
|
101
|
+
- "*/*"
|
102
|
+
Date:
|
103
|
+
- Wed, 15 Apr 2020 20:38:52 GMT
|
104
|
+
Content-Type:
|
105
|
+
- application/json; charset=utf-8
|
106
|
+
Cookie: ''
|
107
|
+
response:
|
108
|
+
status:
|
109
|
+
code: 200
|
110
|
+
message: OK
|
111
|
+
headers:
|
112
|
+
Content-Type:
|
113
|
+
- application/json
|
114
|
+
Date:
|
115
|
+
- Wed, 15 Apr 2020 20:38:54 GMT
|
116
|
+
Server: ''
|
117
|
+
Strict-Transport-Security:
|
118
|
+
- max-age=31536000
|
119
|
+
Vary:
|
120
|
+
- Accept-Encoding
|
121
|
+
X-Frame-Options:
|
122
|
+
- SAMEORIGIN
|
123
|
+
X-Xss-Protection:
|
124
|
+
- 1; mode=block
|
125
|
+
Content-Length:
|
126
|
+
- '309'
|
127
|
+
Set-Cookie: ''
|
128
|
+
body:
|
129
|
+
encoding: UTF-8
|
130
|
+
string: '{"uuid": "a34caf64-2209-480c-96ed-dd94117ef7ac", "action": "DeviceRouter",
|
131
|
+
"result": {"new_jobs": [{"uuid": "b0c01851-394f-49a1-8547-acd02633194e", "description":
|
132
|
+
"Create UnitTestDevice under /Devices/Server", "uid": "/zport/dmd/JobManager"}],
|
133
|
+
"success": true}, "tid": 1, "type": "rpc", "method": "addDevice"}'
|
134
|
+
http_version:
|
135
|
+
recorded_at: Wed, 15 Apr 2020 20:38:54 GMT
|
136
|
+
- request:
|
137
|
+
method: post
|
138
|
+
uri: http://localhost:8080/zport/dmd/zport/dmd/device_router
|
139
|
+
body:
|
140
|
+
encoding: UTF-8
|
141
|
+
string: __ac_name=admin&__ac_password=zenoss&submitted=true&came_from=https%3A%2F%2Fhttp:://localhost:8080/zport/dmd%2Fzport%2Fdmd
|
142
|
+
headers:
|
143
|
+
User-Agent:
|
144
|
+
- HTTPClient/1.0 (2.8.3, ruby 2.3.3 (2016-11-21))
|
145
|
+
Accept:
|
146
|
+
- "*/*"
|
147
|
+
Date:
|
148
|
+
- Wed, 15 Apr 2020 20:38:54 GMT
|
149
|
+
Content-Type:
|
150
|
+
- application/json; charset=utf-8
|
151
|
+
Cookie: ''
|
152
|
+
response:
|
153
|
+
status:
|
154
|
+
code: 200
|
155
|
+
message: OK
|
156
|
+
headers:
|
157
|
+
Content-Type:
|
158
|
+
- application/json
|
159
|
+
Date:
|
160
|
+
- Wed, 15 Apr 2020 20:38:54 GMT
|
161
|
+
Server: ''
|
162
|
+
Strict-Transport-Security:
|
163
|
+
- max-age=31536000
|
164
|
+
Vary:
|
165
|
+
- Accept-Encoding
|
166
|
+
X-Frame-Options:
|
167
|
+
- SAMEORIGIN
|
168
|
+
X-Xss-Protection:
|
169
|
+
- 1; mode=block
|
170
|
+
Content-Length:
|
171
|
+
- '197'
|
172
|
+
Set-Cookie: ''
|
173
|
+
body:
|
174
|
+
encoding: UTF-8
|
175
|
+
string: '{"uuid": "48c067ba-5c1e-4d81-aac0-3c49aadba9fc", "action": "DeviceRouter",
|
176
|
+
"result": {"totalCount": 0, "hash": "0", "success": true, "devices": []},
|
177
|
+
"tid": 2, "type": "rpc", "method": "getDevices"}'
|
178
|
+
http_version:
|
179
|
+
recorded_at: Wed, 15 Apr 2020 20:38:54 GMT
|
180
|
+
- request:
|
181
|
+
method: post
|
182
|
+
uri: http://localhost:8080/zport/dmd/zport/dmd/device_router
|
183
|
+
body:
|
184
|
+
encoding: UTF-8
|
185
|
+
string: __ac_name=admin&__ac_password=zenoss&submitted=true&came_from=https%3A%2F%2Fhttp:://localhost:8080/zport/dmd%2Fzport%2Fdmd
|
186
|
+
headers:
|
187
|
+
User-Agent:
|
188
|
+
- HTTPClient/1.0 (2.8.3, ruby 2.3.3 (2016-11-21))
|
189
|
+
Accept:
|
190
|
+
- "*/*"
|
191
|
+
Date:
|
192
|
+
- Wed, 15 Apr 2020 20:39:09 GMT
|
193
|
+
Content-Type:
|
194
|
+
- application/json; charset=utf-8
|
195
|
+
Cookie: ''
|
196
|
+
response:
|
197
|
+
status:
|
198
|
+
code: 200
|
199
|
+
message: OK
|
200
|
+
headers:
|
201
|
+
Content-Type:
|
202
|
+
- application/json
|
203
|
+
Date:
|
204
|
+
- Wed, 15 Apr 2020 20:39:11 GMT
|
205
|
+
Server: ''
|
206
|
+
Strict-Transport-Security:
|
207
|
+
- max-age=31536000
|
208
|
+
Vary:
|
209
|
+
- Accept-Encoding
|
210
|
+
X-Frame-Options:
|
211
|
+
- SAMEORIGIN
|
212
|
+
X-Xss-Protection:
|
213
|
+
- 1; mode=block
|
214
|
+
Content-Length:
|
215
|
+
- '905'
|
216
|
+
Set-Cookie: ''
|
217
|
+
body:
|
218
|
+
encoding: UTF-8
|
219
|
+
string: '{"uuid": "91ffde13-d44b-4a5e-9846-2155070ba803", "action": "DeviceRouter",
|
220
|
+
"result": {"totalCount": 1, "hash": "1", "success": true, "devices": [{"ipAddressString":
|
221
|
+
null, "serialNumber": "", "pythonClass": "Products.ZenModel.Device", "hwManufacturer":
|
222
|
+
null, "collector": "localhost", "osModel": null, "productionState": 1000,
|
223
|
+
"systems": [], "priority": 3, "hwModel": null, "tagNumber": "", "osManufacturer":
|
224
|
+
null, "location": null, "groups": [], "uid": "/zport/dmd/Devices/Server/devices/UnitTestDevice",
|
225
|
+
"ipAddress": null, "events": {"info": {"count": 0, "acknowledged_count": 0},
|
226
|
+
"clear": {"count": 0, "acknowledged_count": 0}, "warning": {"count": 0, "acknowledged_count":
|
227
|
+
0}, "critical": {"count": 0, "acknowledged_count": 0}, "error": {"count":
|
228
|
+
0, "acknowledged_count": 0}, "debug": {"count": 0, "acknowledged_count": 0}},
|
229
|
+
"name": "UnitTestDevice"}]}, "tid": 3, "type": "rpc", "method": "getDevices"}'
|
230
|
+
http_version:
|
231
|
+
recorded_at: Wed, 15 Apr 2020 20:39:11 GMT
|
232
|
+
recorded_with: VCR 4.0.0
|