diff --git a/share/hooks/host_error.rb b/share/hooks/host_error.rb
index 5bf785204f..b4f7864233 100755
--- a/share/hooks/host_error.rb
+++ b/share/hooks/host_error.rb
@@ -1,4 +1,4 @@
-#!/usr/bin/env ruby
+#!/usr/bin/env ruby
# -------------------------------------------------------------------------- #
# Copyright 2002-2011, OpenNebula Project Leads (OpenNebula.org) #
@@ -18,9 +18,9 @@
####################################################
# Script to implement host failure tolerance
-# It can be set to
+# It can be set to
# -r resubmit VMs running in the host
-# -d delete VMs running in the host
+# -d delete VMs running in the host
####################################################
ONE_LOCATION=ENV["ONE_LOCATION"]
@@ -64,16 +64,18 @@ host.info
host_name = host.name
# Loop through all vms
-vms = VirtualMachinePool.new(client, -2)
+vms = VirtualMachinePool.new(client)
exit -1 if OpenNebula.is_error?(vms)
-vms.info
+vms.info_all
-vm_ids_array = vms.retrieve_elements("/VM_POOL/VM[STATE=3]/HISTORY[HOSTNAME=\"#{host_name}\"]/../ID")
+state = "STATE=3"
+state += " or STATE=5" if force == "y"
+vm_ids_array = vms.retrieve_elements("/VM_POOL/VM[#{state}]/HISTORY_RECORDS/HISTORY[HOSTNAME=\"#{host_name}\" and last()]/../../ID")
if vm_ids_array
- vm_ids_array.each do |vm_id|
+ vm_ids_array.each do |vm_id|
vm=OpenNebula::VirtualMachine.new_with_id(vm_id, client)
vm.info
@@ -85,21 +87,3 @@ if vm_ids_array
end
end
-if force == "y"
- vm_ids_array = vms.retrieve_elements("/VM_POOL/VM[STATE=5]/HISTORY[HOSTNAME=\"#{host_name}\"]/../ID")
-
- if vm_ids_array
- vm_ids_array.each do |vm_id|
- vm=OpenNebula::VirtualMachine.new_with_id(vm_id, client)
- vm.info
-
- if mode == "-r"
- vm.resubmit
- elsif mode == "-d"
- vm.finalize
- end
- end
- end
-end
-
-
diff --git a/src/cli/one_helper.rb b/src/cli/one_helper.rb
index 683d71f83f..1a918b89ef 100644
--- a/src/cli/one_helper.rb
+++ b/src/cli/one_helper.rb
@@ -81,8 +81,8 @@ EOT
end
end
- def list_pool(options, top=false, filter_flag=-2)
- filter_flag ||= -2
+ def list_pool(options, top=false, filter_flag=nil)
+ filter_flag ||= OpenNebula::Pool::INFO_GROUP
pool = factory_pool(filter_flag)
@@ -219,15 +219,19 @@ EOT
def filterflag_to_i(str)
filter_flag = case str
- when "a", "all" then -2
- when "m", "mine" then -3
- when "g", "group" then -1
+ when "a", "all" then OpenNebula::Pool::INFO_ALL
+ when "m", "mine" then OpenNebula::Pool::INFO_MINE
+ when "g", "group" then OpenNebula::Pool::INFO_GROUP
else
if str.match(/^[0123456789]+$/)
str.to_i
else
user = translation_hash[:users].select { |k,v| v==str }
- user.length > 0 ? user.first.first.to_i : -2
+ if user.length > 0
+ user.first.first.to_i
+ else
+ OpenNebula::Pool::INFO_GROUP
+ end
end
end
diff --git a/src/cloud/ec2/lib/EC2QueryServer.rb b/src/cloud/ec2/lib/EC2QueryServer.rb
index 03e7f44ecf..1d8c786729 100644
--- a/src/cloud/ec2/lib/EC2QueryServer.rb
+++ b/src/cloud/ec2/lib/EC2QueryServer.rb
@@ -161,11 +161,10 @@ class EC2QueryServer < CloudServer
end
def describe_images(params, one_client)
- user_flag=-1
+ user_flag = OpenNebula::Pool::INFO_GROUP
impool = ImagePool.new(one_client, user_flag)
impool.info
- erb_user_name = params['AWSAccessKeyId']
erb_version = params['Version']
response = ERB.new(File.read(@config[:views]+"/describe_images.erb"))
@@ -221,7 +220,7 @@ class EC2QueryServer < CloudServer
end
def describe_instances(params, one_client)
- user_flag=-1
+ user_flag = OpenNebula::Pool::INFO_MINE
vmpool = VirtualMachinePool.new(one_client, user_flag)
vmpool.info
diff --git a/src/cloud/ec2/lib/views/describe_images.erb b/src/cloud/ec2/lib/views/describe_images.erb
index 5ef277ad1a..163241c670 100644
--- a/src/cloud/ec2/lib/views/describe_images.erb
+++ b/src/cloud/ec2/lib/views/describe_images.erb
@@ -13,7 +13,7 @@
<% elsif im['STATE'] == '4'%>
pending
<% end %>
- <%= erb_user_name %>
+ <%= im['UNAME'] %>
<% if im['PUBLIC'] == '0' %>
false
<% elsif im['PUBLIC'] == '1' %>
diff --git a/src/onedb/1.rb b/src/onedb/1.rb
index 86c07f0c04..98db3116c3 100644
--- a/src/onedb/1.rb
+++ b/src/onedb/1.rb
@@ -46,16 +46,21 @@ module Migrator
if( oid == 0 )
gid = 0
+ groupname = "oneadmin"
else
gid = 1
+ groupname = "users"
user_group_ids += "#{oid}"
end
name = row[:user_name]
- body = "#{oid}#{gid}#{name}#{row[:password]}#{row[:enabled]}#{gid}"
+ body = "#{oid}#{gid}#{groupname}#{name}#{row[:password]}#{row[:enabled]}"
- @db.run "INSERT INTO user_pool VALUES(#{oid},'#{name}','#{body}');"
+ @db[:user_pool].insert(
+ :oid => oid,
+ :name => name,
+ :body => body)
end
# Delete old user_pool
@@ -98,7 +103,12 @@ module Migrator
body = "#{oid}#{name}#{state}#{row[:im_mad]}#{row[:vm_mad]}#{row[:tm_mad]}#{last_mon_time}#{host_share}#{ template_doc.to_s }"
- @db.run "INSERT INTO host_pool VALUES(#{oid},'#{name}','#{body}', #{state}, #{last_mon_time});"
+ @db[:host_pool].insert(
+ :oid => oid,
+ :name => name,
+ :body => body,
+ :state => state,
+ :last_mon_time => last_mon_time)
end
# Delete old table
@@ -131,13 +141,20 @@ module Migrator
name = row[:name]
uid = row[:uid]
gid = (uid == 0) ? 0 : 1
+ group = (uid == 0) ? "oneadmin" : "users"
public = row[:public]
# In OpenNebula 2.0 Image States go from 0 to 3, in 3.0 go
# from 0 to 5, but the meaning is the same for states 0 to 3
- body = "#{oid}#{row[:uid]}#{gid}#{name}#{row[:type]}#{public}#{row[:persistent]}#{row[:regtime]}#{row[:source]}#{row[:state]}#{row[:running_vms]}#{row[:template]}"
+ body = "#{oid}#{row[:uid]}#{gid}#{get_username(row[:uid])}#{group}#{name}#{row[:type]}#{public}#{row[:persistent]}#{row[:regtime]}#{row[:source]}#{row[:state]}#{row[:running_vms]}#{row[:template]}"
- @db.run "INSERT INTO image_pool VALUES(#{oid},'#{name}','#{body}', #{uid}, #{gid}, #{public});"
+ @db[:image_pool].insert(
+ :oid => oid,
+ :name => name,
+ :body => body,
+ :uid => uid,
+ :gid => gid,
+ :public => public)
end
# Delete old table
@@ -167,7 +184,10 @@ module Migrator
body = "#{seq}#{row[:host_name]}#{row[:vm_dir]}#{row[:hid]}#{row[:stime]}#{row[:etime]}#{row[:vm_mad]}#{row[:tm_mad]}#{row[:pstime]}#{row[:petime]}#{row[:rstime]}#{row[:retime]}#{row[:estime]}#{row[:eetime]}#{row[:reason]}"
- @db.run "INSERT INTO history VALUES(#{vid},'#{seq}','#{body}');"
+ @db[:history].insert(
+ :vid => vid,
+ :seq => seq,
+ :body => body)
end
@@ -177,6 +197,7 @@ module Migrator
name = row[:name]
uid = row[:uid]
gid = (uid == 0) ? 0 : 1
+ group = (uid == 0) ? "oneadmin" : "users"
last_poll = row[:last_poll]
state = row[:state]
lcm_state = row[:lcm_state]
@@ -187,17 +208,21 @@ module Migrator
history = history_row[:body]
end
- body = "#{oid}#{uid}#{gid}#{name}#{last_poll}#{state}#{lcm_state}#{row[:stime]}#{row[:etime]}#{row[:deploy_id]}#{row[:memory]}#{row[:cpu]}#{row[:net_tx]}#{row[:net_rx]}#{row[:template]}#{history}"
+ if ( history != "" )
+ history = "#{history}"
+ end
+
+ body = "#{oid}#{uid}#{gid}#{get_username(uid)}#{group}#{name}#{last_poll}#{state}#{lcm_state}#{row[:stime]}#{row[:etime]}#{row[:deploy_id]}#{row[:memory]}#{row[:cpu]}#{row[:net_tx]}#{row[:net_rx]}#{row[:template]}#{history}"
@db[:vm_pool].insert(
- :oid => oid,
- :name => name,
- :body => body,
- :uid => uid,
- :gid => gid,
- :last_poll => last_poll,
- :state => state,
- :lcm_state => lcm_state)
+ :oid => oid,
+ :name => name,
+ :body => body,
+ :uid => uid,
+ :gid => gid,
+ :last_poll => last_poll,
+ :state => state,
+ :lcm_state => lcm_state)
end
@@ -228,14 +253,21 @@ module Migrator
name = row[:name]
uid = row[:uid]
gid = (uid == 0) ? 0 : 1
+ group = (uid == 0) ? "oneadmin" : "users"
public = row[:public]
# is stored in the DB, but it is not used to rebuild
# the VirtualNetwork object, and it is generated each time the
# network is listed. So setting it to 0 is safe
- body = "#{oid}#{uid}#{gid}#{name}#{row[:type]}#{row[:bridge]}#{public}0#{row[:template]}"
+ body = "#{oid}#{uid}#{gid}#{get_username(uid)}#{group}#{name}#{row[:type]}#{row[:bridge]}#{public}0#{row[:template]}"
- @db.run "INSERT INTO network_pool VALUES(#{oid},'#{name}','#{body}', #{uid}, #{gid}, #{public});"
+ @db[:network_pool].insert(
+ :oid => oid,
+ :name => name,
+ :body => body,
+ :uid => uid,
+ :gid => gid,
+ :public => public)
end
# Read each entry in the old table, and insert into new table
@@ -245,7 +277,10 @@ module Migrator
body = "#{ip}#{row[:mac_prefix]}#{row[:mac_suffix]}#{row[:used]}#{row[:vid]}"
- @db.run "INSERT INTO leases VALUES(#{oid}, #{ip}, '#{body}');"
+ @db[:leases].insert(
+ :oid => oid,
+ :ip => ip,
+ :body => body)
end
# Delete old tables
@@ -259,11 +294,12 @@ module Migrator
@db.run "CREATE TABLE db_versioning (oid INTEGER PRIMARY KEY, version INTEGER, timestamp INTEGER, comment VARCHAR(256));"
@db.run "CREATE TABLE template_pool (oid INTEGER PRIMARY KEY, name VARCHAR(256), body TEXT, uid INTEGER, gid INTEGER, public INTEGER);"
+ @db.run "CREATE TABLE acl (oid INT PRIMARY KEY, user BIGINT, resource BIGINT, rights BIGINT);"
# The group pool has two default ones
@db.run "CREATE TABLE group_pool (oid INTEGER PRIMARY KEY, name VARCHAR(256), body TEXT, UNIQUE(name));"
- @db.run "INSERT INTO group_pool VALUES(0,'oneadmin','00oneadmin0');"
- @db.run "INSERT INTO group_pool VALUES(1,'users','10users#{user_group_ids}');"
+ @db.run "INSERT INTO group_pool VALUES(0,'oneadmin','0oneadmin0');"
+ @db.run "INSERT INTO group_pool VALUES(1,'users','1users#{user_group_ids}');"
# New pool_control table contains the last_oid used, must be rebuilt
@db.run "CREATE TABLE pool_control (tablename VARCHAR(32) PRIMARY KEY, last_oid BIGINT UNSIGNED)"
@@ -282,4 +318,14 @@ module Migrator
return true
end
+
+ def get_username(uid)
+ username = ""
+
+ @db.fetch("SELECT name FROM user_pool WHERE oid=#{uid}") do |user|
+ username = user[:name]
+ end
+
+ return username
+ end
end
diff --git a/src/onedb/test/2.2/one.db b/src/onedb/test/2.2/one.db
index 5e62d3ad7d..62d34ebc1f 100644
Binary files a/src/onedb/test/2.2/one.db and b/src/onedb/test/2.2/one.db differ
diff --git a/src/onedb/test/create.sh b/src/onedb/test/create.sh
index c6f817eb76..6a49a6b070 100755
--- a/src/onedb/test/create.sh
+++ b/src/onedb/test/create.sh
@@ -1,13 +1,26 @@
#!/bin/bash
+# This script populates a DB with different resources
+# Set the TWO_SERIES flag if the target OpenNebula is 2.0 or 2.2
+
+# The oneadmin's auth must be in ~/.one/one_auth
+
TWO_SERIES="no"
#TWO_SERIES="yes"
+ONEADMIN_AUTH=$ONE_AUTH
TMP_FILE="tmp_file"
+# 5 Users
-# 5 Hosts and Clusters
+for i in 0 1 2 3 4; do
+ echo "user_$i:pass_$i" > one_auth$i
+ oneuser create user_$i pass_$i
+done
+
+
+# 5 Hosts
for i in 0 1 2 3 4; do
onehost create host_$i im_dummy vmm_dummy tm_dummy
@@ -18,7 +31,9 @@ done
for i in 0 1 2; do
( echo "NAME = vnet_fixed_$i"
echo "TYPE = FIXED"
+ echo "PUBLIC = FIXED"
echo "BRIDGE = vbr1"
+ echo "EXTRA_ATT = \"EXTRA_VALUE FOR VNET $i\""
echo "LEASES = [IP=192.168.$i.1]"
echo "LEASES = [IP=192.168.$i.2]"
echo "LEASES = [IP=192.168.$i.3]"
@@ -26,6 +41,9 @@ for i in 0 1 2; do
echo "LEASES = [IP=192.168.$i.5]"
) > $TMP_FILE
+ # Change auth
+ export ONE_AUTH="`pwd`/one_auth$i"
+
onevnet create $TMP_FILE
done
@@ -37,9 +55,14 @@ for i in 3 4; do
echo "BRIDGE = vbr0"
echo "NETWORK_SIZE = C"
echo "NETWORK_ADDRESS = 192.168.$i.0"
+ echo "EXTRA_ATT = \"EXTRA_VALUE FOR VNET $i\""
) > $TMP_FILE
+ # Change auth
+ export ONE_AUTH="`pwd`/one_auth$i"
+
onevnet create $TMP_FILE
+ onevnet publish $i
done
# 5 Images
@@ -48,17 +71,14 @@ for i in 0 1 2 3 4; do
( echo "NAME = image_$i"
echo "TYPE = DATABLOCK"
echo "PATH = /dev/null"
+ echo "EXTRA_ATT = \"EXTRA_VALUE FOR IMG $i\""
) > $TMP_FILE
+ export ONE_AUTH="`pwd`/one_auth$i"
+
oneimage create $TMP_FILE
done
-# 5 Users
-
-for i in 0 1 2 3 4; do
- oneuser create user_$i pass_$i
-done
-
# 5 VMs
for i in 0 1 2 3 4; do
@@ -82,23 +102,38 @@ for i in 0 1 2 3 4; do
echo "REQUIREMENTS = \"CPUSPEED > 1000\" "
echo "RANK = FREECPU "
echo "CONTEXT = [ files = \"/dev/null\" ] "
+
+ echo "EXTRA_ATT = \"EXTRA_VALUE FOR VM $i\""
) > $TMP_FILE
+ export ONE_AUTH="`pwd`/one_auth$i"
+
if [ $TWO_SERIES == "yes" ]; then
onevm create $TMP_FILE
else
onetemplate create $TMP_FILE
onetemplate instantiate $i
fi
+done
+
+if [ -n "$ONEADMIN_AUTH" ] ; then
+ export ONE_AUTH=$ONEADMIN_AUTH
+else
+ # Unset the one_auth file, cli will look for it in ~/.one/one_auth
+ unset ONE_AUTH
+fi
+
+for i in 0 1 2 3; do
onevm deploy $i $i
done
rm $TMP_FILE
+
echo -n "Waiting until all VMs are running "
-while [ $(onevm list | grep -c runn) -ne 5 ]; do
+while [ $(onevm list a | grep -c runn) -ne 4 ]; do
echo -n "."
sleep 0.5s
done
@@ -108,17 +143,34 @@ echo " ok"
# Wait for some monitorization data
sleep 3s
+
onevm migrate 0 1
-while [ $(onevm list | grep -c runn) -ne 5 ]; do sleep 0.5s; done
+while [ $(onevm list a | grep -c runn) -ne 4 ]; do sleep 0.5s; done
+
onevm livemigrate 1 2
-while [ $(onevm list | grep -c runn) -ne 5 ]; do sleep 0.5s; done
+while [ $(onevm list a | grep -c runn) -ne 4 ]; do sleep 0.5s; done
+
+onevm stop 1
+while [ $(onevm list a | grep -c stop) -ne 1 ]; do sleep 0.5s; done
+
+onevm resume 1
+while [ $(onevm list a | grep -c pend) -ne 2 ]; do sleep 0.5s; done
+
+onevm deploy 1 0
+while [ $(onevm list a | grep -c runn) -ne 4 ]; do sleep 0.5s; done
+
+onevm migrate 1 3
+while [ $(onevm list a | grep -c runn) -ne 4 ]; do sleep 0.5s; done
+
+onevm shutdown 1
+while [ $(onevm list a | grep -c runn) -ne 3 ]; do sleep 0.5s; done
onevm shutdown 2
-while [ $(onevm list | grep -c runn) -ne 4 ]; do sleep 0.5s; done
+while [ $(onevm list a | grep -c runn) -ne 2 ]; do sleep 0.5s; done
onevm delete 3
-while [ $(onevm list | grep -c runn) -ne 3 ]; do sleep 0.5s; done
+while [ $(onevm list a | grep -c runn) -ne 1 ]; do sleep 0.5s; done
onehost disable 3
oneimage persistent 3
@@ -130,8 +182,20 @@ sleep 3s
mkdir -p results/xml_files
-for obj in host vnet image vm; do
+for obj in host vnet image vm user; do
+ one$obj list a -x > results/xml_files/$obj-pool.xml
+
for i in 0 1 2 3 4; do
one$obj show -x $i > results/xml_files/$obj-$i.xml
done
done
+
+if [ $TWO_SERIES == "no" ]; then
+ oneacl list a -x > results/xml_files/acl-pool.xml
+ onegroup list a -x > results/xml_files/group-pool.xml
+fi
+
+# Clean one auth files
+for i in 0 1 2 3 4; do
+ rm one_auth$i
+done
diff --git a/src/onedb/test/test.sh b/src/onedb/test/test.sh
index 4af12bc809..0a7cd2f9cf 100755
--- a/src/onedb/test/test.sh
+++ b/src/onedb/test/test.sh
@@ -26,8 +26,12 @@ fi
cp oned.conf $ONEDCONF_LOCATION
+
+echo "oneadmin:oneadmin" > oneadmin_auth
export ONE_XMLRPC=http://localhost:2888/RPC2
export PATH=$ONE_LOCATION/bin:$PATH
+export ONE_AUTH="`pwd`/oneadmin_auth"
+
PID=$$
@@ -62,12 +66,16 @@ onedb upgrade -v --sqlite results/one.db.upgraded --backup results/one.db.backup
echo "Done. Upgraded DB and the one just created will be compared."
# Dump both DB schemas
-sqlite3 results/one.db.upgraded ".schema" > results/one.db.upgraded.schema
-sqlite3 results/one.db.3.0 ".schema" > results/one.db.3.0.schema
+sqlite3 results/one.db.upgraded ".schema" > results/one.db.upgraded.tmpschema
+sqlite3 results/one.db.3.0 ".schema" > results/one.db.3.0.tmpschema
# Sort the files contents, to avoid false diff errors
-sort results/one.db.upgraded.schema > results/one.db.upgraded.schema
-sort results/one.db.3.0.schema > results/one.db.3.0.schema
+sort results/one.db.upgraded.tmpschema > results/one.db.upgraded.schema
+sort results/one.db.3.0.tmpschema > results/one.db.3.0.schema
+
+rm results/one.db.upgraded.tmpschema
+rm results/one.db.3.0.tmpschema
+
# Perform a diff
@@ -92,12 +100,17 @@ cp results/one.db.upgraded $VAR_LOCATION/one.db
oned -f &
sleep 2s;
-for obj in host vnet image vm; do
+for obj in host vnet image vm user; do
for i in 0 1 2 3 4; do
one$obj show -x $i > results/xml_files/$obj-$i-upgraded.xml
done
done
+for obj in host vnet image vm acl group user; do
+ one$obj list a -x > results/xml_files/$obj-pool-upgraded.xml
+done
+
+
pkill -P $PID oned
sleep 2s;
pkill -9 -P $PID oned
@@ -106,6 +119,14 @@ echo "XML output collected. A diff will be performed."
mkdir results/diff_files
+diff <(grep -v -e "" -e "" -e "NAME>" results/xml_files/host-pool.xml) <(grep -v -e "" -e "" -e "NAME>" results/xml_files/host-pool-upgraded.xml) > results/diff_files/host-pool.diff
+diff <(grep -v -e "" -e "" results/xml_files/image-pool.xml) <(grep -v -e "" -e "" results/xml_files/image-pool-upgraded.xml) > results/diff_files/image-pool.diff
+diff <(grep -v -e "" -e "TIME>" -e "" -e "" -e "" results/xml_files/vm-pool.xml) <(grep -v -e "" -e "TIME>" -e "" -e "" -e "" results/xml_files/vm-pool-upgraded.xml) > results/diff_files/vm-pool.diff
+
+for obj in vnet acl group user; do
+ diff <(cat results/xml_files/$obj-pool.xml) <(cat results/xml_files/$obj-pool-upgraded.xml) > results/diff_files/$obj-pool.diff
+done
+
for i in 0 1 2 3 4; do
diff <(grep -v -e "" -e "" -e "NAME>" results/xml_files/host-$i.xml) <(grep -v -e "" -e "" -e "NAME>" results/xml_files/host-$i-upgraded.xml) > results/diff_files/host-$i.diff
@@ -113,12 +134,15 @@ for i in 0 1 2 3 4; do
diff <(grep -v -e "" -e "" results/xml_files/image-$i.xml) <(grep -v -e "" -e "" results/xml_files/image-$i-upgraded.xml) > results/diff_files/image-$i.diff
- diff <(grep -v -e "" -e "TIME>" -e "" -e "" -e "" results/xml_files/vm-$i.xml) <(grep -v -e "" -e "TIME>" -e "" -e "" -e "" results/xml_files/vm-$i-upgraded.xml) > results/diff_files/vm-$i.diff
+ diff <(grep -v -e "" -e "TIME>" -e "" -e "" -e "" -e "" results/xml_files/vm-$i.xml) <(grep -v -e "" -e "TIME>" -e "" -e "" -e "" -e "" results/xml_files/vm-$i-upgraded.xml) > results/diff_files/vm-$i.diff
+
+ diff <(cat results/xml_files/user-$i.xml) <(cat results/xml_files/user-$i-upgraded.xml) > results/diff_files/user-$i.diff
done
+
CODE=0
-for obj in host vnet image vm; do
+for obj in host vnet image vm user; do
for i in 0 1 2 3 4; do
FILE=results/diff_files/$obj-$i.diff
if [[ -s $FILE ]] ; then
@@ -128,8 +152,19 @@ for obj in host vnet image vm; do
done
done
+for obj in host vnet image vm acl group user; do
+ FILE=results/diff_files/$obj-pool.diff
+ if [[ -s $FILE ]] ; then
+ echo "Error: diff file $FILE is not empty."
+ CODE=-1
+ fi
+done
+
+
if [ $CODE -eq 0 ]; then
echo "Done, all tests passed."
fi
+rm oneadmin_auth
+
exit $CODE