zenoss_client 0.5.4 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
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