1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-16 22:50:10 +03:00

feature #1112: Initial changes in the Image driver to support multiple Datastores

This commit is contained in:
Ruben S. Montero 2012-02-13 12:33:16 +01:00
parent e9d026e3ae
commit 45382e76b1
3 changed files with 63 additions and 31 deletions

View File

@ -235,8 +235,8 @@ VAR_DIRS="$VAR_LOCATION/remotes \
$VAR_LOCATION/remotes/vmm/vmware \
$VAR_LOCATION/remotes/hooks \
$VAR_LOCATION/remotes/hooks/ft \
$VAR_LOCATION/remotes/image \
$VAR_LOCATION/remotes/image/fs \
$VAR_LOCATION/remotes/datastore \
$VAR_LOCATION/remotes/datastore/fs \
$VAR_LOCATION/remotes/auth \
$VAR_LOCATION/remotes/auth/plain \
$VAR_LOCATION/remotes/auth/ssh \
@ -385,7 +385,7 @@ INSTALL_FILES=(
VMWARE_TM_COMMANDS_LIB_FILES:$LIB_LOCATION/tm_commands/vmware
DUMMY_TM_COMMANDS_LIB_FILES:$LIB_LOCATION/tm_commands/dummy
LVM_TM_COMMANDS_LIB_FILES:$LIB_LOCATION/tm_commands/lvm
IMAGE_DRIVER_FS_SCRIPTS:$VAR_LOCATION/remotes/image/fs
IMAGE_DRIVER_FS_SCRIPTS:$VAR_LOCATION/remotes/datastore/fs
NETWORK_FILES:$VAR_LOCATION/remotes/vnm
NETWORK_8021Q_FILES:$VAR_LOCATION/remotes/vnm/802.1Q
NETWORK_DUMMY_FILES:$VAR_LOCATION/remotes/vnm/dummy

View File

@ -338,7 +338,7 @@ TM_MAD = [
#-------------------------------------------------------------------------------
IMAGE_MAD = [
executable = "one_image",
arguments = "fs -t 15" ]
arguments = "-t 15 -d fs" ]
#-------------------------------------------------------------------------------
#*******************************************************************************

View File

@ -50,20 +50,30 @@ class ImageDriver < OpenNebulaDriver
}
# Register default actions for the protocol
def initialize(fs_type, options={})
def initialize(ds_type, options={})
@options={
:concurrency => 10,
:threaded => true,
:retries => 0,
:local_actions => {
'MV' => nil,
'CP' => nil,
'RM' => nil,
'MKFS' => nil
ACTION[:mv] => nil,
ACTION[:cp] => nil,
ACTION[:rm] => nil,
ACTION[:mkfs] => nil
}
}.merge!(options)
super("image/#{fs_type}", @options)
super("datastore/", @options)
if ds_type == nil
@types = Dir["#{@local_scripts_path}/*/"].map do |d|
d.split('/')[-1]
end
elsif ds_type.class == String
@types = [ds_type]
else
@types = ds_type
end
register_action(ACTION[:mv].to_sym, method("mv"))
register_action(ACTION[:cp].to_sym, method("cp"))
@ -72,22 +82,47 @@ class ImageDriver < OpenNebulaDriver
end
# Image Manager Protocol Actions (generic implementation
def mv(id, src, dst)
do_action("#{src} #{dst} #{id}", id, nil,
ACTION[:mv])
def mv(id, ds, src, dst)
do_image_action(id, ds, :mv, "'#{src}' '#{dst}' '#{id}'")
end
def cp(id, src)
do_action("#{src} #{id}", id, nil, ACTION[:cp])
def cp(id, ds, src)
do_image_action(id, ds, :cp, "'#{src}' '#{id}'")
end
def rm(id, dst)
do_action("#{dst} #{id}", id, nil, ACTION[:rm])
def rm(id, ds, dst)
do_image_action(id, ds, :rm, "'#{dst}' '#{id}'")
end
def mkfs(id, fs, size)
do_action("#{fs} #{size} #{id}", id, nil,
ACTION[:mkfs])
def mkfs(id, ds, fs, size)
do_image_action(id, ds, :mkfs, "'#{fs}' '#{size}' '#{id}'")
end
private
def is_available?(ds, id, action)
if @types.include?(ds)
return true
else
send_message(ACTION[action], RESULT[:failure], id,
"Datastore driver '#{ds}' not available")
return false
end
end
def do_image_action(id, ds, action, arguments)
return if not is_available?(ds,id,:mv)
path = File.join(@local_scripts_path, ds)
cmd = File.join(path, ACTION[action].downcase)
cmd << " " << arguments
rc = LocalCommand.run(cmd, log_method(id))
result, info = get_info_from_execution(rc)
send_message(ACTION[action], result, id, info)
end
end
@ -95,28 +130,25 @@ end
# ImageDriver Main program
opts = GetoptLong.new(
[ '--threads', '-t', GetoptLong::OPTIONAL_ARGUMENT ]
[ '--threads', '-t', GetoptLong::OPTIONAL_ARGUMENT ],
[ '--ds-types', '-d', GetoptLong::OPTIONAL_ARGUMENT ]
)
fs_type = ''
threads = 15
ds_type = nil
threads = 15
begin
opts.each do |opt, arg|
case opt
when '--threads'
threads = arg.to_i
threads = arg.to_i
when '--ds-types'
ds_type = arg.split(',').map {|a| a.strip }
end
end
rescue Exception => e
exit(-1)
end
if ARGV.length >= 1
fs_type = ARGV.shift
else
exit(-1)
end
image_driver = ImageDriver.new(fs_type, :concurrency => threads)
image_driver = ImageDriver.new(ds_type, :concurrency => threads)
image_driver.start_driver