oneview-sdk 2.2.1 → 3.0.0

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