fog-libvirt 0.12.2 → 0.13.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +0 -3
  3. data/fog-libvirt.gemspec +4 -5
  4. data/lib/fog/libvirt/compute.rb +15 -26
  5. data/lib/fog/libvirt/models/compute/network.rb +11 -0
  6. data/lib/fog/libvirt/models/compute/pool.rb +14 -0
  7. data/lib/fog/libvirt/models/compute/server.rb +41 -150
  8. data/lib/fog/libvirt/models/compute/util/util.rb +2 -10
  9. data/lib/fog/libvirt/models/compute/volume.rb +41 -2
  10. data/lib/fog/libvirt/requests/compute/clone_volume.rb +7 -5
  11. data/lib/fog/libvirt/requests/compute/create_domain.rb +6 -4
  12. data/lib/fog/libvirt/requests/compute/create_volume.rb +6 -3
  13. data/lib/fog/libvirt/requests/compute/define_domain.rb +6 -4
  14. data/lib/fog/libvirt/requests/compute/define_pool.rb +6 -3
  15. data/lib/fog/libvirt/requests/compute/destroy_interface.rb +6 -4
  16. data/lib/fog/libvirt/requests/compute/destroy_network.rb +6 -4
  17. data/lib/fog/libvirt/requests/compute/dhcp_leases.rb +4 -5
  18. data/lib/fog/libvirt/requests/compute/get_node_info.rb +6 -3
  19. data/lib/fog/libvirt/requests/compute/libversion.rb +6 -4
  20. data/lib/fog/libvirt/requests/compute/list_domains.rb +27 -31
  21. data/lib/fog/libvirt/requests/compute/list_interfaces.rb +6 -14
  22. data/lib/fog/libvirt/requests/compute/list_networks.rb +6 -24
  23. data/lib/fog/libvirt/requests/compute/list_pool_volumes.rb +6 -3
  24. data/lib/fog/libvirt/requests/compute/list_pools.rb +20 -42
  25. data/lib/fog/libvirt/requests/compute/list_volumes.rb +16 -36
  26. data/lib/fog/libvirt/requests/compute/pool_action.rb +6 -4
  27. data/lib/fog/libvirt/requests/compute/update_autostart.rb +6 -4
  28. data/lib/fog/libvirt/requests/compute/update_display.rb +6 -5
  29. data/lib/fog/libvirt/requests/compute/upload_volume.rb +6 -3
  30. data/lib/fog/libvirt/requests/compute/vm_action.rb +6 -4
  31. data/lib/fog/libvirt/requests/compute/volume_action.rb +6 -4
  32. data/lib/fog/libvirt/version.rb +1 -1
  33. data/minitests/test_helper.rb +1 -1
  34. data/tests/helper.rb +1 -1
  35. data/tests/helpers/formats_helper.rb +3 -2
  36. data/tests/helpers/formats_helper_tests.rb +8 -8
  37. data/tests/helpers/mock_helper.rb +1 -1
  38. data/tests/libvirt/models/compute/network_tests.rb +14 -2
  39. data/tests/libvirt/models/compute/nic_tests.rb +2 -1
  40. data/tests/libvirt/models/compute/pools_tests.rb +6 -6
  41. data/tests/libvirt/models/compute/server_tests.rb +53 -3
  42. data/tests/libvirt/models/compute/volume_tests.rb +21 -1
  43. data/tests/libvirt/models/compute/volumes_tests.rb +2 -0
  44. data/tests/libvirt/requests/compute/list_pools_tests.rb +1 -1
  45. metadata +38 -43
  46. data/lib/fog/libvirt/models/compute/templates/network.xml.erb +0 -6
  47. data/lib/fog/libvirt/models/compute/templates/pool.xml.erb +0 -6
  48. data/lib/fog/libvirt/models/compute/templates/volume.xml.erb +0 -34
  49. data/lib/fog/libvirt/requests/compute/mock_files/domain.xml +0 -40
  50. data/minitests/server/server_test.rb +0 -64
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f14f3c6f7a7006039ac17b404d7f533e5abcfb662d18984059c5a7f53305c186
4
- data.tar.gz: d8ecdd32d3809c080ae2604fcdd20091c8b097cd75905c59ef0975559f7b6552
3
+ metadata.gz: 6a669713a0c03e1bbfaa52fc3e9264f94c1e4966cc78d87cfc951e9e583c539a
4
+ data.tar.gz: 518134720023079b9e6ff39616cb6bd9355486c441be5fcefe651ecc98d282c4
5
5
  SHA512:
6
- metadata.gz: 02e8650702e0275fedc29d61e61b882e9384b520a5e8700964d107e0c0c5544798fd9fd6c43a78d0a781ef464485b2465c5b5560272e8338d468e2bc25d9b230
7
- data.tar.gz: 491a54f950cdb142b2a95cdf97e6e6fa378868374ba684d01a67d3884566f67c0e8c5b860bcd1b13d6e074dc1c5706208ca45e0c1cebcf2e4e72b367d74de24a
6
+ metadata.gz: d7fd1e7d922c785a27c9e6496dca419b9dc85ec342941354371ab7004495327229c82193ea99e88a27c6192b7169fb67f52f49795814559e77dbe40171ad2e74
7
+ data.tar.gz: 0e4ec2da6eb82210b16a445f3957bc1f1034ee6c7ccf63e303180a0d5fcc61a871f2f7c6c1896ccf2e893920324a31350f90a026ca1690556e76fbdaee301a05
data/Gemfile CHANGED
@@ -6,7 +6,4 @@ group :development, :test do
6
6
  gem "octokit", :require => false
7
7
  end
8
8
 
9
- # 0.8.3 breaks our tests
10
- gem "ruby-libvirt", ">= 0.7.0", "< 0.8.3"
11
-
12
9
  gemspec
