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:
parent
9dc1b6f1c4
commit
919fd01b00
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
@ -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?
|
||||
|
Loading…
x
Reference in New Issue
Block a user