fog-libvirt-csem 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTORS.md +24 -0
  3. data/Gemfile +9 -0
  4. data/LICENSE.md +20 -0
  5. data/README.md +83 -0
  6. data/Rakefile +127 -0
  7. data/fog-libvirt-csem.gemspec +49 -0
  8. data/lib/fog/bin/libvirt.rb +58 -0
  9. data/lib/fog/libvirt/compute.rb +140 -0
  10. data/lib/fog/libvirt/models/compute/README.md +92 -0
  11. data/lib/fog/libvirt/models/compute/interface.rb +25 -0
  12. data/lib/fog/libvirt/models/compute/interfaces.rb +20 -0
  13. data/lib/fog/libvirt/models/compute/network.rb +33 -0
  14. data/lib/fog/libvirt/models/compute/networks.rb +20 -0
  15. data/lib/fog/libvirt/models/compute/nic.rb +50 -0
  16. data/lib/fog/libvirt/models/compute/nics.rb +12 -0
  17. data/lib/fog/libvirt/models/compute/node.rb +29 -0
  18. data/lib/fog/libvirt/models/compute/nodes.rb +20 -0
  19. data/lib/fog/libvirt/models/compute/pool.rb +84 -0
  20. data/lib/fog/libvirt/models/compute/pools.rb +20 -0
  21. data/lib/fog/libvirt/models/compute/server.rb +514 -0
  22. data/lib/fog/libvirt/models/compute/servers.rb +21 -0
  23. data/lib/fog/libvirt/models/compute/templates/network.xml.erb +6 -0
  24. data/lib/fog/libvirt/models/compute/templates/pool.xml.erb +6 -0
  25. data/lib/fog/libvirt/models/compute/templates/server.xml.erb +155 -0
  26. data/lib/fog/libvirt/models/compute/templates/volume.xml.erb +30 -0
  27. data/lib/fog/libvirt/models/compute/util/uri.rb +138 -0
  28. data/lib/fog/libvirt/models/compute/util/util.rb +32 -0
  29. data/lib/fog/libvirt/models/compute/volume.rb +129 -0
  30. data/lib/fog/libvirt/models/compute/volumes.rb +20 -0
  31. data/lib/fog/libvirt/requests/compute/clone_volume.rb +18 -0
  32. data/lib/fog/libvirt/requests/compute/create_domain.rb +17 -0
  33. data/lib/fog/libvirt/requests/compute/create_volume.rb +16 -0
  34. data/lib/fog/libvirt/requests/compute/define_domain.rb +17 -0
  35. data/lib/fog/libvirt/requests/compute/define_pool.rb +16 -0
  36. data/lib/fog/libvirt/requests/compute/destroy_interface.rb +18 -0
  37. data/lib/fog/libvirt/requests/compute/destroy_network.rb +17 -0
  38. data/lib/fog/libvirt/requests/compute/dhcp_leases.rb +37 -0
  39. data/lib/fog/libvirt/requests/compute/get_node_info.rb +37 -0
  40. data/lib/fog/libvirt/requests/compute/libversion.rb +18 -0
  41. data/lib/fog/libvirt/requests/compute/list_domains.rb +128 -0
  42. data/lib/fog/libvirt/requests/compute/list_interfaces.rb +57 -0
  43. data/lib/fog/libvirt/requests/compute/list_networks.rb +63 -0
  44. data/lib/fog/libvirt/requests/compute/list_pool_volumes.rb +19 -0
  45. data/lib/fog/libvirt/requests/compute/list_pools.rb +71 -0
  46. data/lib/fog/libvirt/requests/compute/list_volumes.rb +106 -0
  47. data/lib/fog/libvirt/requests/compute/mock_files/domain.xml +40 -0
  48. data/lib/fog/libvirt/requests/compute/pool_action.rb +19 -0
  49. data/lib/fog/libvirt/requests/compute/update_autostart.rb +18 -0
  50. data/lib/fog/libvirt/requests/compute/update_display.rb +36 -0
  51. data/lib/fog/libvirt/requests/compute/upload_volume.rb +31 -0
  52. data/lib/fog/libvirt/requests/compute/vm_action.rb +19 -0
  53. data/lib/fog/libvirt/requests/compute/volume_action.rb +18 -0
  54. data/lib/fog/libvirt/version.rb +5 -0
  55. data/lib/fog/libvirt.rb +16 -0
  56. data/minitests/server/server_test.rb +64 -0
  57. data/minitests/server/user_data_iso_test.rb +77 -0
  58. data/minitests/test_helper.rb +18 -0
  59. data/tests/helper.rb +17 -0
  60. data/tests/helpers/formats_helper.rb +100 -0
  61. data/tests/helpers/formats_helper_tests.rb +107 -0
  62. data/tests/helpers/mock_helper.rb +14 -0
  63. data/tests/helpers/succeeds_helper.rb +9 -0
  64. data/tests/libvirt/compute_tests.rb +19 -0
  65. data/tests/libvirt/models/compute/interface_tests.rb +27 -0
  66. data/tests/libvirt/models/compute/interfaces_tests.rb +14 -0
  67. data/tests/libvirt/models/compute/network_tests.rb +31 -0
  68. data/tests/libvirt/models/compute/networks_tests.rb +13 -0
  69. data/tests/libvirt/models/compute/nic_tests.rb +31 -0
  70. data/tests/libvirt/models/compute/nics_tests.rb +10 -0
  71. data/tests/libvirt/models/compute/pool_tests.rb +27 -0
  72. data/tests/libvirt/models/compute/pools_tests.rb +13 -0
  73. data/tests/libvirt/models/compute/server_tests.rb +63 -0
  74. data/tests/libvirt/models/compute/servers_tests.rb +14 -0
  75. data/tests/libvirt/models/compute/volume_tests.rb +38 -0
  76. data/tests/libvirt/models/compute/volumes_tests.rb +15 -0
  77. data/tests/libvirt/requests/compute/create_domain_tests.rb +21 -0
  78. data/tests/libvirt/requests/compute/define_domain_tests.rb +11 -0
  79. data/tests/libvirt/requests/compute/dhcp_leases_tests.rb +15 -0
  80. data/tests/libvirt/requests/compute/update_autostart_tests.rb +12 -0
  81. data/tests/libvirt/requests/compute/update_display.rb +13 -0
  82. metadata +335 -0
@@ -0,0 +1,37 @@
1
+ module Fog
2
+ module Libvirt
3
+ class Compute
4
+ class Real
5
+ def get_node_info
6
+ node_hash = Hash.new
7
+ node_info = client.node_get_info
8
+ [:model, :memory, :cpus, :mhz, :nodes, :sockets, :cores, :threads].each do |param|
9
+ node_hash[param] = node_info.send(param) rescue nil
10
+ end
11
+ [:type, :version, :node_free_memory, :max_vcpus].each do |param|
12
+ node_hash[param] = client.send(param) rescue nil
13
+ end
14
+ node_hash[:uri] = client.uri
15
+ xml = client.sys_info rescue nil
16
+ [:uuid, :manufacturer, :product, :serial].each do |attr|
17
+ node_hash[attr] = node_attr(attr, xml) rescue nil
18
+ end if xml
19
+
20
+ node_hash[:hostname] = client.hostname
21
+ [node_hash]
22
+ end
23
+
24
+ private
25
+
26
+ def node_attr attr, xml
27
+ xml_element(xml, "sysinfo/system/entry[@name='#{attr}']").strip
28
+ end
29
+ end
30
+
31
+ class Mock
32
+ def get_node_info
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,18 @@
1
+
2
+ module Fog
3
+ module Libvirt
4
+ class Compute
5
+ class Real
6
+ def libversion()
7
+ client.libversion
8
+ end
9
+ end
10
+
11
+ class Mock
12
+ def libversion()
13
+ return 1002009
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,128 @@
1
+ module Fog
2
+ module Libvirt
3
+ class Compute
4
+ class Real
5
+ def list_domains(filter = { })
6
+ data=[]
7
+
8
+ if filter.key?(:uuid)
9
+ data << client.lookup_domain_by_uuid(filter[:uuid])
10
+ elsif filter.key?(:name)
11
+ data << client.lookup_domain_by_name(filter[:name])
12
+ else
13
+ client.list_defined_domains.each { |name| data << catchLibvirtExceptions { client.lookup_domain_by_name(name) } } unless filter[:defined] == false
14
+ client.list_domains.each { |id| data << catchLibvirtExceptions { client.lookup_domain_by_id(id) } } unless filter[:active] == false
15
+ end
16
+ data.compact.map { |d| domain_to_attributes d }.compact
17
+ end
18
+
19
+ # Catch Libvirt exceptions to avoid race conditions involving
20
+ # concurrent libvirt operations from other processes. For example,
21
+ # domains being undefined while fog-libvirt is trying to work with
22
+ # domain lists.
23
+ def catchLibvirtExceptions
24
+ yield
25
+ rescue ::Libvirt::RetrieveError, ::Libvirt::Error
26
+ nil
27
+ end
28
+ end
29
+
30
+ module Shared
31
+ private
32
+
33
+ def domain_display xml
34
+ attrs = {}
35
+ [:type, :port, :password, :listen].each do |element|
36
+ attrs[element] = xml_element(xml, "domain/devices/graphics",element.to_s) rescue nil
37
+ end
38
+ attrs.reject{|k,v| v.nil? or v == ""}
39
+ end
40
+
41
+ def domain_volumes xml
42
+ vols_by_file = xml_elements(xml, "domain/devices/disk/source", "file")
43
+ vols_by_name = xml_elements(xml, "domain/devices/disk/source", "name")
44
+ vols = []
45
+ vols_by_file.zip(vols_by_name).each do |by_file,by_name|
46
+ vols.push(by_file.nil? ? by_name : by_file)
47
+ end
48
+ vols
49
+ end
50
+
51
+ def boot_order xml
52
+ xml_elements(xml, "domain/os/boot", "dev")
53
+ end
54
+
55
+ def domain_interfaces xml
56
+ ifs = xml_elements(xml, "domain/devices/interface")
57
+ ifs.map { |i|
58
+ nics.new({
59
+ :type => i['type'],
60
+ :mac => (i/'mac').first[:address],
61
+ :network => ((i/'source').first[:network] rescue nil),
62
+ :bridge => ((i/'source').first[:bridge] rescue nil),
63
+ :model => ((i/'model').first[:type] rescue nil),
64
+ }.reject{|k,v| v.nil?})
65
+ }
66
+ end
67
+
68
+ def domain_to_attributes(dom)
69
+ states= %w(nostate running blocked paused shutting-down shutoff crashed pmsuspended)
70
+
71
+ begin
72
+ {
73
+ :id => dom.uuid,
74
+ :uuid => dom.uuid,
75
+ :name => dom.name,
76
+ :max_memory_size => dom.info.max_mem,
77
+ :cputime => dom.info.cpu_time,
78
+ :memory_size => dom.info.memory,
79
+ :cpus => dom.info.nr_virt_cpu,
80
+ :autostart => dom.autostart?,
81
+ :os_type => dom.os_type,
82
+ :active => dom.active?,
83
+ :display => domain_display(dom.xml_desc),
84
+ :boot_order => boot_order(dom.xml_desc),
85
+ :nics => domain_interfaces(dom.xml_desc),
86
+ :volumes_path => domain_volumes(dom.xml_desc),
87
+ :state => states[dom.info.state]
88
+ }
89
+ rescue ::Libvirt::RetrieveError, ::Libvirt::Error
90
+ # Catch libvirt exceptions to avoid race conditions involving
91
+ # concurrent libvirt operations (like from another process)
92
+ return nil
93
+ end
94
+ end
95
+ end
96
+
97
+ class Mock
98
+ def list_domains(filter = { })
99
+ dom1 = mock_domain 'fog-dom1'
100
+ dom2 = mock_domain 'fog-dom2'
101
+ dom3 = mock_domain 'a-fog-dom3'
102
+ [dom1, dom2, dom3]
103
+ end
104
+
105
+ def mock_domain name
106
+ xml = read_xml 'domain.xml'
107
+ {
108
+ :id => "dom.uuid",
109
+ :uuid => "dom.uuid",
110
+ :name => name,
111
+ :max_memory_size => 8,
112
+ :cputime => 7,
113
+ :memory_size => 6,
114
+ :cpus => 5,
115
+ :autostart => false,
116
+ :os_type => "RHEL6",
117
+ :active => false,
118
+ :vnc_port => 5910,
119
+ :boot_order => boot_order(xml),
120
+ :nics => domain_interfaces(xml),
121
+ :volumes_path => domain_volumes(xml),
122
+ :state => 'shutoff'
123
+ }
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,57 @@
1
+ module Fog
2
+ module Libvirt
3
+ class Compute
4
+ class Real
5
+ def list_interfaces(filter = { })
6
+ data=[]
7
+ if filter.keys.empty?
8
+ active_networks = client.list_interfaces rescue []
9
+ defined_networks = client.list_defined_interfaces rescue []
10
+ (active_networks + defined_networks).each do |ifname|
11
+ data << interface_to_attributes(client.lookup_interface_by_name(ifname))
12
+ end
13
+ else
14
+ data = [interface_to_attributes(get_interface_by_filter(filter))]
15
+ end
16
+ data.compact
17
+ end
18
+
19
+ private
20
+ # Retrieve the interface by mac or by name
21
+ def get_interface_by_filter(filter)
22
+ case filter.keys.first
23
+ when :mac
24
+ client.lookup_interface_by_mac(filter[:mac])
25
+ when :name
26
+ client.lookup_interface_by_name(filter[:name])
27
+ end
28
+ end
29
+
30
+ def interface_to_attributes(net)
31
+ return if net.nil? || net.name == 'lo'
32
+ {
33
+ :mac => net.mac,
34
+ :name => net.name,
35
+ :active => net.active?
36
+ }
37
+ end
38
+ end
39
+
40
+ class Mock
41
+ def list_interfaces(filters={ })
42
+ if1 = mock_interface 'if1'
43
+ if2 = mock_interface 'if2'
44
+ [if1, if2]
45
+ end
46
+
47
+ def mock_interface name
48
+ {
49
+ :mac => 'aa:bb:cc:dd:ee:ff',
50
+ :name => name,
51
+ :active => true
52
+ }
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,63 @@
1
+ module Fog
2
+ module Libvirt
3
+ class Compute
4
+ class Real
5
+ def list_networks(filter = { })
6
+ data=[]
7
+ if filter.keys.empty?
8
+ (client.list_networks + client.list_defined_networks).each do |network_name|
9
+ data << network_to_attributes(client.lookup_network_by_name(network_name))
10
+ end
11
+ else
12
+ data = [network_to_attributes(get_network_by_filter(filter))]
13
+ end
14
+ data
15
+ end
16
+
17
+ private
18
+ # Retrieve the network by uuid or name
19
+ def get_network_by_filter(filter)
20
+ case filter.keys.first
21
+ when :uuid
22
+ client.lookup_network_by_uuid(filter[:uuid])
23
+ when :name
24
+ client.lookup_network_by_name(filter[:name])
25
+ end
26
+ end
27
+
28
+ # bridge name may not be defined in some networks, we should skip that in such case
29
+ def network_to_attributes(net)
30
+ return if net.nil?
31
+
32
+ begin
33
+ bridge_name = net.bridge_name
34
+ rescue ::Libvirt::Error
35
+ bridge_name = ''
36
+ end
37
+
38
+ {
39
+ :uuid => net.uuid,
40
+ :name => net.name,
41
+ :bridge_name => bridge_name
42
+ }
43
+ end
44
+ end
45
+
46
+ class Mock
47
+ def list_networks(filters={ })
48
+ [ {
49
+ :uuid => 'a29146ea-39b2-412d-8f53-239eef117a32',
50
+ :name => 'net1',
51
+ :bridge_name => 'virbr0'
52
+ },
53
+ {
54
+ :uuid => 'fbd4ac68-cbea-4f95-86ed-22953fd92384',
55
+ :name => 'net2',
56
+ :bridge_name => 'virbr1'
57
+ }
58
+ ]
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,19 @@
1
+ module Fog
2
+ module Libvirt
3
+ class Compute
4
+ class Real
5
+ def list_pool_volumes(uuid)
6
+ pool = client.lookup_storage_pool_by_uuid uuid
7
+ pool.list_volumes.map do |volume_name|
8
+ volume_to_attributes(pool.lookup_volume_by_name(volume_name))
9
+ end
10
+ end
11
+ end
12
+
13
+ class Mock
14
+ def list_pool_volumes(uuid)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,71 @@
1
+ module Fog
2
+ module Libvirt
3
+ class Compute
4
+ class Real
5
+ def list_pools(filter = { })
6
+ data=[]
7
+ if filter.key?(:name)
8
+ data << find_pool_by_name(filter[:name])
9
+ elsif filter.key?(:uuid)
10
+ data << find_pool_by_uuid(filter[:uuid])
11
+ else
12
+ (client.list_storage_pools + client.list_defined_storage_pools).each do |name|
13
+ data << find_pool_by_name(name)
14
+ end
15
+ end
16
+ data.compact
17
+ end
18
+
19
+ private
20
+ def pool_to_attributes(pool)
21
+ states=[:inactive, :building, :running, :degrated, :inaccessible]
22
+ {
23
+ :uuid => pool.uuid,
24
+ :persistent => pool.persistent?,
25
+ :autostart => pool.autostart?,
26
+ :active => pool.active?,
27
+ :name => pool.name,
28
+ :allocation => pool.info.allocation,
29
+ :capacity => pool.info.capacity,
30
+ :num_of_volumes => pool.num_of_volumes,
31
+ :state => states[pool.info.state]
32
+ }
33
+ end
34
+
35
+ def find_pool_by_name name
36
+ pool_to_attributes(client.lookup_storage_pool_by_name(name))
37
+ rescue ::Libvirt::RetrieveError
38
+ nil
39
+ end
40
+
41
+ def find_pool_by_uuid uuid
42
+ pool_to_attributes(client.lookup_storage_pool_by_uuid(uuid))
43
+ rescue ::Libvirt::RetrieveError
44
+ nil
45
+ end
46
+ end
47
+
48
+ class Mock
49
+ def list_pools(filter = { })
50
+ pool1 = mock_pool 'pool1'
51
+ pool2 = mock_pool 'pool1'
52
+ [pool1, pool2]
53
+ end
54
+
55
+ def mock_pool name
56
+ {
57
+ :uuid => 'pool.uuid',
58
+ :persistent => true,
59
+ :autostart => true,
60
+ :active => true,
61
+ :name => name,
62
+ :allocation => 123456789,
63
+ :capacity => 123456789,
64
+ :num_of_volumes => 3,
65
+ :state => :running
66
+ }
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,106 @@
1
+ module Fog
2
+ module Libvirt
3
+ class Compute
4
+ class Real
5
+ def list_volumes(filter = { })
6
+ data = []
7
+ if filter.keys.empty?
8
+ raw_volumes do |pool|
9
+ pool.list_volumes.each do |volume_name|
10
+ begin
11
+ data << volume_to_attributes(pool.lookup_volume_by_name(volume_name))
12
+ rescue ::Libvirt::RetrieveError
13
+ # Catch libvirt exceptions to avoid race conditions involving
14
+ # concurrent libvirt operations (like from another process)
15
+ next
16
+ end
17
+ end
18
+ end
19
+ else
20
+ data << get_volume(filter)
21
+ end
22
+ data.compact
23
+ end
24
+
25
+ private
26
+
27
+ def volume_to_attributes(vol)
28
+ format_type = xml_element(vol.xml_desc, "/volume/target/format", "type") rescue nil # not all volumes have types, e.g. LVM
29
+ return nil if format_type == "dir"
30
+
31
+ begin
32
+ {
33
+ :pool_name => vol.pool.name,
34
+ :key => vol.key,
35
+ :id => vol.key,
36
+ :path => vol.path,
37
+ :name => vol.name,
38
+ :format_type => format_type,
39
+ :allocation => bytes_to_gb(vol.info.allocation),
40
+ :capacity => bytes_to_gb(vol.info.capacity),
41
+ }
42
+ rescue ::Libvirt::RetrieveError, ::Libvirt::Error
43
+ return nil # If there are issues during stat of volume file
44
+ end
45
+ end
46
+
47
+ def bytes_to_gb bytes
48
+ bytes / 1024**3
49
+ end
50
+
51
+ def raw_volumes
52
+ client.list_storage_pools.each do |pool_name|
53
+ pool = client.lookup_storage_pool_by_name(pool_name)
54
+ yield(pool)
55
+ end
56
+ end
57
+
58
+ def get_volume filter = { }, raw = false
59
+ raw_volumes do |pool|
60
+ vol = case filter.keys.first
61
+ when :name
62
+ pool.lookup_volume_by_name(filter[:name]) rescue nil
63
+ when :key
64
+ pool.lookup_volume_by_key(filter[:key]) rescue nil
65
+ when :path
66
+ pool.lookup_volume_by_path(filter[:path]) rescue nil
67
+ end
68
+ if vol
69
+ return raw ? vol : volume_to_attributes(vol)
70
+ end
71
+ end
72
+
73
+ nil
74
+ end
75
+ end
76
+
77
+ class Mock
78
+ def list_volumes(filters={ })
79
+ vol1 = mock_volume 'vol1'
80
+ vol2 = mock_volume 'vol2'
81
+ vols = [vol1, vol2]
82
+
83
+ if filters.keys.empty?
84
+ return vols
85
+ end
86
+
87
+ key = filters.keys.first
88
+ vols.select { |v| v[key] == filters[key] }
89
+ end
90
+
91
+ def mock_volume name
92
+ {
93
+ :pool_name => 'vol.pool.name',
94
+ :key => "vol.#{name}", # needs to match id
95
+ :id => "vol.#{name}",
96
+ :path => "path/to/disk", # used by in mock_files/domain.xml
97
+ :name => name,
98
+ :format_type => 'raw',
99
+ :allocation => 123,
100
+ :capacity => 123,
101
+ }
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,40 @@
1
+ <domain type='kvm'>
2
+ <name>fog-449765558356062</name>
3
+ <memory>262144</memory>
4
+ <vcpu>1</vcpu>
5
+ <os>
6
+ <type arch='x86_64'>hvm</type>
7
+ <boot dev='hd'/>
8
+ <boot dev='cdrom'/>
9
+ <boot dev='network'/>
10
+ </os>
11
+ <features>
12
+ <acpi/>
13
+ <apic/>
14
+ <pae/>
15
+ </features>
16
+ <clock offset='utc'/>
17
+ <devices>
18
+ <interface type='network'>
19
+ <mac address="aa:bb:cc:dd:ee:ff" />
20
+ <source network='net1' />
21
+ <model type='virtio'/>
22
+ </interface>
23
+ <serial type='pty'>
24
+ <target port='0'/>
25
+ </serial>
26
+ <console type='pty'>
27
+ <target port='0'/>
28
+ </console>
29
+ <input type='mouse' bus='ps2'/>
30
+ <graphics type='vnc' port='-1' autoport='yes'/>
31
+ <video>
32
+ <model type='cirrus' vram='9216' heads='1'/>
33
+ </video>
34
+ <disk type='file' device='disk'>
35
+ <driver name='qemu' type='raw'/>
36
+ <source file='path/to/disk'/>
37
+ <target dev='vda' bus='virtio'/>
38
+ </disk>
39
+ </devices>
40
+ </domain>
@@ -0,0 +1,19 @@
1
+ module Fog
2
+ module Libvirt
3
+ class Compute
4
+ class Real
5
+ def pool_action(uuid, action)
6
+ pool = client.lookup_storage_pool_by_uuid uuid
7
+ pool.send(action)
8
+ true
9
+ end
10
+ end
11
+
12
+ class Mock
13
+ def pool_action(uuid, action)
14
+ true
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,18 @@
1
+ module Fog
2
+ module Libvirt
3
+ class Compute
4
+ class Real
5
+ def update_autostart(uuid, value)
6
+ domain = client.lookup_domain_by_uuid(uuid)
7
+ domain.autostart = value
8
+ end
9
+ end
10
+
11
+ class Mock
12
+ def update_autostart(uuid, value)
13
+ value
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,36 @@
1
+ module Fog
2
+ module Libvirt
3
+ class Compute
4
+ class Real
5
+ def update_display(options = { })
6
+ raise ArgumentError, "uuid is a required parameter" unless options.key? :uuid
7
+
8
+ domain = client.lookup_domain_by_uuid(options[:uuid])
9
+
10
+ display = { }
11
+ display[:type] = options[:type] || 'vnc'
12
+ display[:port] = (options[:port] || -1).to_s
13
+ display[:listen] = options[:listen].to_s if options[:listen]
14
+ display[:passwd] = options[:password].to_s if options[:password]
15
+ display[:autoport] = 'yes' if display[:port] == '-1'
16
+ new_keymap = options[:keymap] || xml_elements(domain.xml_desc, "graphics", "keymap")[0]
17
+ display[:keymap] = new_keymap unless new_keymap.nil?
18
+
19
+ builder = Nokogiri::XML::Builder.new { graphics_ (display) }
20
+ xml = Nokogiri::XML(builder.to_xml).root.to_s
21
+
22
+ domain.update_device(xml, 0)
23
+ # if we got no exceptions, then we're good'
24
+ true
25
+ end
26
+ end
27
+
28
+ class Mock
29
+ def update_display(options = { })
30
+ raise ArgumentError, "uuid is a required parameter" unless options.key? :uuid
31
+ true
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,31 @@
1
+ module Fog
2
+ module Libvirt
3
+ class Compute
4
+ class Real
5
+ def upload_volume(pool_name, volume_name, file_path)
6
+ volume = client.lookup_storage_pool_by_name(pool_name).lookup_volume_by_name(volume_name)
7
+ stream = client.stream
8
+
9
+ image_file = File.open(file_path, "rb")
10
+ volume.upload(stream, 0, image_file.size)
11
+ stream.sendall do |_opaque, n|
12
+ begin
13
+ r = image_file.read(n)
14
+ r ? [r.length, r] : [0, ""]
15
+ rescue Exception => e
16
+ [-1, ""]
17
+ end
18
+ end
19
+ stream.finish
20
+ ensure
21
+ image_file.close if image_file
22
+ end
23
+ end
24
+
25
+ class Mock
26
+ def upload_volume(pool_name, volume_name, file_path)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,19 @@
1
+ module Fog
2
+ module Libvirt
3
+ class Compute
4
+ class Real
5
+ def vm_action(uuid, action, *args)
6
+ domain = client.lookup_domain_by_uuid(uuid)
7
+ domain.send(action, *args)
8
+ true
9
+ end
10
+ end
11
+
12
+ class Mock
13
+ def vm_action(uuid, action)
14
+ true
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,18 @@
1
+ module Fog
2
+ module Libvirt
3
+ class Compute
4
+ class Real
5
+ def volume_action(key, action, options={})
6
+ get_volume({:key => key}, true).send(action)
7
+ true
8
+ end
9
+ end
10
+
11
+ class Mock
12
+ def volume_action(action, options={})
13
+ true
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end