diff --git a/install.sh b/install.sh
index 4d8adbf9f7..3f62f396a1 100755
--- a/install.sh
+++ b/install.sh
@@ -1070,6 +1070,7 @@ ONEDB_MIGRATOR_FILES="src/onedb/2.0_to_2.9.80.rb \
src/onedb/4.3.85_to_4.3.90.rb \
src/onedb/4.3.90_to_4.4.0.rb \
src/onedb/4.4.0_to_4.4.1.rb \
+ src/onedb/4.4.1_to_4.5.80.rb \
src/onedb/fsck.rb \
src/onedb/import_slave.rb \
src/onedb/onedb.rb \
diff --git a/src/onedb/4.4.1_to_4.5.80.rb b/src/onedb/4.4.1_to_4.5.80.rb
new file mode 100644
index 0000000000..9b27ef70ae
--- /dev/null
+++ b/src/onedb/4.4.1_to_4.5.80.rb
@@ -0,0 +1,145 @@
+# -------------------------------------------------------------------------- #
+# Copyright 2002-2014, OpenNebula Project (OpenNebula.org), C12G Labs #
+# #
+# 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 'nokogiri'
+
+module Migrator
+ def db_version
+ "4.5.80"
+ end
+
+ def one_version
+ "OpenNebula 4.5.80"
+ end
+
+ def up
+
+ init_log_time()
+
+ @db.run "ALTER TABLE acl RENAME TO old_acl;"
+ @db.run "CREATE TABLE acl (oid INT PRIMARY KEY, user BIGINT, resource BIGINT, rights BIGINT, zone BIGINT, UNIQUE(user, resource, rights, zone));"
+
+ @db.transaction do
+ @db.fetch("SELECT * FROM old_acl") do |row|
+ @db[:acl].insert(
+ :oid => row[:oid],
+ :user => row[:user],
+ :resource => row[:resource],
+ :rights => row[:rights],
+ :zone => 4294967296)
+ end
+ end
+
+ @db.run "DROP TABLE old_acl;"
+
+ log_time()
+
+ # Move USER/QUOTA to user_quotas table
+
+ @db.run "ALTER TABLE user_pool RENAME TO old_user_pool;"
+ @db.run "CREATE TABLE user_pool (oid INTEGER PRIMARY KEY, name VARCHAR(128), body MEDIUMTEXT, uid INTEGER, gid INTEGER, owner_u INTEGER, group_u INTEGER, other_u INTEGER, UNIQUE(name));"
+
+ @db.run "CREATE TABLE user_quotas (user_oid INTEGER PRIMARY KEY, body MEDIUMTEXT);"
+
+ @db.transaction do
+ @db.fetch("SELECT * FROM old_user_pool") do |row|
+ doc = Nokogiri::XML(row[:body])
+
+ quotas_doc = extract_quotas(doc)
+
+ @db[:user_pool].insert(
+ :oid => row[:oid],
+ :name => row[:name],
+ :body => doc.root.to_s,
+ :uid => row[:oid],
+ :gid => row[:gid],
+ :owner_u => row[:owner_u],
+ :group_u => row[:group_u],
+ :other_u => row[:other_u])
+
+ @db[:user_quotas].insert(
+ :user_oid => row[:oid],
+ :body => quotas_doc.root.to_s)
+ end
+ end
+
+ @db.run "DROP TABLE old_user_pool;"
+
+ log_time()
+
+ # GROUP/RESOURCE_PROVIDER is not needed
+
+ # Move GROUP/QUOTA to group_quotas table
+
+ @db.run "ALTER TABLE group_pool RENAME TO old_group_pool;"
+ @db.run "CREATE TABLE group_pool (oid INTEGER PRIMARY KEY, name VARCHAR(128), body MEDIUMTEXT, uid INTEGER, gid INTEGER, owner_u INTEGER, group_u INTEGER, other_u INTEGER, UNIQUE(name));"
+
+ @db.run "CREATE TABLE group_quotas (group_oid INTEGER PRIMARY KEY, body MEDIUMTEXT);"
+
+ @db.transaction do
+ @db.fetch("SELECT * FROM old_group_pool") do |row|
+ doc = Nokogiri::XML(row[:body])
+
+ quotas_doc = extract_quotas(doc)
+
+ @db[:group_pool].insert(
+ :oid => row[:oid],
+ :name => row[:name],
+ :body => doc.root.to_s,
+ :uid => row[:oid],
+ :gid => row[:gid],
+ :owner_u => row[:owner_u],
+ :group_u => row[:group_u],
+ :other_u => row[:other_u])
+
+ @db[:group_quotas].insert(
+ :group_oid => row[:oid],
+ :body => quotas_doc.root.to_s)
+ end
+ end
+
+ @db.run "DROP TABLE old_group_pool;"
+
+ log_time()
+
+ # Default ZONE
+ @db.run "CREATE TABLE zone_pool (oid INTEGER PRIMARY KEY, name VARCHAR(128), body MEDIUMTEXT, uid INTEGER, gid INTEGER, owner_u INTEGER, group_u INTEGER, other_u INTEGER, UNIQUE(name));"
+ @db.run "INSERT INTO \"zone_pool\" VALUES(0,'OpenNebula','0OpenNebula',0,0,1,0,0);"
+
+ @db.run "INSERT INTO \"pool_control\" VALUES('zone_pool',99);"
+
+ return true
+ end
+
+ def extract_quotas(doc)
+ ds_quota = doc.root.at_xpath("DATASTORE_QUOTA").remove
+ net_quota = doc.root.at_xpath("NETWORK_QUOTA").remove
+ vm_quota = doc.root.at_xpath("VM_QUOTA").remove
+ img_quota = doc.root.at_xpath("IMAGE_QUOTA").remove
+
+ quotas_doc = Nokogiri::XML("")
+
+ quotas_doc.root.add_child(quotas_doc.create_element("ID"))
+ .content = doc.root.at_xpath("ID").text
+
+ quotas_doc.root.add_child(ds_quota)
+ quotas_doc.root.add_child(net_quota)
+ quotas_doc.root.add_child(vm_quota)
+ quotas_doc.root.add_child(img_quota)
+
+ return quotas_doc
+ end
+end