zenoss_client 0.5.4 → 0.6.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 (42) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +3 -1
  3. data/.travis.yml +9 -0
  4. data/Gemfile +1 -1
  5. data/README.textile +6 -1
  6. data/Rakefile +5 -4
  7. data/VERSION +1 -1
  8. data/lib/zenoss.rb +2 -2
  9. data/lib/zenoss/connection.rb +3 -2
  10. data/lib/zenoss/jsonapi/events_router.rb +0 -1
  11. data/lib/zenoss/model/devices/device.rb +9 -0
  12. data/test/docker/3.2.1/Dockerfile +11 -0
  13. data/test/docker/3.2.1/remote_start.sh +3 -0
  14. data/test/docker/3.2.1/start.sh +2 -0
  15. data/test/docker/4.2.5/Dockerfile +10 -0
  16. data/test/docker/4.2.5/remote_start.sh +12 -0
  17. data/test/docker/4.2.5/start.sh +2 -0
  18. data/test/fixtures/.gitkeep +0 -0
  19. data/test/fixtures/vcr_cassettes/3_2_1_initial_connection.yml +437 -0
  20. data/test/fixtures/vcr_cassettes/3_2_1_test_0001_returns_an_Array_of_devices_when_searched_by_name.yml +85 -0
  21. data/test/fixtures/vcr_cassettes/3_2_1_test_0002_returns_device_uptime_when_asked.yml +110 -0
  22. data/test/fixtures/vcr_cassettes/3_2_1_test_0003_returns_an_Array_of_events_for_a_device.yml +80 -0
  23. data/test/fixtures/vcr_cassettes/3_2_1_test_0004_returns_an_Array_of_historical_events_for_a_device.yml +80 -0
  24. data/test/fixtures/vcr_cassettes/3_2_1_test_0005_returns_info_for_a_device_in_the_form_of_a_Hash.yml +251 -0
  25. data/test/fixtures/vcr_cassettes/3_2_1_test_0006_returns_an_Array_of_events_for_all_devices.yml +86 -0
  26. data/test/fixtures/vcr_cassettes/3_2_1_test_0007_fetches_the_report_tree.yml +181 -0
  27. data/test/fixtures/vcr_cassettes/3_2_1_test_0008_fetches_available_report_types_and_returns_a_Hash.yml +82 -0
  28. data/test/fixtures/vcr_cassettes/3_2_1_test_0009_renames_the_device.yml +151 -0
  29. data/test/fixtures/vcr_cassettes/4_2_5_initial_connection.yml +594 -0
  30. data/test/fixtures/vcr_cassettes/4_2_5_test_0001_returns_an_Array_of_devices_when_searched_by_name.yml +93 -0
  31. data/test/fixtures/vcr_cassettes/4_2_5_test_0002_returns_device_uptime_when_asked.yml +114 -0
  32. data/test/fixtures/vcr_cassettes/4_2_5_test_0003_returns_an_Array_of_events_for_a_device.yml +99 -0
  33. data/test/fixtures/vcr_cassettes/4_2_5_test_0004_returns_an_Array_of_historical_events_for_a_device.yml +99 -0
  34. data/test/fixtures/vcr_cassettes/4_2_5_test_0005_returns_info_for_a_device_in_the_form_of_a_Hash.yml +234 -0
  35. data/test/fixtures/vcr_cassettes/4_2_5_test_0006_returns_an_Array_of_events_for_all_devices.yml +203 -0
  36. data/test/fixtures/vcr_cassettes/4_2_5_test_0007_fetches_the_report_tree.yml +203 -0
  37. data/test/fixtures/vcr_cassettes/4_2_5_test_0008_fetches_available_report_types_and_returns_a_Hash.yml +86 -0
  38. data/test/fixtures/vcr_cassettes/4_2_5_test_0009_renames_the_device.yml +160 -0
  39. data/test/test_helper.rb +20 -11
  40. data/test/zenoss_client_test.rb +140 -114
  41. data/zenoss_client.gemspec +13 -9
  42. metadata +104 -37
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f8f07405207ee82f6bcaa25d7269cef6efceee00
4
+ data.tar.gz: 098b6361c48aba30c8167547d57e906fa73c052b
5
+ SHA512:
6
+ metadata.gz: 49f02e82b15399437c4e5f9d4d8b8e4ec719a29af079171b79ce92c106e042b17d901e64bc3598d7f3549354a7b14dd643481fea872ae8c551d874dd7ecb52a7
7
+ data.tar.gz: 2512bd62eab7f087dbb737b2173b62673b7c740f613342409291a624dc0d02d664d02a9e4238518b6d22601f85f1519219be771fcc6b50696d1785ce792ddb6f
data/.gitignore CHANGED
@@ -12,6 +12,8 @@ spec/reports
12
12
  test/tmp
13
13
  test/version_tmp
14
14
  tmp
15
+ # Gemfile.lock shouldn't be checked in for gems
16
+ Gemfile.lock
15
17
 
16
18
  # YARD artifacts
17
19
  .yardoc
@@ -21,4 +23,4 @@ doc/
21
23
 
22
24
  # Extra's not part of the template
23
25
  .buildpath
24
- .project
26
+ .project
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ script: bundle exec rake test
3
+ rvm:
4
+ - 1.9.3
5
+ - 2.0.0
6
+ - 2.1.0
7
+ - 2.2.0
8
+ - ruby-head
9
+ - jruby-head
data/Gemfile CHANGED
@@ -1,3 +1,3 @@
1
- source :rubygems
1
+ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
@@ -72,7 +72,7 @@ Have fun and let me know what needs to be fixed / added.
72
72
  == Testing
73
73
  You can invoke a series of minitest based spec test using the supplied
74
74
  tests and rake task. Simply run the following to kick off the tests
75
- @rake test@
75
+ @bundle exec rake test@
76
76
 
77
77
  You should see output similar to the following (The number of tests will
78
78
  of course grow over time):
@@ -80,3 +80,8 @@ of course grow over time):
80
80
 
81
81
  If you get any failures, you should of course address them
82
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/Rakefile CHANGED
@@ -1,8 +1,9 @@
1
1
  require 'rubygems'
2
2
  require 'rake/clean'
