Class: OpenNebula::VirtualNetwork

Inherits:
PoolElement show all
Defined in:
lib/opennebula/virtual_network.rb

Constant Summary collapse

VN_METHODS =

Constants and Class Methods

{
    :info       => "vn.info",
    :allocate   => "vn.allocate",
    :delete     => "vn.delete",
    :add_ar     => "vn.add_ar",
    :rm_ar      => "vn.rm_ar",
    :update_ar  => "vn.update_ar",
    :chown      => "vn.chown",
    :chmod      => "vn.chmod",
    :update     => "vn.update",
    :hold       => "vn.hold",
    :release    => "vn.release",
    :rename     => "vn.rename",
    :reserve    => "vn.reserve",
    :free_ar    => "vn.free_ar",
    :lock       => "vn.lock",
    :unlock     => "vn.unlock",
    :recover    => "vn.recover"
}
VN_STATES =
%w{INIT READY LOCK_CREATE LOCK_DELETE DONE ERROR UPDATE_FAILURE}
SHORT_VN_STATES =
{
    "INIT"          => "init",
    "READY"         => "rdy",
    "LOCK_CREATE"   => "lock",
    "LOCK_DELETE"   => "lock",
    "DONE"          => "done",
    "ERROR"         => "err",
    "UPDATE_FAILURE"=> "fail"
}

Instance Attribute Summary

Attributes inherited from PoolElement

#name

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from PoolElement

#id, new_with_id, #replace, #to_str

Methods inherited from XMLElement

#[], #add_element, #attr, #delete_element, #each, #each_xpath, #element_xml, #has_elements?, #initialize_xml, #name, #retrieve_elements, #retrieve_xmlelements, #set_content, #template_like_str, #template_str, #template_xml, #text, #to_hash, #to_xml, #xml_nil?

Constructor Details

#initialize(xml, client) ⇒ VirtualNetwork

Class constructor



77
78
79
80
81
# File 'lib/opennebula/virtual_network.rb', line 77

def initialize(xml, client)
    LockableExt.make_lockable(self, VN_METHODS)

    super(xml,client)
end

Class Method Details

.build_xml(pe_id = nil) ⇒ Object

Creates a VirtualNetwork description with just its identifier this method should be used to create plain VirtualNetwork objects. id the id of the network

Example:

vnet = VirtualNetwork.new(VirtualNetwork.build_xml(3),rpc_client)


66
67
68
69
70
71
72
73
74
# File 'lib/opennebula/virtual_network.rb', line 66

def VirtualNetwork.build_xml(pe_id=nil)
    if pe_id
        vn_xml = "<VNET><ID>#{pe_id}</ID></VNET>"
    else
        vn_xml = "<VNET></VNET>"
    end

    XMLElement.build_xml(vn_xml, 'VNET')
end

Instance Method Details

#add_ar(ar_template) ⇒ Object

Adds Address Ranges to the VirtualNetwork



133
134
135
136
137
138
139
140
# File 'lib/opennebula/virtual_network.rb', line 133

def add_ar(ar_template)
    return Error.new('ID not defined') if !@pe_id

    rc = @client.call(VN_METHODS[:add_ar], @pe_id, ar_template)
    rc = nil if !OpenNebula.is_error?(rc)

    return rc
end

#addleases(ip, mac = nil) ⇒ Object

Deprecated.

use #add_ar

Simulates old addleases call



144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/opennebula/virtual_network.rb', line 144

def addleases(ip, mac=nil)
    self.info

    ar_id = self.retrieve_elements("AR_POOL/AR[IP='#{ip}' and SIZE='1']/AR_ID")

    if !ar_id.nil?
        return Error.new("IP Address Range found with IP #{ip}")
    end

    template = 'AR = [ '
    template << 'TYPE = "IP4"'
    template << ', IP = "' << ip << '"' if ip
    template << ', MAC = "' << mac << '"' if mac
    template << ', SIZE = 1 ]'

    add_ar(template)
end

#allocate(description, cluster_id = ClusterPool::NONE_CLUSTER_ID) ⇒ Integer, OpenNebula::Error

Allocates a new VirtualNetwork in OpenNebula

Parameters:

  • description (String)

    The template of the VirtualNetwork.

  • cluster_id (Integer) (defaults to: ClusterPool::NONE_CLUSTER_ID)

    Id of the cluster, -1 to use default

Returns:



101
102
103
# File 'lib/opennebula/virtual_network.rb', line 101

def allocate(description,cluster_id=ClusterPool::NONE_CLUSTER_ID)
    super(VN_METHODS[:allocate], description, cluster_id)
end

#chmod(owner_u, owner_m, owner_a, group_u, group_m, group_a, other_u, other_m, other_a) ⇒ nil, OpenNebula::Error

Changes the virtual network permissions. Each [Integer] argument must be 1 to allow, 0 deny, -1 do not change

Returns:



311
312
313
314
315
# File 'lib/opennebula/virtual_network.rb', line 311

def chmod(owner_u, owner_m, owner_a, group_u, group_m, group_a, other_u,
        other_m, other_a)
    super(VN_METHODS[:chmod], owner_u, owner_m, owner_a, group_u,
        group_m, group_a, other_u, other_m, other_a)
end

#chmod_octet(octet) ⇒ nil, OpenNebula::Error

Changes the virtual network permissions.

Parameters:

  • octet (String)

    Permissions octed , e.g. 640

Returns:



302
303
304
# File 'lib/opennebula/virtual_network.rb', line 302

def chmod_octet(octet)
    super(VN_METHODS[:chmod], octet)
end

#chown(uid, gid) ⇒ nil, OpenNebula::Error

Changes the owner/group

Parameters:

  • uid (Integer)

    the new owner id. Set to -1 to leave the current one

  • gid (Integer)

    the new group id. Set to -1 to leave the current one

Returns:



293
294
295
# File 'lib/opennebula/virtual_network.rb', line 293

def chown(uid, gid)
    super(VN_METHODS[:chown], uid, gid)
end

#deleteObject

Deletes the VirtualNetwork



128
129
130
# File 'lib/opennebula/virtual_network.rb', line 128

def delete()
    super(VN_METHODS[:delete])
end

#free(ar_id) ⇒ Object

Removes an Address Range from the VirtualNetwork



277
278
279
280
281
282
283
284
# File 'lib/opennebula/virtual_network.rb', line 277

def free(ar_id)
    return Error.new('ID not defined') if !@pe_id

    rc = @client.call(VN_METHODS[:free_ar], @pe_id, ar_id.to_i)
    rc = nil if !OpenNebula.is_error?(rc)

    return rc
end

#gidObject

Returns the group identifier

return

Integer the element’s group ID



343
344
345
# File 'lib/opennebula/virtual_network.rb', line 343

def gid
    self['GID'].to_i
end

#hold(ip, ar_id = -1)) ⇒ Object

Holds a virtual network address

Parameters:

  • ip (String)

    address to hold, if contains “:” a MAC address is assumed

  • ar_id (Integer) (defaults to: -1))

    The address range to hold the lease. If not set the lease will be held from all possible address ranges



202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
# File 'lib/opennebula/virtual_network.rb', line 202

def hold(ip, ar_id=-1)
    return Error.new('ID not defined') if !@pe_id

    addr_name = address_type(ip)

    return addr_name if OpenNebula.is_error?(addr_name)

    lease_template =  "LEASES = [ #{addr_name} = #{ip}"
    lease_template << ", AR_ID = #{ar_id}" if ar_id != -1
    lease_template << "]"

    rc = @client.call(VN_METHODS[:hold], @pe_id, lease_template)
    rc = nil if !OpenNebula.is_error?(rc)

    return rc
end

#info(decrypt = false) ⇒ Object Also known as: info!

