vipruby 0.1.4 → 0.1.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.yardoc/checksums +7 -0
  4. data/.yardoc/object_types +0 -0
  5. data/.yardoc/objects/root.dat +0 -0
  6. data/.yardoc/proxy_types +0 -0
  7. data/.yardopts +1 -0
  8. data/Gemfile +4 -0
  9. data/Gemfile.lock +22 -0
  10. data/LICENSE.txt +22 -0
  11. data/README.md +49 -0
  12. data/Rakefile +2 -0
  13. data/doc/Host.html +910 -0
  14. data/doc/Vipr.html +656 -0
  15. data/doc/ViprBase.html +928 -0
  16. data/doc/ViprHost.html +1952 -0
  17. data/doc/ViprStorageSystem.html +2695 -0
  18. data/doc/ViprVcenter.html +1540 -0
  19. data/doc/Vipruby.html +139 -0
  20. data/doc/Vipruby/Auth.html +745 -0
  21. data/doc/_index.html +135 -0
  22. data/doc/class_list.html +58 -0
  23. data/doc/css/common.css +1 -0
  24. data/doc/css/full_list.css +57 -0
  25. data/doc/css/style.css +339 -0
  26. data/doc/file.README.html +121 -0
  27. data/doc/file_list.html +60 -0
  28. data/doc/frames.html +26 -0
  29. data/doc/index.html +121 -0
  30. data/doc/js/app.js +219 -0
  31. data/doc/js/full_list.js +181 -0
  32. data/doc/js/jquery.js +4 -0
  33. data/doc/method_list.html +333 -0
  34. data/doc/top-level-namespace.html +114 -0
  35. data/lib/.yardoc/checksums +0 -0
  36. data/lib/.yardoc/object_types +0 -0
  37. data/lib/.yardoc/objects/root.dat +0 -0
  38. data/lib/.yardoc/proxy_types +0 -0
  39. data/lib/vipruby.rb +6 -426
  40. data/lib/vipruby/.yardoc/checksums +0 -0
  41. data/lib/vipruby/.yardoc/object_types +0 -0
  42. data/lib/vipruby/.yardoc/objects/root.dat +0 -0
  43. data/lib/vipruby/.yardoc/proxy_types +0 -0
  44. data/lib/vipruby/objects/host.rb +234 -0
  45. data/lib/vipruby/objects/storagesystem.rb +278 -0
  46. data/lib/vipruby/objects/vcenter.rb +162 -0
  47. data/lib/vipruby/version.rb +6 -0
  48. data/lib/vipruby/vipr.rb +45 -0
  49. data/lib/vipruby/viprbase.rb +84 -0
  50. data/vipruby.gemspec +29 -0
  51. metadata +100 -9