3
- require 'rake/gempackagetask'
4
- require 'rake/rdoctask'
3
+ require 'rubygems/package_task'
4
+ require 'rdoc/task'
5
5
  require 'rake/testtask'
6
+ require 'date'
6
7
 
7
8
  CLEAN.include("pkg")
8
9
  CLEAN.include("doc")
@@ -33,8 +34,8 @@ GEMSPEC = Gem::Specification.new do |gem|
33
34
  gem.add_runtime_dependency 'tzinfo'
34
35
  gem.post_install_message = "See README.rdoc"
35
36
  end
36
-
37
- Rake::GemPackageTask.new(GEMSPEC) do |pkg|
37
+
38
+ Gem::PackageTask.new(GEMSPEC) do |pkg|
38
39
  pkg.need_tar = true
39
40
  end
40
41
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.4
1
+ 0.6.0
@@ -32,8 +32,8 @@ module Zenoss
32
32
 
33
33
  # initialize a connection to a Zenoss server. This is the same as doing
34
34
  # Zenoss::Connection.new(server,user,pass)
35
- def Zenoss.connect(server, user, pass, &block)
36
- Connection.new(server,user,pass,&block)
35
+ def Zenoss.connect(server, user, pass, opts = {}, &block)
36
+ Connection.new(server, user, pass, opts, &block)
37
37
  end
38
38
 
39
39
  # Some of the REST methods return Strings that are formated like a Python list.
@@ -31,13 +31,13 @@ module Zenoss
31
31
  include Zenoss::JSONAPI::ReportRouter
32
32
  include Zenoss::RESTAPI
33
33
 
34
- def initialize(url, user, pass, &block)
34
+ def initialize(url, user, pass, opts = {}, &block)
35
35
  @zenoss_uri = (url.is_a?(URI) ? url : URI.parse(url))
36
36
  @request_number = 1
37
37
  @httpcli = HTTPClient.new
38
38
  @httpcli.receive_timeout = 360 # six minutes should be more that sufficient
39
39
  yield(@httpcli) if block_given?
40
- sign_in(user,pass)
40
+ sign_in(user, pass) unless opts[:no_sign_in]
41
41
  end
42
42
 
43
43
  private
@@ -54,6 +54,7 @@ module Zenoss
54
54
  resp = @httpcli.post login_path, login_parms
55
55
  if(resp.status == 302)
56
56
  login_path = resp.header['Location'].first
57
+ login_path = "#{@zenoss_uri}/#{login_path}"
57
58
  resp = @httpcli.post login_path, login_parms
58
59
  raise ZenossError, "(HTTP Response #{resp.status}) Could not authenticate to #{@zenoss_uri}" unless resp.status == 200
59
60
  end
@@ -68,7 +68,6 @@ module Zenoss
68
68
  :start => opts[:start],
69
69
  :sort => opts[:sort],
70
70
  :dir => opts[:dir],
71
- :history => opts[:history],
72
71
  }
73
72
  data[:uid] = uid unless uid.nil?
74
73
  data[:params] = opts[:params] if opts.has_key?(:params)
@@ -202,6 +202,15 @@ module Zenoss
202
202
  rest("getSystemNamesString?sep=#{sep}")
203
203
  end
204
204
 
205
+ # Change name of the device
206
+ def rename_device(new_name)
207
+ ret = rest("renameDevice?newId=#{new_name}")
208
+ if ret
209
+ self.name = new_name
210
+ end
211
+ return ret
212
+ end
213
+
205
214
 
206
215
  private
207
216
 
