Class: Fog::Compute::Libvirt::Volume

Inherits:
Model
  • Object
show all
Includes:
Fog::Compute::LibvirtUtil
Defined in:
lib/fog/libvirt/models/compute/volume.rb

Instance Attribute Summary

Attributes inherited from Model

#collection, #connection

Instance Method Summary collapse

Methods included from Fog::Compute::LibvirtUtil

#document

Methods inherited from Model

#inspect, #reload, #to_json, #wait_for

Methods included from Attributes::ClassMethods

#_load, #aliases, #attribute, #attributes, #identity, #ignore_attributes, #ignored_attributes

Methods included from Attributes::InstanceMethods

#_dump, #attributes, #dup, #identity, #identity=, #merge_attributes, #new_record?, #requires, #requires_one

Constructor Details

#initialize(attributes = {}) ⇒ Volume

Can be created by passing in :xml => “<xml to create volume>” A volume always belongs to a pool, :pool_name => “<name of pool>”

[View source]

32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/fog/libvirt/models/compute/volume.rb', line 32

def initialize(attributes={} )
  self.xml  ||= nil unless attributes[:xml]
  self.key  = nil
  self.format_type ||= "raw" unless attributes[:format_type]
  extension = self.format_type=="raw" ? "img" : self.format_type
  self.name ||= "fog-#{SecureRandom.random_number*10E14.to_i.round}.#{extension}" unless attributes[:name]
  self.capacity ||= "10G" unless attributes[:capacity]
  self.allocation ||= "1G" unless attributes[:allocation]
  super

  #We need a connection to calculate the poolname
  #This is why we do this after super
  self.pool_name  ||= default_pool_name unless attributes[:pool_name]
end

Instance Method Details

#clone(name) ⇒ Object

Clones this volume to the name provided

[View source]

131
132
133
134
135
136
137
138
139
# File 'lib/fog/libvirt/models/compute/volume.rb', line 131

def clone(name)
  pool=@raw.pool
  xml = REXML::Document.new(self.xml)
  xml.root.elements['/volume/name'].text=name
  xml.root.elements['/volume/key'].text=name
  xml.delete_element('/volume/target/path')
  pool.create_volume_xml_from(xml.to_s,@raw)
  return connection.volumes.all(:name => name).first
end

#default_pool_nameObject

Try to guess the default/first pool of no pool_name was specificed

[View source]

48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/fog/libvirt/models/compute/volume.rb', line 48

def default_pool_name
  default_name="default"
  default_pool=@connection.pools.all(:name => default_name)

  if default_pool.nil?
    first_pool=@connection.pools.first
    if first_pool.nil?
      raise Fog::Errors::Error.new('We could not find a pool called "default" and there was no other pool defined')
    else
      default_name=first_pool.name
    end
  end
  return default_name
end

#destroyObject

Destroy a volume

[View source]

117
118
119
120
121
# File 'lib/fog/libvirt/models/compute/volume.rb', line 117

def destroy
  requires :raw
  raw.delete
  true
end

#saveObject

Takes a pool and either :xml or other settings

Raises:

[View source]

64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/fog/libvirt/models/compute/volume.rb', line 64

def save
  requires :pool_name

  raise Fog::Errors::Error.new('Resaving an existing volume may create a duplicate') if key

  xml=xml_from_template if xml.nil?

  begin
    volume=nil
    pool=connection.raw.lookup_storage_pool_by_name(pool_name)
    volume=pool.create_volume_xml(xml)
    self.raw=volume
    true
  rescue
    raise Fog::Errors::Error.new("Error creating volume: #{$!}")
    false
  end

end

#split_size_unit(text) ⇒ Object

[View source]

84
85
86
87
88
89
# File 'lib/fog/libvirt/models/compute/volume.rb', line 84

def split_size_unit(text)
  matcher=text.match(/(\d+)(.+)/)
  size=matcher[1]
  unit=matcher[2]
  return size , unit
end

#wipeObject

Wipes a volume , zeroes disk

[View source]

124
125
126
127
128
# File 'lib/fog/libvirt/models/compute/volume.rb', line 124

def wipe
  requires :raw
  raw.wipe
  true
end

#xml_from_templateObject

Create a valid xml for the volume based on the template

[View source]

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/fog/libvirt/models/compute/volume.rb', line 92

def xml_from_template

  allocation_size,allocation_unit=split_size_unit(self.allocation)
  capacity_size,capacity_unit=split_size_unit(self.capacity)

  template_options={
    :name => self.name,
    :format_type => self.format_type,
    :allocation_size => allocation_size,
    :allocation_unit => allocation_unit,
    :capacity_size => capacity_size,
    :capacity_unit => capacity_unit
  }

  # We only want specific variables for ERB
  vars = ErbBinding.new(template_options)
  template_path=File.join(File.dirname(__FILE__),"templates","volume.xml.erb")
  template=File.open(template_path).readlines.join
  erb = ERB.new(template)
  vars_binding = vars.send(:get_binding)
  result=erb.result(vars_binding)
  return result
end