data/fog-libvirt.gemspec CHANGED
@@ -1,4 +1,3 @@
1
- # coding: utf-8
2
1
  lib = File.expand_path("../lib", __FILE__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require "fog/libvirt/version"
@@ -23,23 +22,23 @@ Gem::Specification.new do |s|
23
22
  s.rdoc_options = ["--charset=UTF-8"]
24
23
  s.extra_rdoc_files = %w[README.md]
25
24
 
26
- s.required_ruby_version = '>= 2.5.0'
25
+ s.required_ruby_version = '>= 2.7'
27
26
 
28
27
  s.add_dependency("fog-core", ">= 1.27.4")
29
28
  s.add_dependency("fog-json")
30
29
  s.add_dependency("fog-xml", "~> 0.1.1")
31
- s.add_dependency('ruby-libvirt','>= 0.7.0')
32
30
  s.add_dependency("json")
31
+ s.add_dependency('ruby-libvirt','>= 0.7.0')
33
32
 
34
- s.add_development_dependency("net-ssh")
35
33
  s.add_development_dependency("minitest", "~> 5.0")
34
+ s.add_development_dependency("mocha", ">= 1.15", "< 3")
35
+ s.add_development_dependency("net-ssh")
36
36
  s.add_development_dependency("pry")
37
37
  s.add_development_dependency("rake")
38
38
  s.add_development_dependency("rubocop")
39
39
  s.add_development_dependency("shindo", "~> 0.3.4")
40
40
  s.add_development_dependency("simplecov")
41
41
  s.add_development_dependency("yard")
42
- s.add_development_dependency("mocha", ">= 1.15", "< 3")
43
42
 
44
43
  # Let's not ship dot files and gemfiles
45
44
  git_files = `git ls-files`.split("\n")
@@ -6,7 +6,6 @@ module Fog
6
6
  class Compute < Fog::Service
7
7
  requires :libvirt_uri
8
8
  recognizes :libvirt_username, :libvirt_password
9
- recognizes :libvirt_ip_command
10
9
 
11
10
  model_path 'fog/libvirt/models/compute'
12
11
  model :server
@@ -50,37 +49,13 @@ module Fog
50
49
 
51
50
  module Shared
52
51
  include Fog::Libvirt::Util
53
- end
54
-
55
- class Mock
56
- include Shared
57
- def initialize(options={})
58
- # libvirt is part of the gem => ruby-libvirt
59
- require 'libvirt'
60
- end
61
52
 
62
- private
63
-
64
- def client
65
- return @client if defined?(@client)
66
- end
67
-
68
- #read mocks xml
69
- def read_xml(file_name)
70
- file_path = File.join(File.dirname(__FILE__),"requests","compute","mock_files",file_name)
71
- File.read(file_path)
72
- end
73
- end
74
-
75
- class Real
76
- include Shared
77
53
  attr_reader :client
78
54
  attr_reader :uri
79
- attr_reader :ip_command
80
55
 
81
56
  def initialize(options={})
57
+ super()
82
58
  @uri = ::Fog::Libvirt::Util::URI.new(enhance_uri(options[:libvirt_uri]))
83
- @ip_command = options[:libvirt_ip_command]
84
59
 
85
60
  # libvirt is part of the gem => ruby-libvirt
86
61
  begin
@@ -135,6 +110,20 @@ module Fog
135
110
  uri+append
136
111
  end
137
112
  end
113
+
114
+ class Real
115
+ include Shared
116
+ end
117
+
118
+ class Mock
119
+ include Shared
120
+
121
+ def enhance_uri(uri)
122
+ uri = 'test:///default' unless ::URI.parse(uri).scheme == 'test'
123
+
124
+ super(uri)
125
+ end
126
+ end
138
127
  end
139
128
  end
140
129
  end
@@ -27,6 +27,17 @@ module Fog
27
27
  def shutdown
28
28
  service.destroy_network(uuid)
29
29
  end
30
+
31
+ def to_xml
32
+ builder = Nokogiri::XML::Builder.new do |xml|
33
+ xml.network do
34
+ xml.name(name)
35
+ xml.bridge(:name => bridge_name, :stp => 'on', :delay => '0')
36
+ end
37
+ end
38
+
39
+ builder.to_xml
40
+ end
30
41
  end
31
42
  end
32
43
  end
@@ -78,6 +78,20 @@ module Fog
78
78
  def volumes
79
79
  service.list_pool_volumes uuid
80
80
  end
81
+
82
+ def to_xml
83
+ builder = Nokogiri::XML::Builder.new do |xml|
84
+ xml.pool(:type => 'dir') do
85
+ xml.name(name)
86
+
87
+ xml.target do
88
+ xml.path(path)
89
+ end
90
+ end
91
+ end
92
+
93
+ builder.to_xml
94
+ end
81
95
  end
82
96
  end
83
97
  end
@@ -13,6 +13,10 @@ module Fog
13
13
 
14
14
  attribute :cpus
15
15
  attribute :cputime
16
+ attribute :firmware
17
+ attribute :firmware_features
18
+ attribute :secure_boot
19
+ attribute :loader_attributes
16
20
  attribute :os_type
17
21
  attribute :memory_size
18
22
  attribute :max_memory_size
@@ -30,6 +34,7 @@ module Fog
30
34
  attribute :cpu
31
35
  attribute :hugepages
32
36
  attribute :guest_agent
37
+ attribute :video
33
38
  attribute :virtio_rng
34
39
 
35
40
  attribute :state
@@ -83,7 +88,7 @@ module Fog
83
88
  end
84
89
 
85
90
  def mac
86
- nics.first.mac if nics && nics.first
91
+ nics&.first&.mac
87
92
  end
88
93
 
89
94
  def disk_path
@@ -286,14 +291,31 @@ module Fog
286
291
  end
287
292
 
288
293
  xml.vcpu(cpus)
289
- xml.os do
294
+ os_tags = {}
295
+
296
+ os_tags[:firmware] = firmware if firmware == 'efi'
297
+
298
+ xml.os(**os_tags) do
290
299
  type = xml.type(os_type, :arch => arch)
291
300
  type[:machine] = "q35" if ["i686", "x86_64"].include?(arch)
292
301
 
293
302
  boot_order.each do |dev|
294
303
  xml.boot(:dev => dev)
295
304
  end
305
+
306
+ loader_attributes&.each do |key, value|
307
+ xml.loader(key => value)
308
+ end
309
+
310
+ if firmware == "efi" && firmware_features&.any?
311
+ xml.firmware do
312
+ firmware_features.each_pair do |key, value|
313
+ xml.feature(:name => key, :enabled => value)
314
+ end
315
+ end
316
+ end
296
317
  end
318
+
297
319
  xml.features do
298
320
  xml.acpi
299
321
  xml.apic
@@ -306,7 +328,7 @@ module Fog
306
328
  end
307
329
  else
308
330
  xml.cpu(
309
- :mode => cpu.dig(:model, :name) || "host-passthrough",
331
+ :mode => cpu.fetch(:mode, "host-passthrough"),
310
332
  :check => cpu.fetch(:check, "none"),
311
333
  :migratable => cpu.fetch(:migratable, "on")
312
334
  )
@@ -361,14 +383,15 @@ module Fog
361
383
  xml.disk(:type => "file", :device => "cdrom") do
362
384
  xml.driver(:name => "qemu", :type => "raw")
363
385
  xml.source(:file => "#{iso_dir}/#{iso_file}")
364
- xml.target(:dev => "hdc", :bus => "ide")
386
+ xml.target(:dev => "sda", :bus => "scsi")
365
387
  xml.readonly
366
- xml.address(:type => "drive", :controller => 0, :bus => 1, :unit => 0)
388
+ xml.address(:type => "drive", :controller => 0, :bus => 0, :unit => 0)
367
389
  end
368
390
  end
369
391
 
370
392
  nics.each do |nic|
371
393
  xml.interface(:type => nic.type) do
394
+ xml.mac(:address => nic.mac) if nic.mac
372
395
  if nic.type == "bridge"
373
396
  xml.source(:bridge => nic.bridge)
374
397
  else
@@ -413,10 +436,10 @@ module Fog
413
436
  graphics.autoport = "yes"
414
437
  end
415
438
  graphics.listen = display[:listen] unless display[:listen].empty?
416
- graphics.passwd = display[:password] unless display[:password].empty?
439
+ graphics.passwd = display[:password] if display[:password] && !display[:password].empty?
417
440
 
418
441
  xml.video do
419
- xml.model(:type => "cirrus", :vram => 9216, :heads => 1)
442
+ xml.model(video)
420
443
  end
421
444
  end
422
445
  end
@@ -445,160 +468,26 @@ module Fog
445
468
  args
446
469
  end
447
470
 
448
- # This tests the library version before redefining the address
449
- # method for this instance to use a method compatible with
450
- # earlier libvirt libraries, or uses the dhcp method from more
451
- # recent releases.
452
- def addresses(service_arg=service, options={})
453
- addresses_method = self.method(:addresses_dhcp)
454
- # check if ruby-libvirt was compiled against a new enough version
455
- # that can use dhcp_leases, as otherwise it will not provide the
456
- # method dhcp_leases on any of the network objects.
457
- has_dhcp_leases = true
458
- begin
459
- service.networks.first.dhcp_leases(self.mac)
460
- rescue NoMethodError
461
- has_dhcp_leases = false
462
- rescue
463
- # assume some other odd exception.
464
- end
465
-
466
- # if ruby-libvirt not compiled with support, or remote library is
467
- # too old (must be newer than 1.2.8), then use old fallback
468
- if not has_dhcp_leases or service.libversion() < 1002008
469
- addresses_method = self.method(:addresses_ip_command)
470
- end
471
-
472
- # replace current definition for this instance with correct one for
473
- # detected libvirt to perform check once for connection
474
- (class << self; self; end).class_eval do
475
- define_method(:addresses, addresses_method)
476
- end
477
- addresses(service_arg, options)
478
- end
479
-
480
- def ssh_ip_command(ip_command, uri)
481
- # Retrieve the parts we need from the service to setup our ssh options
482
- user=uri.user #could be nil
483
- host=uri.host
484
- keyfile=uri.keyfile
485
- port=uri.port
486
-
487
- # Setup the options
488
- ssh_options={}
489
- ssh_options[:keys]=[ keyfile ] unless keyfile.nil?
490
- ssh_options[:port]=port unless keyfile.nil?
491
- ssh_options[:paranoid]=true if uri.no_verify?
492
-
493
- begin
494
- result=Fog::SSH.new(host, user, ssh_options).run(ip_command)
495
- rescue Errno::ECONNREFUSED
496
- raise Fog::Errors::Error.new("Connection was refused to host #{host} to retrieve the ip_address for #{mac}")
497
- rescue Net::SSH::AuthenticationFailed
498
- raise Fog::Errors::Error.new("Error authenticating over ssh to host #{host} and user #{user}")
499
- end
500
-
501
- # Check for a clean exit code
502
- if result.first.status == 0
503
- return result.first.stdout.strip
504
- else
505
- # We got a failure executing the command
506
- raise Fog::Errors::Error.new("The command #{ip_command} failed to execute with a clean exit code")
507
- end
508
- end
509
-
510
- def local_ip_command(ip_command)
511
- # Execute the ip_command locally
512
- # Initialize empty ip_address string
513
- ip_address=""
514
-
515
- IO.popen("#{ip_command}") do |p|
516
- p.each_line do |l|
517
- ip_address+=l
518
- end
519
- status=Process.waitpid2(p.pid)[1].exitstatus
520
- if status!=0
521
- raise Fog::Errors::Error.new("The command #{ip_command} failed to execute with a clean exit code")
522
- end
523
- end
524
-
525
- #Strip any new lines from the string
526
- ip_address.chomp
527
- end
528
-
529
- # Locale-friendly removal of non-alpha nums
530
- DOMAIN_CLEANUP_REGEXP = Regexp.compile('[\W_-]')
531
-
532
- # This retrieves the ip address of the mac address using ip_command
533
- # It returns an array of public and private ip addresses
534
- # Currently only one ip address is returned, but in the future this could be multiple
535
- # if the server has multiple network interface
536
- def addresses_ip_command(service_arg=service, options={})
537
- mac=self.mac
538
-
539
- # Aug 24 17:34:41 juno arpwatch: new station 10.247.4.137 52:54:00:88:5a:0a eth0.4
540
- # Aug 24 17:37:19 juno arpwatch: changed ethernet address 10.247.4.137 52:54:00:27:33:00 (52:54:00:88:5a:0a) eth0.4
541
- # Check if another ip_command string was provided
542
- ip_command_global=service_arg.ip_command.nil? ? 'grep $mac /var/log/arpwatch.log|sed -e "s/new station//"|sed -e "s/changed ethernet address//g" |sed -e "s/reused old ethernet //" |tail -1 |cut -d ":" -f 4-| cut -d " " -f 3' : service_arg.ip_command
543
- ip_command_local=options[:ip_command].nil? ? ip_command_global : options[:ip_command]
544
-
545
- ip_command="mac=#{mac}; server_name=#{name.gsub(DOMAIN_CLEANUP_REGEXP, '_')}; "+ip_command_local
546
-
547
- ip_address=nil
548
-
549
- if service_arg.uri.ssh_enabled?
550
- ip_address=ssh_ip_command(ip_command, service_arg.uri)
551
- else
552
- # It's not ssh enabled, so we assume it is
553
- if service_arg.uri.transport=="tls"
554
- raise Fog::Errors::Error.new("TlS remote transport is not currently supported, only ssh")
555
- end
556
- ip_address=local_ip_command(ip_command)
557
- end
558
-
559
- # The Ip-address command has been run either local or remote now
560
-
561
- if ip_address==""
562
- #The grep didn't find an ip address result"
563
- ip_address=nil
564
- else
565
- # To be sure that the command didn't return another random string
566
- # We check if the result is an actual ip-address
567
- # otherwise we return nil
568
- unless ip_address=~/^(\d{1,3}\.){3}\d{1,3}$/
569
- raise Fog::Errors::Error.new(
570
- "The result of #{ip_command} does not have valid ip-address format\n"+
571
- "Result was: #{ip_address}\n"
572
- )
573
- end
574
- end
575
-
576
- return { :public => [ip_address], :private => [ip_address]}
577
- end
578
-
579
471
  # This retrieves the ip address of the mac address using dhcp_leases
580
472
  # It returns an array of public and private ip addresses
581
473
  # Currently only one ip address is returned, but in the future this could be multiple
582
474
  # if the server has multiple network interface
583
- def addresses_dhcp(service_arg=service, options={})
584
- mac=self.mac
585
-
475
+ def addresses(service_arg=service, options={})
586
476
  ip_address = nil
587
- nic = self.nics.find {|nic| nic.mac==mac}
588
- if !nic.nil?
477
+ if (nic = self.nics&.first)
589
478
  net = service.networks.all(:name => nic.network).first
590
- if !net.nil?
591
- leases = net.dhcp_leases(mac, 0)
592
- # Assume the lease expiring last is the current IP address
593
- ip_address = leases.sort_by { |lse| lse["expirytime"] }.last["ipaddr"] if !leases.empty?
594
- end
479
+ # Assume the lease expiring last is the current IP address
480
+ ip_address = net&.dhcp_leases(nic.mac)&.max_by { |lse| lse["expirytime"] }&.dig("ipaddr")
595
481
  end
596
482
 
597
483
  return { :public => [ip_address], :private => [ip_address] }
598
484
  end
599
485
 
486
+ # Locale-friendly removal of non-alpha nums
487
+ DOMAIN_CLEANUP_REGEXP = Regexp.compile('[\W_-]')
488
+
600
489
  def ip_address(key)
601
- addresses[key].nil? ? nil : addresses[key].first
490
+ addresses[key]&.first
602
491
  end
603
492
 
604
493
  def initialize_nics
@@ -669,7 +558,9 @@ module Fog
669
558
  :cpu => {},
670
559
  :hugepages => false,
671
560
  :guest_agent => true,
561
+ :video => {:type => "cirrus", :vram => 9216, :heads => 1},
672
562
  :virtio_rng => {},
563
+ :firmware_features => { "secure-boot" => "no" },
673
564
  }
674
565
  end
675
566
 
@@ -683,7 +574,7 @@ module Fog
683
574
  end
684
575
 
685
576
  def default_display
686
- {:port => '-1', :listen => '127.0.0.1', :type => 'vnc', :password => '' }
577
+ {:port => '-1', :listen => '127.0.0.1', :type => 'vnc' }
687
578
  end
688
579
  end
689
580
  end
@@ -12,16 +12,8 @@ module Fog
12
12
  end
13
13
 
14
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)
15
+ xml = Nokogiri::XML(xml)
16
+ attribute.nil? ? (xml/path).map : (xml/path).map{|element| element[attribute.to_sym]}
25
17
  end
26
18
 
27
19
  def randomized_name
@@ -39,7 +39,8 @@ module Fog
39
39
 
40
40
  raise Fog::Errors::Error.new('Reserving an existing volume may create a duplicate') if key
41
41
  @xml ||= to_xml
42
- self.path = service.create_volume(pool_name, xml).path
42
+ self.id = service.create_volume(pool_name, xml).key
43
+ reload
43
44
  end
44
45
 
45
46
  # Destroy a volume
@@ -68,8 +69,8 @@ module Fog
68
69
  new_volume = self.dup
69
70
  new_volume.key = nil
70
71
  new_volume.name = new_name
