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
API200::Fabric, API200::Rack, API200::Resource, API200::Switch, API200::User, API200::Volume, API300::C7000::Resource, API300::C7000::Scope, API300::Synergy::Resource, ImageStreamer::API300::Resource
Constant Summary collapse
- BASE_URI =
'/rest'.freeze
- UNIQUE_IDENTIFIERS =
Ordered list of unique attributes to search by
%w(name uri).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.
33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/oneview-sdk/resource.rb', line 33 def initialize(client, params = {}, api_ver = nil) raise InvalidClient, 'Must specify a valid client' unless client.is_a?(OneviewSDK::Client) || client.is_a?(OneviewSDK::ImageStreamer::Client) @client = client @logger = @client.logger @api_version = api_ver || @client.api_version if @api_version > @client.max_api_version raise 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.
22 23 24 |
# File 'lib/oneview-sdk/resource.rb', line 22 def api_version @api_version end |
#client ⇒ Object
Returns the value of attribute client.
22 23 24 |
# File 'lib/oneview-sdk/resource.rb', line 22 def client @client end |
#data ⇒ Object
Returns the value of attribute data.
22 23 24 |
# File 'lib/oneview-sdk/resource.rb', line 22 def data @data end |
#logger ⇒ Object
Returns the value of attribute logger.
22 23 24 |
# File 'lib/oneview-sdk/resource.rb', line 22 def logger @logger end |
Class Method Details
.build_query(query_options) ⇒ Object
Builds a Query string corresponding to the parameters passed
294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 |
# File 'lib/oneview-sdk/resource.rb', line 294 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
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 |
# File 'lib/oneview-sdk/resource.rb', line 263 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
244 245 246 247 248 249 250 251 252 253 254 255 256 |
# File 'lib/oneview-sdk/resource.rb', line 244 def self.from_file(client, file_path) resource = OneviewSDK::Config.load(file_path) klass = self if klass == OneviewSDK::Resource && resource['type'] # Use correct resource class by parsing type klass = OneviewSDK # Secondary/temp class/module reference resource['type'].split('::').each do |id| c = klass.const_get(id) rescue nil klass = c if c.is_a?(Class) || c.is_a?(Module) end klass = OneviewSDK::Resource unless klass <= OneviewSDK::Resource end klass.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
282 283 284 |
# File 'lib/oneview-sdk/resource.rb', line 282 def self.get_all(client) find_by(client, {}) end |
.schema(client) ⇒ Hash
Get resource schema
232 233 234 235 236 237 238 |
# File 'lib/oneview-sdk/resource.rb', line 232 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)
121 122 123 124 125 |
# File 'lib/oneview-sdk/resource.rb', line 121 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
104 105 106 |
# File 'lib/oneview-sdk/resource.rb', line 104 def [](key) @data[key.to_s] end |
#[]=(key, value) ⇒ Object
The key will be converted to a string
Set data using hash syntax
113 114 115 116 |
# File 'lib/oneview-sdk/resource.rb', line 113 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
151 152 153 154 155 156 157 |
# File 'lib/oneview-sdk/resource.rb', line 151 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
164 165 166 167 168 |
# File 'lib/oneview-sdk/resource.rb', line 164 def create! temp = self.class.new(@client, @data) temp.delete if temp.retrieve! create end |
#delete ⇒ true
Delete resource from OneView
196 197 198 199 200 201 |
# File 'lib/oneview-sdk/resource.rb', line 196 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
96 97 98 |
# File 'lib/oneview-sdk/resource.rb', line 96 def each(&block) @data.each(&block) end |
#eql?(other) ⇒ Boolean
Check equality of 2 resources. Same as ==(other)
130 131 132 |
# File 'lib/oneview-sdk/resource.rb', line 130 def eql?(other) self == other end |
#exists? ⇒ Boolean
one of the UNIQUE_IDENTIFIERS, e.g. name or uri, must be specified in the resource
Check if a resource exists
64 65 66 67 68 69 70 71 72 |
# File 'lib/oneview-sdk/resource.rb', line 64 def exists? retrieval_keys = self.class::UNIQUE_IDENTIFIERS.select { |k| !@data[k].nil? } raise IncompleteResource, "Must set resource #{self.class::UNIQUE_IDENTIFIERS.join(' or ')} before trying to retrieve!" if retrieval_keys.empty? retrieval_keys.each do |k| results = self.class.find_by(@client, k => @data[k]) return true if results.size == 1 end 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.
142 143 144 |
# File 'lib/oneview-sdk/resource.rb', line 142 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
173 174 175 176 177 178 179 |
# File 'lib/oneview-sdk/resource.rb', line 173 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
one of the UNIQUE_IDENTIFIERS, e.g. name or uri, must be specified in the resource
Retrieve resource details based on this resource’s name or URI.
49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/oneview-sdk/resource.rb', line 49 def retrieve! retrieval_keys = self.class::UNIQUE_IDENTIFIERS.select { |k| !@data[k].nil? } raise IncompleteResource, "Must set resource #{self.class::UNIQUE_IDENTIFIERS.join(' or ')} before trying to retrieve!" if retrieval_keys.empty? retrieval_keys.each do |k| results = self.class.find_by(@client, k => @data[k]) next if results.size != 1 set_all(results[0].data) return true end false end |
#schema ⇒ Hash
This may not be implemented in the API for every resource. Check the API docs
Get resource schema
225 226 227 |
# File 'lib/oneview-sdk/resource.rb', line 225 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
89 90 91 92 93 |
# File 'lib/oneview-sdk/resource.rb', line 89 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
78 79 80 81 82 83 |
# File 'lib/oneview-sdk/resource.rb', line 78 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
208 209 210 211 212 213 214 215 216 217 218 219 220 |
# File 'lib/oneview-sdk/resource.rb', line 208 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 raise InvalidFormat, "Invalid format: #{format}" end true end |
#update(attributes = {}) ⇒ Resource
Set data and save to OneView
186 187 188 189 190 191 192 |
# File 'lib/oneview-sdk/resource.rb', line 186 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 |