From 919fd01b00ecf466bdd448ed644b670b6ed888ec Mon Sep 17 00:00:00 2001 From: Daniel Clavijo Coca Date: Tue, 11 Dec 2018 14:03:48 -0600 Subject: [PATCH] F #1684: LXD Ceph mappers --- src/vmm_mad/remotes/lib/lxd/container.rb | 3 +- src/vmm_mad/remotes/lib/lxd/mapper/mapper.rb | 20 +++++---- src/vmm_mad/remotes/lib/lxd/mapper/qcow2.rb | 4 +- src/vmm_mad/remotes/lib/lxd/mapper/rbd.rb | 46 ++++++++++---------- src/vmm_mad/remotes/lib/lxd/opennebula-lxd | 2 +- src/vmm_mad/remotes/lib/lxd/opennebula_vm.rb | 2 +- 6 files changed, 40 insertions(+), 37 deletions(-) diff --git a/src/vmm_mad/remotes/lib/lxd/container.rb b/src/vmm_mad/remotes/lib/lxd/container.rb index 8b0eeeb227..63a812e244 100644 --- a/src/vmm_mad/remotes/lib/lxd/container.rb +++ b/src/vmm_mad/remotes/lib/lxd/container.rb @@ -409,7 +409,8 @@ class Container return FSRawMapper.new end when 'RBD' - RBDMapper.new + OpenNebula.log "Using rbd disk mapper for #{ds}" + RBDMapper.new(disk) end end diff --git a/src/vmm_mad/remotes/lib/lxd/mapper/mapper.rb b/src/vmm_mad/remotes/lib/lxd/mapper/mapper.rb index 2d972ad08c..f7ac80e7da 100644 --- a/src/vmm_mad/remotes/lib/lxd/mapper/mapper.rb +++ b/src/vmm_mad/remotes/lib/lxd/mapper/mapper.rb @@ -60,13 +60,14 @@ class Mapper :nbd => 'sudo -u root -g oneadmin qemu-nbd', :su_mkdir => 'sudo mkdir -p', :mkdir => 'mkdir -p', - :cat => 'sudo cat', + :catfstab => 'sudo catfstab', + :cat => 'cat', :file => 'file -L', :blkid => 'sudo blkid', :e2fsck => 'sudo e2fsck', :resize2fs => 'sudo resize2fs', :xfs_growfs => 'sudo xfs_growfs', - :rbd => 'sudo rbd --id' + :rbd => 'sudo rbd-nbd --id' } #--------------------------------------------------------------------------- @@ -221,11 +222,9 @@ class Mapper umount(partitions) - - do_unmap(device, one_vm, disk, real_path) - return true + true end private @@ -263,7 +262,10 @@ class Mapper return false if !rc - cmd = "#{COMMANDS[:cat]} #{path}/etc/fstab" + bin = COMMANDS[:catfstab] + bin = COMMANDS[:cat] unless path.include?('containers/one-') + + cmd = "#{bin} #{path}/etc/fstab" rc, fstab, e = Command.execute(cmd, false) @@ -333,9 +335,11 @@ class Mapper Command.execute("#{cmd} #{path}", false) - rc, out, err = Command.execute("#{COMMANDS[:mount]} #{dev} #{path}",true) + rc, _out, err = Command.execute("#{COMMANDS[:mount]} #{dev} #{path}", true) + + if rc != 0 + return true if err.include?("unknown filesystem type 'swap'") - if rc != 0 OpenNebula.log_error("mount_dev: #{err}") return false end diff --git a/src/vmm_mad/remotes/lib/lxd/mapper/qcow2.rb b/src/vmm_mad/remotes/lib/lxd/mapper/qcow2.rb index 064f8d5116..209ddfa756 100644 --- a/src/vmm_mad/remotes/lib/lxd/mapper/qcow2.rb +++ b/src/vmm_mad/remotes/lib/lxd/mapper/qcow2.rb @@ -53,9 +53,7 @@ class Qcow2Mapper < Mapper rc, out, err = Command.execute(cmd, true) - if rc != 0 - OpenNebula.log_error("do_unmap: #{err}") - end + OpenNebula.log_error("do_unmap: #{err}") if rc != 0 end private diff --git a/src/vmm_mad/remotes/lib/lxd/mapper/rbd.rb b/src/vmm_mad/remotes/lib/lxd/mapper/rbd.rb index ea229e3147..58d75c5415 100644 --- a/src/vmm_mad/remotes/lib/lxd/mapper/rbd.rb +++ b/src/vmm_mad/remotes/lib/lxd/mapper/rbd.rb @@ -21,40 +21,40 @@ $LOAD_PATH.unshift File.dirname(__FILE__) require 'mapper' # Ceph RBD mapper -class RBD < Mapper +class RBDMapper < Mapper - def initialize(ceph_user) - @ceph_user = ceph_user + def initialize(disk) + @ceph_user = disk['CEPH_USER'] end - def map(image) - `sudo rbd --id #{@ceph_user} map #{image}`.chomp + def disk_source(vm_id, disk) + src = disk['SOURCE'] + return "#{src}-#{vm_id}-#{disk['DISK_ID']}" if disk['CLONE'] == 'YES' end - def unmap(block) - shell("sudo rbd --id #{@ceph_user} unmap #{block}") - end + def do_map(one_vm, disk, _directory) + dsrc = disk_source(one_vm.vm_id, disk) - # Returns an array of mountable block's partitions - def detect_parts(block) - parts = `blkid | grep #{block} | grep -w UUID | awk {'print $1'}`.split(":\n") - uuids = [] - parts.each {|part| uuids.append `blkid #{part} -o export | grep -w UUID`.chomp("\n")[5..-1] } + cmd = "#{COMMANDS[:rbd]} #{@ceph_user} map #{dsrc}" - formatted = [] - 0.upto parts.length - 1 do |i| - formatted[i] = { 'name' => parts[i], 'uuid' => uuids[i] } + rc, out, err = Command.execute(cmd, false) + + if rc != 0 + OpenNebula.log_error("do_map: #{err}") + return end - formatted + out.chomp end - def get_parts(block) - parts = detect_parts(block) - parts.each do |part| - part['name'].slice!('//dev') + def do_unmap(device, one_vm, disk, directory) + cmd = "#{COMMANDS[:rbd]} #{@ceph_user} unmap #{device}" + + rc, _out, err = Command.execute(cmd, false) + + if rc != 0 + OpenNebula.log_error("do_map: #{err}") + return end - parts end - end diff --git a/src/vmm_mad/remotes/lib/lxd/opennebula-lxd b/src/vmm_mad/remotes/lib/lxd/opennebula-lxd index 2b91145ddc..9de5ff78c7 100644 --- a/src/vmm_mad/remotes/lib/lxd/opennebula-lxd +++ b/src/vmm_mad/remotes/lib/lxd/opennebula-lxd @@ -18,5 +18,5 @@ # This file is meant for allow oneadmin to run the following commands as root # -Cmnd_Alias ONE_MAPPER = /bin/lsblk, /sbin/losetup, /bin/mount, /bin/umount, /sbin/kpartx, /usr/bin/qemu-nbd, /bin/mkdir, /usr/bin/catfstab, /sbin/blkid /sbin/e2fsck, /sbin/resize2fs, /usr/sbin/xfs_growfs, /usr/bin/rbd +Cmnd_Alias ONE_MAPPER = /bin/lsblk, /sbin/losetup, /bin/mount, /bin/umount, /sbin/kpartx, /usr/bin/qemu-nbd, /bin/mkdir, /usr/bin/catfstab, /sbin/blkid, /sbin/e2fsck, /sbin/resize2fs, /usr/sbin/xfs_growfs, /usr/bin/rbd-nbd oneadmin ALL=(ALL:ALL) NOPASSWD: ONE_MAPPER \ No newline at end of file diff --git a/src/vmm_mad/remotes/lib/lxd/opennebula_vm.rb b/src/vmm_mad/remotes/lib/lxd/opennebula_vm.rb index f3f4ede772..d62193d6c8 100644 --- a/src/vmm_mad/remotes/lib/lxd/opennebula_vm.rb +++ b/src/vmm_mad/remotes/lib/lxd/opennebula_vm.rb @@ -335,7 +335,7 @@ class OpenNebulaVM # Creates or closes a connection to a container rfb port depending on signal def vnc_command(signal) data = @xml.element('//TEMPLATE/GRAPHICS') - return unless data && data['PORT'] && data['TYPE'] == 'vnc' + return unless data && data['PORT'] && data['TYPE'] && data['TYPE'].casecmp?('vnc') pass = data['PASSWD'] pass = '-' unless pass && !pass.empty?