Class: OneviewSDK::Resource
- Inherits:
-
Object
- Object
- OneviewSDK::Resource
- Defined in:
- lib/oneview-sdk/resource.rb
Overview
Resource base class that defines all common resource functionality.
Direct Known Subclasses
ConnectionTemplate, Datacenter, Enclosure, EnclosureGroup, EthernetNetwork, FCNetwork, FCoENetwork, Fabric, FirmwareDriver, Interconnect, LIGUplinkSet, LogicalDownlink, LogicalEnclosure, LogicalInterconnect, LogicalInterconnectGroup, LogicalSwitch, LogicalSwitchGroup, ManagedSAN, NetworkSet, PowerDevice, Rack, SANManager, ServerHardware, ServerHardwareType, ServerProfile, ServerProfileTemplate, StoragePool, StorageSystem, Switch, UnmanagedDevice, UplinkSet, Volume, VolumeAttachment, VolumeSnapshot, VolumeTemplate
Constant Summary collapse
- BASE_URI =
'/rest'.freeze
Instance Attribute Summary collapse
-
#api_version ⇒ Object
Returns the value of attribute api_version.
-
#client ⇒ Object
Returns the value of attribute client.
-
#data ⇒ Object
Returns the value of attribute data.
-
#logger ⇒ Object
Returns the value of attribute logger.
Class Method Summary collapse
-
.build_query(query_options) ⇒ Object
Builds a Query string corresponding to the parameters passed.
-
.find_by(client, attributes, uri = self::BASE_URI) ⇒ Array<Resource>
Make a GET request to the resource uri, and returns an array with results matching the search.
-
.from_file(client, file_path) ⇒ Resource
Load resource from a .json or .yaml file.
-
.get_all(client) ⇒ Array<Resource>
Make a GET request to the resource base uri, and returns an array with all objects of this type.
-
.schema(client) ⇒ Hash
Get resource schema.
Instance Method Summary collapse
-
#==(other) ⇒ Boolean
Check equality of 2 resources.
-
#[](key) ⇒ Object
Access data using hash syntax.
-
#[]=(key, value) ⇒ Object
Set data using hash syntax.
-
#create ⇒ Resource
Create the resource on OneView using the current data.
-
#create! ⇒ Resource
Delete the resource from OneView if it exists, then create it using the current data.
-
#delete ⇒ true
Delete resource from OneView.
-
#each(&block) ⇒ Object
Run block once for each data key-value pair.
-
#eql?(other) ⇒ Boolean
Check equality of 2 resources.
-
#exists? ⇒ Boolean
Check if a resource exists.
-
#initialize(client, params = {}, api_ver = nil) ⇒ Resource
constructor
Create a resource object, associate it with a client, and set its properties.
-
#like?(other) ⇒ Boolean
Check the equality of the data for the other resource with this resource.
-
#refresh ⇒ Resource
Updates this object using the data that exists on OneView.
-
#retrieve! ⇒ Boolean
Retrieve resource details based on this resource’s name or URI.
-
#schema ⇒ Hash
Get resource schema.
-
#set(key, value) ⇒ Object
Set a resource attribute with the given value and call any validation method if necessary.
-
#set_all(params = {}) ⇒ Resource
Set the given hash of key-value pairs as resource data attributes.
-
#to_file(file_path, format = :json) ⇒ True
Save resource to json or yaml file.
-
#update(attributes = {}) ⇒ Resource
Set data and save to OneView.
Constructor Details
#initialize(client, params = {}, api_ver = nil) ⇒ Resource
Create a resource object, associate it with a client, and set its properties.
31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/oneview-sdk/resource.rb', line 31 def initialize(client, params = {}, api_ver = nil) fail InvalidClient, 'Must specify a valid client' unless client.is_a?(OneviewSDK::Client) @client = client @logger = @client.logger @api_version = api_ver || @client.api_version if @api_version > @client.max_api_version fail UnsupportedVersion, "#{self.class.name} api_version '#{@api_version}' is greater than the client's max_api_version '#{@client.max_api_version}'" end @data ||= {} set_all(params) end |
Instance Attribute Details
#api_version ⇒ Object
Returns the value of attribute api_version.
20 21 22 |
# File 'lib/oneview-sdk/resource.rb', line 20 def api_version @api_version end |
#client ⇒ Object
Returns the value of attribute client.
20 21 22 |
# File 'lib/oneview-sdk/resource.rb', line 20 def client @client end |
#data ⇒ Object
Returns the value of attribute data.
20 21 22 |
# File 'lib/oneview-sdk/resource.rb', line 20 def data @data end |
#logger ⇒ Object
Returns the value of attribute logger.
20 21 22 |
# File 'lib/oneview-sdk/resource.rb', line 20 def logger @logger end |
Class Method Details
.build_query(query_options) ⇒ Object
Builds a Query string corresponding to the parameters passed
277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 |
# File 'lib/oneview-sdk/resource.rb', line 277 def self.build_query() return '' if ! || .empty? query_path = '?' .each do |k, v| words = k.to_s.split('_') words.map!(&:capitalize!) words[0] = words.first.downcase new_key = words.join v.retrieve! if v.respond_to?(:retrieve!) && !v['uri'] if v.class <= OneviewSDK::Resource new_key = new_key.concat('Uri') v = v['uri'] end query_path.concat("&#{new_key}=#{v}") end query_path.sub('?&', '?') end |
.find_by(client, attributes, uri = self::BASE_URI) ⇒ Array<Resource>
Make a GET request to the resource uri, and returns an array with results matching the search
246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 |
# File 'lib/oneview-sdk/resource.rb', line 246 def self.find_by(client, attributes, uri = self::BASE_URI) results = [] loop do response = client.rest_get(uri) body = client.response_handler(response) members = body['members'] break unless members members.each do |member| temp = new(client, member) results.push(temp) if temp.like?(attributes) end break unless body['nextPageUri'] && (body['nextPageUri'] != body['uri']) uri = body['nextPageUri'] end results end |
.from_file(client, file_path) ⇒ Resource
Load resource from a .json or .yaml file
236 237 238 239 |
# File 'lib/oneview-sdk/resource.rb', line 236 def self.from_file(client, file_path) resource = OneviewSDK::Config.load(file_path) new(client, resource['data'], resource['api_version']) end |
.get_all(client) ⇒ Array<Resource>
Make a GET request to the resource base uri, and returns an array with all objects of this type
265 266 267 |
# File 'lib/oneview-sdk/resource.rb', line 265 def self.get_all(client) find_by(client, {}) end |
.schema(client) ⇒ Hash
Get resource schema
224 225 226 227 228 229 230 |
# File 'lib/oneview-sdk/resource.rb', line 224 def self.schema(client) response = client.rest_get("#{self::BASE_URI}/schema", client.api_version) client.response_handler(response) rescue StandardError => e client.logger.error('This resource does not implement the schema endpoint!') if e. =~ /404 NOT FOUND/ raise e end |
Instance Method Details
#==(other) ⇒ Boolean
Check equality of 2 resources. Same as eql?(other)
113 114 115 116 117 |
# File 'lib/oneview-sdk/resource.rb', line 113 def ==(other) self_state = instance_variables.sort.map { |v| instance_variable_get(v) } other_state = other.instance_variables.sort.map { |v| other.instance_variable_get(v) } other.class == self.class && other_state == self_state end |
#[](key) ⇒ Object
The key will be converted to a string
Access data using hash syntax
96 97 98 |
# File 'lib/oneview-sdk/resource.rb', line 96 def [](key) @data[key.to_s] end |
#[]=(key, value) ⇒ Object
The key will be converted to a string
Set data using hash syntax
105 106 107 108 |
# File 'lib/oneview-sdk/resource.rb', line 105 def []=(key, value) set(key, value) value end |
#create ⇒ Resource
Calls the refresh method to set additional data
Create the resource on OneView using the current data
143 144 145 146 147 148 149 |
# File 'lib/oneview-sdk/resource.rb', line 143 def create ensure_client response = @client.rest_post(self.class::BASE_URI, { 'body' => @data }, @api_version) body = @client.response_handler(response) set_all(body) self end |
#create! ⇒ Resource
Calls refresh method to set additional data
Delete the resource from OneView if it exists, then create it using the current data
156 157 158 159 160 |
# File 'lib/oneview-sdk/resource.rb', line 156 def create! temp = self.class.new(@client, @data) temp.delete if temp.retrieve! create end |
#delete ⇒ true
Delete resource from OneView
188 189 190 191 192 193 |
# File 'lib/oneview-sdk/resource.rb', line 188 def delete ensure_client && ensure_uri response = @client.rest_delete(@data['uri'], {}, @api_version) @client.response_handler(response) true end |
#each(&block) ⇒ Object
Run block once for each data key-value pair
88 89 90 |
# File 'lib/oneview-sdk/resource.rb', line 88 def each(&block) @data.each(&block) end |
#eql?(other) ⇒ Boolean
Check equality of 2 resources. Same as ==(other)
122 123 124 |
# File 'lib/oneview-sdk/resource.rb', line 122 def eql?(other) self == other end |
#exists? ⇒ Boolean
name or uri must be specified inside resource
Check if a resource exists
59 60 61 62 63 64 |
# File 'lib/oneview-sdk/resource.rb', line 59 def exists? fail IncompleteResource, 'Must set resource name or uri before trying to retrieve!' unless @data['name'] || @data['uri'] return true if @data['name'] && self.class.find_by(@client, name: @data['name']).size == 1 return true if @data['uri'] && self.class.find_by(@client, uri: @data['uri']).size == 1 false end |
#like?(other) ⇒ Boolean
Does not check the client, logger, or api_version if another resource is passed in
Check the equality of the data for the other resource with this resource.
134 135 136 |
# File 'lib/oneview-sdk/resource.rb', line 134 def like?(other) recursive_like?(other, @data) end |
#refresh ⇒ Resource
Will overwrite any data that differs from OneView
Updates this object using the data that exists on OneView
165 166 167 168 169 170 171 |
# File 'lib/oneview-sdk/resource.rb', line 165 def refresh ensure_client && ensure_uri response = @client.rest_get(@data['uri'], @api_version) body = @client.response_handler(response) set_all(body) self end |
#retrieve! ⇒ Boolean
Name or URI must be specified inside the resource
Retrieve resource details based on this resource’s name or URI.
47 48 49 50 51 52 53 54 |
# File 'lib/oneview-sdk/resource.rb', line 47 def retrieve! fail IncompleteResource, 'Must set resource name or uri before trying to retrieve!' unless @data['name'] || @data['uri'] results = self.class.find_by(@client, name: @data['name']) if @data['name'] results = self.class.find_by(@client, uri: @data['uri']) if @data['uri'] && (!results || results.empty?) return false unless results.size == 1 set_all(results[0].data) true end |
#schema ⇒ Hash
This may not be implemented in the API for every resource. Check the API docs
Get resource schema
217 218 219 |
# File 'lib/oneview-sdk/resource.rb', line 217 def schema self.class.schema(@client) end |
#set(key, value) ⇒ Object
Keys will be converted to strings
Set a resource attribute with the given value and call any validation method if necessary
81 82 83 84 85 |
# File 'lib/oneview-sdk/resource.rb', line 81 def set(key, value) method_name = "validate_#{key}" send(method_name.to_sym, value) if respond_to?(method_name.to_sym) @data[key.to_s] = value end |
#set_all(params = {}) ⇒ Resource
All top-level keys will be converted to strings
Set the given hash of key-value pairs as resource data attributes
70 71 72 73 74 75 |
# File 'lib/oneview-sdk/resource.rb', line 70 def set_all(params = {}) params = params.data if params.class <= Resource params = Hash[params.map { |(k, v)| [k.to_s, v] }] params.each { |key, value| set(key.to_s, value) } self end |
#to_file(file_path, format = :json) ⇒ True
If a .yml or .yaml file extension is given in the file_path, the format will be set automatically
Save resource to json or yaml file
200 201 202 203 204 205 206 207 208 209 210 211 212 |
# File 'lib/oneview-sdk/resource.rb', line 200 def to_file(file_path, format = :json) format = :yml if %w(.yml .yaml).include? File.extname(file_path) temp_data = { type: self.class.name, api_version: @api_version, data: @data } case format.to_sym when :json File.open(file_path, 'w') { |f| f.write(JSON.pretty_generate(temp_data)) } when :yml, :yaml File.open(file_path, 'w') { |f| f.write(temp_data.to_yaml) } else fail InvalidFormat, "Invalid format: #{format}" end true end |
#update(attributes = {}) ⇒ Resource
Set data and save to OneView
178 179 180 181 182 183 184 |
# File 'lib/oneview-sdk/resource.rb', line 178 def update(attributes = {}) set_all(attributes) ensure_client && ensure_uri response = @client.rest_put(@data['uri'], { 'body' => @data }, @api_version) @client.response_handler(response) self end |