Class: Backends::Opennebula::Network

Inherits:
Base
  • Object
show all
Includes:
Helpers::NetworkParseHelper
Defined in:
lib/backends/opennebula/network.rb

Constant Summary

Constants inherited from Base

Base::API_VERSION

Instance Method Summary collapse

Methods included from Helpers::NetworkParseHelper

#parse_backend_obj, #parse_basic_attrs, #parse_one_attrs, #parse_state

Methods inherited from Base

#add_other_backend, #initialize

Methods included from Helpers::ExtensionsHelper

#read_extensions

Methods included from Helpers::JsonCollectionHelper

#read_from_json

Constructor Details

This class inherits a constructor from Backends::Opennebula::Base

Instance Method Details

#create(network) ⇒ String

Instantiates a new network instance from ::Occi::Infrastructure::Network. ID given in the occi.core.id attribute is optional and can be changed inside this method. Final occi.core.id must be returned as a String. If the requested instance cannot be created, an error describing the problem must be raised, @see Backends::Errors.

Examples:

network = ::Occi::Infrastructure::Network.new
network_id = create(network)
    #=> "65d4f65adfadf-ad2f4ad-daf5ad-f5ad4fad4ffdf"

Parameters:

  • network (::Occi::Infrastructure::Network)

    network instance containing necessary attributes

Returns:

  • (String)

    final identifier of the new network instance


89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/backends/opennebula/network.rb', line 89

def create(network)
  @logger.debug "[Backends] [Opennebula] Creating network #{network.inspect}"

  # include some basic mixins
  # WARNING: adding mix-ins will re-set their attributes
  attr_backup = ::Occi::Core::Attributes.new(network.attributes)
  network.mixins << 'http://schemas.ogf.org/occi/infrastructure/network#ipnetwork'
  network.mixins << 'http://schemas.opennebula.org/occi/infrastructure#network'
  network.attributes = attr_backup

  template_location = File.join(@options.templates_dir, 'network.erb')
  template = Erubis::Eruby.new(File.read(template_location)).evaluate(network: network)

  @logger.debug "[Backends] [Opennebula] Template #{template.inspect}"

  vnet_alloc = ::OpenNebula::VirtualNetwork.build_xml
  backend_object = ::OpenNebula::VirtualNetwork.new(vnet_alloc, @client)

  rc = backend_object.allocate(template)
  check_retval(rc, Backends::Errors::ResourceCreationError)

  rc = backend_object.info
  check_retval(rc, Backends::Errors::ResourceRetrievalError)

  backend_object['ID']
end

#delete(network_id) ⇒ true, false

Deletes a specific network instance, instance to be deleted is specified by an ID, this ID must match the occi.core.id attribute of the deleted instance. If the requested instance cannot be deleted, an error describing the problem must be raised, @see Backends::Errors.

Examples:

delete("65d4f65adfadf-ad2f4ad-daf5ad-f5ad4fad4ffdf") #=> true

Parameters:

  • network_id (String)

    an identifier of a network instance to be deleted

Returns:

  • (true, false)

    result of the operation


154
155
156
157
158
159
160
161
162
163
# File 'lib/backends/opennebula/network.rb', line 154

def delete(network_id)
  network = ::OpenNebula::VirtualNetwork.new(::OpenNebula::VirtualNetwork.build_xml(network_id), @client)
  rc = network.info
  check_retval(rc, Backends::Errors::ResourceRetrievalError)

  rc = network.delete
  check_retval(rc, Backends::Errors::ResourceActionError)

  true
end

#delete_all(mixins = nil) ⇒ true, false

Deletes all network instances, instances to be deleted must be filtered by the specified filter, filter (if set) must contain an ::Occi::Core::Mixins instance. If the requested instances cannot be deleted, an error describing the problem must be raised, @see Backends::Errors.

Examples:

delete_all #=> true

mixins = ::Occi::Core::Mixins.new << ::Occi::Core::Mixin.new
delete_all(mixins)  #=> true

Parameters:

  • mixins (::Occi::Core::Mixins) (defaults to: nil)

    a filter containing mixins

Returns:

  • (true, false)

    result of the operation


129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/backends/opennebula/network.rb', line 129

def delete_all(mixins = nil)
  # TODO: impl filtering with mixins
  backend_network_pool = ::OpenNebula::VirtualNetworkPool.new(@client)
  rc = backend_network_pool.info_all
  check_retval(rc, Backends::Errors::ResourceRetrievalError)

  backend_network_pool.each do |backend_network|
    rc = backend_network.delete
    check_retval(rc, Backends::Errors::ResourceActionError)
  end

  true
end

#get(network_id) ⇒ ::Occi::Infrastructure::Network?

Gets a specific network instance as ::Occi::Infrastructure::Network. ID given as an argument must match the occi.core.id attribute inside the returned ::Occi::Infrastructure::Network instance, however it is possible to implement internal mapping to a platform-specific identifier.

Examples:

network = get('65d4f65adfadf-ad2f4ad-daf5ad-f5ad4fad4ffdf')
    #=> #<::Occi::Infrastructure::Network>

Parameters:

  • network_id (String)

    OCCI identifier of the requested network instance

Returns:

  • (::Occi::Infrastructure::Network, nil)

    a network instance or `nil`


68
69
70
71
72
73
74
# File 'lib/backends/opennebula/network.rb', line 68

def get(network_id)
  virtual_network = ::OpenNebula::VirtualNetwork.new(::OpenNebula::VirtualNetwork.build_xml(network_id), @client)
  rc = virtual_network.info
  check_retval(rc, Backends::Errors::ResourceRetrievalError)

  parse_backend_obj(virtual_network)
end

#get_extensions::Occi::Collection

Returns a collection of custom mixins introduced (and specific for) the enabled backend. Only mixins and actions are allowed.

Returns:

  • (::Occi::Collection)

    collection of extensions (custom mixins and/or actions)


244
245
246
# File 'lib/backends/opennebula/network.rb', line 244

def get_extensions
  read_extensions 'network', @options.model_extensions_dir
end

#list(mixins = nil) ⇒ ::Occi::Core::Resources

Gets all network instances, instances must be filtered by the specified filter, filter (if set) must contain an ::Occi::Core::Mixins instance. Returned collection must contain ::Occi::Infrastructure::Network instances wrapped in ::Occi::Core::Resources.

Examples:

networks = list #=> #<::Occi::Core::Resources>
networks.first #=> #<::Occi::Infrastructure::Network>

mixins = ::Occi::Core::Mixins.new << ::Occi::Core::Mixin.new
networks = list(mixins) #=> #<::Occi::Core::Resources>

Parameters:

  • mixins (::Occi::Core::Mixins) (defaults to: nil)

    a filter containing mixins

Returns:

  • (::Occi::Core::Resources)

    a collection of network instances


43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/backends/opennebula/network.rb', line 43

def list(mixins = nil)
  # TODO: impl filtering with mixins
  network = ::Occi::Core::Resources.new
  backend_network_pool = ::OpenNebula::VirtualNetworkPool.new(@client)
  rc = backend_network_pool.info_all
  check_retval(rc, Backends::Errors::ResourceRetrievalError)

  backend_network_pool.each do |backend_network|
    network << parse_backend_obj(backend_network)
  end

  network
end

#list_ids(mixins = nil) ⇒ Array<String>

Gets all network instance IDs, no details, no duplicates. Returned identifiers must correspond to those found in the occi.core.id attribute of ::Occi::Infrastructure::Network instances.

Examples:

list_ids #=> []
list_ids #=> ["65d4f65adfadf-ad2f4ad-daf5ad-f5ad4fad4ffdf",
                         "ggf4f65adfadf-adgg4ad-daggad-fydd4fadyfdfd"]

Parameters:

  • mixins (::Occi::Core::Mixins) (defaults to: nil)

    a filter containing mixins

Returns:

  • (Array<String>)

    IDs for all available network instances


15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/backends/opennebula/network.rb', line 15

def list_ids(mixins = nil)
  # TODO: impl filtering with mixins
  backend_network_pool = ::OpenNebula::VirtualNetworkPool.new(@client)
  rc = backend_network_pool.info_all
  check_retval(rc, Backends::Errors::ResourceRetrievalError)

  network = []
  backend_network_pool.each do |backend_network|
    network << backend_network['ID']
  end

  network
end

#partial_update(network_id, attributes = nil, mixins = nil, links = nil) ⇒ true, false

Partially updates an existing network instance, instance to be updated is specified by network_id. If the requested instance cannot be updated, an error describing the problem must be raised, @see Backends::Errors.

Examples:

attributes = ::Occi::Core::Attributes.new
mixins = ::Occi::Core::Mixins.new
links = ::Occi::Core::Links.new
partial_update(network_id, attributes, mixins, links) #=> true

Parameters:

  • network_id (String)

    unique identifier of a network instance to be updated

  • attributes (::Occi::Core::Attributes) (defaults to: nil)

    a collection of attributes to be updated

  • mixins (::Occi::Core::Mixins) (defaults to: nil)

    a collection of mixins to be added

  • links (::Occi::Core::Links) (defaults to: nil)

    a collection of links to be added

Returns:

  • (true, false)

    result of the operation


181
182
183
184
# File 'lib/backends/opennebula/network.rb', line 181

def partial_update(network_id, attributes = nil, mixins = nil, links = nil)
  # TODO: impl
  fail Backends::Errors::MethodNotImplementedError, 'Partial updates are currently not supported!'
end

#trigger_action(network_id, action_instance) ⇒ true, false

Triggers an action on an existing network instance, the network instance in question is identified by a network instance ID, action is identified by the action.term attribute of the action instance passed as an argument. If the requested action cannot be triggered, an error describing the problem must be raised, @see Backends::Errors.

Examples:

action_instance = ::Occi::Core::ActionInstance.new
trigger_action("65d4f65adfadf-ad2f4ad-daf5ad-f5ad4fad4ffdf", action_instance)
  #=> true

Parameters:

  • network_id (String)

    network instance identifier

  • action_instance (::Occi::Core::ActionInstance)

    action to be triggered

Returns:

  • (true, false)

    result of the operation


235
236
237
238
# File 'lib/backends/opennebula/network.rb', line 235

def trigger_action(network_id, action_instance)
  fail Backends::Errors::ActionNotImplementedError,
       "Action #{action_instance.action.type_identifier.inspect} is not implemented!"
end

#trigger_action_on_all(action_instance, mixins = nil) ⇒ true, false

Triggers an action on all existing network instance, instances must be filtered by the specified filter, filter (if set) must contain an ::Occi::Core::Mixins instance, action is identified by the action.term attribute of the action instance passed as an argument. If the requested action cannot be triggered, an error describing the problem must be raised, @see Backends::Errors.

Examples:

action_instance = ::Occi::Core::ActionInstance.new
mixins = ::Occi::Core::Mixins.new << ::Occi::Core::Mixin.new
trigger_action_on_all(action_instance, mixin) #=> true

Parameters:

  • action_instance (::Occi::Core::ActionInstance)

    action to be triggered

  • mixins (::Occi::Core::Mixins) (defaults to: nil)

    a filter containing mixins

Returns:

  • (true, false)

    result of the operation


216
217
218
219
# File 'lib/backends/opennebula/network.rb', line 216

def trigger_action_on_all(action_instance, mixins = nil)
  list_ids(mixins).each { |ntw| trigger_action(ntw, action_instance) }
  true
end

#update(network) ⇒ true, false

Updates an existing network instance, instance to be updated is specified using the occi.core.id attribute of the instance passed as an argument. If the requested instance cannot be updated, an error describing the problem must be raised, @see Backends::Errors.

Examples:

network = ::Occi::Infrastructure::Network.new
update(network) #=> true

Parameters:

  • network (::Occi::Infrastructure::Network)

    instance containing updated information

Returns:

  • (true, false)

    result of the operation


197
198
199
200
# File 'lib/backends/opennebula/network.rb', line 197

def update(network)
  # TODO: impl
  fail Backends::Errors::MethodNotImplementedError, 'Updates are currently not supported!'
end