diff --git a/lib/fog/libvirt/models/compute/README.md b/lib/fog/libvirt/models/compute/README.md index d8e1eec..c90d186 100644 --- a/lib/fog/libvirt/models/compute/README.md +++ b/lib/fog/libvirt/models/compute/README.md @@ -32,7 +32,7 @@ After adding the authentication key to a libvirt secret, it can be configured as ``` monitor=mon001.example.com,mon002.example.com,mon003.example.com port=6789 -libvirt_ceph_pool=rbd_pool_name +libvirt_ceph_pool=rbd_pool_name,second_rbd_pool_name auth_username=libvirt auth_uuid=uuid_of_libvirt_secret bus_type=virtio diff --git a/lib/fog/libvirt/models/compute/server.rb b/lib/fog/libvirt/models/compute/server.rb index fa2f4b7..39fb212 100644 --- a/lib/fog/libvirt/models/compute/server.rb +++ b/lib/fog/libvirt/models/compute/server.rb @@ -346,13 +346,13 @@ def to_xml volumes.each_with_index do |volume, index| target_device = "vd#{('a'..'z').to_a[index]}" - if ceph_args && volume.pool_name.include?(ceph_args["libvirt_ceph_pool"]) + if ceph_args && ceph_args["libvirt_ceph_pool"]&.split(",")&.include?(volume.pool_name) xml.disk(:type => "network", :device => "disk") do xml.driver(:name => "qemu", :type => volume.format_type, :cache => "writeback", :discard => "unmap") - xml.source(:protocol => "rbd", :name => volume.path) - - ceph_args["monitor"]&.split(",")&.each do |monitor| - xml.host(:name => monitor, :port => ceph_args["port"]) + xml.source(:protocol => "rbd", :name => volume.path) do + ceph_args["monitor"]&.split(",")&.each do |monitor| + xml.host(:name => monitor, :port => ceph_args["port"]) + end end xml.auth(:username => ceph_args["auth_username"]) do @@ -363,7 +363,7 @@ def to_xml end end - xml.target(:dev => target_device, :bus => args["bus_type"] == "virtio" ? "virtio" : "scsi") + xml.target(:dev => target_device, :bus => ceph_args["bus_type"] == "virtio" ? "virtio" : "scsi") end else is_block = volume.path.start_with?("/dev/") diff --git a/tests/libvirt/models/compute/server_tests.rb b/tests/libvirt/models/compute/server_tests.rb index 448baef..f8a4f4d 100644 --- a/tests/libvirt/models/compute/server_tests.rb +++ b/tests/libvirt/models/compute/server_tests.rb @@ -1,3 +1,29 @@ +RealFile = File +class FakeFile < RealFile + def self.file?(path) + if path == '/etc/foreman/ceph.conf' + return true + else + return RealFile.file(path) + end + end + + def self.readlines(path) + if path == '/etc/foreman/ceph.conf' + return [ + "monitor=mon001.example.com,mon002.example.com,mon003.example.com", + "port=6789", + "libvirt_ceph_pool=rbd_pool_name,second_rbd_pool_name", + "auth_username=libvirt", + "auth_uuid=uuid_of_libvirt_secret", + "bus_type=virtio" + ] + else + return RealFile.readlines(path) + end + end +end + Shindo.tests('Fog::Compute[:libvirt] | server model', ['libvirt']) do servers = Fog::Compute[:libvirt].servers @@ -5,6 +31,20 @@ nics = Fog.mock? ? [{ :type => 'network', :network => 'default', :mac => 'aa:bb:cc:dd:ee:ff' }] : nil server = servers.create(:name => Fog::Mock.random_letters(8), :nics => nics) + before do + Object.class_eval do + remove_const(:File) + const_set(:File, FakeFile) + end + end + + after do + Object.class_eval do + remove_const(:File) + const_set(:File, RealFile) + end + end + tests('The server model should') do tests('have the action') do test('autostart') { server.respond_to? 'autostart' } @@ -89,6 +129,26 @@ xml = server.to_xml xml.match?(//) && xml.match?(%r{}) end + test("with disk of type ceph") do + server = Fog::Libvirt::Compute::Server.new( + { + :nics => [], + :volumes => [ + Fog::Libvirt::Compute::Volume.new({ :path => "rbd_pool_name/block-1", :pool_name => "rbd_pool_name" }) + ] + } + ) + + xml = server.to_xml + + network_disk = xml.match?(//) + mon_host = xml.match?(%r{}) + source_rbd = xml.match?(%r{}) + auth_username = xml.match?(//) + auth_secret = xml.match?(%r{}) + + network_disk && mon_host && source_rbd && auth_username && auth_secret + end test("with q35 machine type on x86_64") { server.to_xml.match?(%r{hvm}) } end test("with efi firmware") do