oneview-sdk 4.1.0 → 4.2.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 (104) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +17 -2
  3. data/Gemfile +11 -0
  4. data/Guardfile +26 -0
  5. data/README.md +9 -3
  6. data/lib/oneview-sdk.rb +1 -1
  7. data/lib/oneview-sdk/image-streamer/resource/{api_300.rb → api300.rb} +0 -0
  8. data/lib/oneview-sdk/image-streamer/resource/api300/artifact_bundle.rb +10 -12
  9. data/lib/oneview-sdk/image-streamer/resource/api300/golden_image.rb +6 -61
  10. data/lib/oneview-sdk/resource.rb +23 -6
  11. data/lib/oneview-sdk/resource/api200/firmware_bundle.rb +4 -37
  12. data/lib/oneview-sdk/resource/api200/lig_uplink_set.rb +1 -1
  13. data/lib/oneview-sdk/resource/api200/logical_interconnect_group.rb +47 -29
  14. data/lib/oneview-sdk/resource/api200/volume.rb +2 -22
  15. data/lib/oneview-sdk/resource/api300/c7000/server_hardware.rb +1 -13
  16. data/lib/oneview-sdk/resource/api300/synergy/os_deployment_plan.rb +41 -0
  17. data/lib/oneview-sdk/resource/api300/synergy/server_profile.rb +13 -0
  18. data/lib/oneview-sdk/resource/api500.rb +66 -0
  19. data/lib/oneview-sdk/resource/api500/c7000.rb +27 -0
  20. data/lib/oneview-sdk/resource/api500/c7000/connection_template.rb +22 -0
  21. data/lib/oneview-sdk/resource/api500/c7000/datacenter.rb +22 -0
  22. data/lib/oneview-sdk/resource/api500/c7000/enclosure.rb +22 -0
  23. data/lib/oneview-sdk/resource/api500/c7000/enclosure_group.rb +22 -0
  24. data/lib/oneview-sdk/resource/api500/c7000/ethernet_network.rb +22 -0
  25. data/lib/oneview-sdk/resource/api500/c7000/fabric.rb +22 -0
  26. data/lib/oneview-sdk/resource/api500/c7000/fc_network.rb +22 -0
  27. data/lib/oneview-sdk/resource/api500/c7000/fcoe_network.rb +22 -0
  28. data/lib/oneview-sdk/resource/api500/c7000/firmware_bundle.rb +21 -0
  29. data/lib/oneview-sdk/resource/api500/c7000/firmware_driver.rb +22 -0
  30. data/lib/oneview-sdk/resource/api500/c7000/interconnect.rb +22 -0
  31. data/lib/oneview-sdk/resource/api500/c7000/lig_uplink_set.rb +21 -0
  32. data/lib/oneview-sdk/resource/api500/c7000/logical_downlink.rb +22 -0
  33. data/lib/oneview-sdk/resource/api500/c7000/logical_enclosure.rb +22 -0
  34. data/lib/oneview-sdk/resource/api500/c7000/logical_interconnect.rb +22 -0
  35. data/lib/oneview-sdk/resource/api500/c7000/logical_interconnect_group.rb +22 -0
  36. data/lib/oneview-sdk/resource/api500/c7000/logical_switch.rb +22 -0
  37. data/lib/oneview-sdk/resource/api500/c7000/logical_switch_group.rb +22 -0
  38. data/lib/oneview-sdk/resource/api500/c7000/managed_san.rb +22 -0
  39. data/lib/oneview-sdk/resource/api500/c7000/network_set.rb +22 -0
  40. data/lib/oneview-sdk/resource/api500/c7000/power_device.rb +21 -0
  41. data/lib/oneview-sdk/resource/api500/c7000/rack.rb +22 -0
  42. data/lib/oneview-sdk/resource/api500/c7000/resource.rb +21 -0
  43. data/lib/oneview-sdk/resource/api500/c7000/san_manager.rb +22 -0
  44. data/lib/oneview-sdk/resource/api500/c7000/scope.rb +22 -0
  45. data/lib/oneview-sdk/resource/api500/c7000/server_hardware.rb +22 -0
  46. data/lib/oneview-sdk/resource/api500/c7000/server_hardware_type.rb +21 -0
  47. data/lib/oneview-sdk/resource/api500/c7000/server_profile.rb +22 -0
  48. data/lib/oneview-sdk/resource/api500/c7000/server_profile_template.rb +22 -0
  49. data/lib/oneview-sdk/resource/api500/c7000/storage_pool.rb +22 -0
  50. data/lib/oneview-sdk/resource/api500/c7000/storage_system.rb +22 -0
  51. data/lib/oneview-sdk/resource/api500/c7000/switch.rb +22 -0
  52. data/lib/oneview-sdk/resource/api500/c7000/unmanaged_device.rb +22 -0
  53. data/lib/oneview-sdk/resource/api500/c7000/uplink_set.rb +22 -0
  54. data/lib/oneview-sdk/resource/api500/c7000/user.rb +22 -0
  55. data/lib/oneview-sdk/resource/api500/c7000/volume.rb +22 -0
  56. data/lib/oneview-sdk/resource/api500/c7000/volume_attachment.rb +22 -0
  57. data/lib/oneview-sdk/resource/api500/c7000/volume_snapshot.rb +22 -0
  58. data/lib/oneview-sdk/resource/api500/c7000/volume_template.rb +22 -0
  59. data/lib/oneview-sdk/resource/api500/synergy.rb +27 -0
  60. data/lib/oneview-sdk/resource/api500/synergy/connection_template.rb +22 -0
  61. data/lib/oneview-sdk/resource/api500/synergy/datacenter.rb +22 -0
  62. data/lib/oneview-sdk/resource/api500/synergy/drive_enclosure.rb +22 -0
  63. data/lib/oneview-sdk/resource/api500/synergy/enclosure.rb +22 -0
  64. data/lib/oneview-sdk/resource/api500/synergy/enclosure_group.rb +22 -0
  65. data/lib/oneview-sdk/resource/api500/synergy/ethernet_network.rb +22 -0
  66. data/lib/oneview-sdk/resource/api500/synergy/fabric.rb +22 -0
  67. data/lib/oneview-sdk/resource/api500/synergy/fc_network.rb +22 -0
  68. data/lib/oneview-sdk/resource/api500/synergy/fcoe_network.rb +22 -0
  69. data/lib/oneview-sdk/resource/api500/synergy/firmware_bundle.rb +21 -0
  70. data/lib/oneview-sdk/resource/api500/synergy/firmware_driver.rb +22 -0
  71. data/lib/oneview-sdk/resource/api500/synergy/interconnect.rb +22 -0
  72. data/lib/oneview-sdk/resource/api500/synergy/lig_uplink_set.rb +21 -0
  73. data/lib/oneview-sdk/resource/api500/synergy/logical_downlink.rb +22 -0
  74. data/lib/oneview-sdk/resource/api500/synergy/logical_enclosure.rb +22 -0
  75. data/lib/oneview-sdk/resource/api500/synergy/logical_interconnect.rb +22 -0
  76. data/lib/oneview-sdk/resource/api500/synergy/logical_interconnect_group.rb +22 -0
  77. data/lib/oneview-sdk/resource/api500/synergy/logical_switch.rb +22 -0
  78. data/lib/oneview-sdk/resource/api500/synergy/managed_san.rb +22 -0
  79. data/lib/oneview-sdk/resource/api500/synergy/network_set.rb +22 -0
  80. data/lib/oneview-sdk/resource/api500/synergy/power_device.rb +21 -0
  81. data/lib/oneview-sdk/resource/api500/synergy/rack.rb +22 -0
  82. data/lib/oneview-sdk/resource/api500/synergy/resource.rb +21 -0
  83. data/lib/oneview-sdk/resource/api500/synergy/san_manager.rb +22 -0
  84. data/lib/oneview-sdk/resource/api500/synergy/sas_interconnect.rb +22 -0
  85. data/lib/oneview-sdk/resource/api500/synergy/sas_logical_interconnect.rb +22 -0
  86. data/lib/oneview-sdk/resource/api500/synergy/sas_logical_interconnect_group.rb +22 -0
  87. data/lib/oneview-sdk/resource/api500/synergy/scope.rb +22 -0
  88. data/lib/oneview-sdk/resource/api500/synergy/server_hardware.rb +22 -0
  89. data/lib/oneview-sdk/resource/api500/synergy/server_hardware_type.rb +22 -0
  90. data/lib/oneview-sdk/resource/api500/synergy/server_profile.rb +22 -0
  91. data/lib/oneview-sdk/resource/api500/synergy/server_profile_template.rb +22 -0
  92. data/lib/oneview-sdk/resource/api500/synergy/storage_pool.rb +22 -0
  93. data/lib/oneview-sdk/resource/api500/synergy/storage_system.rb +22 -0
  94. data/lib/oneview-sdk/resource/api500/synergy/switch.rb +22 -0
  95. data/lib/oneview-sdk/resource/api500/synergy/unmanaged_device.rb +22 -0
  96. data/lib/oneview-sdk/resource/api500/synergy/uplink_set.rb +22 -0
  97. data/lib/oneview-sdk/resource/api500/synergy/user.rb +22 -0
  98. data/lib/oneview-sdk/resource/api500/synergy/volume.rb +22 -0
  99. data/lib/oneview-sdk/resource/api500/synergy/volume_attachment.rb +22 -0
  100. data/lib/oneview-sdk/resource/api500/synergy/volume_snapshot.rb +22 -0
  101. data/lib/oneview-sdk/resource/api500/synergy/volume_template.rb +22 -0
  102. data/lib/oneview-sdk/rest.rb +21 -8
  103. data/lib/oneview-sdk/version.rb +1 -1
  104. metadata +90 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 33d01d70d21a357c6e0c4f9295f039d874aea7b1