71
- new_volume.path = service.clone_volume(pool_name, new_volume.to_xml, self.name).path
72
72
 
73
+ new_volume.id = service.clone_volume(pool_name, new_volume.to_xml, self.name).key
73
74
  new_volume.reload
74
75
  end
75
76
 
@@ -78,8 +79,46 @@ module Fog
78
79
  service.upload_volume(pool_name, name, file_path)
79
80
  end
80
81
 
82
+ def to_xml
83
+ builder = Nokogiri::XML::Builder.new do |xml|
84
+ xml.volume do
85
+ xml.name(name)
86
+
87
+ allocation_size, allocation_unit = split_size_unit(allocation)
88
+ xml.allocation(allocation_size, :unit => allocation_unit)
89
+
90
+ capacity_size, capacity_unit = split_size_unit(capacity)
91
+ xml.capacity(capacity_size, :unit => capacity_unit)
92
+
93
+ xml.target do
94
+ xml.format(:type => format_type)
95
+ xml_permissions(xml)
96
+ end
97
+
98
+ if backing_volume
99
+ xml.backingStore do
100
+ xml.path(backing_volume.path)
101
+ xml.format(:type => backing_volume.format_type)
102
+ xml_permissions(xml)
103
+ end
104
+ end
105
+ end
106
+ end
107
+
108
+ builder.to_xml
109
+ end
110
+
81
111
  private
82
112
 
113
+ def xml_permissions(xml)
114
+ xml.permissions do
115
+ xml.owner(owner) if owner
116
+ xml.group(group) if group
117
+ xml.mode('0744')
118
+ xml.label('virt_image_t')
119
+ end
120
+ end
121
+
83
122
  def image_suffix
84
123
  return "img" if format_type == "raw"
85
124
  format_type
@@ -1,17 +1,19 @@
1
1
  module Fog
2
2
  module Libvirt
3
3
  class Compute
4
- class Real
5
- def clone_volume (pool_name, xml, name)
4
+ module Shared
5
+ def clone_volume(pool_name, xml, name)
6
6
  vol = client.lookup_storage_pool_by_name(pool_name).lookup_volume_by_name(name)
7
7
  client.lookup_storage_pool_by_name(pool_name).create_vol_xml_from(xml, vol)
8
8
  end
9
9
  end
10
10
 
11
+ class Real
12
+ include Shared
13
+ end
14
+
11
15
  class Mock
12
- def clone_volume(pool_name, xml, name)
13
- Fog::Libvirt::Compute::Volume.new({:pool_name => pool_name, :xml => xml})
14
- end
16
+ include Shared
15
17
  end
16
18
  end
17
19
  end
@@ -1,16 +1,18 @@
1
1
  module Fog
