fog-libvirt-csem 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CONTRIBUTORS.md +24 -0
- data/Gemfile +9 -0
- data/LICENSE.md +20 -0
- data/README.md +83 -0
- data/Rakefile +127 -0
- data/fog-libvirt-csem.gemspec +49 -0
- data/lib/fog/bin/libvirt.rb +58 -0
- data/lib/fog/libvirt/compute.rb +140 -0
- data/lib/fog/libvirt/models/compute/README.md +92 -0
- data/lib/fog/libvirt/models/compute/interface.rb +25 -0
- data/lib/fog/libvirt/models/compute/interfaces.rb +20 -0
- data/lib/fog/libvirt/models/compute/network.rb +33 -0
- data/lib/fog/libvirt/models/compute/networks.rb +20 -0
- data/lib/fog/libvirt/models/compute/nic.rb +50 -0
- data/lib/fog/libvirt/models/compute/nics.rb +12 -0
- data/lib/fog/libvirt/models/compute/node.rb +29 -0
- data/lib/fog/libvirt/models/compute/nodes.rb +20 -0
- data/lib/fog/libvirt/models/compute/pool.rb +84 -0
- data/lib/fog/libvirt/models/compute/pools.rb +20 -0
- data/lib/fog/libvirt/models/compute/server.rb +514 -0
- data/lib/fog/libvirt/models/compute/servers.rb +21 -0
- data/lib/fog/libvirt/models/compute/templates/network.xml.erb +6 -0
- data/lib/fog/libvirt/models/compute/templates/pool.xml.erb +6 -0
- data/lib/fog/libvirt/models/compute/templates/server.xml.erb +155 -0
- data/lib/fog/libvirt/models/compute/templates/volume.xml.erb +30 -0
- data/lib/fog/libvirt/models/compute/util/uri.rb +138 -0
- data/lib/fog/libvirt/models/compute/util/util.rb +32 -0
- data/lib/fog/libvirt/models/compute/volume.rb +129 -0
- data/lib/fog/libvirt/models/compute/volumes.rb +20 -0
- data/lib/fog/libvirt/requests/compute/clone_volume.rb +18 -0
- data/lib/fog/libvirt/requests/compute/create_domain.rb +17 -0
- data/lib/fog/libvirt/requests/compute/create_volume.rb +16 -0
- data/lib/fog/libvirt/requests/compute/define_domain.rb +17 -0
- data/lib/fog/libvirt/requests/compute/define_pool.rb +16 -0
- data/lib/fog/libvirt/requests/compute/destroy_interface.rb +18 -0
- data/lib/fog/libvirt/requests/compute/destroy_network.rb +17 -0
- data/lib/fog/libvirt/requests/compute/dhcp_leases.rb +37 -0
- data/lib/fog/libvirt/requests/compute/get_node_info.rb +37 -0
- data/lib/fog/libvirt/requests/compute/libversion.rb +18 -0
- data/lib/fog/libvirt/requests/compute/list_domains.rb +128 -0
- data/lib/fog/libvirt/requests/compute/list_interfaces.rb +57 -0
- data/lib/fog/libvirt/requests/compute/list_networks.rb +63 -0
- data/lib/fog/libvirt/requests/compute/list_pool_volumes.rb +19 -0
- data/lib/fog/libvirt/requests/compute/list_pools.rb +71 -0
- data/lib/fog/libvirt/requests/compute/list_volumes.rb +106 -0
- data/lib/fog/libvirt/requests/compute/mock_files/domain.xml +40 -0
- data/lib/fog/libvirt/requests/compute/pool_action.rb +19 -0
- data/lib/fog/libvirt/requests/compute/update_autostart.rb +18 -0
- data/lib/fog/libvirt/requests/compute/update_display.rb +36 -0
- data/lib/fog/libvirt/requests/compute/upload_volume.rb +31 -0
- data/lib/fog/libvirt/requests/compute/vm_action.rb +19 -0
- data/lib/fog/libvirt/requests/compute/volume_action.rb +18 -0
- data/lib/fog/libvirt/version.rb +5 -0
- data/lib/fog/libvirt.rb +16 -0
- data/minitests/server/server_test.rb +64 -0
- data/minitests/server/user_data_iso_test.rb +77 -0
- data/minitests/test_helper.rb +18 -0
- data/tests/helper.rb +17 -0
- data/tests/helpers/formats_helper.rb +100 -0
- data/tests/helpers/formats_helper_tests.rb +107 -0
- data/tests/helpers/mock_helper.rb +14 -0
- data/tests/helpers/succeeds_helper.rb +9 -0
- data/tests/libvirt/compute_tests.rb +19 -0
- data/tests/libvirt/models/compute/interface_tests.rb +27 -0
- data/tests/libvirt/models/compute/interfaces_tests.rb +14 -0
- data/tests/libvirt/models/compute/network_tests.rb +31 -0
- data/tests/libvirt/models/compute/networks_tests.rb +13 -0
- data/tests/libvirt/models/compute/nic_tests.rb +31 -0
- data/tests/libvirt/models/compute/nics_tests.rb +10 -0
- data/tests/libvirt/models/compute/pool_tests.rb +27 -0
- data/tests/libvirt/models/compute/pools_tests.rb +13 -0
- data/tests/libvirt/models/compute/server_tests.rb +63 -0
- data/tests/libvirt/models/compute/servers_tests.rb +14 -0
- data/tests/libvirt/models/compute/volume_tests.rb +38 -0
- data/tests/libvirt/models/compute/volumes_tests.rb +15 -0
- data/tests/libvirt/requests/compute/create_domain_tests.rb +21 -0
- data/tests/libvirt/requests/compute/define_domain_tests.rb +11 -0
- data/tests/libvirt/requests/compute/dhcp_leases_tests.rb +15 -0
- data/tests/libvirt/requests/compute/update_autostart_tests.rb +12 -0
- data/tests/libvirt/requests/compute/update_display.rb +13 -0
- metadata +335 -0
@@ -0,0 +1,155 @@
|
|
1
|
+
<domain type='<%= domain_type %>'>
|
2
|
+
<name><%= name %></name>
|
3
|
+
<memory><%= memory_size %></memory>
|
4
|
+
<% if hugepages -%>
|
5
|
+
<memoryBacking>
|
6
|
+
<hugepages/>
|
7
|
+
</memoryBacking>
|
8
|
+
<% end -%>
|
9
|
+
<vcpu><%= cpus %></vcpu>
|
10
|
+
<os>
|
11
|
+
<type arch='<%= arch %>'><%= os_type %></type>
|
12
|
+
<% boot_order.each do |dev| -%>
|
13
|
+
<boot dev='<%= dev %>'/>
|
14
|
+
<% end -%>
|
15
|
+
</os>
|
16
|
+
<features>
|
17
|
+
<acpi/>
|
18
|
+
<apic/>
|
19
|
+
<pae/>
|
20
|
+
</features>
|
21
|
+
<% if !cpu.empty? -%>
|
22
|
+
<% if cpu[:mode] -%>
|
23
|
+
<cpu mode='<%= cpu[:mode] %>'>
|
24
|
+
<% else -%>
|
25
|
+
<cpu>
|
26
|
+
<% end -%>
|
27
|
+
<%
|
28
|
+
fallback = 'allow'
|
29
|
+
model = ''
|
30
|
+
if cpu[:model]
|
31
|
+
fallback = cpu[:model][:fallback] if cpu[:model][:fallback]
|
32
|
+
model = cpu[:model][:name] if cpu[:model][:name]
|
33
|
+
end
|
34
|
+
-%>
|
35
|
+
<model fallback='<%= fallback %>'><%= model %></model>
|
36
|
+
</cpu>
|
37
|
+
<% end -%>
|
38
|
+
<clock offset='utc'/>
|
39
|
+
<devices>
|
40
|
+
<% args = {}
|
41
|
+
if File.file?('/etc/foreman/ceph.conf')
|
42
|
+
File.readlines('/etc/foreman/ceph.conf').each do |line|
|
43
|
+
pair = line.strip.split("=")
|
44
|
+
key = pair[0]
|
45
|
+
value = pair[1]
|
46
|
+
args[key] = value
|
47
|
+
end
|
48
|
+
end
|
49
|
+
%>
|
50
|
+
<% volumes.each do |vol| -%>
|
51
|
+
<% if File.file?('/etc/foreman/ceph.conf') && vol.pool_name.include?(args["libvirt_ceph_pool"]) %>
|
52
|
+
<disk type='network' device='disk'>
|
53
|
+
<driver name='qemu' type='<%= vol.format_type %>' cache='writeback' discard='unmap'/>
|
54
|
+
<source protocol='rbd' name='<%= vol.path %>'>
|
55
|
+
<% if args.key?("monitor") -%>
|
56
|
+
<% args["monitor"].split(",").each do |mon| %>
|
57
|
+
<host name='<%= mon %>' port='<%= args["port"] %>'/>
|
58
|
+
<% end %>
|
59
|
+
<% end %>
|
60
|
+
</source>
|
61
|
+
<auth username='<%= args["auth_username"] %>'>
|
62
|
+
<% if args.key?("auth_uuid") -%>
|
63
|
+
<secret type='ceph' uuid='<%= args["auth_uuid"] %>'/>
|
64
|
+
<% else -%>
|
65
|
+
<secret type='ceph' usage='<%= args["auth_usage"] %>'/>
|
66
|
+
<% end -%>
|
67
|
+
</auth>
|
68
|
+
<% if args['bus_type'] == 'virtio' %>
|
69
|
+
<target dev='vd<%= ('a'..'z').to_a[volumes.index(vol)] %>' bus='virtio'/>
|
70
|
+
<% else %>
|
71
|
+
<target dev='sd<%= ('a'..'z').to_a[volumes.index(vol)] %>' bus='scsi'/>
|
72
|
+
<% end %>
|
73
|
+
</disk>
|
74
|
+
<% else %>
|
75
|
+
<disk type='file' device='disk'>
|
76
|
+
<driver name='qemu' type='<%= vol.format_type %>'/>
|
77
|
+
<source file='<%= vol.path %>'/>
|
78
|
+
<%# we need to ensure a unique target dev -%>
|
79
|
+
<target dev='vd<%= ('a'..'z').to_a[volumes.index(vol)] %>' bus='virtio'/>
|
80
|
+
</disk>
|
81
|
+
<% end %>
|
82
|
+
<% end -%>
|
83
|
+
<% if iso_file -%>
|
84
|
+
<disk type='file' device='cdrom'>
|
85
|
+
<driver name='qemu' type='raw'/>
|
86
|
+
<source file='<%= "#{iso_dir}/#{iso_file}" %>'/>
|
87
|
+
<target dev='hdc' bus='ide'/>
|
88
|
+
<readonly/>
|
89
|
+
<address type='drive' controller='0' bus='1' unit='0'/>
|
90
|
+
</disk>
|
91
|
+
<% end -%>
|
92
|
+
<% nics.each do |nic| -%>
|
93
|
+
<interface type='<%= nic.type %>'>
|
94
|
+
<source <%= nic.type == 'bridge' ? "bridge='#{nic.bridge}'" : "network='#{nic.network}'" %> />
|
95
|
+
<model type='<%= nic.model %>'/>
|
96
|
+
</interface>
|
97
|
+
<% end -%>
|
98
|
+
<% if guest_agent -%>
|
99
|
+
<channel type='unix'>
|
100
|
+
<target type='virtio' name='org.qemu.guest_agent.0'/>
|
101
|
+
</channel>
|
102
|
+
<% end -%>
|
103
|
+
<rng model='virtio'>
|
104
|
+
<%
|
105
|
+
rng_backend_model = virtio_rng[:backend_model] ? virtio_rng[:backend_model] : 'random'
|
106
|
+
-%>
|
107
|
+
<% if virtio_rng[:backend_path] -%>
|
108
|
+
<backend model='<%= rng_backend_model %>'><%= virtio_rng[:backend_path] %></backend>
|
109
|
+
<% else -%>
|
110
|
+
<backend model='<%= rng_backend_model %>'/>
|
111
|
+
<% end -%>
|
112
|
+
</rng>
|
113
|
+
<% if arch == "s390x" -%>
|
114
|
+
<controller type="scsi" index="0" model="virtio-scsi"/>
|
115
|
+
<console type="pty">
|
116
|
+
<target type="sclp"/>
|
117
|
+
</console>
|
118
|
+
<memballoon model="virtio"/>
|
119
|
+
<% else -%>
|
120
|
+
<serial type='pty'>
|
121
|
+
<target port='0'/>
|
122
|
+
</serial>
|
123
|
+
<console type='pty'>
|
124
|
+
<target port='0'/>
|
125
|
+
</console>
|
126
|
+
<input type='tablet' bus='usb'/>
|
127
|
+
<input type='mouse' bus='ps2'/>
|
128
|
+
<% end -%>
|
129
|
+
<%
|
130
|
+
display_type = display[:type]
|
131
|
+
|
132
|
+
if display[:port].empty?
|
133
|
+
display_port = display[:port]
|
134
|
+
autoport = 'no'
|
135
|
+
else
|
136
|
+
display_port = '-1'
|
137
|
+
autoport = 'yes'
|
138
|
+
end
|
139
|
+
|
140
|
+
unless display[:listen].empty?
|
141
|
+
display_listen = "listen='#{display[:listen]}'"
|
142
|
+
end
|
143
|
+
|
144
|
+
unless display[:password].empty?
|
145
|
+
display_password = "passwd='#{display[:password]}'"
|
146
|
+
end
|
147
|
+
-%>
|
148
|
+
<% if arch != "s390x" -%>
|
149
|
+
<graphics type='<%= display_type %>' port='<%= display_port %>' autoport='<%= autoport %>' <%= display_listen %> <%= display_password %> />
|
150
|
+
<video>
|
151
|
+
<model type='cirrus' vram='9216' heads='1'/>
|
152
|
+
</video>
|
153
|
+
<% end -%>
|
154
|
+
</devices>
|
155
|
+
</domain>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<volume>
|
2
|
+
<name><%= name %></name>
|
3
|
+
<allocation unit="<%= split_size_unit(allocation)[1] %>"><%= split_size_unit(allocation)[0] %></allocation>
|
4
|
+
<capacity unit="<%= split_size_unit(capacity)[1] %>"><%= split_size_unit(capacity)[0] %></capacity>
|
5
|
+
<target>
|
6
|
+
<format type="<%= format_type %>"/>
|
7
|
+
<permissions>
|
8
|
+
<% if owner -%>
|
9
|
+
<owner><%= owner %></owner>
|
10
|
+
<% end -%>
|
11
|
+
<% if group -%>
|
12
|
+
<group><%= group %></group>
|
13
|
+
<% end -%>
|
14
|
+
<mode>0744</mode>
|
15
|
+
<label>virt_image_t</label>
|
16
|
+
</permissions>
|
17
|
+
</target>
|
18
|
+
<% if backing_volume -%>
|
19
|
+
<backingStore>
|
20
|
+
<path><%= backing_volume.path %></path>
|
21
|
+
<format type="<%= backing_volume.format_type %>"/>
|
22
|
+
<permissions>
|
23
|
+
<owner><%= owner %></owner>
|
24
|
+
<group><%= group %></group>
|
25
|
+
<mode>0744</mode>
|
26
|
+
<label>virt_image_t</label>
|
27
|
+
</permissions>
|
28
|
+
</backingStore>
|
29
|
+
<% end -%>
|
30
|
+
</volume>
|
@@ -0,0 +1,138 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'cgi'
|
3
|
+
|
4
|
+
module Fog
|
5
|
+
module Libvirt
|
6
|
+
module Util
|
7
|
+
class URI
|
8
|
+
attr_reader :uri
|
9
|
+
|
10
|
+
def initialize(uri)
|
11
|
+
@parsed_uri=::URI.parse(uri)
|
12
|
+
@uri=uri
|
13
|
+
return self
|
14
|
+
end
|
15
|
+
|
16
|
+
# Transport will be part of the scheme
|
17
|
+
# The part after the plus sign
|
18
|
+
# f.i. qemu+ssh
|
19
|
+
def transport
|
20
|
+
scheme=@parsed_uri.scheme
|
21
|
+
return nil if scheme.nil?
|
22
|
+
|
23
|
+
return scheme.split(/\+/)[1]
|
24
|
+
end
|
25
|
+
|
26
|
+
def scheme
|
27
|
+
return @parsed_uri.scheme
|
28
|
+
end
|
29
|
+
|
30
|
+
def driver
|
31
|
+
scheme=@parsed_uri.scheme
|
32
|
+
return nil if scheme.nil?
|
33
|
+
|
34
|
+
return scheme.split(/\+/).first
|
35
|
+
end
|
36
|
+
|
37
|
+
def ssh_enabled?
|
38
|
+
if remote?
|
39
|
+
return transport.include?("ssh")
|
40
|
+
else
|
41
|
+
return false
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def remote?
|
46
|
+
return !transport.nil?
|
47
|
+
end
|
48
|
+
|
49
|
+
def user
|
50
|
+
@parsed_uri.user
|
51
|
+
end
|
52
|
+
|
53
|
+
def host
|
54
|
+
@parsed_uri.host
|
55
|
+
end
|
56
|
+
|
57
|
+
def port
|
58
|
+
@parsed_uri.port
|
59
|
+
end
|
60
|
+
|
61
|
+
def password
|
62
|
+
@parsed_uri.password
|
63
|
+
end
|
64
|
+
|
65
|
+
def name
|
66
|
+
value("name")
|
67
|
+
end
|
68
|
+
|
69
|
+
def command
|
70
|
+
value("command")
|
71
|
+
end
|
72
|
+
|
73
|
+
def socket
|
74
|
+
value("socket")
|
75
|
+
end
|
76
|
+
|
77
|
+
def keyfile
|
78
|
+
value("keyfile")
|
79
|
+
end
|
80
|
+
|
81
|
+
def netcat
|
82
|
+
value("netcat")
|
83
|
+
end
|
84
|
+
|
85
|
+
def no_verify?
|
86
|
+
no_verify=value("no_verify")
|
87
|
+
return false if no_verify.nil?
|
88
|
+
|
89
|
+
if no_verify.to_s=="0"
|
90
|
+
return false
|
91
|
+
else
|
92
|
+
return true
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def verify?
|
97
|
+
return !no_verify?
|
98
|
+
end
|
99
|
+
|
100
|
+
def no_tty?
|
101
|
+
no_tty=value("no_tty")
|
102
|
+
|
103
|
+
return false if no_tty.nil?
|
104
|
+
|
105
|
+
if no_tty=="0"
|
106
|
+
return false
|
107
|
+
else
|
108
|
+
return true
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def tty?
|
113
|
+
return !no_tty?
|
114
|
+
end
|
115
|
+
|
116
|
+
def pkipath
|
117
|
+
value("pkipath")
|
118
|
+
end
|
119
|
+
|
120
|
+
# A libvirt URI allows you to specify extra params
|
121
|
+
# http://libvirt.org/remote.html
|
122
|
+
private
|
123
|
+
def value(name)
|
124
|
+
unless @parsed_uri.query.nil?
|
125
|
+
params=CGI.parse(@parsed_uri.query)
|
126
|
+
if params.key?(name)
|
127
|
+
return params[name].first
|
128
|
+
else
|
129
|
+
return nil
|
130
|
+
end
|
131
|
+
else
|
132
|
+
return nil
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
require 'erb'
|
3
|
+
require 'ostruct'
|
4
|
+
require 'securerandom'
|
5
|
+
|
6
|
+
module Fog
|
7
|
+
module Libvirt
|
8
|
+
module Util
|
9
|
+
def xml_element(xml, path, attribute=nil)
|
10
|
+
xml = Nokogiri::XML(xml)
|
11
|
+
attribute.nil? ? (xml/path).first.text : (xml/path).first[attribute.to_sym]
|
12
|
+
end
|
13
|
+
|
14
|
+
def xml_elements(xml, path, attribute=nil)
|
15
|
+
xml = Nokogiri::XML(xml)
|
16
|
+
attribute.nil? ? (xml/path).map : (xml/path).map{|element| element[attribute.to_sym]}
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_xml template_name = nil
|
20
|
+
# figure out our ERB template filename
|
21
|
+
erb = template_name || self.class.to_s.split("::").last.downcase
|
22
|
+
path = File.join(File.dirname(__FILE__), "..", "templates", "#{erb}.xml.erb")
|
23
|
+
template = File.read(path)
|
24
|
+
ERB.new(template, nil, '-').result(binding)
|
25
|
+
end
|
26
|
+
|
27
|
+
def randomized_name
|
28
|
+
"fog-#{(SecureRandom.random_number*10E14).to_i.round}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require 'fog/core/model'
|
2
|
+
require 'fog/libvirt/models/compute/util/util'
|
3
|
+
|
4
|
+
module Fog
|
5
|
+
module Libvirt
|
6
|
+
class Compute
|
7
|
+
class Volume < Fog::Model
|
8
|
+
attr_reader :xml
|
9
|
+
include Fog::Libvirt::Util
|
10
|
+
|
11
|
+
identity :id, :aliases => 'key'
|
12
|
+
|
13
|
+
attribute :pool_name
|
14
|
+
attribute :key
|
15
|
+
attribute :name
|
16
|
+
attribute :path
|
17
|
+
attribute :capacity
|
18
|
+
attribute :allocation
|
19
|
+
attribute :owner
|
20
|
+
attribute :group
|
21
|
+
attribute :format_type
|
22
|
+
attribute :backing_volume
|
23
|
+
|
24
|
+
# Can be created by passing in :xml => "<xml to create volume>"
|
25
|
+
# A volume always belongs to a pool, :pool_name => "<name of pool>"
|
26
|
+
#
|
27
|
+
def initialize(attributes={ })
|
28
|
+
@xml = attributes.delete(:xml)
|
29
|
+
super(defaults.merge(attributes))
|
30
|
+
|
31
|
+
# We need a connection to calculate the pool_name
|
32
|
+
# This is why we do this after super
|
33
|
+
self.pool_name ||= default_pool_name
|
34
|
+
end
|
35
|
+
|
36
|
+
# Takes a pool and either :xml or other settings
|
37
|
+
def save
|
38
|
+
requires :pool_name
|
39
|
+
|
40
|
+
raise Fog::Errors::Error.new('Reserving an existing volume may create a duplicate') if key
|
41
|
+
@xml ||= to_xml
|
42
|
+
self.path = service.create_volume(pool_name, xml).path
|
43
|
+
end
|
44
|
+
|
45
|
+
# Destroy a volume
|
46
|
+
def destroy
|
47
|
+
service.volume_action key, :delete
|
48
|
+
end
|
49
|
+
|
50
|
+
# Wipes a volume , zeroes disk
|
51
|
+
def wipe
|
52
|
+
service.volume_action key, :wipe
|
53
|
+
end
|
54
|
+
|
55
|
+
# Clones this volume to the name provided
|
56
|
+
def clone(name)
|
57
|
+
new_volume = self.dup
|
58
|
+
new_volume.key = nil
|
59
|
+
new_volume.name = name
|
60
|
+
new_volume.save
|
61
|
+
|
62
|
+
new_volume.reload
|
63
|
+
end
|
64
|
+
|
65
|
+
def clone_volume(new_name)
|
66
|
+
requires :pool_name
|
67
|
+
|
68
|
+
new_volume = self.dup
|
69
|
+
new_volume.key = nil
|
70
|
+
new_volume.name = new_name
|
71
|
+
new_volume.path = service.clone_volume(pool_name, new_volume.to_xml, self.name).path
|
72
|
+
|
73
|
+
new_volume.reload
|
74
|
+
end
|
75
|
+
|
76
|
+
def upload_image(file_path)
|
77
|
+
requires :pool_name
|
78
|
+
service.upload_volume(pool_name, name, file_path)
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
def image_suffix
|
84
|
+
return "img" if format_type == "raw"
|
85
|
+
format_type
|
86
|
+
end
|
87
|
+
|
88
|
+
def randominzed_name
|
89
|
+
"#{super}.#{image_suffix}"
|
90
|
+
end
|
91
|
+
|
92
|
+
# Try to guess the default/first pool of no pool_name was specified
|
93
|
+
def default_pool_name
|
94
|
+
name = "default"
|
95
|
+
return name unless (service.pools.all(:name => name)).empty?
|
96
|
+
|
97
|
+
# we default to the first pool we find.
|
98
|
+
first_pool = service.pools.first
|
99
|
+
|
100
|
+
raise Fog::Errors::Error.new('No storage pools are defined') unless first_pool
|
101
|
+
first_pool.name
|
102
|
+
end
|
103
|
+
|
104
|
+
def defaults
|
105
|
+
{
|
106
|
+
:persistent => true,
|
107
|
+
:format_type => "raw",
|
108
|
+
:name => randomized_name,
|
109
|
+
:capacity => "10G",
|
110
|
+
:allocation => "1G",
|
111
|
+
:owner => nil,
|
112
|
+
:group => nil,
|
113
|
+
}
|
114
|
+
end
|
115
|
+
|
116
|
+
def split_size_unit(text)
|
117
|
+
if (text.kind_of? String) && (matcher = text.match(/(\d+)(.+)/))
|
118
|
+
size = matcher[1]
|
119
|
+
unit = matcher[2]
|
120
|
+
else
|
121
|
+
size = text.to_i
|
122
|
+
unit = "G"
|
123
|
+
end
|
124
|
+
[size, unit]
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'fog/core/collection'
|
2
|
+
require 'fog/libvirt/models/compute/volume'
|
3
|
+
|
4
|
+
module Fog
|
5
|
+
module Libvirt
|
6
|
+
class Compute
|
7
|
+
class Volumes < Fog::Collection
|
8
|
+
model Fog::Libvirt::Compute::Volume
|
9
|
+
|
10
|
+
def all(filter = {})
|
11
|
+
load(service.list_volumes(filter))
|
12
|
+
end
|
13
|
+
|
14
|
+
def get(key)
|
15
|
+
self.all(:key => key).first
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Fog
|
2
|
+
module Libvirt
|
3
|
+
class Compute
|
4
|
+
class Real
|
5
|
+
def clone_volume (pool_name, xml, name)
|
6
|
+
vol = client.lookup_storage_pool_by_name(pool_name).lookup_volume_by_name(name)
|
7
|
+
client.lookup_storage_pool_by_name(pool_name).create_vol_xml_from(xml, vol)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class Mock
|
12
|
+
def clone_volume(pool_name, xml, name)
|
13
|
+
Fog::Libvirt::Compute::Volume.new({:pool_name => pool_name, :xml => xml})
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Fog
|
2
|
+
module Libvirt
|
3
|
+
class Compute
|
4
|
+
class Real
|
5
|
+
def create_volume(pool_name, xml)
|
6
|
+
client.lookup_storage_pool_by_name(pool_name).create_vol_xml(xml)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class Mock
|
11
|
+
def create_volume(pool_name, xml)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Fog
|
2
|
+
module Libvirt
|
3
|
+
class Compute
|
4
|
+
class Real
|
5
|
+
#shutdown the interface
|
6
|
+
def destroy_interface(uuid)
|
7
|
+
client.lookup_interface_by_uuid(uuid).destroy
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class Mock
|
12
|
+
def destroy_interface(uuid)
|
13
|
+
true
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'socket'
|
2
|
+
|
3
|
+
module Fog
|
4
|
+
module Libvirt
|
5
|
+
class Compute
|
6
|
+
class Real
|
7
|
+
def dhcp_leases(uuid, mac, flags = 0)
|
8
|
+
client.lookup_network_by_uuid(uuid).dhcp_leases(mac, flags)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class Mock
|
13
|
+
def dhcp_leases(uuid, mac, flags = 0)
|
14
|
+
leases1 = {
|
15
|
+
'aa:bb:cc:dd:ee:ff' => [
|
16
|
+
{ 'type' => Socket::AF_INET, 'ipaddr' => '1.2.3.4', 'prefix' => 24, 'expirytime' => 5000 },
|
17
|
+
{ 'type' => Socket::AF_INET, 'ipaddr' => '1.2.5.6', 'prefix' => 24, 'expirytime' => 5005 }
|
18
|
+
]
|
19
|
+
}
|
20
|
+
leases2 = {
|
21
|
+
'99:88:77:66:55:44' => [
|
22
|
+
{ 'type' => Socket::AF_INET, 'ipaddr' => '10.1.1.5', 'prefix' => 24, 'expirytime' => 50 }
|
23
|
+
]
|
24
|
+
}
|
25
|
+
networks = {
|
26
|
+
# should match mock net uuid from list_networks.rb
|
27
|
+
'a29146ea-39b2-412d-8f53-239eef117a32' => leases1,
|
28
|
+
'fbd4ac68-cbea-4f95-86ed-22953fd92384' => leases2
|
29
|
+
}
|
30
|
+
if !networks[uuid].nil?
|
31
|
+
return networks[uuid][mac]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|