1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-21 14:50:08 +03:00

F #1684: LXD Ceph mappers

This commit is contained in:
Daniel Clavijo Coca 2018-12-11 14:03:48 -06:00 committed by Ruben S. Montero
parent 9dc1b6f1c4
commit 919fd01b00
6 changed files with 40 additions and 37 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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?