@@ -0,0 +1,11 @@
1
+ FROM centos:5
2
+ RUN mkdir /opt/zenoss
3
+ WORKDIR /opt/zenoss
4
+ RUN yum -y install mysql-server net-snmp net-snmp-utils gmp \
5
+ libgomp libgcj liberation-fonts libaio wget
6
+ RUN wget http://downloads.sourceforge.net/project/zenoss/zenoss-3.2/zenoss-3.2.1/zenoss-3.2.1.el5.x86_64.rpm
7
+ RUN service mysqld start && mysqladmin -u root password '' && \
8
+ mysqladmin -u root -h localhost password ''
9
+ RUN rpm -ivh ./zenoss-3.2.1.el5.x86_64.rpm
10
+ RUN service zenoss start
11
+ ADD remote_start.sh ./
@@ -0,0 +1,3 @@
1
+ service mysqld start
2
+ service zenoss start
3
+ tail -F /opt/zenoss/log/event.log
@@ -0,0 +1,2 @@
1
+ docker build -t zen3.2.1 .
2
+ docker run -i -p 8080:8080 -t zen3.2.1 sh remote_start.sh
@@ -0,0 +1,10 @@
1
+ FROM centos:6
2
+ RUN mkdir /opt/zenoss
3
+ WORKDIR /opt/zenoss
4
+ RUN yum -y install wget which
5
+ ADD https://raw.githubusercontent.com/zenoss/core-autodeploy/4.2.5/core-autodeploy.sh ./
6
+ ADD https://raw.githubusercontent.com/zenoss/core-autodeploy/4.2.5/secure_zenoss.sh ./
7
+ ADD https://raw.githubusercontent.com/zenoss/core-autodeploy/4.2.5/zenpack_actions.txt ./
8
+ RUN chmod +x /core-autodeploy.sh
9
+ RUN echo -e "\ny\n" | /core-autodeploy.sh
10
+ ADD remote_start.sh ./
@@ -0,0 +1,12 @@
1
+ #!/bin/sh
2
+ service zenoss start &
3
+ service mysql start &
4
+ service rabbitmq-server start
5
+ rabbitmqctl stop_app
6
+ rabbitmqctl reset
7
+ rabbitmqctl start_app
8
+ rabbitmqctl add_vhost "/zenoss"
9
+ rabbitmqctl add_user zenoss \
10
+ "$(sed -n 's/amqppassword \(.*\)/\1/p' /opt/zenoss/etc/global.conf)"
11
+ rabbitmqctl set_permissions -p "/zenoss" zenoss ".*" ".*" ".*"
12
+ tail -F /opt/zenoss/log/event.log
@@ -0,0 +1,2 @@
1
+ docker build -t zen4.2.5 .
2
+ docker run -i -p 8080:8080 -t zen4.2.5 sh remote_start.sh
File without changes
@@ -0,0 +1,437 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: http://192.168.56.2:9080/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%3A%2F%2F192.168.56.2%3A9080%2Fzport%2Fdmd%2Fzport%2Fdmd
9
+ headers:
10
+ User-Agent:
11
+ - HTTPClient/1.0 (2.6.0.1, ruby 2.2.0 (2014-12-25))
12
+ Accept:
13
+ - "*/*"
14
+ Date:
15
+ - Fri, 22 May 2015 12:19:38 GMT
16
+ Content-Type:
17
+ - application/x-www-form-urlencoded
18
+ response:
19
+ status:
20
+ code: 302
21
+ message: Moved Temporarily
22
+ headers:
23
+ Server:
24
+ - Zope/(2.12.1, python 2.6.2, linux2) ZServer/1.1
25
+ Date:
26
+ - Fri, 22 May 2015 12:19:38 GMT
27
+ Content-Length:
28
+ - '59'
29
+ Content-Type:
30
+ - text/plain; charset=utf-8
31
+ Location:
32
+ - http://192.168.56.2:9080/zport/dmd/zport/dmd?submitted=true
33
+ Set-Cookie:
34
+ - __ginger_snap="NjE2NDZkNjk2ZTo3YTY1NmU2ZjczNzM%253D"; Path=/
35
+ body:
36
+ encoding: UTF-8
37
+ string: http://192.168.56.2:9080/zport/dmd/zport/dmd?submitted=true
38
+ http_version:
39
+ recorded_at: Fri, 22 May 2015 12:19:38 GMT
40
+ - request:
41
+ method: post
42
+ uri: http://192.168.56.2:9080/zport/dmd/http://192.168.56.2:9080/zport/dmd/zport/dmd?submitted=true
43
+ body:
44
+ encoding: UTF-8
45
+ string: __ac_name=admin&__ac_password=zenoss&submitted=true&came_from=http%3A%2F%2F192.168.56.2%3A9080%2Fzport%2Fdmd%2Fzport%2Fdmd
46
+ headers:
47
+ User-Agent:
48
+ - HTTPClient/1.0 (2.6.0.1, ruby 2.2.0 (2014-12-25))
49
+ Accept:
50
+ - "*/*"
51
+ Date:
52
+ - Fri, 22 May 2015 12:19:38 GMT
53
+ Content-Type:
54
+ - application/x-www-form-urlencoded
55
+ Cookie:
56
+ - __ginger_snap=NjE2NDZkNjk2ZTo3YTY1NmU2ZjczNzM%253D
57
+ response:
58
+ status:
59
+ code: 200
60
+ message: OK
61
+ headers:
62
+ Server:
63
+ - Zope/(2.12.1, python 2.6.2, linux2) ZServer/1.1
64
+ Date:
65
+ - Fri, 22 May 2015 12:19:38 GMT
66
+ Content-Length:
67
+ - '23063'
68
+ Content-Type:
69
+ - text/html; charset=utf-8
70
+ body:
71
+ encoding: UTF-8
72
+ string: "\n<html>\n <head>\n<base href=\"http://192.168.56.2:9080/zport/dmd/zport/dmd/\"
73
+ />\n\n <title>\n Zenoss:\n \n Dashboard\n\n
74
+ \ </title>\n <link rel=\"icon\" href=\"/zport/dmd/favicon.ico\"
75
+ type=\"image/x-icon\" />\n <link rel=\"shortcut icon\" href=\"/zport/dmd/favicon.ico\"
76
+ type=\"image/x-icon\" />\n <link rel=\"stylesheet\" type=\"text/css\"
77
+ href=\"/++resource++extjs/resources/css/ext-all.css\" />\n <link rel=\"stylesheet\"
78
+ type=\"text/css\" href=\"/++resource++extjs/treegrid/treegrid.css\" />\n <link
79
+ rel=\"stylesheet\" type=\"text/css\" href=\"/++resource++zenui/js/livegrid/resources/css/ext-ux-livegrid.css\"
80
+ />\n <link rel=\"stylesheet\" type=\"text/css\" href=\"/++resource++zenui/css/xtheme-zenoss.css\"
81
+ />\n <link rel=\"stylesheet\" type=\"text/css\" href=\"/++resource++zenui/css/zenoss.css\"
82
+ />\n <link rel=\"stylesheet\" type=\"text/css\" href=\"/++resource++zenui/css/zenui3.css\"
83
+ />\n \n<script type=\"text/javascript\">\n function _global_permissions(){\n
84
+ \ return {\"modify cookie crumblers\": true, \"add ram cache managers\":
85
+ true, \"reply to item\": true, \"zproperties edit\": true, \"maintenance windows
86
+ view\": true, \"maintenance windows edit\": true, \"define commands edit\":
87
+ true, \"add folders\": true, \"set own password\": true, \"add portal content\":
88
+ true, \"edit user groups\": true, \"review portal content\": true, \"manage
89
+ relations\": true, \"change cache managers\": true, \"add ofolders\": true,
90
+ \"create transient objects\": true, \"list undoable changes\": true, \"webdav
91
+ unlock items\": true, \"view modifications\": true, \"manage portal\": true,
92
+ \"change bindings\": true, \"delete device\": true, \"access transient objects\":
93
+ true, \"add dmd objects\": true, \"manage site\": true, \"gensummary\": true,
94
+ \"add restructuredtext documents\": true, \"zencommon\": true, \"manage transient
95
+ object container\": true, \"zproperties view\": true, \"request review\":
96
+ true, \"mail forgotten password\": true, \"change cache settings\": true,
97
+ \"add page templates\": true, \"change session data manager\": true, \"change
98
+ external methods\": true, \"managableindex: manage\": true, \"administrators
99
+ view\": true, \"add external methods\": true, \"define commands view\": true,
100
+ \"change device production state\": true, \"add site roots\": true, \"add
101
+ zentablemanager\": true, \"set own properties\": true, \"add plugin registrys\":
102
+ true, \"webdav lock items\": true, \"add mysqleventmanagers\": true, \"search
103
+ zcatalog\": true, \"access contents information\": true, \"add browser id
104
+ manager\": true, \"change dtml documents\": true, \"use mailhost services\":
105
+ true, \"change dtml methods\": true, \"view history\": true, \"add content
106
+ type registrys\": true, \"ftp access\": true, \"add vocabularies\": true,
107
+ \"edit local templates\": true, \"manage groups\": true, \"manage webdav locks\":
108
+ true, \"add toonerelationships\": true, \"add user folders\": true, \"add
109
+ cmf caching policy managers\": true, \"add temporary folder\": true, \"add
110
+ btreefolder2s\": true, \"administrators edit\": true, \"admin device\": true,
111
+ \"change python scripts\": true, \"change images and files\": true, \"change
112
+ database methods\": true, \"add python scripts\": true, \"change configuration\":
113
+ true, \"view\": true, \"access inactive portal content\": true, \"undo changes\":
114
+ true, \"run commands\": true, \"change admin objects\": true, \"webdav access\":
115
+ true, \"view management screens\": true, \"add session data manager\": true,
116
+ \"add mailhost objects\": true, \"add cmf core tools\": true, \"add database
117
+ methods\": true, \"change network\": true, \"import/export objects\": true,
118
+ \"manage vocabulary\": true, \"access arbitrary user session data\": true,
119
+ \"open/close database connections\": true, \"delete objects\": true, \"change
120
+ settings\": true, \"change page templates\": true, \"change device\": true,
121
+ \"add portal member\": true, \"change browser id manager\": true, \"manage
122
+ zcatalog entries\": true, \"send events\": true, \"manage eventmanager\":
123
+ true, \"access session data\": true, \"copy or move\": true, \"add filesystem
124
+ directory views\": true, \"add cookie crumblers\": true, \"add virtual host
125
+ monsters\": true, \"define permissions\": true, \"change event views\": true,
126
+ \"add tomanycontrelationships\": true, \"add documents, images, and files\":
127
+ true, \"manage access rules\": true, \"change alerting rules\": true, \"query
128
+ vocabulary\": true, \"modify portal content\": true, \"edit restructuredtext\":
129
+ true, \"manage dmd\": true, \"add generic setup tools\": true, \"zenupdate\":
130
+ true, \"add pluggable index\": true, \"add zcatalogs\": true, \"add portal
131
+ folders\": true, \"manage device status\": true, \"change local roles\": true,
132
+ \"add transient object container\": true, \"manage five local sites\": true,
133
+ \"add tomanyrelationships\": true, \"list portal members\": true, \"edit users\":
134
+ true, \"manage users\": true, \"change permissions\": true, \"use database
135
+ methods\": true, \"add accelerated http cache managers\": true, \"manage zcatalogindex
136
+ entries\": true, \"search for principals\": true, \"log to the event log\":
137
+ true, \"manage events\": true, \"ofolder: reorder\": true, \"log site errors\":
138
+ true, \"list folder contents\": true, \"add relationship managers\": true,
139
+ \"change proxy roles\": true, \"manage properties\": true, \"add zodb mount
140
+ points\": true, \"manage device\": true};\n }\n</script>\n \n <script
141
+ type=\"text/javascript\" src=\"/++resource++extjs/adapters/ext/ext-base.js\"></script>\n\n\n<script
142
+ type=\"text/javascript\">\n\n (function() {\n var ua =
143
+ navigator.userAgent.toLowerCase();\n if (ua.indexOf(\"firefox/3.6\")
144
+ > -1) {\n Ext.toArray = function(a, i, j, res) {\n res
145
+ = [];\n Ext.each(a, function(v) { res.push(v); });\n return
146
+ res.slice(i || 0, j || res.length);\n }\n }\n })();\n
147
+ \ \n</script>\n\n<script type=\"text/javascript\" src=\"/++resource++extjs/ext-all.js\"></script>\n\n<script
148
+ type=\"text/javascript\" src=\"/++resource++zenui/js/livegrid/livegrid-all.js\"></script>\n\n\n<script
149
+ type=\"text/javascript\" src=\"/++resource++extjs/treegrid/TreeGridSorter.js\"></script>\n<script
150
+ type=\"text/javascript\" src=\"/++resource++extjs/treegrid/TreeGridColumnResizer.js\"></script>\n<script
151
+ type=\"text/javascript\" src=\"/++resource++extjs/treegrid/TreeGridNodeUI.js\"></script>\n<script
152
+ type=\"text/javascript\" src=\"/++resource++extjs/treegrid/TreeGridLoader.js\"></script>\n<script
153
+ type=\"text/javascript\" src=\"/++resource++extjs/treegrid/TreeGridColumns.js\"></script>\n<script
154
+ type=\"text/javascript\" src=\"/++resource++extjs/fileuploadfield/FileUploadField.js\"></script>\n<script
155
+ type=\"text/javascript\" src=\"/++resource++extjs/treegrid/TreeGridLoader.js\"></script>\n<script
156
+ type=\"text/javascript\" src=\"/++resource++extjs/treegrid/TreeGridColumns.js\"></script>\n<script
157
+ type=\"text/javascript\" src=\"/++resource++extjs/treegrid/TreeGrid.js\"></script>\n<script
158
+ type=\"text/javascript\" src=\"extdirect.js\"></script>\n\n<script type=\"text/javascript\"
159
+ src=\"zenoss-all.js?v=3.2.1\"></script>\n\n<script type=\"text/javascript\"
160
+ src=\"i18n.js\"></script>\n\n <script></script>\n \n \n
161
+ \ \n \n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"
162
+ />\n <link rel=\"shortcut icon\" href=\"/zport/dmd/favicon.ico\" type=\"image/x-icon\"
163
+ />\n <link rel=\"stylesheet\" href=\"yui/reset-fonts-grids/reset-fonts-grids.css\"
164
+ />\n <link rel=\"stylesheet\" href=\"yui/base/base-min.css\" />\n <link
165
+ rel=\"stylesheet\" href=\"/zport/portal_skins/zenoss.css\">\n <!--[if IE
166
+ 7]>\n <link rel=\"stylesheet\" type=\"text/css\" title=\"zenoss\"\n
167
+ \ href=\"zenoss_ie.css\" >\n <![endif]-->\n <!--[if IE 6]>\n
168
+ \ <link rel=\"stylesheet\" type=\"text/css\" title=\"zenoss\"\n href=\"zenoss_ie6.css\"
169
+ >\n <![endif]-->\n <script>\n var DEBUG_MODE = false;\n var
170
+ VERSION_ID = '321';\n </script>\n <script type=\"text/javascript\" src=\"js/MochiKit.js\"></script>\n
171
+ \ <script type=\"text/javascript\" language=\"javascript\" src=\"/zport/dmd/yui/yahoo/yahoo-min.js\"></script>\n
172
+ \ <script type=\"text/javascript\" language=\"javascript\" src=\"/zport/dmd/yui/yuiloader/yuiloader-min.js\"></script>\n
173
+ \ <script type=\"text/javascript\" src=\"javascript/zenoss-core.js\"></script>\n
174
+ \ <script>\n var loader = YAHOO.zenoss.getLoader();\n loader.require(['zenossutils']);\n
175
+ \ loader.insert({onSuccess:function(){\n removeElementAutoCompletes();\n
176
+ \ applyBrowserSpecificStyles();\n addSelectionBar();\n checkForCollapsed();\n
177
+ \ connectCheckboxListeners();\n notifyParentOfNewUrl();\n zenPageInit();\n
178
+ \ }});\n </script>\n\n\n \n<script>\n\nvar submitFormToMethod = function(formname,
179
+ method) {\n//Basically for use in menu items, to obviate creating dummy forms\n//or
180
+ menu items that are actually buttons.\n f = document.forms[formname];\n
181
+ \ f.action = '/zport/dmd/' + method;\n f.submit();\n}\n\nvar goExport =
182
+ function() {\n var params = {};\n if (eventZenGrid.lastparams['severity'])\n
183
+ \ params['sev'] = eventZenGrid.lastparams['severity'];\n if (eventZenGrid.lastparams['state'])\n
184
+ \ params['state'] = eventZenGrid.lastparams['state'];\n if (eventZenGrid.lastparams['filter'])\n
185
+ \ params['filter'] = eventZenGrid.lastparams['filter'];\n if (eventZenGrid.lastparams['startdate'])\n
186
+ \ params['startdate'] = eventZenGrid.lastparams['startdate'];\n if
187
+ (eventZenGrid.lastparams['enddate'])\n params['enddate'] = eventZenGrid.lastparams['enddate'];\n
188
+ \ if (eventZenGrid.lastparams['orderby'])\n params['orderby'] = eventZenGrid.lastparams['orderby'];\n
189
+ \ log(keys(params));\n log(queryString(params));\n url = '/zport/dmd/exportEvents?'
190
+ + queryString(params);\n parent.location = url;\n}\n\naddLoadEvent(function()
191
+ {\n\n YAHOO.zenoss.templateFreeURL = '/zport/dmd';\n YAHOO.zenoss.ZENOSS_VERSION
192
+ = '3.2.1';\n YAHOO.zenoss.ZENOSS_PRODUCT = 'core';\n\n});\n\n\n\n</script>\n\n
193
+ \ <link rel=\"stylesheet\" href=\"/++resource++zenui/css/backcompat.css\"
194
+ />\n\n \n<script type=\"text/javascript\">\n\n Ext.onReady(function(){\n
195
+ \ Zenoss.env.EVENT_CLASSES = ['/App', '/App/Citrix', '/App/Conn',
196
+ '/App/Conn/Max', '/App/Email', '/App/Email/Loop', '/App/Failed', '/App/Info',
197
+ '/App/Install', '/App/Job', '/App/Job/Fail', '/App/Log', '/App/Print', '/App/Reload',
198
+ '/App/Start', '/App/Stop', '/App/VNC', '/Archive', '/Change', '/Change/Add',
199
+ '/Change/Add/Blocked', '/Change/Remove', '/Change/Remove/Blocked', '/Change/Set',
200
+ '/Change/Set/Blocked', '/Cisco', '/Cisco/FW', '/Cluster', '/Cluster/Heartbeat',
201
+ '/Cmd', '/Cmd/Fail', '/Cmd/Ok', '/Config', '/DB', '/DB/Filemaker', '/Environ',
202
+ '/HW', '/HW/Backup', '/HW/Backup/Robot', '/HW/Backup/SCSI', '/HW/Backup/Tape
203
+ Drive', '/HW/Backup/Tape Media', '/HW/Blade', '/HW/Management', '/HW/Memory',
204
+ '/HW/Network', '/HW/Network/AdapterDown', '/HW/Network/TeamDown', '/HW/Power',
205
+ '/HW/Power/PowerLoss', '/HW/Power/UPS', '/HW/Power/UPS/SmartBoost', '/HW/Store',
206
+ '/HW/Store/FiberChannel', '/HW/Temperature', '/HW/Temperature/Fan', '/Heartbeat',
207
+ '/Ignore', '/Ignore/Win', '/License', '/Net', '/Net/Conflict', '/Net/Dhcp',
208
+ '/Net/Dhcp/Ack', '/Net/Dhcp/Inform', '/Net/Dhcp/Obtained', '/Net/Dhcp/Request',
209
+ '/Net/Link', '/Net/NS', '/Net/SpanTree', '/Net/Time', '/OS', '/OS/Pagefile',
210
+ '/OS/Reboot', '/Perf', '/Perf/CPU', '/Perf/Filesystem', '/Perf/Interface',
211
+ '/Perf/Memory', '/Perf/Snmp', '/Perf/XmlRpc', '/Security', '/Security/Auth',
212
+ '/Security/Conn', '/Security/Conn/Close', '/Security/Conn/Open', '/Security/Login',
213
+ '/Security/Login/BadPass', '/Security/Login/Fail', '/Security/Sudo', '/Security/Virus',
214
+ '/Status', '/Status/Heartbeat', '/Status/IpService', '/Status/Nagios', '/Status/OSProcess',
215
+ '/Status/Perf', '/Status/Ping', '/Status/Snmp', '/Status/Update', '/Status/Web',
216
+ '/Status/WinService', '/Status/Wmi', '/Status/Wmi/Conn', '/Status/XmlRpc',
217
+ '/Status/zenwinmodeler', '/Storage', '/Storage/Full', '/Storage/SAN', '/Unknown',
218
+ '/Users', '/Win', '/Win/AD', '/Win/DCOM', '/Win/Exchange', '/Win/NetBios',
219
+ '/Win/PWMgr', '/Win/SharePoint', '/Win/Shell', '/Win/Userenv', '/Win/WindowsUpdate',
220
+ '/Win/WindowsUpdate/Failure', '/Win/WindowsUpdate/Pending', '/Win/WindowsUpdate/Success',
221
+ '/Win/evtsys'];\n })\n \nExt.onReady(function(){Zenoss.env.COLUMN_DEFINITIONS=[\n{\"sortable\":
222
+ true, \"header\": \"Status\", \"filter\": {\"text\": \"...\", \"xtype\": \"multiselectmenu\",
223
+ \"source\": [{\"name\": \"New\", \"value\": 0}, {\"name\": \"Acknowledged\",
224
+ \"value\": 1}, {\"checked\": false, \"name\": \"Suppressed\", \"value\": 2}]},
225
+ \"width\": 60, \"dataIndex\": \"eventState\", \"id\": \"eventState\", \"renderer\":
226
+ Zenoss.util.render_status},\n{\"sortable\": true, \"header\": \"Severity\",
227
+ \"filter\": {\"text\": \"...\", \"xtype\": \"multiselectmenu\", \"source\":
228
+ [{\"name\": \"Critical\", \"value\": 5}, {\"name\": \"Error\", \"value\":
229
+ 4}, {\"name\": \"Warning\", \"value\": 3}, {\"name\": \"Info\", \"value\":
230
+ 2}, {\"checked\": false, \"name\": \"Debug\", \"value\": 1}, {\"checked\":
231
+ false, \"name\": \"Clear\", \"value\": 0}]}, \"width\": 60, \"dataIndex\":
232
+ \"severity\", \"id\": \"severity\", \"renderer\": Zenoss.util.render_severity},\n{\"sortable\":
233
+ true, \"filter\": {\"xtype\": \"textfield\"}, \"header\": \"Device\", \"dataIndex\":
234
+ \"device\", \"id\": \"device\", \"renderer\": Zenoss.render.linkFromGrid},\n{\"sortable\":
235
+ true, \"header\": \"Component\", \"filter\": {\"xtype\": \"textfield\"}, \"width\":
236
+ 80, \"dataIndex\": \"component\", \"id\": \"component\", \"renderer\": Zenoss.render.DeviceComponent},\n{\"sortable\":
237
+ true, \"header\": \"Event Class\", \"filter\": {\"xtype\": \"textfield\"},
238
+ \"width\": 80, \"dataIndex\": \"eventClass\", \"id\": \"eventClass\", \"renderer\":
239
+ Zenoss.render.linkFromGrid},\n{\"filter\": {\"xtype\": \"textfield\"}, \"header\":
240
+ \"Summary\", \"sortable\": true, \"id\": \"summary\", \"dataIndex\": \"summary\"},\n{\"sortable\":
241
+ true, \"header\": \"First Seen\", \"filter\": {\"xtype\": \"datefield\", \"format\":
242
+ \"Y-m-d H:i:s\"}, \"width\": 100, \"dataIndex\": \"firstTime\", \"id\": \"firstTime\",
243
+ \"renderer\": Ext.util.Format.dateRenderer(Zenoss.date.ISO8601NoYear)},\n{\"sortable\":
244
+ true, \"header\": \"Last Seen\", \"filter\": {\"xtype\": \"datefield\", \"format\":
245
+ \"Y-m-d H:i:s\"}, \"width\": 100, \"dataIndex\": \"lastTime\", \"id\": \"lastTime\",
246
+ \"renderer\": Ext.util.Format.dateRenderer(Zenoss.date.ISO8601NoYear)},\n{\"sortable\":
247
+ true, \"header\": \"Count\", \"filter\": {\"vtype\": \"numcmp\", \"xtype\":
248
+ \"textfield\"}, \"width\": 60, \"dataIndex\": \"count\", \"id\": \"count\"}\n];\nZenoss.env.EVENT_AUTO_EXPAND_COLUMN='summary';});\n\n
249
+ \ Ext.namespace('Zenoss.settings');\n Zenoss.settings.enableLiveSearch
250
+ = true;\n \n \n</script>\n\n </head>\n\n <body>\n <div
251
+ id=\"header\">\n <div class=\"bg\">\n <div class=\"bg-leftcap\">\n
252
+ \ <div class=\"bg-tile\">\n <div
253
+ class=\"bg-logo\"></div>\n <div id=\"primarynav\">\n
254
+ \ <ul><li class=\"nav-item-active\">\n<div class=\"sd-left\">\n
255
+ \ <div class=\"sd-right\">\n <a href=\"/zport/dmd/Dashboard\" target=\"_self\">Dashboard</a>\n
256
+ \ </div>\n</div>\n</li>\n\n<li class=\"nav-item-inactive\">\n<div class=\"sd-left\">\n
257
+ \ <div class=\"sd-right\">\n <a href=\"/zport/dmd/Events/evconsole\"
258
+ target=\"_self\">Events</a>\n </div>\n</div>\n</li>\n\n<li class=\"nav-item-inactive\">\n<div
259
+ class=\"sd-left\">\n <div class=\"sd-right\">\n <a href=\"/zport/dmd/itinfrastructure\"
260
+ target=\"_self\">Infrastructure</a>\n </div>\n</div>\n</li>\n\n<li class=\"nav-item-inactive\">\n<div
261
+ class=\"sd-left\">\n <div class=\"sd-right\">\n <a href=\"/zport/dmd/reports\"
262
+ target=\"_self\">Reports</a>\n </div>\n</div>\n</li>\n\n<li class=\"nav-item-inactive\">\n<div
263
+ class=\"sd-left\">\n <div class=\"sd-right\">\n <a href=\"/zport/dmd/editSettings\"
264
+ target=\"_self\">Advanced</a>\n </div>\n</div>\n</li>\n</ul>\n <div
265
+ id=\"header-extra\">\n <div id=\"searchbox-container\"></div>\n
266
+ \ <div id=\"saved-search-container\"></div>\n
267
+ \ <div id=\"user-link-container\">\n <a\n
268
+ \ href=\"/zport/dmd/ZenUsers/admin\">\n admin\n
269
+ \ </a>\n </div>\n
270
+ \ <div id=\"sign-out-link\">\n <a
271
+ href=\"/zport/dmd/logoutUser\">sign out</a>\n </div>\n
272
+ \ <div>\n <div
273
+ id=\"help-icon-container\">\n <span></span><!--
274
+ ie needs empty span tags in some versions -->\n <a
275
+ target=\"_blank\"\n alt=\"Help\"\n href=\"http://www.zenoss.com/help?version=3.2.1\">&nbsp;</a>\n
276
+ \ </div>\n </div>\n
277
+ \ </div>\n </div>\n <div
278
+ id=\"secondarynav\">\n <ul></ul>\n \n\n
279
+ \ </div>\n </div>\n </div>\n
280
+ \ </div>\n </div>\n <div id=\"center\">\n \n
281
+ \ \n<form name=\"proxy_form\" id=\"proxy_form\"\n style=\"position:absolute;visibility:hidden\"\n
282
+ \ action=\"/zport/dmd\"></form>\n<form method=\"post\" name=\"proxyForm\"
283
+ action=\"here/absolute_url\"> \n <input type=\"hidden\" name=\"zenScreenName\"\n
284
+ \ value=\"Dashboard.pt\" /> \n</form>\n\n \n\n<div id=\"dialog\"
285
+ class=\"dialog\" style=\"visibility:hidden;position:absolute\"> \n<div id=\"dialog_innercontent\">\n
286
+ \ \n\n<div style=\"text-align:center\">\n<h2>Loading...</h2>\n<br />\n<img
287
+ src=\"img/spinning_wheel_throbber.gif\" />\n</div>\n\n\n</div>\n<img id=\"dialog_close\"
288
+ src=\"/++resource++zenui/img/xtheme-zenoss/window/close-button.png\" class=\"dialog_close\"
289
+ />\n</div>\n<script>\nloader = YAHOO.zenoss.getLoader();\nloader.require(['zenossutils']);\nloader.insert({\n
290
+ \ onSuccess: function(){\n mydialog = new Dialog.Box($('dialog'));\n
291
+ \ connect('dialog_close','onclick', mydialog.box.hide);\n $('dialog').style.visibility
292
+ = '';\n }\n});\n</script>\n\n\n \n <div id=\"contentPaneContainer\">\n
293
+ \ \n<div id=\"portletContainer\"></div>\n<script>\n var start_time
294
+ = '2015-05-22 12:19:38';\n var state = '';\n if(state) var dashboardState
295
+ = evalJSON(state);\n</script>\n<script>\nvar server_time = isoTimestamp(start_time).getTime();\nvar
296
+ updateTime = {\n run: function () {\n server_time += 1000;\n },\n
297
+ \ interval: 1000\n}\nExt.TaskMgr.start(updateTime);\n\nfunction getServerTimestamp()
298
+ {\n var server_now = new Date(server_time);\n return toISOTimestamp(server_now);\n}\n\n//
299
+ Initialization of dashboard portlets\nvar ContainerObject;\nfunction initDashboardPortlets()
300
+ {\n ContainerObject = new YAHOO.zenoss.portlet.PortletContainer(\n 'portletContainer');\n
301
+ \ YAHOO.zenoss.globalPortletContainer = ContainerObject;\n if (dashboardState)
302
+ {\n ContainerObject.restore(dashboardState);\n } else {\n //
303
+ Create a default dashboard\n ContainerObject.setLayout('2coleq', false);\n
304
+ \ ContainerObject.restoreDefaults();\n }\n}\nvar loader = YAHOO.zenoss.getLoader();\nloader.require(['portletsource']);\nloader.insert({
305
+ 'onSuccess':initDashboardPortlets });\n\n</script>\n<style>\n .z-bc .z-bc-content-pane
306
+ {\n background-color: #888;\n }\n</style>\n\n </div>\n \n\n
307
+ \ </div>\n <div id=\"footer\">\n </div>\n <div
308
+ id=\"footer_extra\">\n </div>\n\n\n<form id=\"exportform\" method=\"post\"
309
+ action=\"/zport/dmd/Events/export\">\n <input type=\"hidden\" id=\"export_body\"
310
+ name=\"body\" />\n</form>\n<script type=\"text/javascript\">\nExt.onReady(function(){\nvar
311
+ viewport = new Ext.Viewport({\n id: 'viewport',\n layout: 'border',\n
312
+ \ cls: 'zenui3',\n defaults: {\n 'border': false\n },\n items:
313
+ [\n new Ext.BoxComponent({\n region: 'north',\n el:
314
+ 'header',\n height: 75,\n id: 'header_panel'\n }),{\n
315
+ \ id: 'footer_panel',\n region: 'south',\n height:
316
+ 30,\n layout: 'fit',\n el: 'footer',\n items:
317
+ [\n new Ext.Toolbar({\n border: false,\n
318
+ \ id: 'footer_bar',\n listeners: {\n
319
+ \ render: function(bar){\n Ext.get('footer_extra').appendTo(bar.getEl());\n
320
+ \ }\n }\n })\n ],\n
321
+ \ border: false\n },{\n id: 'center_panel',\n
322
+ \ region: 'center',\n el: 'center',\n layout:
323
+ 'fit',\n border: false,\n defaults: {\n 'border':
324
+ false\n }\n }\n ]\n});\n});\n</script>\n\n\n<script>\n//
325
+ A little pre-javascript layout hackery to prevent appearance of re-layout.\n//
326
+ If there are breadcrumbs the tabs pane needs to be bumped up.\nif (Zenoss.env.pageHasBreadCrumbs)
327
+ {\n try {\n Ext.get('newTabsPane').setStyle({\n top:
328
+ -23,\n position: 'relative'\n });\n } catch(e) {}\n}\nExt.onReady(function(){\n
329
+ \ var outerItems = [],\n innerItems = [{\n region: 'center',\n
330
+ \ autoScroll: true,\n bodyCssClass: 'z-bc-content-pane',\n contentEl:
331
+ 'contentPaneContainer',\n split: true\n }];\n if (Zenoss.env.pageHasTabs)
332
+ {\n outerItems.push({\n region: 'west',\n width:
333
+ 200,\n bodyCssClass: 'z-bc-tab-pane',\n contentEl: 'newTabsPane',\n
334
+ \ split: true\n });\n }\n if (Zenoss.env.pageHasBreadCrumbs)
335
+ {\n innerItems.push({\n region: 'north',\n height:
336
+ 24,\n bodyCssClass: 'z-bc-bread-crumb-pane',\n contentEl:
337
+ 'breadCrumbPane'\n });\n }\n outerItems.push({\n region:
338
+ 'center',\n layout: 'border',\n defaults: {\n border:
339
+ false\n },\n items: innerItems\n });\n\n // Undo all the
340
+ pre-layout css\n try {\n Ext.get('contentPaneContainer').setStyle({\n
341
+ \ marginLeft: 0\n });\n } catch(e) {}\n try {\n Ext.get('newTabsPane').setStyle({\n
342
+ \ top: 0,\n position: 'static'\n });\n } catch(e)
343
+ {}\n try {\n Ext.get('breadCrumbPane').setStyle({\n marginLeft:
344
+ 0,\n position: 'static'\n });\n } catch(e) {}\n\n\n Zenoss.util.callWhenReady('center_panel',
345
+ function(){\n Ext.getCmp('center_panel').add({\n layout:
346
+ 'border',\n id: 'backcompat-layout-panel',\n defaults:
347
+ {\n border: false\n },\n bodyCssClass:
348
+ 'z-bc', // Zenoss back compat\n items: outerItems\n });\n
349
+ \ Ext.getCmp('center_panel').doLayout();\n });\n});\n</script>\n\n\n<!--
350
+ Make sure everything on the page gets laid out -->\n<script type=\"text/javascript\">\n
351
+ \ Ext.onReady(function(){Ext.getCmp('viewport').doLayout()});\n</script>\n\n\n
352
+ \ \n\n\n<!-- Load tooltips for this screen -->\n<script type=\"text/javascript\"
353
+ src=\"tooltips.js\"></script>\n\n<!-- Fields required for history management
354
+ -->\n<form id=\"history-form\" class=\"x-hidden\" action=\"\">\n <input
355
+ type=\"hidden\" id=\"x-history-field\" />\n <iframe id=\"x-history-frame\"></iframe>\n</form>\n<script
356
+ type=\"text/javascript\">\nExt.History.init(function(mgr){\n Ext.History.selectByToken(mgr.getToken());\n});\n</script>\n</body>\n</html>
357
+ <!-- metal:use-macro=\"context/page_macros/base-new\" -->\n\n\n"
358
+ http_version:
359
+ recorded_at: Fri, 22 May 2015 12:19:38 GMT
360
+ - request:
361
+ method: post
362
+ uri: http://192.168.56.2:9080/zport/dmd/zport/dmd/device_router
363
+ body:
364
+ encoding: UTF-8
365
+ string: '[{"action":"DeviceRouter","method":"addDevice","data":[{"deviceName":"UnitTestDevice","deviceClass":"/Devices/Server"}],"type":"rpc","tid":1}]'
366
+ headers:
367
+ User-Agent:
368
+ - HTTPClient/1.0 (2.6.0.1, ruby 2.2.0 (2014-12-25))
369
+ Accept:
370
+ - "*/*"
371
+ Date:
372
+ - Fri, 22 May 2015 12:19:38 GMT
373
+ Content-Type:
374
+ - application/json; charset=utf-8
375
+ Cookie:
376
+ - __ginger_snap=NjE2NDZkNjk2ZTo3YTY1NmU2ZjczNzM%253D
377
+ response:
378
+ status:
379
+ code: 200
380
+ message: OK
381
+ headers:
382
+ Server:
383
+ - Zope/(2.12.1, python 2.6.2, linux2) ZServer/1.1
384
+ Date:
385
+ - Fri, 22 May 2015 12:19:38 GMT
386
+ Content-Length:
387
+ - '176'
388
+ Content-Type:
389
+ - application/json
390
+ body:
391
+ encoding: UTF-8
392
+ string: '{"tid": 1, "action": "DeviceRouter", "type": "rpc", "method": "addDevice",
393
+ "result": {"success": true, "jobId": "DeviceCreationJobStatus_77b6d227-2f37-4260-a016-0892d66ad838"}}'
394
+ http_version:
395
+ recorded_at: Fri, 22 May 2015 12:19:38 GMT
396
+ - request:
397
+ method: post
398
+ uri: http://192.168.56.2:9080/zport/dmd/zport/dmd/device_router
399
+ body:
400
+ encoding: UTF-8
401
+ string: '[{"action":"DeviceRouter","method":"getDevices","data":[{"uid":"/zport/dmd/Devices","params":{"name":"UnitTestDevice"}}],"type":"rpc","tid":2}]'
402
+ headers:
403
+ User-Agent:
404
+ - HTTPClient/1.0 (2.6.0.1, ruby 2.2.0 (2014-12-25))
405
+ Accept:
406
+ - "*/*"
407
+ Date:
408
+ - Fri, 22 May 2015 12:19:38 GMT
409
+ Content-Type:
410
+ - application/json; charset=utf-8
411
+ Cookie:
412
+ - __ginger_snap=NjE2NDZkNjk2ZTo3YTY1NmU2ZjczNzM%253D
413
+ response:
414
+ status:
415
+ code: 200
416
+ message: OK
417
+ headers:
418
+ Server:
419
+ - Zope/(2.12.1, python 2.6.2, linux2) ZServer/1.1
420
+ Date:
421
+ - Fri, 22 May 2015 12:19:38 GMT
422
+ Content-Length:
423
+ - '576'
424
+ Content-Type:
425
+ - application/json
426
+ body:
427
+ encoding: UTF-8
428
+ string: '{"tid": 2, "action": "DeviceRouter", "type": "rpc", "method": "getDevices",
429
+ "result": {"totalCount": 1, "hash": "1", "success": true, "devices": [{"groups":
430
+ [], "serialNumber": "", "name": "UnitTestDevice", "collector": "localhost",
431
+ "osModel": null, "productionState": "Production", "location": null, "priority":
432
+ "Normal", "hwModel": null, "tagNumber": "", "osManufacturer": null, "systems":
433
+ [], "hwManufacturer": null, "ipAddress": null, "events": {"info": 0, "debug":
434
+ 0, "critical": 0, "warning": 0, "error": 0}, "uid": "/zport/dmd/Devices/Server/devices/UnitTestDevice"}]}}'
435
+ http_version:
436
+ recorded_at: Fri, 22 May 2015 12:19:38 GMT
437
+ recorded_with: VCR 2.9.3