@@ -0,0 +1,162 @@
1
+ require 'rest-client'
2
+ require 'json'
3
+
4
+ # The Following vCenter calls will get vCenter information for all tenants
5
+ module ViprVcenter
6
+
7
+ # Retrive all vCenter Servers registered for all tenants
8
+ #
9
+ # @return [Hash] the object converted into Hash format and can be parsed with object[0] or object['id'] notation
10
+ def get_all_vcenters(auth=nil, cert=nil)
11
+ rest_get("#{@base_url}/compute/vcenters/bulk", auth.nil? ? @auth_token : auth, cert.nil? ? @verify_cert : cert)
12
+ end
13
+
14
+ # Retrieve information for a single vCenter server using the uid
15
+ #
16
+ # @param vcenter_id [String] Requires the string of the vcenter uid
17
+ # @return [Hash] the object converted into Hash format and can be parsed with object[0] or object['id'] notation
18
+ #
19
+ # @example
20
+ # x = vipr.get_all_vcenters['id'][0]
21
+ # vipr.get_vcenter(x)
22
+ def get_vcenter(vcenter_id=nil, auth=nil, cert=nil)
23
+ check_vcenter(vcenter_id)
24
+ rest_get("#{@base_url}/compute/vcenters/#{vcenter_id}", auth.nil? ? @auth_token : auth, cert.nil? ? @verify_cert : cert)
25
+ end
26
+
27
+ # Retrieve Host information for a single vCenter server using the uid
28
+ #
29
+ # @param vcenter_id [String] Requires the string of the vcenter uid
30
+ # @return [Hash] the object converted into Hash format and can be parsed with object[0] or object['id'] notation
31
+ #
32
+ # @example
33
+ # x = vipr.get_all_vcenters['id'][0]
34
+ # vipr.get_vcenter_hosts(x)
35
+ def get_vcenter_hosts(vcenter_id=nil, auth=nil, cert=nil)
36
+ check_vcenter(vcenter_id)
37
+ rest_get("#{@base_url}/compute/vcenters/#{vcenter_id}/hosts", auth.nil? ? @auth_token : auth, cert.nil? ? @verify_cert : cert)
38
+ end
39
+
40
+ # Retrieve Cluster information for a single vCenter server using the uid
41
+ #
42
+ # @param vcenter_id [String] Requires the string of the vcenter uid
43
+ # @return [Hash] the object converted into Hash format and can be parsed with object[0] or object['id'] notation
44
+ #
45
+ # @example
46
+ # x = vipr.get_all_vcenters['id'][0]
47
+ # vipr.get_vcenter_clusters(x)
48
+ def get_vcenter_clusters(vcenter_id=nil, auth=nil, cert=nil)
49
+ check_vcenter(vcenter_id)
50
+ rest_get("#{@base_url}/compute/vcenters/#{vcenter_id}/clusters", auth.nil? ? @auth_token : auth, cert.nil? ? @verify_cert : cert)
51
+ end
52
+
53
+ # Retrieve Datacenter information for a single vCenter server using the uid
54
+ #
55
+ # @param vcenter_id [String] Requires the string of the vcenter uid
56
+ # @return [Hash] the object converted into Hash format and can be parsed with object[0] or object['id'] notation
57
+ #
58
+ # @example
59
+ # x = vipr.get_all_vcenters['id'][0]
60
+ # vipr.get_vcenter_datacenters(x)
61
+ def get_vcenter_datacenters(vcenter_id=nil, auth=nil, cert=nil)
62
+ check_vcenter(vcenter_id)
63
+ rest_get("#{@base_url}/compute/vcenters/#{vcenter_id}/vcenter-data-centers", auth.nil? ? @auth_token : auth, cert.nil? ? @verify_cert : cert)
64
+ end
65
+
66
+ # Search for vCenters matching a specific parameter
67
+ #
68
+ # @param vcenter_search_hash [String] String for searching
69
+ # @return [Hash] Will return any vCenter objects containing the search string. The object converted into Hash format and can be parsed with object[0] or object['id'] notation
70
+ #
71
+ # @example
72
+ # vipr.find_vcenter_object('demo')
73
+ def find_vcenter_object(vcenter_search_hash=nil, auth=nil, cert=nil)
74
+ check_vcenter_object_hash(vcenter_search_hash)
75
+ rest_get("#{@base_url}/compute/vcenters/search?name=#{vcenter_search_hash}", auth.nil? ? @auth_token : auth, cert.nil? ? @verify_cert : cert)
76
+ end
77
+
78
+ # Add a vCenters to a specified tenant
79
+ #
80
+ # @param fqdn_or_ip [String] FQDN or IP Address of the vCenter server to add. This is a required string.
81
+ # @param name [String] Name of the vCenter server. This name is arbitrary and only exists within ViPR. This is a required string.
82
+ # @param user_name [String] User Name that will be used for authenticating against the vCenter Server. This is a required string.
83
+ # @param password [String] Password for the user_name that will be used for authenticating against the vCenter Server. This is a required string.
84
+ # @param port [String] Port of the vCenter server. This is an optional parameter. If no parameter is present, the default port of '443' will be used. If registering to a different tenant than default, set this param to nil
85
+ # @param tenant [String] Specify a tenant_uid where the vCenter will be registered. By default it will be added to the tenant of the current logged in ViPR user. This string is optional.
86
+ # @return [Hash] The resulted post operation
87
+ #
88
+ # @example
89
+ # vipr.add_vcenter('vcenter1.mydomain.com', 'vCENTER1', 'DOMAIN\user', 'userpw')
90
+ # vipr.add_vcenter('vcenter2.mydomain.com', 'vCENTER2', 'DOMAIN\user', 'userpw', '1092')
91
+ # vipr.add_vcenter('vcenter3.mydomain.com', 'vCENTER3', 'DOMAIN\user', 'userpw', nil, 'diff_tenant_uid')
92
+ def add_vcenter(fqdn_or_ip=nil, name=nil, user_name=nil, password=nil, port=nil, tenant=nil, auth=nil, cert=nil)
93
+ check_vcenter_post(fqdn_or_ip, name, user_name, password)
94
+ port.nil? ? port = '443' : port = port
95
+ payload = {
96
+ ip_address: fqdn_or_ip,
97
+ name: name,
98
+ port_number: port,
99
+ user_name: user_name,
100
+ password: password
101
+ }.to_json
102
+ rest_post(payload, "#{@base_url}/tenants/#{@tenant_uid}/vcenters", auth.nil? ? @auth_token : auth, cert.nil? ? @verify_cert : cert)
103
+ end
104
+
105
+ # Delete a vCenter from any tenant based on vCenter ID
106
+ #
107
+ # @param vcenter_id [String] Requires the string of the vcenter uid
108
+ # @return [Hash] The resulted post operation
109
+ #
110
+ # @example
111
+ # x = vipr.get_all_vcenters['id'][0]
112
+ # vipr.delete_vcenter(x)
113
+ def delete_vcenter(vcenter_id=nil, auth=nil, cert=nil)
114
+ check_vcenter(vcenter_id)
115
+ payload = {
116
+ }.to_json
117
+ rest_post(payload, "#{@base_url}/compute/vcenters/#{vcenter_id}/deactivate", auth.nil? ? @auth_token : auth, cert.nil? ? @verify_cert : cert)
118
+ end
119
+
120
+
121
+ private
122
+
123
+ # Error Handling method to check for Missing vCenter ID param. If the pass fails, an error exception is raised
124
+ #
125
+ # @param vcenter_id [String] Requires the string of the vcenter uid
126
+ # @return [Boolean] True if pass, false if it fails
127
+ #
128
+ # @private
129
+ def check_vcenter(vcenter_id=nil)
130
+ if vcenter_id == nil
131
+ raise "Missing vCenter ID param (vcenter_id)"
132
+ end
133
+ end
134
+
135
+ # Error Handling method to check for Missing vCenter Object param. If the pass fails, an error exception is raised
136
+ #
137
+ # @param vcenter_search_hash [String] Requires the string of something to search
138
+ # @return [Boolean] True if pass, false if it fails
139
+ #
140
+ # @private
141
+ def check_vcenter_object_hash(vcenter_search_hash=nil)
142
+ if vcenter_search_hash == nil
143
+ raise "Missing vCenter Object to search as a param"
144
+ end
145
+ end
146
+
147
+ # Error Handling method to check for Missing Param. If the pass fails, an error exception is raised
148
+ #
149
+ # @param fqdn_or_ip [String] Requires the string of the vcenter FQDN or IP Address
150
+ # @param name [String] Requires the name of the vCenter
151
+ # @param user_name [String] Requires the User Name used for authentication to vCenter
152
+ # @param password [String] Requires the password of the User Name used for authentication to vCenter
153
+ # @return [Boolean] True if pass, false if it fails
154
+ #
155
+ # @private
156
+ def check_vcenter_post(fqdn_or_ip=nil, name=nil, user_name=nil, password=nil)
157
+ if fqdn_or_ip == nil || name == nil || user_name == nil || password == nil
158
+ raise "Missing a Required Param of fqdn_or_ip, name, port, user_name, or password"
159
+ end
160
+ end
161
+
162
+ end
@@ -0,0 +1,6 @@
1
+ # Get Version information for this Gem
2
+ module Vipruby
3
+
4
+ # Version of the Gem File
5
+ VERSION = "0.1.6.1"
6
+ end
@@ -0,0 +1,45 @@
1
+
2
+ require "vipruby/viprbase"
3
+ require "vipruby/objects/vcenter"
4
+ require 'vipruby/objects/storagesystem'
5
+ require 'vipruby/objects/host'
6
+
7
+ # The base class for the gem. Every subsequent method relies on creating an object from this class
8
+ class Vipr
9
+ include ViprBase
10
+ include ViprVcenter
11
+ include ViprStorageSystem
12
+ include ViprHost
13
+
14
+ # required params used for almost every single method
15
+ attr_accessor :tenant_uid, :auth_token, :base_url, :verify_cert
16
+
17
+ # Initializes a Vipr object that all methods can follow.
18
+ #
19
+ # @param base_url [String] The IP address or FQDN of the ViPR appliance. Do not include 'https' or port numbers
20
+ # @param user_name [String] Username used to log into ViPR
21
+ # @param password [String] Password used to log into ViPR
22
+ # @param verify_cert [Boolean] Should the cert be SSL verified? Setting it to false will work for development purposes. Should be set to true for production
23
+ # @return [Object] The Vipruby object that can be used with many different methods
24
+ #
25
+ # @note
26
+ # Every POST call requires a Tenant UID to create an object.
27
+ # This variable gets the current logged in tenant information.
28
+ # Nothing else needs to be done if there is a single tenant configured for ViPR
29
+ # If resources need to be added to specific tenants, this variable must be overwritten
30
+ # by specifying the tenant_uid
31
+ #
32
+ # @example New Vipruby Object
33
+ # base_url = 'vipr.mydomain.com'
34
+ # user_name = 'root'
35
+ # password = 'mypw'
36
+ # verify_cert = false
37
+ # vipr = Vipr.new(base_url,user_name,password,verify_cert)
38
+ def initialize(base_url,user_name,password,verify_cert)
39
+ @base_url = generate_base_url(base_url)
40
+ @verify_cert = to_boolean(verify_cert)
41
+ @auth_token = get_auth_token(user_name,password)
42
+ @tenant_uid = get_tenant_uid['id']
43
+ end
44
+
45
+ end
@@ -0,0 +1,84 @@
1
+ require 'rest-client'
2
+ require 'json'
3
+
4
+ #Base methods used for all operations such as logging in and performing API calls
5
+ module ViprBase
6
+
7
+ # Generic API post call
8
+ #
9
+ # @param payload [JSON] the JSON payload to be posted
10
+ # @param api_url [string] the full API URL path
11
+ # @return [Hash] the object converted into Hash format and can be parsed with object[0] or object['id'] notation
12
+ def rest_post(payload, api_url, auth=nil, cert=nil)
13
+ JSON.parse(RestClient::Request.execute(method: :post,
14
+ url: api_url,
15
+ verify_ssl: cert.nil? ? @verify_cert : cert,
16
+ payload: payload,
17
+ headers: {
18
+ :'X-SDS-AUTH-TOKEN' => auth.nil? ? @auth_token : auth,
19
+ content_type: 'application/json',
20
+ accept: :json
21
+ }))
22
+ end
23
+
24
+ # Generic API get call
25
+ #
26
+ # @param api_url [string] the full API URL path
27
+ # @return [Hash] the object converted into Hash format and can be parsed with object[0] or object['id'] notation
28
+ def rest_get(api_url, auth=nil, cert=nil)
29
+ JSON.parse(RestClient::Request.execute(method: :get,
30
+ url: api_url,
31
+ verify_ssl: cert.nil? ? @verify_cert : cert,
32
+ headers: {
33
+ :'X-SDS-AUTH-TOKEN' => auth.nil? ? @auth_token : auth,
34
+ accept: :json
35
+ }))
36
+ end
37
+
38
+ # Get the current users Tenant UID
39
+ #
40
+ # @return [Hash] Hash return with the Tenant UID ['id'].
41
+ def get_tenant_uid(base=nil, auth=nil, cert=nil)
42
+ rest_get(base.nil? ? @base_url + "/tenant" : base + "/tenant", auth.nil? ? @auth_token : auth, cert.nil? ? @verify_cert : cert)
43
+ end
44
+
45
+ # Login to ViPR
46
+ #
47
+ # @param user_name [string] the username used to login
48
+ # @param password [string] the password for the username
49
+ # @return [HTML] returns token information in headers
50
+ def login(user_name, password, cert=nil, base=nil)
51
+ RestClient::Request.execute(method: :get,
52
+ url: base.nil? ? @base_url : base + "/login",
53
+ user: user_name,
54
+ password: password,
55
+ verify_ssl: cert.nil? ? @verify_cert : cert
56
+ )
57
+ end
58
+
59
+ # Generate the URL for standard ViPR instances using https: and port :443
60
+ #
61
+ # @param ip_or_fqdn [string] String representation of the IP Address or Fully Qualified Domain Name of the ViPR instance
62
+ # @return [strong] returns the full URL for API called
63
+ def generate_base_url(ip_or_fqdn)
64
+ return "https://#{ip_or_fqdn}:4443"
65
+ end
66
+
67
+ # Get User's Authentication Token
68
+ #
69
+ # @param user_name [string] the username used to login
70
+ # @param password [string] the password for the username
71
+ # @return [String] returns authentication token for the user
72
+ def get_auth_token(user_name,password, cert=nil, base=nil)
73
+ login(user_name, password, cert.nil? ? @verify_cert : cert, base.nil? ? @base_url : base).headers[:x_sds_auth_token]
74
+ end
75
+
76
+ # Ensure value is a boolean
77
+ #
78
+ # @param str [string, bool] the value to convert or verify
79
+ # @return [bool] returns True or False
80
+ def to_boolean(str)
81
+ str.to_s.downcase == "true"
82
+ end
83
+
84
+ end
data/vipruby.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'vipruby/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'vipruby'
7
+ s.version = Vipruby::VERSION
8
+ s.date = Date.today.to_s
9
+ s.summary = "A Ruby Library for EMC's ViPR"
10
+ s.description = "A Ruby implementation to add & gather information from Storage Arrays, vCenter, and Compute Hosts"
11
+ s.authors = ["Craig J Smith", "Kendrick Coleman"]
12
+ s.email = 'nctiggy@gmail.com'
13
+ s.require_paths = %w[lib]
14
+ s.files = `git ls-files`.split($/)
15
+ s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
16
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
17
+ s.require_paths = ["lib"]
18
+ s.homepage =
19
+ 'https://github.com/nctiggy/Vipruby'
20
+ s.license = 'MIT'
21
+ s.add_runtime_dependency "json",
22
+ ["~> 1.8"]
23
+ s.add_runtime_dependency "rest-client",
24
+ ["= 1.7.2"]
25
+ s.add_development_dependency 'bundler', '~> 1.3'
26
+ s.add_development_dependency 'rake'
27
+ s.add_development_dependency 'rspec'
28
+ s.add_development_dependency 'yard'
29
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vipruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Craig J Smith
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-08-20 00:00:00.000000000 Z
12
+ date: 2014-12-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json
@@ -40,27 +40,117 @@ dependencies:
40
40
  - !ruby/object:Gem::Version
