oneview-sdk 2.2.1 → 3.0.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 (171) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +50 -0
  3. data/README.md +61 -15
  4. data/Rakefile +39 -1
  5. data/lib/oneview-sdk.rb +38 -3
  6. data/lib/oneview-sdk/cli.rb +85 -30
  7. data/lib/oneview-sdk/client.rb +21 -18
  8. data/lib/oneview-sdk/config_loader.rb +1 -1
  9. data/lib/oneview-sdk/resource.rb +44 -36
  10. data/lib/oneview-sdk/resource/api200.rb +34 -0
  11. data/lib/oneview-sdk/resource/api200/connection_template.rb +52 -0
  12. data/lib/oneview-sdk/resource/api200/datacenter.rb +81 -0
  13. data/lib/oneview-sdk/resource/api200/enclosure.rb +203 -0
  14. data/lib/oneview-sdk/resource/api200/enclosure_group.rb +86 -0
  15. data/lib/oneview-sdk/resource/api200/ethernet_network.rb +60 -0
  16. data/lib/oneview-sdk/resource/api200/fabric.rb +45 -0
  17. data/lib/oneview-sdk/resource/api200/fc_network.rb +34 -0
  18. data/lib/oneview-sdk/resource/api200/fcoe_network.rb +32 -0
  19. data/lib/oneview-sdk/resource/api200/firmware_bundle.rb +56 -0
  20. data/lib/oneview-sdk/resource/{fcoe_network.rb → api200/firmware_driver.rb} +21 -12
  21. data/lib/oneview-sdk/resource/api200/interconnect.rb +112 -0
  22. data/lib/oneview-sdk/resource/api200/lig_uplink_set.rb +84 -0
  23. data/lib/oneview-sdk/resource/api200/logical_downlink.rb +57 -0
  24. data/lib/oneview-sdk/resource/api200/logical_enclosure.rb +88 -0
  25. data/lib/oneview-sdk/resource/api200/logical_interconnect.rb +251 -0
  26. data/lib/oneview-sdk/resource/api200/logical_interconnect_group.rb +116 -0
  27. data/lib/oneview-sdk/resource/api200/logical_switch.rb +188 -0
  28. data/lib/oneview-sdk/resource/api200/logical_switch_group.rb +70 -0
  29. data/lib/oneview-sdk/resource/api200/managed_san.rb +83 -0
  30. data/lib/oneview-sdk/resource/api200/network_set.rb +68 -0
  31. data/lib/oneview-sdk/resource/api200/power_device.rb +178 -0
  32. data/lib/oneview-sdk/resource/api200/rack.rb +88 -0
  33. data/lib/oneview-sdk/resource/api200/resource.rb +18 -0
  34. data/lib/oneview-sdk/resource/api200/san_manager.rb +92 -0
  35. data/lib/oneview-sdk/resource/api200/server_hardware.rb +244 -0
  36. data/lib/oneview-sdk/resource/api200/server_hardware_type.rb +61 -0
  37. data/lib/oneview-sdk/resource/api200/server_profile.rb +385 -0
  38. data/lib/oneview-sdk/resource/api200/server_profile_template.rb +217 -0
  39. data/lib/oneview-sdk/resource/api200/storage_pool.rb +92 -0
  40. data/lib/oneview-sdk/resource/api200/storage_system.rb +157 -0
  41. data/lib/oneview-sdk/resource/api200/switch.rb +91 -0
  42. data/lib/oneview-sdk/resource/api200/unmanaged_device.rb +59 -0
  43. data/lib/oneview-sdk/resource/api200/uplink_set.rb +83 -0
  44. data/lib/oneview-sdk/resource/api200/volume.rb +192 -0
  45. data/lib/oneview-sdk/resource/api200/volume_attachment.rb +83 -0
  46. data/lib/oneview-sdk/resource/api200/volume_snapshot.rb +50 -0
  47. data/lib/oneview-sdk/resource/api200/volume_template.rb +99 -0
  48. data/lib/oneview-sdk/resource/api300.rb +66 -0
  49. data/lib/oneview-sdk/resource/api300/c7000.rb +27 -0
  50. data/lib/oneview-sdk/resource/api300/c7000/connection_template.rb +30 -0
  51. data/lib/oneview-sdk/resource/api300/c7000/datacenter.rb +22 -0
  52. data/lib/oneview-sdk/resource/api300/c7000/enclosure.rb +48 -0
  53. data/lib/oneview-sdk/resource/api300/c7000/enclosure_group.rb +37 -0
  54. data/lib/oneview-sdk/resource/api300/c7000/ethernet_network.rb +35 -0
  55. data/lib/oneview-sdk/resource/api300/c7000/fabric.rb +22 -0
  56. data/lib/oneview-sdk/resource/api300/c7000/fc_network.rb +37 -0
  57. data/lib/oneview-sdk/resource/api300/c7000/fcoe_network.rb +35 -0
  58. data/lib/oneview-sdk/resource/api300/c7000/firmware_bundle.rb +21 -0
  59. data/lib/oneview-sdk/resource/api300/c7000/firmware_driver.rb +22 -0
  60. data/lib/oneview-sdk/resource/api300/c7000/interconnect.rb +21 -0
  61. data/lib/oneview-sdk/resource/api300/c7000/lig_uplink_set.rb +21 -0
  62. data/lib/oneview-sdk/resource/api300/c7000/logical_downlink.rb +34 -0
  63. data/lib/oneview-sdk/resource/api300/c7000/logical_enclosure.rb +35 -0
  64. data/lib/oneview-sdk/resource/api300/c7000/logical_interconnect.rb +21 -0
  65. data/lib/oneview-sdk/resource/api300/c7000/logical_interconnect_group.rb +33 -0
  66. data/lib/oneview-sdk/resource/api300/c7000/logical_switch.rb +51 -0
  67. data/lib/oneview-sdk/resource/api300/c7000/logical_switch_group.rb +33 -0
  68. data/lib/oneview-sdk/resource/api300/c7000/managed_san.rb +36 -0
  69. data/lib/oneview-sdk/resource/api300/c7000/network_set.rb +37 -0
  70. data/lib/oneview-sdk/resource/api300/c7000/power_device.rb +21 -0
  71. data/lib/oneview-sdk/resource/api300/c7000/rack.rb +22 -0
  72. data/lib/oneview-sdk/resource/api300/c7000/resource.rb +21 -0
  73. data/lib/oneview-sdk/resource/api300/c7000/san_manager.rb +22 -0
  74. data/lib/oneview-sdk/resource/api300/c7000/server_hardware.rb +93 -0
  75. data/lib/oneview-sdk/resource/api300/c7000/server_hardware_type.rb +21 -0
  76. data/lib/oneview-sdk/resource/api300/c7000/server_profile.rb +33 -0
  77. data/lib/oneview-sdk/resource/api300/c7000/server_profile_template.rb +50 -0
  78. data/lib/oneview-sdk/resource/api300/c7000/storage_pool.rb +29 -0
  79. data/lib/oneview-sdk/resource/api300/c7000/storage_system.rb +21 -0
  80. data/lib/oneview-sdk/resource/api300/c7000/switch.rb +31 -0
  81. data/lib/oneview-sdk/resource/api300/c7000/unmanaged_device.rb +21 -0
  82. data/lib/oneview-sdk/resource/api300/c7000/uplink_set.rb +21 -0
  83. data/lib/oneview-sdk/resource/api300/c7000/volume.rb +22 -0
  84. data/lib/oneview-sdk/resource/api300/c7000/volume_attachment.rb +21 -0
  85. data/lib/oneview-sdk/resource/api300/c7000/volume_snapshot.rb +21 -0
  86. data/lib/oneview-sdk/resource/api300/c7000/volume_template.rb +32 -0
  87. data/lib/oneview-sdk/resource/api300/synergy.rb +27 -0
  88. data/lib/oneview-sdk/resource/api300/synergy/connection_template.rb +30 -0
  89. data/lib/oneview-sdk/resource/api300/synergy/datacenter.rb +22 -0
  90. data/lib/oneview-sdk/resource/api300/synergy/drive_enclosure.rb +71 -0
  91. data/lib/oneview-sdk/resource/api300/synergy/enclosure.rb +110 -0
  92. data/lib/oneview-sdk/resource/api300/synergy/enclosure_group.rb +43 -0
  93. data/lib/oneview-sdk/resource/api300/synergy/ethernet_network.rb +35 -0
  94. data/lib/oneview-sdk/resource/api300/synergy/fabric.rb +46 -0
  95. data/lib/oneview-sdk/resource/api300/synergy/fc_network.rb +37 -0
  96. data/lib/oneview-sdk/resource/api300/synergy/fcoe_network.rb +35 -0
  97. data/lib/oneview-sdk/resource/api300/synergy/firmware_bundle.rb +21 -0
  98. data/lib/oneview-sdk/resource/api300/synergy/firmware_driver.rb +22 -0
  99. data/lib/oneview-sdk/resource/api300/synergy/interconnect.rb +43 -0
  100. data/lib/oneview-sdk/resource/api300/synergy/lig_uplink_set.rb +21 -0
  101. data/lib/oneview-sdk/resource/api300/synergy/logical_downlink.rb +34 -0
  102. data/lib/oneview-sdk/resource/api300/synergy/logical_enclosure.rb +59 -0
  103. data/lib/oneview-sdk/resource/api300/synergy/logical_interconnect.rb +21 -0
  104. data/lib/oneview-sdk/resource/api300/synergy/logical_interconnect_group.rb +119 -0
  105. data/lib/oneview-sdk/resource/api300/synergy/logical_switch.rb +33 -0
  106. data/lib/oneview-sdk/resource/api300/synergy/logical_switch_group.rb +45 -0
  107. data/lib/oneview-sdk/resource/{firmware_driver.rb → api300/synergy/managed_san.rb} +7 -17
  108. data/lib/oneview-sdk/resource/api300/synergy/network_set.rb +37 -0
  109. data/lib/oneview-sdk/resource/api300/synergy/power_device.rb +21 -0
  110. data/lib/oneview-sdk/resource/api300/synergy/rack.rb +22 -0
  111. data/lib/oneview-sdk/resource/api300/synergy/resource.rb +21 -0
  112. data/lib/oneview-sdk/resource/api300/synergy/san_manager.rb +22 -0
  113. data/lib/oneview-sdk/resource/api300/synergy/sas_interconnect.rb +87 -0
  114. data/lib/oneview-sdk/resource/api300/synergy/sas_logical_interconnect.rb +110 -0
  115. data/lib/oneview-sdk/resource/api300/synergy/sas_logical_interconnect_group.rb +87 -0
  116. data/lib/oneview-sdk/resource/api300/synergy/server_hardware.rb +30 -0
  117. data/lib/oneview-sdk/resource/api300/synergy/server_hardware_type.rb +21 -0
  118. data/lib/oneview-sdk/resource/api300/synergy/server_profile.rb +78 -0
  119. data/lib/oneview-sdk/resource/api300/synergy/server_profile_template.rb +34 -0
  120. data/lib/oneview-sdk/resource/api300/synergy/storage_pool.rb +22 -0
  121. data/lib/oneview-sdk/resource/api300/synergy/storage_system.rb +21 -0
  122. data/lib/oneview-sdk/resource/api300/synergy/switch.rb +37 -0
  123. data/lib/oneview-sdk/resource/api300/synergy/unmanaged_device.rb +21 -0
  124. data/lib/oneview-sdk/resource/api300/synergy/uplink_set.rb +21 -0
  125. data/lib/oneview-sdk/resource/api300/synergy/volume.rb +22 -0
  126. data/lib/oneview-sdk/resource/api300/synergy/volume_attachment.rb +21 -0
  127. data/lib/oneview-sdk/resource/api300/synergy/volume_snapshot.rb +21 -0
  128. data/lib/oneview-sdk/resource/api300/synergy/volume_template.rb +32 -0
  129. data/lib/oneview-sdk/rest.rb +7 -10
  130. data/lib/oneview-sdk/ssl_helper.rb +3 -3
  131. data/lib/oneview-sdk/version.rb +1 -1
  132. data/oneview-sdk.gemspec +5 -5
  133. metadata +126 -47
  134. data/.gitattributes +0 -2
  135. data/.gitignore +0 -29
  136. data/.rubocop.yml +0 -80
  137. data/.travis.yml +0 -12
  138. data/lib/oneview-sdk/resource/connection_template.rb +0 -48
  139. data/lib/oneview-sdk/resource/datacenter.rb +0 -77
  140. data/lib/oneview-sdk/resource/enclosure.rb +0 -191
  141. data/lib/oneview-sdk/resource/enclosure_group.rb +0 -82
  142. data/lib/oneview-sdk/resource/ethernet_network.rb +0 -56
  143. data/lib/oneview-sdk/resource/fabric.rb +0 -41
  144. data/lib/oneview-sdk/resource/fc_network.rb +0 -30
  145. data/lib/oneview-sdk/resource/firmware_bundle.rb +0 -50
  146. data/lib/oneview-sdk/resource/interconnect.rb +0 -107
  147. data/lib/oneview-sdk/resource/lig_uplink_set.rb +0 -80
  148. data/lib/oneview-sdk/resource/logical_downlink.rb +0 -53
  149. data/lib/oneview-sdk/resource/logical_enclosure.rb +0 -86
  150. data/lib/oneview-sdk/resource/logical_interconnect.rb +0 -247
  151. data/lib/oneview-sdk/resource/logical_interconnect_group.rb +0 -112
  152. data/lib/oneview-sdk/resource/logical_switch.rb +0 -184
  153. data/lib/oneview-sdk/resource/logical_switch_group.rb +0 -66
  154. data/lib/oneview-sdk/resource/managed_san.rb +0 -79
  155. data/lib/oneview-sdk/resource/network_set.rb +0 -64
  156. data/lib/oneview-sdk/resource/power_device.rb +0 -174
  157. data/lib/oneview-sdk/resource/rack.rb +0 -83
  158. data/lib/oneview-sdk/resource/san_manager.rb +0 -88
  159. data/lib/oneview-sdk/resource/server_hardware.rb +0 -209
  160. data/lib/oneview-sdk/resource/server_hardware_type.rb +0 -58
  161. data/lib/oneview-sdk/resource/server_profile.rb +0 -380
  162. data/lib/oneview-sdk/resource/server_profile_template.rb +0 -213
  163. data/lib/oneview-sdk/resource/storage_pool.rb +0 -63
  164. data/lib/oneview-sdk/resource/storage_system.rb +0 -113
  165. data/lib/oneview-sdk/resource/switch.rb +0 -86
  166. data/lib/oneview-sdk/resource/unmanaged_device.rb +0 -55
  167. data/lib/oneview-sdk/resource/uplink_set.rb +0 -79
  168. data/lib/oneview-sdk/resource/volume.rb +0 -188
  169. data/lib/oneview-sdk/resource/volume_attachment.rb +0 -79
  170. data/lib/oneview-sdk/resource/volume_snapshot.rb +0 -46
  171. data/lib/oneview-sdk/resource/volume_template.rb +0 -95
@@ -17,8 +17,6 @@ require_relative 'ssl_helper'
17
17
  module OneviewSDK
18
18
  # The client defines the connection to the OneView server and handles communication with it.
19
19
  class Client
20
- DEFAULT_API_VERSION = 200
21
-
22
20
  attr_reader :url, :user, :token, :password, :max_api_version
23
21
  attr_accessor :ssl_enabled, :api_version, :logger, :log_level, :cert_store, :print_wait_dots, :timeout
24
22
 
@@ -40,22 +38,25 @@ module OneviewSDK
40
38
  # @option options [Integer] :timeout (nil) Override the default request timeout value
41
39
  def initialize(options = {})
42
40
  options = Hash[options.map { |k, v| [k.to_sym, v] }] # Convert string hash keys to symbols
41
+ STDOUT.sync = true
43
42
  @logger = options[:logger] || Logger.new(STDOUT)
44
- [:debug, :info, :warn, :error, :level=].each { |m| fail InvalidClient, "Logger must respond to #{m} method " unless @logger.respond_to?(m) }
43
+ [:debug, :info, :warn, :error, :level=].each { |m| raise InvalidClient, "Logger must respond to #{m} method " unless @logger.respond_to?(m) }
45
44
  @log_level = options[:log_level] || :info
46
45
  @logger.level = @logger.class.const_get(@log_level.upcase) rescue @log_level
47
46
  @print_wait_dots = options.fetch(:print_wait_dots, false)
48
47
  @url = options[:url] || ENV['ONEVIEWSDK_URL']
49
- fail InvalidClient, 'Must set the url option' unless @url
48
+ raise InvalidClient, 'Must set the url option' unless @url
50
49
  @max_api_version = appliance_api_version
51
50
  if options[:api_version] && options[:api_version].to_i > @max_api_version
52
51
  logger.warn "API version #{options[:api_version]} is greater than the appliance API version (#{@max_api_version})"
53
52
  end
54
- @api_version = options[:api_version] || [DEFAULT_API_VERSION, @max_api_version].min
53
+ @api_version = options[:api_version] || [OneviewSDK::DEFAULT_API_VERSION, @max_api_version].min
54
+ # Set the default OneviewSDK module API version
55
+ OneviewSDK.api_version = @api_version unless OneviewSDK.api_version_updated? || !OneviewSDK::SUPPORTED_API_VERSIONS.include?(@api_version)
55
56
  @ssl_enabled = true
56
57
  if ENV.key?('ONEVIEWSDK_SSL_ENABLED')
57
58
  if %w(true false 1 0).include?(ENV['ONEVIEWSDK_SSL_ENABLED'])
58
- @ssl_enabled = ! %w(false 0).include?(ENV['ONEVIEWSDK_SSL_ENABLED'])
59
+ @ssl_enabled = !%w(false 0).include?(ENV['ONEVIEWSDK_SSL_ENABLED'])
59
60
  else
60
61
  @logger.warn "Unrecognized ssl_enabled value '#{ENV['ONEVIEWSDK_SSL_ENABLED']}'. Valid options are 'true' & 'false'"
61
62
  end
@@ -68,7 +69,7 @@ module OneviewSDK
68
69
  @logger.warn 'User option not set. Using default (Administrator)' unless options[:user] || ENV['ONEVIEWSDK_USER']
69
70
  @user = options[:user] || ENV['ONEVIEWSDK_USER'] || 'Administrator'
70
71
  @password = options[:password] || ENV['ONEVIEWSDK_PASSWORD']
71
- fail InvalidClient, 'Must set user & password options or token option' unless @password
72
+ raise InvalidClient, 'Must set user & password options or token option' unless @password
72
73
  @token = login
73
74
  end
74
75
 
@@ -102,13 +103,15 @@ module OneviewSDK
102
103
 
103
104
  # Get array of all resources of a specified type
104
105
  # @param [String] type Resource type
106
+ # @param [Integer] api_ver API module version to fetch resources from
105
107
  # @return [Array<Resource>] Results
106
108
  # @example Get all Ethernet Networks
107
109
  # networks = @client.get_all('EthernetNetworks')
108
- def get_all(type)
109
- OneviewSDK.resource_named(type).get_all(self)
110
- rescue StandardError
111
- raise TypeError, "Invalid resource type '#{type}'"
110
+ # @raise [TypeError] if the type is invalid
111
+ def get_all(type, api_ver = @api_version)
112
+ klass = OneviewSDK.resource_named(type, api_ver)
113
+ raise TypeError, "Invalid resource type '#{type}'. OneviewSDK::API#{api_ver} does not contain a class like it." unless klass
114
+ klass.get_all(self)
112
115
  end
113
116
 
114
117
  # Wait for a task to complete
@@ -116,9 +119,9 @@ module OneviewSDK
116
119
  # @raise [OneviewSDK::TaskError] if the task resulted in an error or early termination.
117
120
  # @return [Hash] if the task completed successfully, return the task details
118
121
  def wait_for(task_uri)
119
- fail ArgumentError, 'Must specify a task_uri!' if task_uri.nil? || task_uri.empty?
122
+ raise ArgumentError, 'Must specify a task_uri!' if task_uri.nil? || task_uri.empty?
120
123
  loop do
121
- task_uri.gsub!(%r{/https:(.*)\/rest/}, '/rest')
124
+ task_uri.gsub!(%r{https:(.*)\/rest}, '/rest')
122
125
  task = rest_get(task_uri)
123
126
  body = JSON.parse(task.body)
124
127
  case body['taskState'].downcase
@@ -130,7 +133,7 @@ module OneviewSDK
130
133
  when 'error', 'killed', 'terminated'
131
134
  msg = "Task ended with bad state: '#{body['taskState']}'.\nResponse: "
132
135
  msg += body['taskErrors'] ? JSON.pretty_generate(body['taskErrors']) : JSON.pretty_generate(body)
133
- fail TaskError, msg
136
+ raise TaskError, msg
134
137
  else
135
138
  print '.' if @print_wait_dots
136
139
  sleep 10
@@ -146,12 +149,12 @@ module OneviewSDK
146
149
  options = { 'Content-Type' => :none, 'X-API-Version' => :none, 'auth' => :none }
147
150
  response = rest_api(:get, '/rest/version', options)
148
151
  version = response_handler(response)['currentVersion']
149
- fail ConnectionError, "Couldn't get API version" unless version
152
+ raise ConnectionError, "Couldn't get API version" unless version
150
153
  version = version.to_i if version.class != Fixnum
151
154
  version
152
155
  rescue ConnectionError
153
- @logger.warn "Failed to get OneView max api version. Using default (#{DEFAULT_API_VERSION})"
154
- DEFAULT_API_VERSION
156
+ @logger.warn "Failed to get OneView max api version. Using default (#{OneviewSDK::DEFAULT_API_VERSION})"
157
+ OneviewSDK::DEFAULT_API_VERSION
155
158
  end
156
159
 
157
160
  # Log in to OneView appliance and set max_api_version
@@ -166,7 +169,7 @@ module OneviewSDK
166
169
  response = rest_post('/rest/login-sessions', options)
167
170
  body = response_handler(response)
168
171
  return body['sessionID'] if body['sessionID']
169
- fail ConnectionError, "\nERROR! Couldn't log into OneView server at #{@url}. Response: #{response}\n#{response.body}"
172
+ raise ConnectionError, "\nERROR! Couldn't log into OneView server at #{@url}. Response: #{response}\n#{response.body}"
170
173
  rescue StandardError => e
171
174
  raise e unless retries > 0
172
175
  @logger.debug 'Failed to log in to OneView. Retrying...'
@@ -25,7 +25,7 @@ module OneviewSDK
25
25
  JSON.parse(IO.read(expanded_path))
26
26
  rescue
27
27
  data = YAML.load_file(expanded_path)
28
- Hash[data.map { |k, v| [k.to_s, v] }]
28
+ JSON.parse(data.to_json) # Convert to and from JSON to ensure compatibility
29
29
  end
30
30
  end
31
31
  end
@@ -16,6 +16,7 @@ module OneviewSDK
16
16
  # Resource base class that defines all common resource functionality.
17
17
  class Resource
18
18
  BASE_URI = '/rest'.freeze
19
+ UNIQUE_IDENTIFIERS = %w(name uri).freeze # Ordered list of unique attributes to search by
19
20
 
20
21
  attr_accessor \
21
22
  :client,
@@ -29,37 +30,43 @@ module OneviewSDK
29
30
  # @param [Integer] api_ver The api version to use when interracting with this resource.
30
31
  # Defaults to the client.api_version if it exists, or the OneviewSDK::Client::DEFAULT_API_VERSION.
31
32
  def initialize(client, params = {}, api_ver = nil)
32
- fail InvalidClient, 'Must specify a valid client' unless client.is_a?(OneviewSDK::Client)
33
+ raise InvalidClient, 'Must specify a valid client' unless client.is_a?(OneviewSDK::Client)
33
34
  @client = client
34
35
  @logger = @client.logger
35
36
  @api_version = api_ver || @client.api_version
36
37
  if @api_version > @client.max_api_version
37
- fail UnsupportedVersion,
38
- "#{self.class.name} api_version '#{@api_version}' is greater than the client's max_api_version '#{@client.max_api_version}'"
38
+ raise UnsupportedVersion,
39
+ "#{self.class.name} api_version '#{@api_version}' is greater than the client's max_api_version '#{@client.max_api_version}'"
39
40
  end
40
41
  @data ||= {}
41
42
  set_all(params)
42
43
  end
43
44
 
44
45
  # Retrieve resource details based on this resource's name or URI.
45
- # @note Name or URI must be specified inside the resource
46
+ # @note one of the UNIQUE_IDENTIFIERS, e.g. name or uri, must be specified in the resource
46
47
  # @return [Boolean] Whether or not retrieve was successful
47
48
  def retrieve!
48
- fail IncompleteResource, 'Must set resource name or uri before trying to retrieve!' unless @data['name'] || @data['uri']
49
- results = self.class.find_by(@client, name: @data['name']) if @data['name']
50
- results = self.class.find_by(@client, uri: @data['uri']) if @data['uri'] && (!results || results.empty?)
51
- return false unless results.size == 1
52
- set_all(results[0].data)
53
- true
49
+ retrieval_keys = self.class::UNIQUE_IDENTIFIERS.select { |k| !@data[k].nil? }
50
+ raise IncompleteResource, "Must set resource #{self.class::UNIQUE_IDENTIFIERS.join(' or ')} before trying to retrieve!" if retrieval_keys.empty?
51
+ retrieval_keys.each do |k|
52
+ results = self.class.find_by(@client, k => @data[k])
53
+ next if results.size != 1
54
+ set_all(results[0].data)
55
+ return true
56
+ end
57
+ false
54
58
  end
55
59
 
56
60
  # Check if a resource exists
57
- # @note name or uri must be specified inside resource
61
+ # @note one of the UNIQUE_IDENTIFIERS, e.g. name or uri, must be specified in the resource
58
62
  # @return [Boolean] Whether or not resource exists
59
63
  def exists?
60
- fail IncompleteResource, 'Must set resource name or uri before trying to retrieve!' unless @data['name'] || @data['uri']
61
- return true if @data['name'] && self.class.find_by(@client, name: @data['name']).size == 1
62
- return true if @data['uri'] && self.class.find_by(@client, uri: @data['uri']).size == 1
64
+ retrieval_keys = self.class::UNIQUE_IDENTIFIERS.select { |k| !@data[k].nil? }
65
+ raise IncompleteResource, "Must set resource #{self.class::UNIQUE_IDENTIFIERS.join(' or ')} before trying to retrieve!" if retrieval_keys.empty?
66
+ retrieval_keys.each do |k|
67
+ results = self.class.find_by(@client, k => @data[k])
68
+ return true if results.size == 1
69
+ end
63
70
  false
64
71
  end
65
72
 
@@ -206,7 +213,7 @@ module OneviewSDK
206
213
  when :yml, :yaml
207
214
  File.open(file_path, 'w') { |f| f.write(temp_data.to_yaml) }
208
215
  else
209
- fail InvalidFormat, "Invalid format: #{format}"
216
+ raise InvalidFormat, "Invalid format: #{format}"
210
217
  end
211
218
  true
212
219
  end
@@ -235,7 +242,16 @@ module OneviewSDK
235
242
  # @return [Resource] New resource created from the file contents
236
243
  def self.from_file(client, file_path)
237
244
  resource = OneviewSDK::Config.load(file_path)
238
- new(client, resource['data'], resource['api_version'])
245
+ klass = self
246
+ if klass == OneviewSDK::Resource && resource['type'] # Use correct resource class by parsing type
247
+ klass = OneviewSDK # Secondary/temp class/module reference
248
+ resource['type'].split('::').each do |id|
249
+ c = klass.const_get(id) rescue nil
250
+ klass = c if c.is_a?(Class) || c.is_a?(Module)
251
+ end
252
+ klass = OneviewSDK::Resource unless klass <= OneviewSDK::Resource
253
+ end
254
+ klass.new(client, resource['data'], resource['api_version'])
239
255
  end
240
256
 
241
257
  # Make a GET request to the resource uri, and returns an array with results matching the search
@@ -296,19 +312,19 @@ module OneviewSDK
296
312
 
297
313
  # Fail unless @client is set for this resource.
298
314
  def ensure_client
299
- fail IncompleteResource, 'Please set client attribute before interacting with this resource' unless @client
315
+ raise IncompleteResource, 'Please set client attribute before interacting with this resource' unless @client
300
316
  true
301
317
  end
302
318
 
303
319
  # Fail unless @data['uri'] is set for this resource.
304
320
  def ensure_uri
305
- fail IncompleteResource, 'Please set uri attribute before interacting with this resource' unless @data['uri']
321
+ raise IncompleteResource, 'Please set uri attribute before interacting with this resource' unless @data['uri']
306
322
  true
307
323
  end
308
324
 
309
325
  # Fail for methods that are not available for one resource
310
326
  def unavailable_method
311
- fail MethodUnavailable, "The method ##{caller[0][/`.*'/][1..-2]} is unavailable for this resource"
327
+ raise MethodUnavailable, "The method ##{caller[0][/`.*'/][1..-2]} is unavailable for this resource"
312
328
  end
313
329
 
314
330
  private
@@ -316,12 +332,12 @@ module OneviewSDK
316
332
  # Recursive helper method for like?
317
333
  # Allows comparison of nested hash structures
318
334
  def recursive_like?(other, data = @data)
319
- fail "Can't compare with object type: #{other.class}! Must respond_to :each" unless other.respond_to?(:each)
335
+ raise "Can't compare with object type: #{other.class}! Must respond_to :each" unless other.respond_to?(:each)
320
336
  other.each do |key, val|
321
337
  return false unless data && data.respond_to?(:[])
322
338
  if val.is_a?(Hash)
323
339
  return false unless data.class == Hash && recursive_like?(val, data[key.to_s])
324
- elsif val != data[key.to_s]
340
+ elsif val != data[key.to_s] && val != data[key.to_sym]
325
341
  return false
326
342
  end
327
343
  end
@@ -332,22 +348,14 @@ module OneviewSDK
332
348
 
333
349
  # Get resource class that matches the type given
334
350
  # @param [String] type Name of the desired class type
351
+ # @param [Fixnum] api_ver API module version to fetch resource from
352
+ # @param [String] variant API module variant to fetch resource from
335
353
  # @return [Class] Resource class or nil if not found
336
- def self.resource_named(type)
337
- classes = {}
338
- orig_classes = []
339
- OneviewSDK.constants.each do |c|
340
- klass = OneviewSDK.const_get(c)
341
- next unless klass.is_a?(Class) && klass < OneviewSDK::Resource
342
- name = klass.name.split('::').last
343
- orig_classes.push(name)
344
- classes[name.downcase.delete('_').delete('-')] = klass
345
- classes["#{name.downcase.delete('_').delete('-')}s"] = klass
354
+ def self.resource_named(type, api_ver = @api_version, variant = nil)
355
+ unless SUPPORTED_API_VERSIONS.include?(api_ver)
356
+ raise UnsupportedVersion, "API version #{api_ver} is not supported! Try one of: #{SUPPORTED_API_VERSIONS}"
346
357
  end
347
- new_type = type.to_s.downcase.gsub(/[ -_]/, '')
348
- return classes[new_type] if classes.keys.include?(new_type)
358
+ api_module = OneviewSDK.const_get("API#{api_ver}")
359
+ variant ? api_module.resource_named(type, variant) : api_module.resource_named(type)
349
360
  end
350
361
  end
351
-
352
- # Load all resources:
353
- Dir[File.dirname(__FILE__) + '/resource/*.rb'].each { |file| require file }
@@ -0,0 +1,34 @@
1
+ # (c) Copyright 2016 Hewlett Packard Enterprise Development LP
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software distributed
8
+ # under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
9
+ # CONDITIONS OF ANY KIND, either express or implied. See the License for the specific
10
+ # language governing permissions and limitations under the License.
11
+
12
+ module OneviewSDK
13
+ # Module for API v200
14
+ module API200
15
+ # Get resource class that matches the type given
16
+ # @param [String] type Name of the desired class type
17
+ # @param [String] variant There is only 1 variant for this module, so this is not used.
18
+ # It exists only so that the parameters match API modules that do have multiple variants.
19
+ # @return [Class] Resource class or nil if not found
20
+ def self.resource_named(type, _variant = nil)
21
+ new_type = type.to_s.downcase.gsub(/[ -_]/, '')
22
+ constants.each do |c|
23
+ klass = const_get(c)
24
+ next unless klass.is_a?(Class) && klass < OneviewSDK::Resource
25
+ name = klass.name.split('::').last.downcase.delete('_').delete('-')
26
+ return klass if new_type =~ /^#{name}[s]?$/
27
+ end
28
+ nil
29
+ end
30
+ end
31
+ end
32
+
33
+ # Load all API-specific resources:
34
+ Dir[File.dirname(__FILE__) + '/api200/*.rb'].each { |file| require file }
@@ -0,0 +1,52 @@
1
+ # (C) Copyright 2016 Hewlett Packard Enterprise Development LP
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # You may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software distributed
8
+ # under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
9
+ # CONDITIONS OF ANY KIND, either express or implied. See the License for the specific
10
+ # language governing permissions and limitations under the License.
11
+
12
+ require_relative 'resource'
13
+
14
+ module OneviewSDK
15
+ module API200
16
+ # Connection template resource implementation
17
+ class ConnectionTemplate < Resource
18
+ BASE_URI = '/rest/connection-templates'.freeze
19
+
20
+ # Create a resource object, associate it with a client, and set its properties.
21
+ # @param [OneviewSDK::Client] client The client object for the OneView appliance
22
+ # @param [Hash] params The options for this resource (key-value pairs)
23
+ # @param [Integer] api_ver The api version to use when interracting with this resource.
24
+ def initialize(client, params = {}, api_ver = nil)
25
+ super
26
+ # Default values:
27
+ @data['bandwidth'] ||= {}
28
+ @data['type'] ||= 'connection-template'
29
+ end
30
+
31
+ # Method is not available
32
+ # @raise [OneviewSDK::MethodUnavailable] method is not available
33
+ def create
34
+ unavailable_method
35
+ end
36
+
37
+ # Method is not available
38
+ # @raise [OneviewSDK::MethodUnavailable] method is not available
39
+ def delete
40
+ unavailable_method
41
+ end
42
+
43
+ # Get the default network connection template
44
+ # @param [OneviewSDK::Client] client The client object for the OneView appliance
45
+ # @return [OneviewSDK::ConnectionTemplate] Connection template
46
+ def self.get_default(client)
47
+ response = client.rest_get(BASE_URI + '/defaultConnectionTemplate')
48
+ OneviewSDK::ConnectionTemplate.new(client, client.response_handler(response))
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,81 @@
1
+ # (C) Copyright 2016 Hewlett Packard Enterprise Development LP
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # You may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software distributed
8
+ # under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
9
+ # CONDITIONS OF ANY KIND, either express or implied. See the License for the
10
+ # specific language governing permissions and limitations under the License.
11
+
12
+ require_relative 'resource'
13
+
14
+ module OneviewSDK
15
+ module API200
16
+ # Datacenter resource implementation
17
+ class Datacenter < Resource
18
+ BASE_URI = '/rest/datacenters'.freeze
19
+
20
+ # Add the resource on OneView using the current data
21
+ # @note Calls the refresh method to set additional data
22
+ # @raise [OneviewSDK::IncompleteResource] if the client is not set
23
+ # @raise [StandardError] if the resource creation fails
24
+ # @return [OneviewSDK::Datacenter] self
25
+ alias add create
26
+
27
+ # Remove resource from OneView
28
+ # @return [true] if resource was removed successfully
29
+ alias remove delete
30
+
31
+ # Create a resource object, associate it with a client, and set its properties.
32
+ # @param [OneviewSDK::Client] client The client object for the OneView appliance
33
+ # @param [Hash] params The options for this resource (key-value pairs)
34
+ # @param [Integer] api_ver The api version to use when interracting with this resource.
35
+ def initialize(client, params = {}, api_ver = nil)
36
+ super
37
+ # Default values:
38
+ @data['contents'] ||= []
39
+ end
40
+
41
+ # Method is not available
42
+ # @raise [OneviewSDK::MethodUnavailable] method is not available
43
+ def create
44
+ unavailable_method
45
+ end
46
+
47
+ # Method is not available
48
+ # @raise [OneviewSDK::MethodUnavailable] method is not available
49
+ def delete
50
+ unavailable_method
51
+ end
52
+
53
+ # Adds an existing rack to the datacenter
54
+ # @param [OneviewSDK::Rack] rack rack
55
+ # @param [Decimal] pos_x x position
56
+ # @param [Decimal] pos_y y position
57
+ # @param [Decimal] rotation Rotation degrees (0-359) around the center of the resource
58
+ def add_rack(rack, pos_x, pos_y, rotation = 0)
59
+ @data['contents'] << {
60
+ 'resourceUri' => rack['uri'],
61
+ 'x' => pos_x,
62
+ 'y' => pos_y,
63
+ 'rotation' => rotation
64
+ }
65
+ end
66
+
67
+ # Removes a rack from the datacenter
68
+ # @param [OneviewSDK::Rack] rack rack
69
+ def remove_rack(rack)
70
+ @data['contents'].reject! { |resource| resource['resourceUri'] == rack['uri'] }
71
+ end
72
+
73
+ # Gets a list of the visual content objects
74
+ # @return [Hash]
75
+ def get_visual_content
76
+ response = @client.rest_get(@data['uri'] + '/visualContent')
77
+ @client.response_handler(response)
78
+ end
79
+ end
80
+ end
81
+ end