4
- data.tar.gz: f5bd6ddea83a0124bf87c034b2107b7949a1004b
3
+ metadata.gz: 91b49f3734a5341886b50994724e02c367a85572
4
+ data.tar.gz: 504c62c8c43728d41c60230661d24f44ff79f5ba
5
5
  SHA512:
6
- metadata.gz: 81644b00704bc889c5f62fbeb98fc2ef00fd7c0ba2a66631016aa867a298207bfc109eb904a8f404768779447f34b9f40a1cc17c3fb1efea46f2be3bd64811ae
7
- data.tar.gz: d469232c518d22bc5ec52d828b929093a5bdac8a7d8ac12bbf647d4c1ca7f6be6f60ac817638e805d2d47dad578649e3ca7d4a310e9251a2bbdb34ab2c3304eb
6
+ metadata.gz: 9193b1927608fbacde28cfeb0d1699a050e12f1741c8d57610e20a704f837918f5f80e9cd1122cf2c55f6f0492be8b17fceaf3cee768da892b44278c6c1016d7
7
+ data.tar.gz: 19ed880cd4bc058178872b0df2f0bad6623b8c4978495a449fcdda37f0985bde7184241d00b8696b10890964992f39152b2cab4b577d1def2eb45a4267b645d5
data/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
- # Unreleased Changes
2
- (none)
1
+ # v4.2.0
2
+
3
+ #### New Resources:
4
+ - OS Deployment Plan
5
+
6
+ #### Bug fixes & Enhancements:
7
+ - [#89](https://github.com/HewlettPackard/oneview-sdk-ruby/issues/89) Fix like? method for Logical Interconnect Groups
8
+ - [#119](https://github.com/HewlettPackard/oneview-sdk-ruby/issues/112) VolumeAttachment::remove_extra_unmanaged_volume throw Unexpected Http Error
9
+ - [#125](https://github.com/HewlettPackard/oneview-sdk-ruby/issues/125) References to resources C7000 in Synergy integration tests
10
+ - [#189](https://github.com/HewlettPackard/oneview-sdk-ruby/issues/189) Use helper methods of Rest module for upload and download file
11
+ - [#201](https://github.com/HewlettPackard/oneview-sdk-ruby/issues/201) Code to search the collection of resources (paginated search) is repeated in some resources
12
+ - [#202](https://github.com/HewlettPackard/oneview-sdk-ruby/issues/202) The method #get_default_settings in LogicalInterconnectGroup is used on integration test
13
+ - [#212](https://github.com/HewlettPackard/oneview-sdk-ruby/issues/212) Unable to create a Server Profile with Deployment Plan settings
14
+ - [#219](https://github.com/HewlettPackard/oneview-sdk-ruby/issues/219) Fix like? method for Server Profile
15
+
16
+ #### Design changes:
17
+ - Architecture for future API500 support. Features for API500 are not yet supported.
3
18
 
4
19
  # v4.1.0
5
20
 
data/Gemfile CHANGED
@@ -1,2 +1,13 @@
1
1
  source 'https://rubygems.org'
2
2
  gemspec
3
+
4
+ begin
5
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.2.6')
6
+ group :development do
7
+ gem 'guard-rspec'
8
+ gem 'guard-rubocop'
9
+ end
10
+ end
11
+ rescue StandardError
12
+ "no big deal; just don't use guard"
13
+ end
data/Guardfile ADDED
@@ -0,0 +1,26 @@
1
+ # (c) Copyright 2017 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
+ guard :rubocop, cmd: 'bundle exec rubocop', cli: ['-D'] do
13
+ watch('.rubocop.yml')
14
+ watch(/(.+\.rb)$/)
15
+ watch(/^(Gemfile|Rakefile)$/)
16
+ end
17
+
18
+ guard :rspec, cmd: 'bundle exec rspec --color -t ~integration', first_match: true do
19
+ watch(%r{^spec\/(\w+)\.rb$}) { 'spec/unit' }
20
+ watch(%r{^(spec\/unit\/.+_spec\.rb)$})
21
+ watch('lib/oneview-sdk/cli.rb') { 'spec/unit/cli' }
22
+ watch(%r{^lib\/oneview-sdk\/(.+)\.rb$}) { |m| "spec/unit/#{m[1]}_spec.rb" }
23
+ watch(%r{^(spec\/support\/\w+\.rb)$}) { 'spec/unit' }
24
+ watch(%r{^spec\/support\/fixtures\/unit\/(\w+)\/.+$}) { |m| "spec/unit/#{m[1]}" }
25
+ watch(%r{^lib\/(.+)\.rb$}) { 'spec/unit' } # Everything else
26
+ end
data/README.md CHANGED
@@ -12,7 +12,7 @@ The OneView SDK provides a Ruby library to easily interact with HPE OneView and
12
12
  - Require the gem in your Gemfile:
13
13
 
14
14
  ```ruby
15
- gem 'oneview-sdk', '~> 4.1'
15
+ gem 'oneview-sdk', '~> 4.2'
16
16
  ```
17
17
 
18
18
  Then run `$ bundle install`
@@ -162,7 +162,7 @@ You may notice resource classes being accessed in a few different ways; for exam
162
162
  require 'oneview-sdk'
163
163
 
164
164
  # Show defaults:
165
- OneviewSDK::SUPPORTED_API_VERSIONS # [200, 300]
165
+ OneviewSDK::SUPPORTED_API_VERSIONS # [200, 300, 500]
166
166
  OneviewSDK::DEFAULT_API_VERSION # 200
167
167
  OneviewSDK.api_version # 200
168
168
  OneviewSDK.api_version_updated? # false
@@ -178,12 +178,17 @@ OneviewSDK.api_version = 300
178
178
  OneviewSDK.api_version # 300
179
179
  OneviewSDK.api_version_updated? # true
180
180
 
181
- # The API200 module has no variants, but API300 has 2 (C7000 & Synergy):
181
+ # The API200 module has no variants, but API300 and API500 has 2 (C7000 & Synergy):
182
182
  OneviewSDK::API300::SUPPORTED_VARIANTS # ['C7000', 'Synergy']
183
183
  OneviewSDK::API300::DEFAULT_VARIANT # 'C7000'
184
184
  OneviewSDK::API300.variant # 'C7000'
185
185
  OneviewSDK::API300.variant_updated? # false
186
186
 
187
+ OneviewSDK::API500::SUPPORTED_VARIANTS # ['C7000', 'Synergy']
188
+ OneviewSDK::API500::DEFAULT_VARIANT # 'C7000'
189
+ OneviewSDK::API500.variant # 'C7000'
190
+ OneviewSDK::API500.variant_updated? # false
191
+
187
192
  # Therefore, there is 1 more namespace level to the real resource class name
188
193
  OneviewSDK::EthernetNetwork # OneviewSDK::API300::C7000::EthernetNetwork
189
194
  OneviewSDK::API300::EthernetNetwork # OneviewSDK::API300::C7000::EthernetNetwork
@@ -425,6 +430,7 @@ First run `$ bundle` (requires the bundler gem), then...
425
430
  ### Testing
426
431
  - RuboCop: `$ rake rubocop`
427
432
  - Unit: `$ rake spec`
433
+ - Optional: Start guard to run unit tests & rubocop automatically on file changes: `$ bundle exec guard`
428
434
  - Integration: See the [spec/integration](spec/integration/) README
429
435
  - All: Run `$ rake test:all` to run RuboCop, unit, & integration tests.
430
436
  - Examples: See the [examples](examples/) README
data/lib/oneview-sdk.rb CHANGED
@@ -24,7 +24,7 @@ module OneviewSDK
24
24
  env_i3s = %w(I3S_URL I3S_SSL_ENABLED)
25
25
  ENV_VARS = env_sdk.concat(env_i3s).freeze
26
26
 
27
- SUPPORTED_API_VERSIONS = [200, 300].freeze
27
+ SUPPORTED_API_VERSIONS = [200, 300, 500].freeze
28
28
  DEFAULT_API_VERSION = 200
29
29
  @api_version = DEFAULT_API_VERSION
30
30
  @api_version_updated = false # Whether or not the API version has been set by the user
@@ -50,8 +50,7 @@ module OneviewSDK
50
50
  file_name = File.basename(file_path)
51
51
  end
52
52
 
53
- params = { 'name' => file_name }
54
- body = client.upload_file(file_path, BASE_URI, params, timeout)
53
+ body = client.upload_file(file_path, BASE_URI, { 'file_name' => file_name }, timeout)
55
54
  ArtifactBundle.new(client, body)
56
55
  end
57
56
 
@@ -76,22 +75,21 @@ module OneviewSDK
76
75
  # If there are any artifacts existing, they will be removed before the extract operation.
77
76
  # @param [OneviewSDK::ImageStreamer::Client] client The client object for the Image Streamer appliance
78
77
  # @param [String] file_path The file path with file extension
79
- # @param [String] artifact_name The name for the artifact that will be created
78
+ # @param [String] artifact_name The name for the artifact that will be created. Default is the file name.
80
79
  # @param [Integer] timeout The number of seconds to wait for completing the request. Default is 300.
81
80
  # @return [Hash] The result hash with DeploymentGroup data
82
- def self.create_backup_from_file!(client, deployment_group, file_path, artifact_name, timeout = OneviewSDK::Rest::READ_TIMEOUT)
81
+ def self.create_backup_from_file!(client, deployment_group, file_path, artifact_name = nil, timeout = OneviewSDK::Rest::READ_TIMEOUT)
83
82
  ensure_resource!(deployment_group)
84
83
  ensure_file_path_extension!(file_path)
85
84
 
86
- file_name = artifact_name.dup
87
- if file_name && !file_name.empty?
88
- file_name += File.extname(file_path)
89
- else
90
- file_name = File.basename(file_path)
91
- end
85
+ file_name = if artifact_name && !artifact_name.empty?
86
+ artifact_name + File.extname(file_path)
87
+ else
88
+ File.basename(file_path)
89
+ end
92
90
 
93
- params = { 'name' => file_name, 'deploymentGrpUri' => deployment_group['uri'] }
94
- client.upload_file(file_path, BACKUPS_ARCHIVE_URI, params, timeout)
91
+ params = { 'deploymentGrpUri' => deployment_group['uri'] }
92
+ client.upload_file(file_path, BACKUPS_ARCHIVE_URI, { 'file_name' => file_name, 'body' => params }, timeout)
95
93
  end
96
94
 
97
95
  # Download the backup bundle
@@ -10,7 +10,6 @@
10
10
  # language governing permissions and limitations under the License.
11
11
 
12
12
  require_relative 'resource'
13
- require 'net/http/post/multipart'
14
13
 
15
14
  module OneviewSDK
16
15
  module ImageStreamer
@@ -18,7 +17,6 @@ module OneviewSDK
18
17
  # Golden Image resource implementation for Image Streamer
19
18
  class GoldenImage < Resource
20
19
  BASE_URI = '/rest/golden-images'.freeze
21
- READ_TIMEOUT = 300 # in seconds (5 minutes)
22
20
  ACCEPTED_FORMATS = %w(.zip .ZIP).freeze # Supported upload extensions
23
21
 
24
22
  # Create a resource object, associate it with a client, and set its properties.
@@ -44,36 +42,10 @@ module OneviewSDK
44
42
  # Downloads the content of the selected golden image to the specified file path.
45
43
  # @param [String] file_path
46
44
  # @param [Integer] timeout The number of seconds to wait for the request to complete
47
- # @return [True] When was saved successfully
48
- def download(file_path, timeout = READ_TIMEOUT)
45
+ # @return [True] When it was saved successfully
46
+ def download(file_path)
49
47
  ensure_client && ensure_uri
50
- uri = URI.parse(URI.escape("#{client.url}#{BASE_URI}/download/#{@data['uri'].split('/').last}"))
51
- req = Net::HTTP::Get.new(uri.request_uri)
52
-
53
- options = {}
54
- options['Content-Type'] = 'application/json'
55
- options['X-Api-Version'] = @client.api_version.to_s
56
- options['auth'] = @client.token
57
- options.each do |key, val|
58
- req[key] = val
59
- end
60
-
61
- http_request = Net::HTTP.new(uri.host, uri.port)
62
- http_request.use_ssl = true
63
- http_request.verify_mode = OpenSSL::SSL::VERIFY_NONE
64
- http_request.read_timeout = timeout
65
-
66
- http_request.start do |http|
67
- http.request(req) do |res|
68
- client.response_handler(res) unless res.code.to_i.between?(200, 204)
69
- File.open(file_path, 'wb') do |file|
70
- res.read_body do |segment|
71
- file.write(segment)
72
- end
73
- end
74
- end
75
- end
76
- true
48
+ client.download_file("#{BASE_URI}/download/#{@data['uri'].split('/').last}", file_path)
77
49
  end
78
50
 
79
51
  # Upload a golden image from the specified local file path.
@@ -85,40 +57,13 @@ module OneviewSDK
85
57
  # @option data_options [String] :description The description of the Golden Image (required)
86
58
  # @param [Integer] timeout The number of seconds to wait for the request to complete
87
59
  # @return [OneviewSDK::ImageStreamer::API300::GoldenImage] if the upload was successful, return a GoldenImage object
88
- def self.add(client, file_path, data_options, timeout = READ_TIMEOUT)
60
+ def self.add(client, file_path, data_options, timeout = OneviewSDK::Rest::READ_TIMEOUT)
89
61
  data_options = Hash[data_options.map { |k, v| [k.to_s, v] }] # Convert symbols hash keys to string
90
- raise NotFound, "ERROR: File '#{file_path}' not found!" unless File.file?(file_path)
91
62
  raise InvalidFormat, 'ERROR: File with extension not supported!' unless ACCEPTED_FORMATS.include? File.extname(file_path)
92
63
  raise IncompleteResource, 'Please set the name of the golden image!' unless data_options['name']
93
64
  raise IncompleteResource, 'Please set the description of the golden image!' unless data_options['description']
94
- options = {}
95
- options['Content-Type'] = 'multipart/form-data'
96
- options['X-Api-Version'] = client.api_version.to_s
97
- options['auth'] = client.token
98
- options['file'] = File.basename(file_path)
99
- url = URI.parse(URI.escape("#{client.url}#{BASE_URI}"))
100
-
101
- File.open(file_path) do |file|
102
- req = Net::HTTP::Post::Multipart.new(
103
- url.path,
104
- { 'file' => UploadIO.new(file, 'application/octet-stream', File.basename(file_path)) }.merge(data_options),
105
- options
106
- )
107
-
108
- http_request = Net::HTTP.new(url.host, url.port)
109
- http_request.use_ssl = true if url.scheme == 'https'
110
- if client.ssl_enabled
111
- http_request.cert_store = client.cert_store if client.cert_store
112
- else http_request.verify_mode = OpenSSL::SSL::VERIFY_NONE
113
- end
114
- http_request.read_timeout = timeout
115
-
116
- http_request.start do |http|
117
- response = http.request(req)
118
- data = client.response_handler(response)
119
- return OneviewSDK::ImageStreamer::API300::GoldenImage.new(client, data)
120
- end
121
- end
65
+ data = client.upload_file(file_path, BASE_URI, { 'body' => data_options }, timeout)
66
+ GoldenImage.new(client, data)
122
67
  end
123
68
 
124
69
  # Sets the OS volume
@@ -262,20 +262,31 @@ module OneviewSDK
262
262
  # @param [String] uri URI of the endpoint
263
263
  # @return [Array<Resource>] Results matching the search
264
264
  def self.find_by(client, attributes, uri = self::BASE_URI)
265
+ all = find_with_pagination(client, uri)
265
266
  results = []
267
+ all.each do |member|
268
+ temp = new(client, member)
269
+ results.push(temp) if temp.like?(attributes)
270
+ end
271
+ results
272
+ end
273
+
274
+ # Make a GET request to the uri, and returns an array with all results (search using resource pagination)
275
+ # @param [OneviewSDK::Client] client The client object for the OneView appliance
276
+ # @param [String] uri URI of the endpoint
277
+ # @return [Array<Hash>] Results
278
+ def self.find_with_pagination(client, uri)
279
+ all = []
266
280
  loop do
267
281
  response = client.rest_get(uri)
268
282
  body = client.response_handler(response)
269
283
  members = body['members']
270
284
  break unless members
271
- members.each do |member|
272
- temp = new(client, member)
273
- results.push(temp) if temp.like?(attributes)
274
- end
285
+ all.concat(members)
275
286
  break unless body['nextPageUri'] && (body['nextPageUri'] != body['uri'])
276
287
  uri = body['nextPageUri']
277
288
  end
278
- results
289
+ all
279
290
  end
280
291
 
281
292
  # Make a GET request to the resource base uri, and returns an array with all objects of this type
@@ -350,7 +361,13 @@ module OneviewSDK
350
361
  return false unless data && data.respond_to?(:[])
351
362
  if val.is_a?(Hash)
352
363
  return false unless data.class == Hash && recursive_like?(val, data[key.to_s])
353
- elsif val != data[key.to_s] && val != data[key.to_sym]
364
+ elsif val.is_a?(Array) && val.first.is_a?(Hash)
365
+ data_array = data[key.to_s] || data[key.to_sym]
366
+ return false unless data_array.is_a?(Array)
367
+ val.each do |other_item|
368
+ return false unless data_array.find { |data_item| recursive_like?(other_item, data_item) }
369
+ end
370
+ elsif val.to_s != data[key.to_s].to_s && val.to_s != data[key.to_sym].to_s
354
371
  return false
355
372
  end
356
373
  end
@@ -9,54 +9,21 @@
9
9
  # CONDITIONS OF ANY KIND, either express or implied. See the License for the specific
10
10
  # language governing permissions and limitations under the License.
11
11
 
12
- require 'net/http/post/multipart'
13
-
14
12
  module OneviewSDK
15
13
  module API200
16
14
  # Firmware bundle resource implementation
17
15
  class FirmwareBundle
18
16
  BASE_URI = '/rest/firmware-bundles'.freeze
19
- READ_TIMEOUT = 300 # in seconds, 5 minutes
20
17
 
21
18
  # Uploads a firmware bundle file
22
19
  # @param [OneviewSDK::Client] client The client object for the OneView appliance
23
20
  # @param [String] file_path
24
21
  # @param [Integer] timeout The number of seconds to wait for completing the request
25
22
  # @return [OneviewSDK::FirmwareDriver] if the upload was successful, return a FirmwareDriver object
26
- def self.add(client, file_path, timeout = READ_TIMEOUT)
27
- raise NotFound, "ERROR: File '#{file_path}' not found!" unless File.file?(file_path)
28
- options = {}
29
- options['Content-Type'] = 'multipart/form-data'
30
- options['X-Api-Version'] = client.api_version.to_s
31
- options['auth'] = client.token
32
- options['uploadfilename'] = File.basename(file_path)
33
- url = URI.parse(URI.escape("#{client.url}#{BASE_URI}"))
34
-
35
- File.open(file_path) do |file|
36
- req = Net::HTTP::Post::Multipart.new(
37
- url.path,
38
- { 'file' => UploadIO.new(file, 'application/octet-stream', File.basename(file_path)) },
39
- options
40
- )
41
-
42
- http_request = Net::HTTP.new(url.host, url.port)
43
- http_request.use_ssl = true
44
- http_request.verify_mode = OpenSSL::SSL::VERIFY_NONE
45
- http_request.read_timeout = timeout
46
-
47
- http_request.start do |http|
48
- begin
49
- response = http.request(req)
50
- data = client.response_handler(response)
51
- return OneviewSDK::FirmwareDriver.new(client, data)
52
- rescue Net::ReadTimeout
53
- raise "The connection was closed because the timeout of #{timeout} seconds has expired."\
54
- 'You can specify the timeout in seconds by passing the timeout on the method call.'\
55
- 'Interrupted firmware uploads may result in corrupted firmware remaining in the appliance.'\
56
- 'HPE recommends checking the appliance for corrupted firmware and removing it.'
57
- end
58
- end
59
- end
23
+ def self.add(client, file_path, timeout = OneviewSDK::Rest::READ_TIMEOUT)
24
+ options = { 'header' => { 'uploadfilename' => File.basename(file_path) } }
25
+ result = client.upload_file(file_path, BASE_URI, options, timeout)
26
+ OneviewSDK::FirmwareDriver.new(client, result)
60
27
  end
61
28
  end
62
29
  end
@@ -25,7 +25,7 @@ module OneviewSDK
25
25
  super
26
26
  # Default values:
27
27
  @data['logicalPortConfigInfos'] ||= []
28
- @data['lacpTimer'] ||= 'Short'
28
+ @data['lacpTimer'] ||= 'Short' unless @data['networkType'] == 'FibreChannel' # FibreChannel does not need set up lacpTimer
29
29
  @data['mode'] ||= 'Auto'
30
30
  @data['networkUris'] ||= []
31
31
  end
@@ -32,12 +32,6 @@ module OneviewSDK
32
32
  @data['type'] ||= 'logical-interconnect-groupV3'
33
33
  @data['interconnectMapTemplate'] ||= {}
34
34
  @data['interconnectMapTemplate']['interconnectMapEntryTemplates'] ||= []
35
-
36
- # User friendly values:
37
- @bay_count = 8
38
-
39
- # Create all entries if empty
40
- parse_interconnect_map_template if @data['interconnectMapTemplate']['interconnectMapEntryTemplates'] == []
41
35
  end
42
36
 
43
37
  # Get the logical interconnect group default settings
@@ -51,18 +45,28 @@ module OneviewSDK
51
45
  # Adds an interconnect
52
46
  # @param [Fixnum] bay Bay number
53
47
  # @param [String] type Interconnect type
54
- # @raise [StandardError] if a invalid type is given then raises an error
48
+ # @raise [OneviewSDK::NotFound] if an invalid type is given
55
49
  def add_interconnect(bay, type)
50
+ interconnect_type = OneviewSDK::Interconnect.get_type(@client, type)
51
+ unless interconnect_type
52
+ list = OneviewSDK::Interconnect.get_types(@client).map { |t| t['name'] }
53
+ raise OneviewSDK::NotFound, "Interconnect type #{type} not found! Supported types: #{list}"
54
+ end
55
+
56
+ entry_already_present = false
56
57
  @data['interconnectMapTemplate']['interconnectMapEntryTemplates'].each do |entry|
57
58
  entry['logicalLocation']['locationEntries'].each do |location|
58
59
  if location['type'] == 'Bay' && location['relativeValue'] == bay
59
- entry['permittedInterconnectTypeUri'] = OneviewSDK::Interconnect.get_type(@client, type)['uri']
60
+ entry['permittedInterconnectTypeUri'] = interconnect_type['uri']
61
+ entry_already_present = true
60
62
  end
61
63
  end
62
64
  end
63
- rescue StandardError
64
- list = OneviewSDK::Interconnect.get_types(@client).map { |t| t['name'] }
65
- raise "Interconnect type #{type} not found! Supported types: #{list}"
65
+
66
+ unless entry_already_present
67
+ new_entry = new_interconnect_entry_template(bay, interconnect_type['uri'])
68
+ @data['interconnectMapTemplate']['interconnectMapEntryTemplates'] << new_entry
69
+ end
66
70
  end
67
71
 
68
72
  # Adds an uplink set
@@ -79,11 +83,25 @@ module OneviewSDK
79
83
  @client.response_handler(response)
80
84
  end
81
85
 
82
- # Saves the current data attributes to the Logical Interconnect Group
83
- # @param [Hash] attributes attributes to be updated
84
- # @return Updated instance of the Logical Interconnect Group
86
+ # Create the resource on OneView using the current data
87
+ # @note Calls the refresh method to set additional data
88
+ # @raise [OneviewSDK::IncompleteResource] if the client is not set
89
+ # @raise [StandardError] if the resource creation fails
90
+ # @return [Resource] self
91
+ def create
92
+ verify_interconnects_before_save!
93
+ super
94
+ end
95
+
96
+ # Set data and save to OneView
97
+ # @param [Hash] attributes The attributes to add/change for this resource (key-value pairs)
98
+ # @raise [OneviewSDK::IncompleteResource] if the client or uri is not set
99
+ # @raise [StandardError] if the resource save fails
100
+ # @return [Resource] self
85
101
  def update(attributes = {})
86
102
  set_all(attributes)
103
+ ensure_client && ensure_uri
104
+ verify_interconnects_before_save!
87
105
  update_options = {
88
106
  'If-Match' => @data.delete('eTag'),
89
107
  'Body' => @data
@@ -95,21 +113,21 @@ module OneviewSDK
95
113
 
96
114
  private
97
115
 
98
- # Parse interconnect map template structure
99
- def parse_interconnect_map_template
100
- 1.upto(@bay_count) do |bay_number|
101
- entry = {
102
- 'logicalDownlinkUri' => nil,
103
- 'logicalLocation' => {
104
- 'locationEntries' => [
105
- { 'relativeValue' => bay_number, 'type' => 'Bay' },
106
- { 'relativeValue' => 1, 'type' => 'Enclosure' }
107
- ]
108
- },
109
- 'permittedInterconnectTypeUri' => nil
110
- }
111
- @data['interconnectMapTemplate']['interconnectMapEntryTemplates'] << entry
112
- end
116
+ def verify_interconnects_before_save!
117
+ return unless @data['interconnectMapTemplate']['interconnectMapEntryTemplates'].empty?
118
+ @data['interconnectMapTemplate']['interconnectMapEntryTemplates'] << new_interconnect_entry_template
119
+ end
120
+
121
+ def new_interconnect_entry_template(bay = 1, interconnect_type_uri = nil)
122
+ {
123
+ 'logicalLocation' => {
124
+ 'locationEntries' => [
125
+ { 'relativeValue' => bay, 'type' => 'Bay' },
126
+ { 'relativeValue' => 1, 'type' => 'Enclosure' }
127
+ ]
128
+ },
129
+ 'permittedInterconnectTypeUri' => interconnect_type_uri
130
+ }
113
131
  end
114
132
  end
115
133
  end