41
41
  version: 1.7.2
42
42
  - !ruby/object:Gem::Dependency
43
- name: nokogiri
43
+ name: bundler
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '1.3'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '1.3'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rake
44
58
  requirement: !ruby/object:Gem::Requirement
45
59
  requirements:
46
60
  - - ">="
47
61
  - !ruby/object:Gem::Version
48
- version: 1.6.0
49
- type: :runtime
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rspec
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: yard
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
50
92
  prerelease: false
51
93
  version_requirements: !ruby/object:Gem::Requirement
52
94
  requirements:
53
95
  - - ">="
54
96
  - !ruby/object:Gem::Version
55
- version: 1.6.0
56
- description: Currently limited to host and initiator add functions along with vCenter
57
- and storage additions
97
+ version: '0'
98
+ description: A Ruby implementation to add & gather information from Storage Arrays,
99
+ vCenter, and Compute Hosts
58
100
  email: nctiggy@gmail.com
59
101
  executables: []
60
102
  extensions: []
61
103
  extra_rdoc_files: []
62
104
  files:
105
+ - ".gitignore"
106
+ - ".yardoc/checksums"
107
+ - ".yardoc/object_types"
108
+ - ".yardoc/objects/root.dat"
109
+ - ".yardoc/proxy_types"
110
+ - ".yardopts"
111
+ - Gemfile
112
+ - Gemfile.lock
113
+ - LICENSE.txt
114
+ - README.md
115
+ - Rakefile
116
+ - doc/Host.html
117
+ - doc/Vipr.html
118
+ - doc/ViprBase.html
119
+ - doc/ViprHost.html
120
+ - doc/ViprStorageSystem.html
121
+ - doc/ViprVcenter.html
122
+ - doc/Vipruby.html
123
+ - doc/Vipruby/Auth.html
124
+ - doc/_index.html
125
+ - doc/class_list.html
126
+ - doc/css/common.css
127
+ - doc/css/full_list.css
128
+ - doc/css/style.css
129
+ - doc/file.README.html
130
+ - doc/file_list.html
131
+ - doc/frames.html
132
+ - doc/index.html
133
+ - doc/js/app.js
134
+ - doc/js/full_list.js
135
+ - doc/js/jquery.js
136
+ - doc/method_list.html
137
+ - doc/top-level-namespace.html
138
+ - lib/.yardoc/checksums
139
+ - lib/.yardoc/object_types
140
+ - lib/.yardoc/objects/root.dat
141
+ - lib/.yardoc/proxy_types
63
142
  - lib/vipruby.rb
143
+ - lib/vipruby/.yardoc/checksums
144
+ - lib/vipruby/.yardoc/object_types
145
+ - lib/vipruby/.yardoc/objects/root.dat
146
+ - lib/vipruby/.yardoc/proxy_types
147
+ - lib/vipruby/objects/host.rb
148
+ - lib/vipruby/objects/storagesystem.rb
149
+ - lib/vipruby/objects/vcenter.rb
150
+ - lib/vipruby/version.rb
151
+ - lib/vipruby/vipr.rb
152
+ - lib/vipruby/viprbase.rb
153
+ - vipruby.gemspec
64
154
  homepage: https://github.com/nctiggy/Vipruby
65
155
  licenses:
66
156
  - MIT
@@ -81,8 +171,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
81
171
  version: '0'
82
172
  requirements: []
83
173
  rubyforge_project:
84
- rubygems_version: 2.4.1
174
+ rubygems_version: 2.2.2
85
175
  signing_key:
86
176
  specification_version: 4
87
177
  summary: A Ruby Library for EMC's ViPR
88
178
  test_files: []
179
+ has_rdoc: