Class: OpenNebula::Host

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

Direct Known Subclasses

VCenterDriver::VCenterHost

Constant Summary collapse

HOST_METHODS =

Constants and Class Methods

{
    :info       => "host.info",
    :allocate   => "host.allocate",
    :delete     => "host.delete",
    :status     => "host.status",
    :update     => "host.update",
    :monitoring => "host.monitoring",
    :rename     => "host.rename"
}
HOST_STATES =
%w{INIT MONITORING_MONITORED MONITORED ERROR DISABLED
MONITORING_ERROR MONITORING_INIT MONITORING_DISABLED OFFLINE}
SHORT_HOST_STATES =
{
    "INIT"                 => "init",
    "MONITORING_MONITORED" => "update",
    "MONITORED"            => "on",
    "ERROR"                => "err",
    "DISABLED"             => "dsbl",
    "MONITORING_ERROR"     => "retry",
    "MONITORING_INIT"      => "init",
    "MONITORING_DISABLED"  => "dsbl",
    "OFFLINE"              => "off"
}
HOST_STATUS =
{
    "ENABLED"  => 0,
    "DISABLED" => 1,
    "OFFLINE"  => 2
}

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from PoolElement

#id, #name, new_with_id, #to_str

Methods inherited from XMLElement

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

Constructor Details

#initialize(xml, client) ⇒ Host

Class constructor



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

def initialize(xml, client)
    super(xml,client)

    @client = client
    @pe_id  = self['ID'].to_i if self['ID']
end

Class Method Details

.build_xml(pe_id = nil) ⇒ Object

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

Example:

host = Host.new(Host.build_xml(3),rpc_client)


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

def Host.build_xml(pe_id=nil)
    if pe_id
        host_xml = "<HOST><ID>#{pe_id}</ID></HOST>"
    else
        host_xml = "<HOST></HOST>"
    end

    XMLElement.build_xml(host_xml, 'HOST')
end

Instance Method Details

#allocate(hostname, im, vmm, cluster_id = ClusterPool::NONE_CLUSTER_ID) ⇒ Integer, OpenNebula::Error

Allocates a new Host in OpenNebula

Parameters:

  • hostname (String)

    Name of the new Host.

  • im (String)

    Name of the im_driver (information/monitoring)

  • vmm (String)

    Name of the vmm_driver (hypervisor)

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

    Id of the cluster, -1 to use default

Returns:



103
104
105
# File 'lib/opennebula/host.rb', line 103

def allocate(hostname, im, vmm, cluster_id=ClusterPool::NONE_CLUSTER_ID)
    super(HOST_METHODS[:allocate], hostname, im, vmm, cluster_id)
end

#deleteObject

Deletes the Host



108
109
110
# File 'lib/opennebula/host.rb', line 108

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

#disableObject

Disables the Host



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

def disable()
    set_status("DISABLED")
end

#enableObject

Enables the Host



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

def enable()
    set_status("ENABLED")
end

#flushObject



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/opennebula/host.rb', line 127

def flush()
    self.disable

    vm_pool = OpenNebula::VirtualMachinePool.new(@client,
                                        VirtualMachinePool::INFO_ALL_VM)

    rc = vm_pool.info
    if OpenNebula.is_error?(rc)
         puts rc.message
         exit -1
    end

    vm_pool.each do |vm|
        hid = vm['HISTORY_RECORDS/HISTORY[last()]/HID']
        if hid == self['ID']
            vm.resched
        end
    end
end

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

Imports a wild VM from the host and puts it in running state

Parameters:

  • name (String)

    Name of the VM to import

Returns:



208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
# File 'lib/opennebula/host.rb', line 208

def import_wild(name)
    vms = importable_wilds.select {|vm| vm['VM_NAME'] == name }

    if vms.length == 0
        return OpenNebula::Error.new("No importable wilds with name " <<
            "'#{name}' found.")
    elsif vms.length > 1
        return OpenNebula::Error.new("More than one importable wild " <<
            "with name '#{name}' found.")
    end

    wild = vms.first

    template = Base64.decode64(wild['IMPORT_TEMPLATE'])

    xml = OpenNebula::VirtualMachine.build_xml
    vm = OpenNebula::VirtualMachine.new(xml, @client)

    rc = vm.allocate(template)

    return rc if OpenNebula.is_error?(rc)

    vm.deploy(id, false)
    return vm.id
end

#importable_wildsObject

Get importable wild VMs in the host



265
266
267
# File 'lib/opennebula/host.rb', line 265

def importable_wilds
    wilds.select {|w| Hash === w && w['IMPORT_TEMPLATE'] }
end

#infoObject Also known as: info!

Retrieves the information of the given Host.



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

def info()
    super(HOST_METHODS[:info], 'HOST')
end

#monitoring(xpath_expressions) ⇒ Hash<String, Array<Array<int>>>, OpenNebula::Error

Retrieves this Host’s monitoring data from OpenNebula

Examples:

host.monitoring( ['HOST_SHARE/FREE_CPU', 'HOST_SHARE/RUNNING_VMS'] )

{ "HOST_SHARE/RUNNING_VMS" =>
    [["1337266000", "1"],
     ["1337266044", "1"],
     ["1337266088", "3"]],
  "HOST_SHARE/FREE_CPU" =>
    [["1337266000", "800"],
     ["1337266044", "800"],
     ["1337266088", "800"]]
}

Parameters:

  • xpath_expressions (Array<String>)

    Elements to retrieve.

Returns:

  • (Hash<String, Array<Array<int>>>, OpenNebula::Error)

    Hash with the requested xpath expressions, and an Array of ‘timestamp, value’.



178
179
180
181
# File 'lib/opennebula/host.rb', line 178

def monitoring(xpath_expressions)
    return super(HOST_METHODS[:monitoring], 'HOST',
        'LAST_MON_TIME', xpath_expressions)
end

#monitoring_xmlString

Retrieves this Host’s monitoring data from OpenNebula, in XML

Returns:

  • (String)

    Monitoring data, in XML



186
187
188
189
190
# File 'lib/opennebula/host.rb', line 186

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

    return @client.call(HOST_METHODS[:monitoring], @pe_id)
end

#offlineObject

Sets the Host offline



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

def offline()
    set_status("OFFLINE")
end

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

Renames this Host

Parameters:

  • name (String)

    New name for the Host.

Returns:



198
199
200
# File 'lib/opennebula/host.rb', line 198

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

#short_state_strObject

Returns the state of the Host (string value)



249
250
251
# File 'lib/opennebula/host.rb', line 249

def short_state_str
    SHORT_HOST_STATES[state_str]
end

#stateObject

Returns the state of the Host (numeric value)



239
240
241
# File 'lib/opennebula/host.rb', line 239

def state
    self['STATE'].to_i
end

#state_strObject

Returns the state of the Host (string value)



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

def state_str
    HOST_STATES[state]
end

#template_str(indent = true) ⇒ Object

Returns the <TEMPLATE> element in text form

indent

Boolean indents the resulting string, default true



255
256
257
# File 'lib/opennebula/host.rb', line 255

def template_str(indent=true)
    template_like_str('TEMPLATE', indent)
end

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

Replaces the template contents

Parameters:

  • new_template (String)

    New template contents

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

    True to append new attributes instead of replace the whole template

Returns:



155
156
157
# File 'lib/opennebula/host.rb', line 155

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

#wildsObject

Get wild VMs in the host



260
261
262
# File 'lib/opennebula/host.rb', line 260

def wilds
    [self.to_hash['HOST']['TEMPLATE']['VM']].flatten.compact
end