Retrieves the information of the given VirtualNetwork.



88
89
90
# File 'lib/opennebula/virtual_network.rb', line 88

def info(decrypt = false)
    super(VN_METHODS[:info], 'VNET', decrypt)
end

#public?Boolean

Returns:

  • (Boolean)


347
348
349
350
351
352
353
# File 'lib/opennebula/virtual_network.rb', line 347

def public?
    if self['PERMISSIONS/GROUP_U'] == "1" || self['PERMISSIONS/OTHER_U'] == "1"
        true
    else
        false
    end
end

#publishObject

Publishes the VirtualNetwork, to be used by other users



118
119
120
# File 'lib/opennebula/virtual_network.rb', line 118

def publish
    set_publish(true)
end

#recover(result) ⇒ nil, OpenNebula::Error

Recovers an stuck Virtual Network

delete (2), retry (3)

Parameters:

  • result (Integer)

    Recover with failure (0), success (1),

Returns:



333
334
335
# File 'lib/opennebula/virtual_network.rb', line 333

def recover(result)
    return call(VN_METHODS[:recover], @pe_id, result)
end

#release(ip, ar_id = -1)) ⇒ Object

Releases an address on hold

Parameters:

  • ip (String)

    IP to release, if contains “:” a MAC address is assumed

  • ar_id (Integer) (defaults to: -1))

    The address range to release the lease. If not set the lease will be freed from all possible address ranges



223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
# File 'lib/opennebula/virtual_network.rb', line 223

def release(ip, ar_id=-1)
    return Error.new('ID not defined') if !@pe_id

    addr_name = address_type(ip)

    return addr_name if OpenNebula.is_error?(addr_name)

    lease_template =  "LEASES = [ #{addr_name} = #{ip}"
    lease_template << ", AR_ID = #{ar_id}" if ar_id != -1
    lease_template << "]"

    rc = @client.call(VN_METHODS[:release], @pe_id, lease_template)
    rc = nil if !OpenNebula.is_error?(rc)

    return rc
end

#rename(name) ⇒ nil, OpenNebula::Error

Renames this virtual network

Parameters:

  • name (String)

    New name for the virtual network.

Returns:



323
324
325
# File 'lib/opennebula/virtual_network.rb', line 323

def rename(name)
    return call(VN_METHODS[:rename], @pe_id, name)
end

#reserve(rname, rsize, ar_id, addr, vnet) ⇒ Integer, OpenNebula::Error

Reserve a set of addresses from this virtual network

Parameters:

  • rname (String)

    of the reservation

  • rsize (String)

    number of addresses to reserve

  • ar_id (String)

    the ar_id to make the reservation. If set to nil any address range will be used

  • addr (String)

    the first address in the reservation. If set to nil the first free address will be used

  • vnet (String)

    ID of the VNET to add the reservation to. If not set a new VNET will be created.

Returns:

  • (Integer, OpenNebula::Error)

    The reservation vnet id on success, Error otherwise



251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
# File 'lib/opennebula/virtual_network.rb', line 251

def reserve(rname, rsize, ar_id, addr, vnet)
    return Error.new('ID not defined') if !@pe_id

    rtmpl =  "SIZE       = #{rsize}\n"
    rtmpl << "NAME       = \"#{rname}\"\n" if !rname.nil?
    rtmpl << "AR_ID      = #{ar_id}\n" if !ar_id.nil?
    rtmpl << "NETWORK_ID = #{vnet}\n"  if !vnet.nil?

    if !addr.nil?
        addr_name = address_type(addr)

        return addr_name if OpenNebula.is_error?(addr_name)

        rtmpl << "#{addr_name} = #{addr}\n"
    end

    return @client.call(VN_METHODS[:reserve], @pe_id, rtmpl)
end

#reserve_with_extra(extra) ⇒ Object



270
271
272
273
274
# File 'lib/opennebula/virtual_network.rb', line 270

def reserve_with_extra(extra)
    return Error.new('ID not defined') unless @pe_id

    @client.call(VN_METHODS[:reserve], @pe_id, extra)
end

#rm_ar(ar_id, force = false) ⇒ Object

Removes an Address Range from the VirtualNetwork



163
164
165
166
167
168
169
170
# File 'lib/opennebula/virtual_network.rb', line 163

def rm_ar(ar_id, force = false)
    return Error.new('ID not defined') if !@pe_id

    rc = @client.call(VN_METHODS[:rm_ar], @pe_id, ar_id.to_i, force)
    rc = nil if !OpenNebula.is_error?(rc)

    return rc
end

#rmleases(ip) ⇒ Object

Deprecated.

use ##rm_ar

Simulates old rmleases call



174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/opennebula/virtual_network.rb', line 174

def rmleases(ip)
    self.info

    ar_id = self.retrieve_elements("AR_POOL/AR[IP='#{ip}' and SIZE='1']/AR_ID")

    if !ar_id
        Error.new("No single IP Address Range found with IP #{ip}")
    elsif ar_id.size > 1
        Error.new("More than one Address Range found with IP #{ip} use rmar")
    else
        rm_ar(ar_id[0])
    end
end

#short_state_strObject

Returns the state of the Virtual Network (string value)



377
378
379
# File 'lib/opennebula/virtual_network.rb', line 377

def short_state_str
    SHORT_VN_STATES[state_str]
end

#stateObject

Returns the state of the Virtual Network (numeric value)



367
368
369
# File 'lib/opennebula/virtual_network.rb', line 367

def state
    self['STATE'].to_i
end

#state_strObject

Returns the state of the Virtual Network (string value)



372
373
374
# File 'lib/opennebula/virtual_network.rb', line 372

def state_str
    VN_STATES[state]
end

#unpublishObject

Unplubishes the VirtualNetwork



123
124
125
# File 'lib/opennebula/virtual_network.rb', line 123

def unpublish
    set_publish(false)
end

#update(new_template = nil, append = false) ⇒ nil, OpenNebula::Error

Replaces the template contents

Parameters:

  • new_template (String) (defaults to: nil)

    New template contents

  • append (true, false) (defaults to: false)

    True to append new attributes instead of replace the whole template

Returns:



113
114
115
# File 'lib/opennebula/virtual_network.rb', line 113

def update(new_template=nil, append=false)
    super(VN_METHODS[:update], new_template, append ? 1 : 0)
end

#update_ar(ar_template) ⇒ Object

Updates Address Ranges from the VirtualNetwork



189
190
191
192
193
194
195
196
# File 'lib/opennebula/virtual_network.rb', line 189

def update_ar(ar_template)
    return Error.new('ID not defined') if !@pe_id

    rc = @client.call(VN_METHODS[:update_ar], @pe_id, ar_template)
    rc = nil if !OpenNebula.is_error?(rc)

    return rc
end

#vm_idsObject

Returns three arrays with the numeric VM IDs for VMs updated, outdated (include updating) and error



383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
# File 'lib/opennebula/virtual_network.rb', line 383

def vm_ids
    updated = Array.new

    self.each('UPDATED_VMS/ID') do |id|
        updated << id.text.to_i
    end

    outdated = Array.new

    self.each('OUTDATED_VMS/ID') do |id|
        outdated << id.text.to_i
    end

    self.each('UPDATING_VMS/ID') do |id|
        outdated << id.text.to_i
    end

    error = Array.new

    self.each('ERROR_VMS/ID') do |id|
        error << id.text.to_i
    end

    [updated, outdated, error]
end

#vrouter_idsObject

Returns an array with the numeric virtual router ids



356
357
358
359
360
361
362
363
364
# File 'lib/opennebula/virtual_network.rb', line 356

def vrouter_ids
    array = Array.new

    self.each("VROUTERS/ID") do |id|
        array << id.text.to_i
    end

    return array
end