oneview-sdk 1.0.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +4 -0
- data/CHANGELOG.md +81 -2
- data/README.md +118 -113
- data/Rakefile +11 -0
- data/lib/oneview-sdk/cli.rb +21 -15
- data/lib/oneview-sdk/client.rb +34 -21
- data/lib/oneview-sdk/config_loader.rb +12 -1
- data/lib/oneview-sdk/exceptions.rb +55 -0
- data/lib/oneview-sdk/resource/connection_template.rb +48 -0
- data/lib/oneview-sdk/resource/datacenter.rb +77 -0
- data/lib/oneview-sdk/resource/enclosure.rb +46 -24
- data/lib/oneview-sdk/resource/enclosure_group.rb +20 -36
- data/lib/oneview-sdk/resource/ethernet_network.rb +19 -23
- data/lib/oneview-sdk/resource/fabric.rb +41 -0
- data/lib/oneview-sdk/resource/fc_network.rb +15 -16
- data/lib/oneview-sdk/resource/fcoe_network.rb +15 -12
- data/lib/oneview-sdk/resource/firmware_bundle.rb +23 -24
- data/lib/oneview-sdk/resource/firmware_driver.rb +21 -9
- data/lib/oneview-sdk/resource/interconnect.rb +29 -9
- data/lib/oneview-sdk/resource/lig_uplink_set.rb +22 -28
- data/lib/oneview-sdk/resource/logical_downlink.rb +53 -0
- data/lib/oneview-sdk/resource/logical_enclosure.rb +35 -33
- data/lib/oneview-sdk/resource/logical_interconnect.rb +29 -65
- data/lib/oneview-sdk/resource/logical_interconnect_group.rb +26 -6
- data/lib/oneview-sdk/resource/logical_switch.rb +184 -0
- data/lib/oneview-sdk/resource/logical_switch_group.rb +66 -0
- data/lib/oneview-sdk/resource/managed_san.rb +79 -0
- data/lib/oneview-sdk/resource/network_set.rb +64 -0
- data/lib/oneview-sdk/resource/power_device.rb +174 -0
- data/lib/oneview-sdk/resource/rack.rb +83 -0
- data/lib/oneview-sdk/resource/san_manager.rb +88 -0
- data/lib/oneview-sdk/resource/server_hardware.rb +139 -18
- data/lib/oneview-sdk/resource/server_hardware_type.rb +32 -1
- data/lib/oneview-sdk/resource/server_profile.rb +352 -9
- data/lib/oneview-sdk/resource/server_profile_template.rb +193 -4
- data/lib/oneview-sdk/resource/storage_pool.rb +42 -20
- data/lib/oneview-sdk/resource/storage_system.rb +64 -14
- data/lib/oneview-sdk/resource/switch.rb +86 -0
- data/lib/oneview-sdk/resource/unmanaged_device.rb +55 -0
- data/lib/oneview-sdk/resource/uplink_set.rb +24 -64
- data/lib/oneview-sdk/resource/volume.rb +29 -29
- data/lib/oneview-sdk/resource/volume_attachment.rb +79 -0
- data/lib/oneview-sdk/resource/volume_snapshot.rb +20 -1
- data/lib/oneview-sdk/resource/volume_template.rb +22 -33
- data/lib/oneview-sdk/resource.rb +66 -28
- data/lib/oneview-sdk/rest.rb +69 -24
- data/lib/oneview-sdk/ssl_helper.rb +20 -9
- data/lib/oneview-sdk/version.rb +12 -1
- data/lib/oneview-sdk.rb +12 -0
- data/oneview-sdk.gemspec +11 -0
- metadata +17 -2
@@ -0,0 +1,79 @@
|
|
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
|
+
# Storage volume attachment resource implementation
|
14
|
+
class VolumeAttachment < Resource
|
15
|
+
BASE_URI = '/rest/storage-volume-attachments'.freeze
|
16
|
+
|
17
|
+
# Create a resource object, associate it with a client, and set its properties.
|
18
|
+
# @param [OneviewSDK::Client] client The client object for the OneView appliance
|
19
|
+
# @param [Hash] params The options for this resource (key-value pairs)
|
20
|
+
# @param [Integer] api_ver The api version to use when interracting with this resource.
|
21
|
+
def initialize(client, params = {}, api_ver = nil)
|
22
|
+
super
|
23
|
+
# Default values:
|
24
|
+
@data['type'] ||= 'StorageVolumeAttachment'
|
25
|
+
end
|
26
|
+
|
27
|
+
# Method is not available
|
28
|
+
# @raise [OneviewSDK::MethodUnavailable] method is not available
|
29
|
+
def create
|
30
|
+
unavailable_method
|
31
|
+
end
|
32
|
+
|
33
|
+
# Method is not available
|
34
|
+
# @raise [OneviewSDK::MethodUnavailable] method is not available
|
35
|
+
def update
|
36
|
+
unavailable_method
|
37
|
+
end
|
38
|
+
|
39
|
+
# Method is not available
|
40
|
+
# @raise [OneviewSDK::MethodUnavailable] method is not available
|
41
|
+
def delete
|
42
|
+
unavailable_method
|
43
|
+
end
|
44
|
+
|
45
|
+
# Gets the list of extra unmanaged storage volumes
|
46
|
+
# @param [OneviewSDK::Client] client The client object for the OneView appliance
|
47
|
+
def self.get_extra_unmanaged_volumes(client)
|
48
|
+
response = client.rest_get(BASE_URI + '/repair?alertFixType=ExtraUnmanagedStorageVolumes')
|
49
|
+
client.response_handler(response)
|
50
|
+
end
|
51
|
+
|
52
|
+
# Removes extra presentations from a specific server profile
|
53
|
+
# @param [OneviewSDK::Client] client The client object for the OneView appliance
|
54
|
+
# @param [OneviewSDK::Resource] resource Oneview resource
|
55
|
+
def self.remove_extra_unmanaged_volume(client, resource)
|
56
|
+
requestBody = {
|
57
|
+
type: 'ExtraUnmanagedStorageVolumes',
|
58
|
+
resourceUri: resource['uri']
|
59
|
+
}
|
60
|
+
response = client.rest_post(BASE_URI + '/repair', 'body' => requestBody)
|
61
|
+
client.response_handler(response)
|
62
|
+
end
|
63
|
+
|
64
|
+
# Gets all volume attachment paths
|
65
|
+
# @return [Array] List of the storage volume attachments paths
|
66
|
+
def get_paths
|
67
|
+
response = @client.rest_get(@data['uri'] + '/paths')
|
68
|
+
@client.response_handler(response)
|
69
|
+
end
|
70
|
+
|
71
|
+
# Gets a volume attachment path by id
|
72
|
+
# @param [String] id Volume attachament path id
|
73
|
+
# @return [OneviewSDK::VolumeAttachmentPath]
|
74
|
+
def get_path(id)
|
75
|
+
response = @client.rest_get("#{@data['uri']}/paths/#{id}")
|
76
|
+
@client.response_handler(response)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -1,18 +1,37 @@
|
|
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
|
+
|
1
12
|
module OneviewSDK
|
2
13
|
# Volume snapshot resource implementation
|
3
14
|
class VolumeSnapshot < Resource
|
4
15
|
BASE_URI = nil
|
5
16
|
|
17
|
+
# Create a resource object, associate it with a client, and set its properties.
|
18
|
+
# @param [OneviewSDK::Client] client The client object for the OneView appliance
|
19
|
+
# @param [Hash] params The options for this resource (key-value pairs)
|
20
|
+
# @param [Integer] api_ver The api version to use when interracting with this resource.
|
6
21
|
def initialize(client, params = {}, api_ver = nil)
|
7
22
|
super
|
8
23
|
# Default values
|
9
24
|
@data['type'] ||= 'Snapshot'
|
10
25
|
end
|
11
26
|
|
27
|
+
# Method is not available
|
28
|
+
# @raise [OneviewSDK::MethodUnavailable] method is not available
|
12
29
|
def create
|
13
30
|
unavailable_method
|
14
31
|
end
|
15
32
|
|
33
|
+
# Method is not available
|
34
|
+
# @raise [OneviewSDK::MethodUnavailable] method is not available
|
16
35
|
def update
|
17
36
|
unavailable_method
|
18
37
|
end
|
@@ -20,7 +39,7 @@ module OneviewSDK
|
|
20
39
|
# Sets the volume
|
21
40
|
# @param [OneviewSDK::Volume] volume Volume
|
22
41
|
def set_volume(volume)
|
23
|
-
|
42
|
+
volume.retrieve! unless volume['uri']
|
24
43
|
@data['storageVolumeUri'] = volume['uri']
|
25
44
|
end
|
26
45
|
end
|
@@ -1,10 +1,21 @@
|
|
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
|
+
|
1
12
|
module OneviewSDK
|
2
13
|
# Volume template resource implementation
|
3
14
|
class VolumeTemplate < Resource
|
4
15
|
BASE_URI = '/rest/storage-volume-templates'.freeze
|
5
16
|
|
6
|
-
# Create client object,
|
7
|
-
# @param [Client] client The
|
17
|
+
# Create the client object, establishes connection, and set up the logging and api version.
|
18
|
+
# @param [OneviewSDK::Client] client The client object for the OneView appliance
|
8
19
|
# @param [Hash] params The options for this resource (key-value pairs)
|
9
20
|
# @param [Integer] api_ver The api version to use when interracting with this resource.
|
10
21
|
# Defaults to client.api_version if exists, or OneviewSDK::Client::DEFAULT_API_VERSION.
|
@@ -17,29 +28,10 @@ module OneviewSDK
|
|
17
28
|
@data['type'] ||= 'StorageVolumeTemplateV3'
|
18
29
|
end
|
19
30
|
|
20
|
-
# @!group Validates
|
21
|
-
|
22
|
-
VALID_REFRESH_STATES = %w(NotRefreshing RefreshFailed RefreshPending Refreshing).freeze
|
23
|
-
# Validate refreshState
|
24
|
-
# @param [String] value NotRefreshing, RefreshFailed, RefreshPending, Refreshing
|
25
|
-
def validate_refreshState(value)
|
26
|
-
fail 'Invalid refresh state' unless VALID_REFRESH_STATES.include?(value)
|
27
|
-
end
|
28
|
-
|
29
|
-
VALID_STATUSES = %w(OK Disabled Warning Critical Unknown).freeze
|
30
|
-
# Validate status
|
31
|
-
# @param [String] value OK, Disabled, Warning, Critical, Unknown
|
32
|
-
def validate_status(value)
|
33
|
-
fail 'Invalid status' unless VALID_STATUSES.include?(value)
|
34
|
-
end
|
35
|
-
|
36
|
-
# @!endgroup
|
37
|
-
|
38
31
|
# Create the resource on OneView using the current data
|
39
|
-
# Adds Accept-Language attribute in the Header equal to "en_US"
|
40
32
|
# @note Calls refresh method to set additional data
|
41
|
-
# @raise [
|
42
|
-
# @raise [
|
33
|
+
# @raise [OneviewSDK::IncompleteResource] if the client is not set
|
34
|
+
# @raise [StandardError] if the resource creation fails
|
43
35
|
# @return [Resource] self
|
44
36
|
def create
|
45
37
|
ensure_client
|
@@ -48,9 +40,8 @@ module OneviewSDK
|
|
48
40
|
set_all(body)
|
49
41
|
end
|
50
42
|
|
51
|
-
#
|
52
|
-
#
|
53
|
-
# @return [TrueClass] if volume template was deleted successfully
|
43
|
+
# Deletes the volume template from OneView
|
44
|
+
# @return [TrueClass] if the volume template was deleted successfully
|
54
45
|
def delete
|
55
46
|
ensure_client && ensure_uri
|
56
47
|
response = @client.rest_delete(@data['uri'], { 'Accept-Language' => 'en_US' }, @api_version)
|
@@ -58,8 +49,7 @@ module OneviewSDK
|
|
58
49
|
true
|
59
50
|
end
|
60
51
|
|
61
|
-
#
|
62
|
-
# Adds Accept-Language attribute in the Header equal to "en_US"
|
52
|
+
# Updates the volume template from OneView
|
63
53
|
# @return [Resource] self
|
64
54
|
def update(attributes = {})
|
65
55
|
set_all(attributes)
|
@@ -69,7 +59,7 @@ module OneviewSDK
|
|
69
59
|
self
|
70
60
|
end
|
71
61
|
|
72
|
-
#
|
62
|
+
# Sets the storage pool
|
73
63
|
# @param [Boolean] shareable
|
74
64
|
# @param [String] provisionType 'Thin' or 'Full'
|
75
65
|
# @param [String] capacity (in bytes)
|
@@ -82,25 +72,24 @@ module OneviewSDK
|
|
82
72
|
@data['provisioning']['storagePoolUri'] = storage_pool['uri']
|
83
73
|
end
|
84
74
|
|
85
|
-
#
|
75
|
+
# Sets the storage system
|
86
76
|
# @param [OneviewSDK::StorageSystem] storage_system Storage System to be used to create the template
|
87
77
|
def set_storage_system(storage_system)
|
88
78
|
storage_system.retrieve! unless storage_system['uri']
|
89
79
|
@data['storageSystemUri'] = storage_system['uri']
|
90
80
|
end
|
91
81
|
|
92
|
-
#
|
82
|
+
# Sets the snapshot pool
|
93
83
|
# @param [OneviewSDK::StoragePool] storage_pool Storage Pool to generate the template
|
94
84
|
def set_snapshot_pool(storage_pool)
|
95
85
|
storage_pool.retrieve! unless storage_pool['uri']
|
96
86
|
@data['snapshotPoolUri'] = storage_pool['uri']
|
97
87
|
end
|
98
88
|
|
99
|
-
#
|
89
|
+
# Gets the connectable volume templates by its attributes
|
100
90
|
# @param [Hash] attributes Hash containing the attributes name and value
|
101
91
|
def get_connectable_volume_templates(attributes = {})
|
102
92
|
OneviewSDK::Resource.find_by(@client, attributes, BASE_URI + '/connectable-volume-templates')
|
103
93
|
end
|
104
|
-
|
105
94
|
end
|
106
95
|
end
|
data/lib/oneview-sdk/resource.rb
CHANGED
@@ -1,3 +1,14 @@
|
|
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
|
+
|
1
12
|
require_relative 'client'
|
2
13
|
|
3
14
|
# OneviewSDK Resources
|
@@ -13,27 +24,28 @@ module OneviewSDK
|
|
13
24
|
:logger
|
14
25
|
|
15
26
|
# Create a resource object, associate it with a client, and set its properties.
|
16
|
-
# @param [Client] client The
|
27
|
+
# @param [OneviewSDK::Client] client The client object for the OneView appliance
|
17
28
|
# @param [Hash] params The options for this resource (key-value pairs)
|
18
29
|
# @param [Integer] api_ver The api version to use when interracting with this resource.
|
19
|
-
# Defaults to client.api_version if exists, or OneviewSDK::Client::DEFAULT_API_VERSION.
|
30
|
+
# Defaults to the client.api_version if it exists, or the OneviewSDK::Client::DEFAULT_API_VERSION.
|
20
31
|
def initialize(client, params = {}, api_ver = nil)
|
21
|
-
fail 'Must specify a valid client' unless client.is_a?(OneviewSDK::Client)
|
32
|
+
fail InvalidClient, 'Must specify a valid client' unless client.is_a?(OneviewSDK::Client)
|
22
33
|
@client = client
|
23
34
|
@logger = @client.logger
|
24
35
|
@api_version = api_ver || @client.api_version
|
25
36
|
if @api_version > @client.max_api_version
|
26
|
-
fail
|
37
|
+
fail UnsupportedVersion,
|
38
|
+
"#{self.class.name} api_version '#{@api_version}' is greater than the client's max_api_version '#{@client.max_api_version}'"
|
27
39
|
end
|
28
40
|
@data ||= {}
|
29
41
|
set_all(params)
|
30
42
|
end
|
31
43
|
|
32
44
|
# Retrieve resource details based on this resource's name or URI.
|
33
|
-
# @note Name or URI must be specified inside resource
|
45
|
+
# @note Name or URI must be specified inside the resource
|
34
46
|
# @return [Boolean] Whether or not retrieve was successful
|
35
47
|
def retrieve!
|
36
|
-
fail 'Must set resource name or uri before trying to retrieve!' unless @data['name'] || @data['uri']
|
48
|
+
fail IncompleteResource, 'Must set resource name or uri before trying to retrieve!' unless @data['name'] || @data['uri']
|
37
49
|
results = self.class.find_by(@client, name: @data['name']) if @data['name']
|
38
50
|
results = self.class.find_by(@client, uri: @data['uri']) if @data['uri'] && (!results || results.empty?)
|
39
51
|
return false unless results.size == 1
|
@@ -45,14 +57,14 @@ module OneviewSDK
|
|
45
57
|
# @note name or uri must be specified inside resource
|
46
58
|
# @return [Boolean] Whether or not resource exists
|
47
59
|
def exists?
|
48
|
-
fail 'Must set resource name or uri before trying to retrieve!' unless @data['name'] || @data['uri']
|
60
|
+
fail IncompleteResource, 'Must set resource name or uri before trying to retrieve!' unless @data['name'] || @data['uri']
|
49
61
|
return true if @data['name'] && self.class.find_by(@client, name: @data['name']).size == 1
|
50
62
|
return true if @data['uri'] && self.class.find_by(@client, uri: @data['uri']).size == 1
|
51
63
|
false
|
52
64
|
end
|
53
65
|
|
54
66
|
# Set the given hash of key-value pairs as resource data attributes
|
55
|
-
# @param [Hash, Resource] params The options for this resource (key-value pairs or
|
67
|
+
# @param [Hash, Resource] params The options for this resource (key-value pairs or resource object)
|
56
68
|
# @note All top-level keys will be converted to strings
|
57
69
|
# @return [Resource] self
|
58
70
|
def set_all(params = {})
|
@@ -105,15 +117,15 @@ module OneviewSDK
|
|
105
117
|
end
|
106
118
|
|
107
119
|
# Check equality of 2 resources. Same as ==(other)
|
108
|
-
# @param [Resource] other The other resource to check equality
|
120
|
+
# @param [Resource] other The other resource to check for equality
|
109
121
|
# @return [Boolean] Whether or not the two objects are equal
|
110
122
|
def eql?(other)
|
111
123
|
self == other
|
112
124
|
end
|
113
125
|
|
114
|
-
# Check equality of data
|
115
|
-
# @note
|
116
|
-
# @param [Hash, Resource] other
|
126
|
+
# Check the equality of the data for the other resource with this resource.
|
127
|
+
# @note Does not check the client, logger, or api_version if another resource is passed in
|
128
|
+
# @param [Hash, Resource] other resource or hash to compare the key-value pairs with
|
117
129
|
# @example Compare to hash
|
118
130
|
# myResource = OneviewSDK::Resource.new(client, { name: 'res1', description: 'example'}, 200)
|
119
131
|
# myResource.like?(description: '') # returns false
|
@@ -125,8 +137,8 @@ module OneviewSDK
|
|
125
137
|
|
126
138
|
# Create the resource on OneView using the current data
|
127
139
|
# @note Calls the refresh method to set additional data
|
128
|
-
# @raise [
|
129
|
-
# @raise [
|
140
|
+
# @raise [OneviewSDK::IncompleteResource] if the client is not set
|
141
|
+
# @raise [StandardError] if the resource creation fails
|
130
142
|
# @return [Resource] self
|
131
143
|
def create
|
132
144
|
ensure_client
|
@@ -138,8 +150,8 @@ module OneviewSDK
|
|
138
150
|
|
139
151
|
# Delete the resource from OneView if it exists, then create it using the current data
|
140
152
|
# @note Calls refresh method to set additional data
|
141
|
-
# @raise [
|
142
|
-
# @raise [
|
153
|
+
# @raise [OneviewSDK::IncompleteResource] if the client is not set
|
154
|
+
# @raise [StandardError] if the resource creation fails
|
143
155
|
# @return [Resource] self
|
144
156
|
def create!
|
145
157
|
temp = self.class.new(@client, @data)
|
@@ -160,8 +172,8 @@ module OneviewSDK
|
|
160
172
|
|
161
173
|
# Set data and save to OneView
|
162
174
|
# @param [Hash] attributes The attributes to add/change for this resource (key-value pairs)
|
163
|
-
# @raise [
|
164
|
-
# @raise [
|
175
|
+
# @raise [OneviewSDK::IncompleteResource] if the client or uri is not set
|
176
|
+
# @raise [StandardError] if the resource save fails
|
165
177
|
# @return [Resource] self
|
166
178
|
def update(attributes = {})
|
167
179
|
set_all(attributes)
|
@@ -194,7 +206,7 @@ module OneviewSDK
|
|
194
206
|
when :yml, :yaml
|
195
207
|
File.open(file_path, 'w') { |f| f.write(temp_data.to_yaml) }
|
196
208
|
else
|
197
|
-
fail "Invalid format: #{format}"
|
209
|
+
fail InvalidFormat, "Invalid format: #{format}"
|
198
210
|
end
|
199
211
|
true
|
200
212
|
end
|
@@ -207,7 +219,7 @@ module OneviewSDK
|
|
207
219
|
end
|
208
220
|
|
209
221
|
# Get resource schema
|
210
|
-
# @param [Client] client
|
222
|
+
# @param [OneviewSDK::Client] client The client object for the OneView appliance
|
211
223
|
# @return [Hash] Schema
|
212
224
|
def self.schema(client)
|
213
225
|
response = client.rest_get("#{self::BASE_URI}/schema", client.api_version)
|
@@ -218,7 +230,7 @@ module OneviewSDK
|
|
218
230
|
end
|
219
231
|
|
220
232
|
# Load resource from a .json or .yaml file
|
221
|
-
# @param [Client] client The client object
|
233
|
+
# @param [OneviewSDK::Client] client The client object for the OneView appliance
|
222
234
|
# @param [String] file_path The full path to the file
|
223
235
|
# @return [Resource] New resource created from the file contents
|
224
236
|
def self.from_file(client, file_path)
|
@@ -226,8 +238,8 @@ module OneviewSDK
|
|
226
238
|
new(client, resource['data'], resource['api_version'])
|
227
239
|
end
|
228
240
|
|
229
|
-
# Make a GET request to the resource uri and
|
230
|
-
# @param [Client] client
|
241
|
+
# Make a GET request to the resource uri, and returns an array with results matching the search
|
242
|
+
# @param [OneviewSDK::Client] client The client object for the OneView appliance
|
231
243
|
# @param [Hash] attributes Hash containing the attributes name and value
|
232
244
|
# @param [String] uri URI of the endpoint
|
233
245
|
# @return [Array<Resource>] Results matching the search
|
@@ -242,35 +254,61 @@ module OneviewSDK
|
|
242
254
|
temp = new(client, member)
|
243
255
|
results.push(temp) if temp.like?(attributes)
|
244
256
|
end
|
245
|
-
break unless body['nextPageUri']
|
257
|
+
break unless body['nextPageUri'] && (body['nextPageUri'] != body['uri'])
|
246
258
|
uri = body['nextPageUri']
|
247
259
|
end
|
248
260
|
results
|
249
261
|
end
|
250
262
|
|
251
|
-
# Make a GET request to the resource base uri and
|
263
|
+
# Make a GET request to the resource base uri, and returns an array with all objects of this type
|
252
264
|
# @return [Array<Resource>] Results
|
253
265
|
def self.get_all(client)
|
254
266
|
find_by(client, {})
|
255
267
|
end
|
256
268
|
|
269
|
+
# Builds a Query string corresponding to the parameters passed
|
270
|
+
# @param [Hash{String=>String,OneviewSDK::Resource}] query_options Query parameters and values
|
271
|
+
# to be applied to the query url.
|
272
|
+
# All key values should be Strings in snake case, the values could be Strings or Resources.
|
273
|
+
# @option query_options [String] String Values that are Strings can be associated as usual
|
274
|
+
# @option query_options [String] Resources Values that are Resources can be associated as usual,
|
275
|
+
# with keys representing only the resource names (like 'ethernet_network'). This method
|
276
|
+
# translates the SDK and Ruby standards to OneView request standard.
|
277
|
+
def self.build_query(query_options)
|
278
|
+
return '' if !query_options || query_options.empty?
|
279
|
+
query_path = '?'
|
280
|
+
query_options.each do |k, v|
|
281
|
+
words = k.to_s.split('_')
|
282
|
+
words.map!(&:capitalize!)
|
283
|
+
words[0] = words.first.downcase
|
284
|
+
new_key = words.join
|
285
|
+
v.retrieve! if v.respond_to?(:retrieve!) && !v['uri']
|
286
|
+
if v.class <= OneviewSDK::Resource
|
287
|
+
new_key = new_key.concat('Uri')
|
288
|
+
v = v['uri']
|
289
|
+
end
|
290
|
+
query_path.concat("&#{new_key}=#{v}")
|
291
|
+
end
|
292
|
+
query_path.sub('?&', '?')
|
293
|
+
end
|
294
|
+
|
257
295
|
protected
|
258
296
|
|
259
297
|
# Fail unless @client is set for this resource.
|
260
298
|
def ensure_client
|
261
|
-
fail 'Please set client attribute before interacting with this resource' unless @client
|
299
|
+
fail IncompleteResource, 'Please set client attribute before interacting with this resource' unless @client
|
262
300
|
true
|
263
301
|
end
|
264
302
|
|
265
303
|
# Fail unless @data['uri'] is set for this resource.
|
266
304
|
def ensure_uri
|
267
|
-
fail 'Please set uri attribute before interacting with this resource' unless @data['uri']
|
305
|
+
fail IncompleteResource, 'Please set uri attribute before interacting with this resource' unless @data['uri']
|
268
306
|
true
|
269
307
|
end
|
270
308
|
|
271
309
|
# Fail for methods that are not available for one resource
|
272
310
|
def unavailable_method
|
273
|
-
fail "The method ##{caller[0][/`.*'/][1..-2]} is unavailable for this resource"
|
311
|
+
fail MethodUnavailable, "The method ##{caller[0][/`.*'/][1..-2]} is unavailable for this resource"
|
274
312
|
end
|
275
313
|
|
276
314
|
private
|
data/lib/oneview-sdk/rest.rb
CHANGED
@@ -1,12 +1,23 @@
|
|
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
|
+
|
1
12
|
require 'uri'
|
2
13
|
require 'net/http'
|
3
14
|
require 'openssl'
|
4
15
|
require 'json'
|
5
16
|
|
6
17
|
module OneviewSDK
|
7
|
-
# Contains all the methods for making API REST calls
|
18
|
+
# Contains all of the methods for making API REST calls
|
8
19
|
module Rest
|
9
|
-
#
|
20
|
+
# Makes a restful API request to OneView
|
10
21
|
# @param [Symbol] type The rest method/type Options: [:get, :post, :delete, :patch, :put]
|
11
22
|
# @param [String] path The path for the request. Usually starts with "/rest/"
|
12
23
|
# @param [Hash] options The options for the request
|
@@ -14,11 +25,12 @@ module OneviewSDK
|
|
14
25
|
# @option options [String] :Content-Type ('application/json') Set to nil or :none to have this option removed
|
15
26
|
# @option options [Integer] :X-API-Version (client.api_version) API version to use for this request
|
16
27
|
# @option options [Integer] :auth (client.token) Authentication token to use for this request
|
17
|
-
# @
|
28
|
+
# @param [Integer] api_ver The api version to use when interracting with this resource
|
29
|
+
# @raise [OpenSSL::SSL::SSLError] if SSL validation of OneView instance's certificate failed
|
18
30
|
# @return [NetHTTPResponse] Response object
|
19
31
|
def rest_api(type, path, options = {}, api_ver = @api_version)
|
20
32
|
@logger.debug "Making :#{type} rest call to #{@url}#{path}"
|
21
|
-
fail 'Must specify path' unless path
|
33
|
+
fail InvalidRequest, 'Must specify path' unless path
|
22
34
|
|
23
35
|
uri = URI.parse(URI.escape(@url + path))
|
24
36
|
http = Net::HTTP.new(uri.host, uri.port)
|
@@ -27,6 +39,8 @@ module OneviewSDK
|
|
27
39
|
http.cert_store = @cert_store if @cert_store
|
28
40
|
else http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
29
41
|
end
|
42
|
+
http.read_timeout = @timeout if @timeout # Timeout for a request
|
43
|
+
http.open_timeout = @timeout if @timeout # Timeout for a connection
|
30
44
|
|
31
45
|
request = build_request(type, uri, options, api_ver)
|
32
46
|
response = http.request(request)
|
@@ -42,32 +56,62 @@ module OneviewSDK
|
|
42
56
|
raise e
|
43
57
|
end
|
44
58
|
|
45
|
-
#
|
46
|
-
#
|
59
|
+
# Makes a restful GET request to OneView
|
60
|
+
# @param [String] path The path for the request. Usually starts with "/rest/"
|
61
|
+
# @param [Integer] api_ver The api version to use when interracting with this resource
|
62
|
+
# @return [NetHTTPResponse] Response object
|
47
63
|
def rest_get(path, api_ver = @api_version)
|
48
64
|
rest_api(:get, path, {}, api_ver)
|
49
65
|
end
|
50
66
|
|
51
|
-
#
|
52
|
-
#
|
67
|
+
# Makes a restful POST request to OneView
|
68
|
+
# @param [String] path The path for the request. Usually starts with "/rest/"
|
69
|
+
# @param [Hash] options The options for the request
|
70
|
+
# @option options [String] :body Hash to be converted into json and set as the request body
|
71
|
+
# @option options [String] :Content-Type ('application/json') Set to nil or :none to have this option removed
|
72
|
+
# @option options [Integer] :X-API-Version (client.api_version) API version to use for this request
|
73
|
+
# @option options [Integer] :auth (client.token) Authentication token to use for this request
|
74
|
+
# @param [Integer] api_ver The api version to use when interracting with this resource
|
75
|
+
# @return [NetHTTPResponse] Response object
|
53
76
|
def rest_post(path, options = {}, api_ver = @api_version)
|
54
77
|
rest_api(:post, path, options, api_ver)
|
55
78
|
end
|
56
79
|
|
57
|
-
#
|
58
|
-
#
|
80
|
+
# Makes a restful PUT request to OneView
|
81
|
+
# @param [String] path The path for the request. Usually starts with "/rest/"
|
82
|
+
# @param [Hash] options The options for the request
|
83
|
+
# @option options [String] :body Hash to be converted into json and set as the request body
|
84
|
+
# @option options [String] :Content-Type ('application/json') Set to nil or :none to have this option removed
|
85
|
+
# @option options [Integer] :X-API-Version (client.api_version) API version to use for this request
|
86
|
+
# @option options [Integer] :auth (client.token) Authentication token to use for this request
|
87
|
+
# @param [Integer] api_ver The api version to use when interracting with this resource
|
88
|
+
# @return [NetHTTPResponse] Response object
|
59
89
|
def rest_put(path, options = {}, api_ver = @api_version)
|
60
90
|
rest_api(:put, path, options, api_ver)
|
61
91
|
end
|
62
92
|
|
63
|
-
#
|
64
|
-
#
|
93
|
+
# Makes a restful PATCH request to OneView
|
94
|
+
# @param [String] path The path for the request. Usually starts with "/rest/"
|
95
|
+
# @param [Hash] options The options for the request
|
96
|
+
# @option options [String] :body Hash to be converted into json and set as the request body
|
97
|
+
# @option options [String] :Content-Type ('application/json') Set to nil or :none to have this option removed
|
98
|
+
# @option options [Integer] :X-API-Version (client.api_version) API version to use for this request
|
99
|
+
# @option options [Integer] :auth (client.token) Authentication token to use for this request
|
100
|
+
# @param [Integer] api_ver The api version to use when interracting with this resource
|
101
|
+
# @return [NetHTTPResponse] Response object
|
65
102
|
def rest_patch(path, options = {}, api_ver = @api_version)
|
66
103
|
rest_api(:patch, path, options, api_ver)
|
67
104
|
end
|
68
105
|
|
69
|
-
#
|
70
|
-
#
|
106
|
+
# Makes a restful DELETE request to OneView
|
107
|
+
# @param [String] path The path for the request. Usually starts with "/rest/"
|
108
|
+
# @param [Hash] options The options for the request
|
109
|
+
# @option options [String] :body Hash to be converted into json and set as the request body
|
110
|
+
# @option options [String] :Content-Type ('application/json') Set to nil or :none to have this option removed
|
111
|
+
# @option options [Integer] :X-API-Version (client.api_version) API version to use for this request
|
112
|
+
# @option options [Integer] :auth (client.token) Authentication token to use for this request
|
113
|
+
# @param [Integer] api_ver The api version to use when interracting with this resource
|
114
|
+
# @return [NetHTTPResponse] Response object
|
71
115
|
def rest_delete(path, options = {}, api_ver = @api_version)
|
72
116
|
rest_api(:delete, path, options, api_ver)
|
73
117
|
end
|
@@ -80,12 +124,12 @@ module OneviewSDK
|
|
80
124
|
RESPONSE_CODE_UNAUTHORIZED = 401
|
81
125
|
RESPONSE_CODE_NOT_FOUND = 404
|
82
126
|
|
83
|
-
#
|
127
|
+
# Handles the response from a rest call.
|
84
128
|
# If an asynchronous task was started, this waits for it to complete.
|
85
129
|
# @param [HTTPResponse] response HTTP response
|
86
130
|
# @param [Boolean] wait_on_task Wait on task (or just return task details)
|
87
|
-
# @raise [
|
88
|
-
# @raise [
|
131
|
+
# @raise [StandardError] if the request failed
|
132
|
+
# @raise [StandardError] if a task was returned that did not complete successfully
|
89
133
|
# @return [Hash] The parsed JSON body
|
90
134
|
def response_handler(response, wait_on_task = true)
|
91
135
|
case response.code.to_i
|
@@ -101,27 +145,28 @@ module OneviewSDK
|
|
101
145
|
when RESPONSE_CODE_ACCEPTED # Asynchronous add, update or delete
|
102
146
|
return JSON.parse(response.body) unless wait_on_task
|
103
147
|
@logger.debug "Waiting for task: response.header['location']"
|
104
|
-
|
148
|
+
uri = response.header['location'] || JSON.parse(response.body)['uri'] # If task uri is not returned in header
|
149
|
+
task = wait_for(uri)
|
105
150
|
return true unless task['associatedResource'] && task['associatedResource']['resourceUri']
|
106
151
|
resource_data = rest_get(task['associatedResource']['resourceUri'])
|
107
152
|
return JSON.parse(resource_data.body)
|
108
153
|
when RESPONSE_CODE_NO_CONTENT # Synchronous delete
|
109
154
|
return {}
|
110
155
|
when RESPONSE_CODE_BAD_REQUEST
|
111
|
-
fail "400 BAD REQUEST #{response.body}"
|
156
|
+
fail BadRequest, "400 BAD REQUEST #{response.body}"
|
112
157
|
when RESPONSE_CODE_UNAUTHORIZED
|
113
|
-
fail "401 UNAUTHORIZED #{response.body}"
|
158
|
+
fail Unauthorized, "401 UNAUTHORIZED #{response.body}"
|
114
159
|
when RESPONSE_CODE_NOT_FOUND
|
115
|
-
fail "404 NOT FOUND #{response.body}"
|
160
|
+
fail NotFound, "404 NOT FOUND #{response.body}"
|
116
161
|
else
|
117
|
-
fail "#{response.code} #{response.body}"
|
162
|
+
fail RequestError, "#{response.code} #{response.body}"
|
118
163
|
end
|
119
164
|
end
|
120
165
|
|
121
166
|
|
122
167
|
private
|
123
168
|
|
124
|
-
#
|
169
|
+
# Builds a request object using the data given
|
125
170
|
def build_request(type, uri, options, api_ver)
|
126
171
|
case type.downcase.to_sym
|
127
172
|
when :get
|
@@ -135,7 +180,7 @@ module OneviewSDK
|
|
135
180
|
when :delete
|
136
181
|
request = Net::HTTP::Delete.new(uri.request_uri)
|
137
182
|
else
|
138
|
-
fail "Invalid rest call: #{type}"
|
183
|
+
fail InvalidRequest, "Invalid rest call: #{type}"
|
139
184
|
end
|
140
185
|
|
141
186
|
options['X-API-Version'] ||= api_ver
|