Class: OneviewSDK::Resource

Inherits:
Object
  • Object
show all
Defined in:
lib/oneview-sdk/resource.rb

Overview

Resource base class that defines all common resource functionality.

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

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(client, params = {}, api_ver = nil) ⇒ Resource

Create a resource object, associate it with a client, and set its properties.

Parameters:

  • client (OneviewSDK::Client)

    The client object for the OneView appliance

  • params (Hash) (defaults to: {})

    The options for this resource (key-value pairs)

  • api_ver (Integer) (defaults to: nil)

    The api version to use when interracting with this resource. Defaults to the client.api_version if it exists, or the OneviewSDK::Client::DEFAULT_API_VERSION.

Raises:



33
34
35
36
37
38
39
40
41
42
43
44
45
# 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_versionObject

Returns the value of attribute api_version.



22
23
24
# File 'lib/oneview-sdk/resource.rb', line 22

def api_version
  @api_version
end

#clientObject

Returns the value of attribute client.



22
23
24
# File 'lib/oneview-sdk/resource.rb', line 22

def client
  @client
end

#dataObject

Returns the value of attribute data.



22
23
24
# File 'lib/oneview-sdk/resource.rb', line 22

def data
  @data
end

#loggerObject

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

Parameters:

  • query_options (Hash{String=>String,OneviewSDK::Resource})

    Query parameters and values to be applied to the query url. All key values should be Strings in snake case, the values could be Strings or Resources.

Options Hash (query_options):

  • String (String)

    Values that are Strings can be associated as usual

  • Resources (String)

    Values that are Resources can be associated as usual, with keys representing only the resource names (like ‘ethernet_network’). This method translates the SDK and Ruby standards to OneView request standard.



306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
# File 'lib/oneview-sdk/resource.rb', line 306

def self.build_query(query_options)
  return '' if !query_options || query_options.empty?
  query_path = '?'
  query_options.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

Parameters:

  • client (OneviewSDK::Client)

    The client object for the OneView appliance

  • attributes (Hash)

    Hash containing the attributes name and value

  • uri (String) (defaults to: self::BASE_URI)

    URI of the endpoint

Returns:

  • (Array<Resource>)

    Results matching the search



264
265
266
267
268
269
270
271
272
# File 'lib/oneview-sdk/resource.rb', line 264

def self.find_by(client, attributes, uri = self::BASE_URI)
  all = find_with_pagination(client, uri)
  results = []
  all.each do |member|
    temp = new(client, member)
    results.push(temp) if temp.like?(attributes)
  end
  results
end

.find_with_pagination(client, uri) ⇒ Array<Hash>

Make a GET request to the uri, and returns an array with all results (search using resource pagination)

Parameters:

  • client (OneviewSDK::Client)

    The client object for the OneView appliance

  • uri (String)

    URI of the endpoint

Returns:

  • (Array<Hash>)

    Results



278
279
280
281
282
283
284
285
286
287
288
289
290
# File 'lib/oneview-sdk/resource.rb', line 278

def self.find_with_pagination(client, uri)
  all = []
  loop do
    response = client.rest_get(uri)
    body = client.response_handler(response)
    members = body['members']
    break unless members
    all.concat(members)
    break unless body['nextPageUri'] && (body['nextPageUri'] != body['uri'])
    uri = body['nextPageUri']
  end
  all
end

.from_file(client, file_path) ⇒ Resource

Load resource from a .json or .yaml file

Parameters:

  • client (OneviewSDK::Client)

    The client object for the OneView appliance

  • file_path (String)

    The full path to the file

Returns:

  • (Resource)

    New resource created from the file contents



245
246
247
248
249
250
251
252
253
254
255
256
257
# File 'lib/oneview-sdk/resource.rb', line 245

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

Returns:



294
295
296
# File 'lib/oneview-sdk/resource.rb', line 294

def self.get_all(client)
  find_by(client, {})
end

.schema(client) ⇒ Hash

Get resource schema

Parameters:

Returns:

  • (Hash)

    Schema



233
234
235
236
237
238
239
# File 'lib/oneview-sdk/resource.rb', line 233

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.message =~ /404 NOT FOUND/
  raise e
end

Instance Method Details

#==(other) ⇒ Boolean

Check equality of 2 resources. Same as eql?(other)

Parameters:

  • other (Resource)

    The other resource to check equality for

Returns:

  • (Boolean)

    Whether or not the two objects are equal



122
123
124
125
126
# File 'lib/oneview-sdk/resource.rb', line 122

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

Note:

The key will be converted to a string

Access data using hash syntax

Parameters:

  • key (String, Symbol)

    Name of key to get value for

Returns:

  • The value of the given key. If not found, returns nil



105
106
107
# File 'lib/oneview-sdk/resource.rb', line 105

def [](key)
  @data[key.to_s]
end

#[]=(key, value) ⇒ Object

Note:

The key will be converted to a string

Set data using hash syntax

Parameters:

  • key (String, Symbol)

    Name of key to set the value for

  • value (Object)

    to set for the given key

Returns:

  • The value set for the given key



114
115
116
117
# File 'lib/oneview-sdk/resource.rb', line 114

def []=(key, value)
  set(key, value)
  value
end

#createResource

Note:

Calls the refresh method to set additional data

Create the resource on OneView using the current data

Returns:

Raises:



152
153
154
155
156
157
158
# File 'lib/oneview-sdk/resource.rb', line 152

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

Note:

Calls refresh method to set additional data

Delete the resource from OneView if it exists, then create it using the current data

Returns:

Raises:



165
166
167
168
169
# File 'lib/oneview-sdk/resource.rb', line 165

def create!
  temp = self.class.new(@client, @data)
  temp.delete if temp.retrieve!
  create
end

#deletetrue

Delete resource from OneView

Returns:

  • (true)

    if resource was deleted successfully



197
198
199
200
201
202
# File 'lib/oneview-sdk/resource.rb', line 197

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



97
98
99
# File 'lib/oneview-sdk/resource.rb', line 97

def each(&block)
  @data.each(&block)
end

#eql?(other) ⇒ Boolean

Check equality of 2 resources. Same as ==(other)

Parameters:

  • other (Resource)

    The other resource to check for equality

Returns:

  • (Boolean)

    Whether or not the two objects are equal



131
132
133
# File 'lib/oneview-sdk/resource.rb', line 131

def eql?(other)
  self == other
end

#exists?Boolean

Note:

one of the UNIQUE_IDENTIFIERS, e.g. name or uri, must be specified in the resource

Check if a resource exists

Returns:

  • (Boolean)

    Whether or not resource exists

Raises:



65
66
67
68
69
70
71
72
73
# File 'lib/oneview-sdk/resource.rb', line 65

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

Note:

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.

Examples:

Compare to hash

myResource = OneviewSDK::Resource.new(client, { name: 'res1', description: 'example'}, 200)
myResource.like?(description: '') # returns false
myResource.like?(name: 'res1') # returns true

Parameters:

  • other (Hash, Resource)

    resource or hash to compare the key-value pairs with

Returns:

  • (Boolean)

    Whether or not the two objects are alike



143
144
145
# File 'lib/oneview-sdk/resource.rb', line 143

def like?(other)
  recursive_like?(other, @data)
end

#refreshResource

Note:

Will overwrite any data that differs from OneView

Updates this object using the data that exists on OneView

Returns:



174
175
176
177
178
179
180
# File 'lib/oneview-sdk/resource.rb', line 174

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

Note:

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.

Returns:

  • (Boolean)

    Whether or not retrieve was successful

Raises:



50
51
52
53
54
55
56
57
58
59
60
# File 'lib/oneview-sdk/resource.rb', line 50

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

#schemaHash

Note:

This may not be implemented in the API for every resource. Check the API docs

Get resource schema

Returns:

  • (Hash)

    Schema



226
227
228
# File 'lib/oneview-sdk/resource.rb', line 226

def schema
  self.class.schema(@client)
end

#set(key, value) ⇒ Object

Note:

Keys will be converted to strings

Set a resource attribute with the given value and call any validation method if necessary

Parameters:

  • key (String)

    attribute name

  • value

    value to assign to the given attribute



90
91
92
93
94
# File 'lib/oneview-sdk/resource.rb', line 90

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

Note:

All top-level keys will be converted to strings

Set the given hash of key-value pairs as resource data attributes

Parameters:

  • params (Hash, Resource) (defaults to: {})

    The options for this resource (key-value pairs or resource object)

Returns:



79
80
81
82
83
84
# File 'lib/oneview-sdk/resource.rb', line 79

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

Note:

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

Parameters:

  • file_path (String)

    The full path to the file

  • format (Symbol) (defaults to: :json)

    The format. Options: [:json, :yml, :yaml]. Defaults to .json

Returns:

  • (True)

    The Resource was saved successfully



209
210
211
212
213
214
215
216
217
218
219
220
221
# File 'lib/oneview-sdk/resource.rb', line 209

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

Parameters:

  • attributes (Hash) (defaults to: {})

    The attributes to add/change for this resource (key-value pairs)

Returns:

Raises:



187
188
189
190
191
192
193
# File 'lib/oneview-sdk/resource.rb', line 187

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