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

Merge branch 'feature-1020'

This commit is contained in:
Ruben S. Montero 2012-01-02 03:05:46 +01:00
commit bf1e80007e
22 changed files with 626 additions and 443 deletions

View File

@ -528,7 +528,6 @@ RUBY_LIB_FILES="src/mad/ruby/ActionManager.rb \
src/mad/ruby/ssh_stream.rb \
src/vnm_mad/one_vnm.rb \
src/mad/ruby/Ganglia.rb \
src/mad/ruby/vmwarelib.rb \
src/oca/ruby/OpenNebula.rb \
src/tm_mad/TMScript.rb \
src/authm_mad/remotes/ssh/ssh_auth.rb \
@ -616,10 +615,12 @@ VMM_EXEC_VMWARE_SCRIPTS="src/vmm_mad/remotes/vmware/cancel \
src/vmm_mad/remotes/vmware/deploy \
src/vmm_mad/remotes/vmware/migrate \
src/vmm_mad/remotes/vmware/restore \
src/vmm_mad/remotes/vmware/reboot \
src/vmm_mad/remotes/vmware/save \
src/vmm_mad/remotes/vmware/poll \
src/vmm_mad/remotes/vmware/checkpoint \
src/vmm_mad/remotes/vmware/shutdown"
src/vmm_mad/remotes/vmware/shutdown \
src/vmm_mad/remotes/vmware/vmware_driver.rb"
#-------------------------------------------------------------------------------
# Information Manager Probes, to be installed under $REMOTES_LOCATION/im
@ -729,7 +730,9 @@ LVM_TM_COMMANDS_LIB_FILES="src/tm_mad/lvm/tm_clone.sh \
VMWARE_TM_COMMANDS_LIB_FILES="src/tm_mad/vmware/tm_clone.sh \
src/tm_mad/vmware/tm_ln.sh \
src/tm_mad/vmware/tm_mv.sh"
src/tm_mad/vmware/tm_mv.sh \
src/tm_mad/vmware/functions.sh \
src/tm_mad/vmware/tm_context.sh"
#-------------------------------------------------------------------------------
# Image Repository drivers, to be installed under $REMOTES_LOCATION/image

View File

@ -16,18 +16,31 @@
# limitations under the License. #
# ---------------------------------------------------------------------------- #
ONE_LOCATION=ENV["ONE_LOCATION"] if !defined?(ONE_LOCATION)
ONE_LOCATION=ENV["ONE_LOCATION"]
if !ONE_LOCATION
ETC_LOCATION = "/etc/one" if !defined?(ETC_LOCATION)
RUBY_LIB_LOCATION = "/usr/lib/one/ruby" if !defined?(RUBY_LIB_LOCATION)
BIN_LOCATION = "/usr/bin"
LIB_LOCATION = "/usr/lib/one"
ETC_LOCATION = "/etc/one/"
VAR_LOCATION = "/var/lib/one"
RUBY_LIB_LOCATION = "/usr/lib/one/ruby"
else
ETC_LOCATION = ONE_LOCATION+"/etc" if !defined?(ETC_LOCATION)
RUBY_LIB_LOCATION = ONE_LOCATION+"/lib/ruby" if !defined?(RUBY_LIB_LOCATION)
LIB_LOCATION = ONE_LOCATION + "/lib"
BIN_LOCATION = ONE_LOCATION + "/bin"
ETC_LOCATION = ONE_LOCATION + "/etc/"
VAR_LOCATION = ONE_LOCATION + "/var/"
RUBY_LIB_LOCATION = ONE_LOCATION+"/lib/ruby"
end
$: << RUBY_LIB_LOCATION
CONF_FILE = ETC_LOCATION + "/vmwarerc"
ENV['LANG'] = 'C'
require "scripts_common"
require 'yaml'
require "CommandManager"
require 'OpenNebula'
include OpenNebula
@ -38,6 +51,30 @@ rescue Exception => e
exit(-1)
end
# ######################################################################## #
# DRIVER HELPER FUNCTIONS #
# ######################################################################## #
#Generates an ESX command using ttyexpect
def esx_cmd(command)
cmd = "#{BIN_LOCATION}/tty_expect -u #{@user} -p #{@pass} #{command}"
end
#Performs a action usgin libvirt
def do_action(cmd)
rc = LocalCommand.run(esx_cmd(cmd))
if rc.code == 0
return [true, rc.stdout]
else
err = "Error executing: #{cmd} err: #{rc.stderr} out: #{rc.stdout}"
OpenNebula.log_error(err)
return [false, rc.code]
end
end
@result_str = ""
def add_info(name, value)
value = "0" if value.nil? or value.to_s.empty?
@result_str << "#{name}=#{value} "
@ -47,23 +84,31 @@ def print_info
puts @result_str
end
@result_str = ""
# ######################################################################## #
# Main Procedure #
# ######################################################################## #
@host = ARGV[2]
host = ARGV[2]
if !@host
if !host
exit -1
end
load ETC_LOCATION + "/vmwarerc"
conf = YAML::load(File.read(CONF_FILE))
if USERNAME.class!=String || PASSWORD.class!=String
warn "Bad ESX credentials, aborting"
exit -1
@uri = conf[:libvirt_uri].gsub!('@HOST@', host)
@user = conf[:username]
@pass = conf[:password]
# Poll the VMware hypervisor
rc, data = do_action("virsh -c #{@uri} --readonly nodeinfo")
if rc == false
exit info
end
data = perform_action("virsh -c #{LIBVIRT_URI} --readonly nodeinfo")
data.split(/\n/).each{|line|
if line.match('^CPU\(s\)')
$total_cpu = line.split(":")[1].strip.to_i * 100

View File

@ -61,6 +61,11 @@ vmware://*)
exec_and_log "cp -rf $SRC $DST" \
"Error copying $SRC to $DST"
BASE_DISK_FILE=`ls $DST | grep -v '.*-s[0-9]*\.vmdk'`
exec_and_log "mv -f $DST/$BASE_DISK_FILE $DST/disk.vmdk" \
"Error renaming disk file $BASE_DISK_FILE to disk.vmdk"
exec_and_log "chmod 0770 $DST"
;;
@ -86,4 +91,4 @@ esac
SIZE=`fs_du $DST`
echo "$DST $SIZE"
echo "$DST $SIZE"

View File

@ -92,12 +92,3 @@ function check_restricted {
echo 0
}
# Change the permissions of all the files inside directoriers (= VMware disks)
function fix_owner_perms {
find $IMAGE_REPOSITORY_PATH -type d \
-mindepth 1 \
-maxdepth 1 \
-execdir chown \
-R $SUDO_USER '{}' \;
}

View File

@ -53,7 +53,9 @@ http://*)
*)
log "Moving local image $SRC to the image repository"
if [ \( -L $SRC \) -a \( "`$READLINK $SRC`" = "$DST" \) ] ; then
if [ \( -L $SRC \) -a \
\( "`$READLINK -f $SRC`" = "`$READLINK -f $DST`" \) ] ; then
log "Not moving files to image repo, they are the same"
else
exec_and_log "mv -f $SRC $DST" "Could not move $SRC to $DST"
@ -63,7 +65,6 @@ esac
if [ -d $DST ]; then
exec_and_log "chmod 0770 $DST"
fix_owner_perms
else
exec_and_log "chmod 0660 $DST"
fi

View File

@ -46,7 +46,7 @@ module OpenNebula
STDERR.puts format_error_message(message)
end
#This function formats an error message for OpenNebula Copyright e
#This function formats an error message for OpenNebula
def self.format_error_message(message)
error_str = "ERROR MESSAGE --8<------\n"
error_str << message

View File

@ -1,60 +0,0 @@
# ---------------------------------------------------------------------------- #
# Copyright 2010-2011, C12G Labs S.L #
# #
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
# not use this file except in compliance with the License. You may obtain #
# a copy of the License at #
# #
# http://www.apache.org/licenses/LICENSE-2.0 #
# #
# Unless required by applicable law or agreed to in writing, software #
# distributed under the License is distributed on an "AS IS" BASIS, #
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
# See the License for the specific language governing permissions and #
# limitations under the License. #
# ---------------------------------------------------------------------------- #
# ---------------------------------------------------------------------------- #
# Set up the environment for the driver #
# ---------------------------------------------------------------------------- #
ONE_LOCATION = ENV["ONE_LOCATION"] if !defined?(ONE_LOCATION)
if !ONE_LOCATION
BIN_LOCATION = "/usr/bin" if !defined?(BIN_LOCATION)
ETC_LOCATION = "/etc/one/" if !defined?(ETC_LOCATION)
RUBY_LIB_LOCATION = "/usr/lib/one/ruby" if !defined?(RUBY_LIB_LOCATION)
else
BIN_LOCATION = ONE_LOCATION + "/bin" if !defined?(BIN_LOCATION)
ETC_LOCATION = ONE_LOCATION + "/etc/" if !defined?(ETC_LOCATION)
if !defined?(RUBY_LIB_LOCATION)
RUBY_LIB_LOCATION = ONE_LOCATION + "/lib/ruby"
end
end
$: << RUBY_LIB_LOCATION
require "OpenNebulaDriver"
require "CommandManager"
# Do host sustitution in the libvirt URI
LIBVIRT_URI.gsub!('@HOST@', @host)
# Common functions
def perform_action(command)
command = BIN_LOCATION + "/tty_expect -u " + USERNAME + " -p " + PASSWORD + " " + command
action_result = LocalCommand.run(command)
if action_result.code == 0
return action_result.stdout
else
log(command, action_result.stderr, action_result.stdout)
return action_result.code
end
end
def log(cmd, stdout, stderr)
STDERR.puts "[VMWARE] cmd failed [" + cmd +
"]. Stderr: " + stderr + ". Stdout: " + stdout
end

View File

@ -0,0 +1,61 @@
# ---------------------------------------------------------------------------- #
# Copyright 2010-2011, C12G Labs S.L #
# #
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
# not use this file except in compliance with the License. You may obtain #
# a copy of the License at #
# #
# http://www.apache.org/licenses/LICENSE-2.0 #
# #
# Unless required by applicable law or agreed to in writing, software #
# distributed under the License is distributed on an "AS IS" BASIS, #
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
# See the License for the specific language governing permissions and #
# limitations under the License. #
# ---------------------------------------------------------------------------- #
#Symlinks the dst_path to dst_path.iso if it is an ISO file
function fix_iso {
dst_path=$1
if [ -f $dst_path ]; then
file -b $dst_path | grep "ISO 9660" > /dev/null 2>&1
if [ $? -eq 0 ]; then
bname=`basename $dst_path`
exec_and_log "ln -s $bname $dst_path/$bname.iso" \
"Can not link ISO file."
fi
fi
}
#Creates the VM dir
function create_vmdir {
dst_path=$1
log "Creating directory `basename $dst_path`"
exec_and_log "mkdir -p $dst_path"
exec_and_log "chmod a+rw $dst_path"
}
#Makes path src ($1) relative to dst ($2)
function make_relative {
src=$1
dst=$2
common=$dst
while [ -z "`echo $src | grep -E "^$common"`" ]; do
common=`dirname $common`
dots="../$dots"
done
echo $dots${src#$common/}
}
#Test if the source file is a disk (and not the image dir for the VM)
function is_disk {
echo $1 | grep -q 'disk\.[0-9]\+$' > /dev/null 2>&1
echo $?
}

View File

@ -26,6 +26,7 @@ else
fi
. $TMCOMMON
. "`dirname $0`/functions.sh"
get_vmdir
@ -37,34 +38,11 @@ fix_paths
log_debug "$1 $2"
log_debug "DST: $DST_PATH"
DST_DIR=`dirname $DST_PATH`
create_vmdir $DST_PATH
log "Creating directory $DST_DIR"
exec_and_log "rm -rf $DST_DIR"
exec_and_log "mkdir -p $DST_PATH"
exec_and_log "chmod a+w $DST_PATH"
log "Cloning $SRC_PATH"
case $SRC in
http://*)
log "Downloading $SRC"
exec_and_log "$WGET -O $DST_PATH $SRC" \
"Error downloading $SRC"
;;
*)
log "Cloning $SRC_PATH"
exec_and_log "cp -r $SRC_PATH/* $DST_PATH" \
"Error copying $SRC to $DST"
;;
esac
SRC_FILE_SUFFIX=`echo ${SRC_PATH##*.}`
if [ "x$SRC_FILE_SUFFIX" == "xiso" ]; then
cd $DST_DIR
DISK_NAME = `basename $DST_PATH`
ln -s $DISK_NAME $DISK_NAME.iso
fi
exec_and_log "chmod a+rw $DST_PATH"
exec_and_log "cp -r $SRC_PATH/* $DST_PATH" \
"Error copying $SRC to $DST"
fix_iso $DST_PATH

63
src/tm_mad/vmware/tm_context.sh Executable file
View File

@ -0,0 +1,63 @@
#!/bin/bash
# ---------------------------------------------------------------------------- #
# Copyright 2010-2011, C12G Labs S.L #
# #
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
# not use this file except in compliance with the License. You may obtain #
# a copy of the License at #
# #
# http://www.apache.org/licenses/LICENSE-2.0 #
# #
# Unless required by applicable law or agreed to in writing, software #
# distributed under the License is distributed on an "AS IS" BASIS, #
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
# See the License for the specific language governing permissions and #
# limitations under the License. #
# ---------------------------------------------------------------------------- #
while (( "$#" )); do
if [ "$#" == "1" ]; then
DST=$1
else
SRC="$SRC $1"
fi
shift
done
if [ -z "${ONE_LOCATION}" ]; then
TMCOMMON=/usr/lib/one/mads/tm_common.sh
else
TMCOMMON=$ONE_LOCATION/lib/mads/tm_common.sh
fi
. $TMCOMMON
. "`dirname $0`/functions.sh"
get_vmdir
DST_PATH=`arg_path $DST`
fix_dst_path
DST_DIR=`dirname $DST_PATH`
ISO_DIR=$DST_DIR/isofiles
exec_and_log "mkdir -p $ISO_DIR"
for f in $SRC; do
case $f in
http://*)
exec_and_log "$WGET -O $ISO_DIR $f"
;;
*)
exec_and_log "cp -R $f $ISO_DIR"
;;
esac
done
exec_and_log "$MKISOFS -o $DST_PATH.iso -J -R $ISO_DIR"
exec_and_log "rm -rf $ISO_DIR"

View File

@ -26,6 +26,7 @@ else
fi
. $TMCOMMON
. "`dirname $0`/functions.sh"
get_vmdir
@ -34,30 +35,21 @@ DST_PATH=`arg_path $DST`
fix_dst_path
DST_DIR=`dirname $DST_PATH`
create_vmdir $DST_PATH
# SRC_PATH needs to be made relative to $ONE_LOCATION/var
VM_FOLDER_NAME=`basename $SRC_PATH`
REPO_NAME="images"
RELATIVE_SRC_PATH="../../$REPO_NAME/$VM_FOLDER_NAME"
log "Creating directory $DST_PATH"
exec_and_log "rm -rf $DST"
exec_and_log "mkdir -p $DST_PATH"
exec_and_log "chmod a+w $DST_PATH"
# ---------------------------------------------------------------------------- #
# Link all files of the disk directory. Note that link paths needs to be #
# relative in order to be accessible from the vSphere Data Store #
# ---------------------------------------------------------------------------- #
REL_SRC_PATH=`make_relative $SRC_PATH $DST_PATH`
log "Link all files in $SRC_PATH to $DST_PATH"
IMAGE_DIR=`dirname $DST_PATH`
cd $IMAGE_DIR
for file in `find $RELATIVE_SRC_PATH/* -type f`; do
file_name=`basename $file`
exec_and_log "ln -sf ../$file $DST_PATH/$file_name"
for file in `find $SRC_PATH -type f`; do
FNAME=`basename $file`
exec_and_log "ln -sf $REL_SRC_PATH/$FNAME $DST_PATH/$FNAME"
done
# Put the symlink mark for tm_mv
exec_and_log "ln -sf $RELATIVE_SRC_PATH $DST_PATH/.disk"
#Mark this disk persistent with a symlink for tm_mv and repo mv
exec_and_log "ln -sf ${REL_SRC_PATH#../../} $DST_PATH/.disk"

View File

@ -1,4 +1,4 @@
#!/bin/bash
#!/bin/bash
# ---------------------------------------------------------------------------- #
# Copyright 2010-2011, C12G Labs S.L #
@ -28,6 +28,7 @@ else
fi
. $TMCOMMON
. "`dirname $0`/functions.sh"
get_vmdir
@ -41,13 +42,13 @@ SRC_PATH=`fix_dir_slashes "$SRC_PATH"`
if [ "$SRC_PATH" = "$DST_PATH" ]; then
log "Will not move, source and destination are equal"
elif [ -f "$SRC_PATH/.disk" ]; then # This link was set in tm_ln.sh
 exec_and_log "mv $SRC_PATH/.disk $DST_PATH"
elif echo $SRC_PATH | grep -q 'disk\.[0-9]\+$'; then
   log "Moving $SRC_PATH"
   exec_and_log "mv $SRC_PATH $DST_PATH"
elif [ -L "$SRC_PATH/.disk" ]; then
exec_and_log "mv $SRC_PATH/.disk $DST_PATH"
elif [ "`is_disk $SRC_PATH`" = "0" ] ; then
log "Moving $SRC_PATH"
exec_and_log "mv $SRC_PATH $DST_PATH"
elif [ -d $SRC_PATH ]; then
log "Will not move, is not saving image"
log "Will not move, it is not saving a VM disk image"
else
log "Moving $SRC_PATH"
exec_and_log "mv $SRC_PATH $DST_PATH"

View File

@ -20,3 +20,4 @@ MKSWAP = dummy/tm_dummy.sh
MKIMAGE = dummy/tm_dummy.sh
DELETE = shared/tm_delete.sh
MV = vmware/tm_mv.sh
CONTEXT = vmware/tm_context.sh

View File

@ -19,36 +19,19 @@
ONE_LOCATION=ENV["ONE_LOCATION"] if !defined?(ONE_LOCATION)
if !ONE_LOCATION
ETC_LOCATION="/etc/one" if !defined?(ETC_LOCATION)
RUBY_LIB_LOCATION="/usr/lib/one/ruby" if !defined?(RUBY_LIB_LOCATION)
else
ETC_LOCATION=ONE_LOCATION+"/etc" if !defined?(ETC_LOCATION)
RUBY_LIB_LOCATION=ONE_LOCATION+"/lib/ruby" if !defined?(RUBY_LIB_LOCATION)
end
$: << RUBY_LIB_LOCATION
$: << File.dirname(__FILE__)
require 'vmware_driver'
deploy_id = ARGV[0]
@host = ARGV[1]
host = ARGV[1]
if !@host or !deploy_id
exit -1
end
load ETC_LOCATION + "/vmwarerc"
if USERNAME.class!=String || PASSWORD.class!=String
warn "Bad ESX credentials, aborting"
exit -1
end
# Destroy the VM
data = perform_action("virsh -c #{LIBVIRT_URI} destroy #{deploy_id}")
if data.class == Fixnum
exit data
end
# Undefine the VM
data = perform_action("virsh -c #{LIBVIRT_URI} undefine #{deploy_id}")
if data.class == Fixnum
exit data
end
vmware_drv = VMwareDriver.new(host)
vmware_drv.cancel(deploy_id)

View File

@ -19,74 +19,22 @@
ONE_LOCATION=ENV["ONE_LOCATION"] if !defined?(ONE_LOCATION)
if !ONE_LOCATION
ETC_LOCATION="/etc/one" if !defined?(ETC_LOCATION)
RUBY_LIB_LOCATION="/usr/lib/one/ruby" if !defined?(RUBY_LIB_LOCATION)
else
ETC_LOCATION=ONE_LOCATION+"/etc" if !defined?(ETC_LOCATION)
RUBY_LIB_LOCATION=ONE_LOCATION+"/lib/ruby" if !defined?(RUBY_LIB_LOCATION)
end
deployment_file = ARGV[0]
@host = ARGV[1]
$: << RUBY_LIB_LOCATION
$: << File.dirname(__FILE__)
if !@host or !deployment_file
exit -1
end
require 'vmware_driver'
load ETC_LOCATION + "/vmwarerc"
dfile = ARGV[0]
host = ARGV[1]
id = ARGV[2]
if USERNAME.class!=String || PASSWORD.class!=String
warn "Bad ESX credentials, aborting"
exit -1
end
vmware_drv = VMwareDriver.new(host)
# Define the VM
data = perform_action("virsh -c #{LIBVIRT_URI} define #{deployment_file}")
puts vmware_drv.deploy(dfile, id)
if data.class == Fixnum
exit data
end
domainname = ""
success = false
data.split('\n').each{ |line|
domainname = line.match("Domain (.*) defined from (.*)")
if domainname
success = true
break
end
}
if !success
exit -1
end
domainname = domainname[1]
# Start the VM
data = perform_action("virsh -c #{LIBVIRT_URI} start #{domainname}")
if data.class == Fixnum
exit data
end
definedname = domainname
domainname = ""
success = false
data.split('\n').each{ |line|
domainname = line.match("Domain (.*) started")
if domainname
success = true
break
end
}
if !success
exit -1
end
if definedname != domainname[1]
exit -1
else
puts definedname
end
exit 0

View File

@ -16,62 +16,23 @@
# limitations under the License. #
# ---------------------------------------------------------------------------- #
ONE_LOCATION=ENV["ONE_LOCATION"] if !defined?(ONE_LOCATION)
if !ONE_LOCATION
ETC_LOCATION="/etc/one" if !defined?(ETC_LOCATION)
RUBY_LIB_LOCATION="/usr/lib/one/ruby" if !defined?(RUBY_LIB_LOCATION)
else
ETC_LOCATION=ONE_LOCATION+"/etc" if !defined?(ETC_LOCATION)
RUBY_LIB_LOCATION=ONE_LOCATION+"/lib/ruby" if !defined?(RUBY_LIB_LOCATION)
end
$: << RUBY_LIB_LOCATION
$: << File.dirname(__FILE__)
require 'vmware_driver'
deploy_id = ARGV[0]
@host = ARGV[1]
if !@host or !deploy_id
exit -1
end
load ETC_LOCATION + "/vmwarerc"
if USERNAME.class!=String || PASSWORD.class!=String
warn "Bad ESX credentials, aborting"
exit -1
end
data = perform_action(
"virsh -c #{LIBVIRT_URI} --readonly dominfo #{deploy_id}")
if data.class == Fixnum
puts "STATE=d"
exit 0
end
state = ""
data.split('\n').each{ |line|
state = line.match("^State: (.*)")
if state
state = state[1].strip
break
end
}
state_short = ""
case state
when "running","blocked","shutdown","dying"
state_short = 'a'
when "paused"
state_short = 'p'
when "crashed"
state_short = 'c'
else
state_short = 'd'
end
puts "STATE=#{state_short}"
host = ARGV[1]
vmware_drv = VMwareDriver.new(host)
puts vmware_drv.poll(deploy_id)

View File

@ -0,0 +1,37 @@
#!/usr/bin/env ruby
# ---------------------------------------------------------------------------- #
# Copyright 2010-2011, C12G Labs S.L #
# #
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
# not use this file except in compliance with the License. You may obtain #
# a copy of the License at #
# #
# http://www.apache.org/licenses/LICENSE-2.0 #
# #
# Unless required by applicable law or agreed to in writing, software #
# distributed under the License is distributed on an "AS IS" BASIS, #
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
# See the License for the specific language governing permissions and #
# limitations under the License. #
# ---------------------------------------------------------------------------- #
ONE_LOCATION=ENV["ONE_LOCATION"] if !defined?(ONE_LOCATION)
if !ONE_LOCATION
RUBY_LIB_LOCATION="/usr/lib/one/ruby" if !defined?(RUBY_LIB_LOCATION)
else
RUBY_LIB_LOCATION=ONE_LOCATION+"/lib/ruby" if !defined?(RUBY_LIB_LOCATION)
end
$: << RUBY_LIB_LOCATION
$: << File.dirname(__FILE__)
require 'vmware_driver'
deploy_id = ARGV[0]
host = ARGV[1]
vmware_drv = VMwareDriver.new(host)
vmware_drv.reboot(deploy_id)

View File

@ -19,71 +19,19 @@
ONE_LOCATION=ENV["ONE_LOCATION"] if !defined?(ONE_LOCATION)
if !ONE_LOCATION
ETC_LOCATION="/etc/one" if !defined?(ETC_LOCATION)
RUBY_LIB_LOCATION="/usr/lib/one/ruby" if !defined?(RUBY_LIB_LOCATION)
else
ETC_LOCATION=ONE_LOCATION+"/etc" if !defined?(ETC_LOCATION)
RUBY_LIB_LOCATION=ONE_LOCATION+"/lib/ruby" if !defined?(RUBY_LIB_LOCATION)
end
file = ARGV[0]
@host = ARGV[1]
if !@host or !file
exit -1
end
load ETC_LOCATION + "/vmwarerc"
if USERNAME.class!=String || PASSWORD.class!=String
warn "Bad ESX credentials, aborting"
exit -1
end
# Define the VM
deployment_file = File.dirname(File.dirname(file)) + "/deployment.0"
data = perform_action("virsh -c #{LIBVIRT_URI} define #{deployment_file}")
if data.class == Fixnum
exit data
end
domainname = ""
success = false
data.split('\n').each{ |line|
domainname = line.match("Domain (.*) defined from (.*)")
if domainname
success = true
break
end
}
if !success
exit -1
end
domainname = domainname[1]
# Revert snapshot VM
# Note: This assumes the checkpoint name is "checkpoint", to change this
# it is needed to change also
# $ONE_LOCATION/lib/remotes/vmm/vmware/checkpoint
data = perform_action(
"virsh -c #{LIBVIRT_URI} snapshot-revert #{domainname} checkpoint")
if data.class == Fixnum
exit data
end
# Delete checkpoint
data = perform_action(
"virsh -c #{LIBVIRT_URI} snapshot-delete #{domainname} checkpoint")
if data.class == Fixnum
exit data
end
$: << RUBY_LIB_LOCATION
$: << File.dirname(__FILE__)
require 'vmware_driver'
checkpoint_file = ARGV[0]
host = ARGV[1]
vmware_drv = VMwareDriver.new(host)
vmware_drv.restore(checkpoint_file)

View File

@ -19,50 +19,20 @@
ONE_LOCATION=ENV["ONE_LOCATION"] if !defined?(ONE_LOCATION)
if !ONE_LOCATION
ETC_LOCATION = "/etc/one" if !defined?(ETC_LOCATION)
VAR_LOCATION = "/var/lib/one" if !defined?(VAR_LOCATION)
RUBY_LIB_LOCATION="/usr/lib/one/ruby" if !defined?(RUBY_LIB_LOCATION)
else
ETC_LOCATION = ONE_LOCATION + "/etc" if !defined?(ETC_LOCATION)
VAR_LOCATION = ONE_LOCATION + "/var" if !defined?(VAR_LOCATION)
RUBY_LIB_LOCATION=ONE_LOCATION+"/lib/ruby" if !defined?(RUBY_LIB_LOCATION)
end
deploy_id = ARGV[0]
file = ARGV[1]
@host = ARGV[2]
$: << RUBY_LIB_LOCATION
$: << File.dirname(__FILE__)
if !@host or !deploy_id or !file
exit -1
end
require 'vmware_driver'
load ETC_LOCATION + "/vmwarerc"
if USERNAME.class!=String || PASSWORD.class!=String
warn "Bad ESX credentials, aborting"
exit -1
end
# Create snapshot
checkpoint_xml_file = VAR_LOCATION + "/remotes/vmm/vmware/checkpoint"
data = perform_action(
"virsh -c #{LIBVIRT_URI} snapshot-create #{deploy_id} #{checkpoint_xml_file}")
if data.class == Fixnum
exit data
end
# Suspend VM
data = perform_action("virsh -c #{LIBVIRT_URI} suspend #{deploy_id}")
if data.class == Fixnum
exit data
end
# Undefine VM
data = perform_action("virsh -c #{LIBVIRT_URI} undefine #{deploy_id}")
if data.class == Fixnum
exit data
end
deploy_id = ARGV[0]
file = ARGV[1]
host = ARGV[2]
vmware_drv = VMwareDriver.new(host)
vmware_drv.save(deploy_id)

View File

@ -19,44 +19,19 @@
ONE_LOCATION=ENV["ONE_LOCATION"] if !defined?(ONE_LOCATION)
if !ONE_LOCATION
ETC_LOCATION="/etc/one" if !defined?(ETC_LOCATION)
RUBY_LIB_LOCATION="/usr/lib/one/ruby" if !defined?(RUBY_LIB_LOCATION)
else
ETC_LOCATION=ONE_LOCATION+"/etc" if !defined?(ETC_LOCATION)
RUBY_LIB_LOCATION=ONE_LOCATION+"/lib/ruby" if !defined?(RUBY_LIB_LOCATION)
end
$: << RUBY_LIB_LOCATION
$: << File.dirname(__FILE__)
require 'vmware_driver'
deploy_id = ARGV[0]
@host = ARGV[1]
if !@host or !deploy_id
exit -1
end
load ETC_LOCATION + "/vmwarerc"
if USERNAME.class!=String || PASSWORD.class!=String
warn "Bad ESX credentials, aborting"
exit -1
end
data = perform_action("virsh -c #{LIBVIRT_URI} shutdown #{deploy_id}")
if data.class == Fixnum
exit data
end
begin
data = perform_action("virsh -c #{LIBVIRT_URI} list")
if data.class == Fixnum
exit data
end
sleep 2
end while data.match(deploy_id)
data = perform_action("virsh -c #{LIBVIRT_URI} undefine #{deploy_id}")
if data.class == Fixnum
exit data
end
host = ARGV[1]
vmware_drv = VMwareDriver.new(host)
vmware_drv.shutdown(deploy_id)

View File