2
2
  module Libvirt
3
3
  class Compute
4
- class Real
4
+ module Shared
5
5
  def create_domain(xml)
6
6
  client.create_domain_xml(xml)
7
7
  end
8
8
  end
9
9
 
10
+ class Real
11
+ include Shared
12
+ end
13
+
10
14
  class Mock
11
- def create_domain(xml)
12
- ::Libvirt::Domain.new()
13
- end
15
+ include Shared
14
16
  end
15
17
  end
16
18
  end
@@ -1,15 +1,18 @@
1
1
  module Fog
2
2
  module Libvirt
3
3
  class Compute
4
- class Real
4
+ module Shared
5
5
  def create_volume(pool_name, xml)
6
6
  client.lookup_storage_pool_by_name(pool_name).create_vol_xml(xml)
7
7
  end
8
8
  end
9
9
 
10
+ class Real
11
+ include Shared
12
+ end
13
+
10
14
  class Mock
11
- def create_volume(pool_name, xml)
12
- end
15
+ include Shared
13
16
  end
14
17
  end
15
18
  end
@@ -1,16 +1,18 @@
1
1
  module Fog
2
2
  module Libvirt
3
3
  class Compute
4
- class Real
4
+ module Shared
5
5
  def define_domain(xml)
6
6
  client.define_domain_xml(xml)
7
7
  end
8
8
  end
9
9
 
10
+ class Real
11
+ include Shared
12
+ end
13
+
10
14
  class Mock
11
- def define_domain(xml)
12
- ::Libvirt::Domain.new()
13
- end
15
+ include Shared
14
16
  end
15
17
  end
16
18
  end
@@ -1,15 +1,18 @@
1
1
  module Fog
2
2
  module Libvirt
3
3
  class Compute
4
- class Real
4
+ module Shared
5
5
  def define_pool(xml)
6
6
  client.define_storage_pool_xml(xml)
7
7
  end
8
8
  end
9
9
 
10
+ class Real
11
+ include Shared
12
+ end
13
+
10
14
  class Mock
11
- def define_pool(xml)
12
- end
15
+ include Shared
13
16
  end
14
17
  end
15
18
  end
@@ -1,17 +1,19 @@
1
1
  module Fog
2
2
  module Libvirt
3
3
  class Compute
4
- class Real
4
+ module Shared
5
5
  #shutdown the interface
6
6
  def destroy_interface(uuid)
7
7
  client.lookup_interface_by_uuid(uuid).destroy
8
8
  end
9
9
  end
10
10
 
11
+ class Real
12
+ include Shared
13
+ end
14
+
11
15
  class Mock
12
- def destroy_interface(uuid)
13
- true
14
- end
16
+ include Shared
15
17
  end
16
18
  end
17
19
  end