@ -0,0 +1,297 @@
# ---------------------------------------------------------------------------- #
# Copyright 2010-2011, C12G Labs S.L #
# #
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
# not use this file except in compliance with the License. You may obtain #
# a copy of the License at #
# #
# http://www.apache.org/licenses/LICENSE-2.0 #
# #
# Unless required by applicable law or agreed to in writing, software #
# distributed under the License is distributed on an "AS IS" BASIS, #
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
# See the License for the specific language governing permissions and #
# limitations under the License. #
# ---------------------------------------------------------------------------- #
require "scripts_common"
require 'yaml'
require "CommandManager"
class VMwareDriver
# -------------------------------------------------------------------------#
# Set up the environment for the driver #
# -------------------------------------------------------------------------#
ONE_LOCATION = ENV["ONE_LOCATION"]
if !ONE_LOCATION
BIN_LOCATION = "/usr/bin"
LIB_LOCATION = "/usr/lib/one"
ETC_LOCATION = "/etc/one/"
VAR_LOCATION = "/var/lib/one"
else
LIB_LOCATION = ONE_LOCATION + "/lib"
BIN_LOCATION = ONE_LOCATION + "/bin"
ETC_LOCATION = ONE_LOCATION + "/etc/"
VAR_LOCATION = ONE_LOCATION + "/var/"
end
CONF_FILE = ETC_LOCATION + "/vmwarerc"
CHECKPOINT = VAR_LOCATION + "/remotes/vmm/vmware/checkpoint"
ENV['LANG'] = 'C'
SHUTDOWN_INTERVAL = 5
SHUTDOWN_TIMEOUT = 500
def initialize(host)
conf = YAML::load(File.read(CONF_FILE))
@uri = conf[:libvirt_uri].gsub!('@HOST@', host)
@user = conf[:username]
@pass = conf[:password]
end
# ######################################################################## #
# VMWARE DRIVER ACTIONS #
# ######################################################################## #
# ------------------------------------------------------------------------ #
# Deploy & define a VM based on its description file #
# ------------------------------------------------------------------------ #
def deploy(dfile, id)
# Define the domain if it is not already defined (e.g. from UNKNOWN)
if not domain_defined?(id)
deploy_id = define_domain(dfile)
exit -1 if deploy_id.nil?
else
deploy_id = "one-#{id}"
end
OpenNebula.log_debug("Successfully defined domain #{deploy_id}.")
# Start the VM
rc, info = do_action("virsh -c #{@uri} start #{deploy_id}")
if rc == false
undefine_domain(deploy_id)
exit info
end
return deploy_id
end
# ------------------------------------------------------------------------ #
# Cancels & undefine the VM #
# ------------------------------------------------------------------------ #
def cancel(deploy_id)
# Destroy the VM
rc, info = do_action("virsh -c #{@uri} destroy #{deploy_id}")
exit info if rc == false
OpenNebula.log_debug("Successfully canceled domain #{deploy_id}.")
# Undefine the VM
undefine_domain(deploy_id)
end
# ------------------------------------------------------------------------ #
# Reboots a running VM #
# ------------------------------------------------------------------------ #
def reboot(deploy_id)
rc, info = do_action("virsh -c #{@uri} reboot #{deploy_id}")
exit info if rc == false
OpenNebula.log_debug("Domain #{deploy_id} successfully rebooted.")
end
# ------------------------------------------------------------------------ #
# Migrate #
# ------------------------------------------------------------------------ #
def migrate
OpenNebula.log_error("Migration action is currently not supported")
exit -1
end
# ------------------------------------------------------------------------ #
# Monitor a VM #
# ------------------------------------------------------------------------ #
def poll(deploy_id)
rc, info = do_action("virsh -c #{@uri} --readonly dominfo #{deploy_id}")
return "STATE=d" if rc == false
state = ""
info.split('\n').each{ |line|
mdata = line.match("^State: (.*)")
if mdata
state = mdata[1].strip
break
end
}
case state
when "running","blocked","shutdown","dying"
state_short = 'a'
when "paused"
state_short = 'p'
when "crashed"
state_short = 'c'
else
state_short = 'd'
end
return "STATE=#{state_short}"
end
# ------------------------------------------------------------------------ #
# Restore a VM from a previously saved checkpoint #
# ------------------------------------------------------------------------ #
def restore(checkpoint)
begin
# Define the VM
dfile = File.dirname(File.dirname(checkpoint)) + "/deployment.0"
rescue => e
OpenNebula.log_error("Can not open checkpoint #{e.message}")
exit -1
end
deploy_id = define_domain(dfile)
exit -1 if deploy_id.nil?
# Revert snapshot VM
# Note: This assumes the checkpoint name is "checkpoint", to change
# this it is needed to change also [1]
#
# [1] $ONE_LOCATION/lib/remotes/vmm/vmware/checkpoint
rc, info = do_action(
"virsh -c #{@uri} snapshot-revert #{deploy_id} checkpoint")
exit info if rc == false
# Delete checkpoint
rc, info = do_action(
"virsh -c #{@uri} snapshot-delete #{deploy_id} checkpoint")
OpenNebula.log_error("Could not delete snapshot") if rc == false
end
# ------------------------------------------------------------------------ #
# Saves a VM taking a snapshot #
# ------------------------------------------------------------------------ #
def save(deploy_id)
# Take a snapshot for the VM
rc, info = do_action(
"virsh -c #{@uri} snapshot-create #{deploy_id} #{CHECKPOINT}")
exit info if rc == false
# Suspend VM
rc, info = do_action("virsh -c #{@uri} suspend #{deploy_id}")
exit info if rc == false
# Undefine VM
undefine_domain(deploy_id)
end
# ------------------------------------------------------------------------ #
# Shutdown a VM #
# ------------------------------------------------------------------------ #
def shutdown(deploy_id)
rc, info = do_action("virsh -c #{@uri} shutdown #{deploy_id}")
exit info if rc == false
counter = 0
begin
rc, info = do_action("virsh -c #{@uri} list")
info = "" if rc == false
sleep SHUTDOWN_INTERVAL
counter = counter + SHUTDOWN_INTERVAL
end while info.match(deploy_id) and counter < SHUTDOWN_TIMEOUT
if counter >= SHUTDOWN_TIMEOUT
OpenNebula.error_message(
"Timeout reached, VM #{deploy_id} is still alive")
exit - 1
end
undefine_domain(deploy_id)
end
# ######################################################################## #
# DRIVER HELPER FUNCTIONS #
# ######################################################################## #
private
#Generates an ESX command using ttyexpect
def esx_cmd(command)
cmd = "#{BIN_LOCATION}/tty_expect -u #{@user} -p #{@pass} #{command}"
end
#Performs a action usgin libvirt
def do_action(cmd)
rc = LocalCommand.run(esx_cmd(cmd))
if rc.code == 0
return [true, rc.stdout]
else
err = "Error executing: #{cmd} err: #{rc.stderr} out: #{rc.stdout}"
OpenNebula.log_error(err)
return [false, rc.code]
end
end
# Undefines a domain in the ESX hypervisor
def undefine_domain(id)
rc, info = do_action("virsh -c #{@uri} undefine #{id}")
if rc == false
OpenNebula.log_error("Error undefining domain #{id}")
OpenNebula.log_error("Domain #{id} has to be undefined manually")
return info
end
return 0
end
#defines a domain in the ESX hypervisor
def define_domain(dfile)
deploy_id = nil
rc, info = do_action("virsh -c #{@uri} define #{dfile}")
return nil if rc == false
info.split('\n').each{ |line|
mdata = line.match("Domain (.*) defined from (.*)")
if mdata
deploy_id = mdata[1]
break
end
}
deploy_id.strip!
return deploy_id
end
def domain_defined?(one_id)
rc, info = do_action("virsh -c #{@uri} dominfo one-#{one_id}")
return rc
end
end

View File

@ -14,28 +14,11 @@
# limitations under the License. #
# ---------------------------------------------------------------------------- #
# User configurable variables (Ruby syntax)
LIBVIRT_URI = "esx://@HOST@/?no_verify=1"
QEMU_PROTOCOL = "qemu"
# Libvirt configuration
:libvirt_uri: "esx://@HOST@/?no_verify=1"
:qemu_protocol: "qemu"
# Username and password of the VMware hypervisor
USERNAME = "oneadmin"
PASSWORD =
# Loading the vmware library for mads
# Please leave this uncommented
ONE_LOCATION=ENV["ONE_LOCATION"] if !defined?(ONE_LOCATION)
if !ONE_LOCATION
LIB_LOCATION = "/usr/lib/one" if !defined?(LIB_LOCATION)
else
LIB_LOCATION = ONE_LOCATION+"/lib" if !defined?(LIB_LOCATION)
end
load LIB_LOCATION + "/ruby/vmwarelib.rb"
ENV['LANG']='C'
:username: "oneadmin"
:password: