Remove tools/migration https://reviews.apache.org/r/6976/diff/
Signed-off-by: Mice Xia <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/5a9d7a79 Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/5a9d7a79 Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/5a9d7a79 Branch: refs/heads/4.0 Commit: 5a9d7a79100ac87ff3c900dc63a5ca0868b3d1bb Parents: 073a915 Author: Sebastien Goasguen <[email protected]> Authored: Mon Sep 10 10:33:23 2012 +0800 Committer: Mice Xia <[email protected]> Committed: Mon Sep 10 10:37:37 2012 +0800 ---------------------------------------------------------------------- tools/migration/10to21Upgrade.txt | 80 -- tools/migration/XenAPI.py | 200 ---- tools/migration/share_all_lus.sh | 238 ----- tools/migration/upgrade.properties | 102 -- tools/migration/upgrade.py | 1612 ------------------------------- 5 files changed, 0 insertions(+), 2232 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5a9d7a79/tools/migration/10to21Upgrade.txt ---------------------------------------------------------------------- diff --git a/tools/migration/10to21Upgrade.txt b/tools/migration/10to21Upgrade.txt deleted file mode 100644 index ccbea23..0000000 --- a/tools/migration/10to21Upgrade.txt +++ /dev/null @@ -1,80 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -CloudStack Migration: 1.0.x to 2.1.x - -How it works: - -There are four major steps to migrating a 1.0.x system's data to version 2.1.x of the CloudStack: - 1. Users in the 1.0.x system need to be re-created in the 2.1.x system - 2. Public IPs that are allocated in the 1.0.x system need to be allocated in the 2.1.x sytem - 3. Port forwarding and load balancer rules that were created in the 1.0.x system need to be re-created in the 2.1.x system - 4. Virtual machines and the data on their root/data disks need to be migrated - -To accomplish steps 1, 2, and 3, the CloudStack Migration tool automatically reads information from 1.0.x system's database and re-creates the data in the 2.1.x system through a combination of API calls and direct SQL inserts. -To accomplish step 4, the tool creates a direct link between 1.0.x storage servers and 2.1.x XenServers, and copies volume data using the XenServer API. - -The overall process should take between 15-30 minutes per VM, depending on the speed of your private network and the size of the volumes involved. - - -What you need: - -1. A running 1.0.x system that has one zone and one pod. -2. Necessary hardware for the 2.1.x system: one or more management servers, and one or more XenServers that are all on the same public network as the 1.0.x system. - * The 2.1.x management server must be able to access the 1.0.x management server's database, as well as the 1.0.x system's storage servers. -3. The 10to21Upgrade.tgz package. - - - -How to run the migration tool: - -1. If you DO NOT have a 2.1.x system installed and running: Do a fresh 2.1.x install (please refer to the admin guide for instructions), taking into account the following special instructions: - * Before you add any XenServer host, add one public IP range into the system with exactly two public IPs; these must be unallocated in the 1.0.x system. - * After adding all of your XenServer hosts in the UI, verify that the secondary storage VM and console proxy VM started. Then, add remainining public IPs as a second IP range. - -2. Register a bootable ISO and note down its database ID (you will need this for step 6). The OS of the ISO doesn't matter. - If you already have a bootable ISO in the 2.1 system, you can use its database ID in step 6. - * If you have no preference about which ISO to use, simply enter the following URL to register an Ubuntu 10.04 ISO: - http://localhost:8096/client/api?command=registerIso&bootable=true&zoneid=1&ispublic=true&name=Ubuntu&displayText=Ubuntu&url=http://ftp.ucsb.edu/pub/mirrors/linux/ubuntu/10.04/ubuntu-10.04.1-desktop-amd64.iso&ostypeid=59 - * Else, use the following API command (replacing variables as necessary): - http://localhost:8096/client/api/?command=registerIso&bootable=true&zoneid=1&ispublic=true&name=ISO_NAME&displayText=ISO_DISPLAY_TEXT&url=ISO_URL&ostypeid=ISO_OS_TYPE_ID - * To determine the ISO_OS_TYPE_ID, run the following API command and find the ID that corresponds to the OS of the ISO: - http://localhost:8096/client/api/?command=listOsTypes - -3. For every service offering in the 1.0.x system: - * Make sure there is a service offering in the 2.1.x system with the same cpu #, cpu speed, and RAM size. - * Make sure there is a disk offering in the 2.1.x system with the same disk size. 1.0.x allowed for creating service offerings with disk sizes that had an arbitrary number of MB. - However, in 2.1.x, disk offerings must be created in multiples of 1 GB. If there is a service offering in the 1.0.x system with a disk size that is not a - multiple of 1 Gb (1024 MB), create a disk offering in the 2.1.x system that is the 1.0.x disk size rounded to the next GB. For example, a disk size of 2000 MB in 1.0.x - will correspond to a disk offering with size 2 GB in the 2.1.x system. - -4. Install Python on the 2.1.x management server, if it isn't already installed. Version 2.4 or above is required. - -5. Download 10to21Upgrade.tgz to any folder on the 2.1.x management server, and uncompress it. - -6. Fill out upgrade.properties. Instructions about various fields are included in the file itself. - -7. If you DO have a 2.1.x system installed and running: - * Add a new public IP range in the 2.1.x system that corresponds to the public IP range in the 1.0.x system. - The public IP ranges that already exist in the 2.1.x system must not overlap with the IP range in the 1.0.x system. - * Run "python upgrade.py publicips". This will immediately allocate the public IPs of all users in the 1.0.x system, so that existing 2.1.x users can't allocate them. - -8. Run "python upgrade.py" on the 2.1.x management server. Status information will be printed out to the console. - * If there is an error, please contact CloudStack Support and send us the migration log. By default, this file is called "migrationLog" and is in the same directory as upgrade.py. - * After the cause for an error has been resolved, you can run upgrade.py again from the beginning; it will skip over any work that has already been done. - * If you would like to re-enable a user on 1.0.x system, simply stop all of the user's VMs that have been migrated on the 2.1.x system, and start the user's VMs on the 1.0.x system. - http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5a9d7a79/tools/migration/XenAPI.py ---------------------------------------------------------------------- diff --git a/tools/migration/XenAPI.py b/tools/migration/XenAPI.py deleted file mode 100644 index d290cf6..0000000 --- a/tools/migration/XenAPI.py +++ /dev/null @@ -1,200 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -import gettext -import xmlrpclib -import httplib -import socket - -translation = gettext.translation('xen-xm', fallback = True) - -API_VERSION_1_1 = '1.1' -API_VERSION_1_2 = '1.2' - -class Failure(Exception): - def __init__(self, details): - self.details = details - - def __str__(self): - try: - return str(self.details) - except Exception, exn: - import sys - print >>sys.stderr, exn - return "Xen-API failure: %s" % str(self.details) - - def _details_map(self): - return dict([(str(i), self.details[i]) - for i in range(len(self.details))]) - - -_RECONNECT_AND_RETRY = (lambda _ : ()) - -class UDSHTTPConnection(httplib.HTTPConnection): - """HTTPConnection subclass to allow HTTP over Unix domain sockets. """ - def connect(self): - path = self.host.replace("_", "/") - self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - self.sock.connect(path) - -class UDSHTTP(httplib.HTTP): - _connection_class = UDSHTTPConnection - -class UDSTransport(xmlrpclib.Transport): - def __init__(self, use_datetime=0): - self._use_datetime = use_datetime - self._extra_headers=[] - def add_extra_header(self, key, value): - self._extra_headers += [ (key,value) ] - def make_connection(self, host): - return UDSHTTP(host) - def send_request(self, connection, handler, request_body): - connection.putrequest("POST", handler) - for key, value in self._extra_headers: - connection.putheader(key, value) - -class Session(xmlrpclib.ServerProxy): - """A server proxy and session manager for communicating with xapi using - the Xen-API. - - Example: - - session = Session('http://localhost/') - session.login_with_password('me', 'mypassword') - session.xenapi.VM.start(vm_uuid) - session.xenapi.session.logout() - """ - - def __init__(self, uri, transport=None, encoding=None, verbose=0, - allow_none=1): - xmlrpclib.ServerProxy.__init__(self, uri, transport, encoding, - verbose, allow_none) - self.transport = transport - self._session = None - self.last_login_method = None - self.last_login_params = None - self.API_version = API_VERSION_1_1 - - - def xenapi_request(self, methodname, params): - if methodname.startswith('login'): - self._login(methodname, params) - return None - elif methodname == 'logout' or methodname == 'session.logout': - self._logout() - return None - else: - retry_count = 0 - while retry_count < 3: - full_params = (self._session,) + params - result = _parse_result(getattr(self, methodname)(*full_params)) - if result == _RECONNECT_AND_RETRY: - retry_count += 1 - if self.last_login_method: - self._login(self.last_login_method, - self.last_login_params) - else: - raise xmlrpclib.Fault(401, 'You must log in') - else: - return result - raise xmlrpclib.Fault( - 500, 'Tried 3 times to get a valid session, but failed') - - - def _login(self, method, params): - result = _parse_result(getattr(self, 'session.%s' % method)(*params)) - if result == _RECONNECT_AND_RETRY: - raise xmlrpclib.Fault( - 500, 'Received SESSION_INVALID when logging in') - self._session = result - self.last_login_method = method - self.last_login_params = params - self.API_version = self._get_api_version() - - def _logout(self): - try: - if self.last_login_method.startswith("slave_local"): - return _parse_result(self.session.local_logout(self._session)) - else: - return _parse_result(self.session.logout(self._session)) - finally: - self._session = None - self.last_login_method = None - self.last_login_params = None - self.API_version = API_VERSION_1_1 - - def _get_api_version(self): - pool = self.xenapi.pool.get_all()[0] - host = self.xenapi.pool.get_master(pool) - major = self.xenapi.host.get_API_version_major(host) - minor = self.xenapi.host.get_API_version_minor(host) - return "%s.%s"%(major,minor) - - def __getattr__(self, name): - if name == 'handle': - return self._session - elif name == 'xenapi': - return _Dispatcher(self.API_version, self.xenapi_request, None) - elif name.startswith('login') or name.startswith('slave_local'): - return lambda *params: self._login(name, params) - else: - return xmlrpclib.ServerProxy.__getattr__(self, name) - -def xapi_local(): - return Session("http://_var_xapi_xapi/", transport=UDSTransport()) - -def _parse_result(result): - if type(result) != dict or 'Status' not in result: - raise xmlrpclib.Fault(500, 'Missing Status in response from server' + result) - if result['Status'] == 'Success': - if 'Value' in result: - return result['Value'] - else: - raise xmlrpclib.Fault(500, - 'Missing Value in response from server') - else: - if 'ErrorDescription' in result: - if result['ErrorDescription'][0] == 'SESSION_INVALID': - return _RECONNECT_AND_RETRY - else: - raise Failure(result['ErrorDescription']) - else: - raise xmlrpclib.Fault( - 500, 'Missing ErrorDescription in response from server') - - -# Based upon _Method from xmlrpclib. -class _Dispatcher: - def __init__(self, API_version, send, name): - self.__API_version = API_version - self.__send = send - self.__name = name - - def __repr__(self): - if self.__name: - return '<XenAPI._Dispatcher for %s>' % self.__name - else: - return '<XenAPI._Dispatcher>' - - def __getattr__(self, name): - if self.__name is None: - return _Dispatcher(self.__API_version, self.__send, name) - else: - return _Dispatcher(self.__API_version, self.__send, "%s.%s" % (self.__name, name)) - - def __call__(self, *args): - return self.__send(self.__name, args) http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5a9d7a79/tools/migration/share_all_lus.sh ---------------------------------------------------------------------- diff --git a/tools/migration/share_all_lus.sh b/tools/migration/share_all_lus.sh deleted file mode 100755 index fc6f124..0000000 --- a/tools/migration/share_all_lus.sh +++ /dev/null @@ -1,238 +0,0 @@ -# !/usr/bin/env bash -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - - - - -# lu_share.sh -- makes all logical units (LUs) available over iSCSI, for a specified initiator IQN -# OpenSolaris - -usage() { - printf "Usage: %s -i <initiator-iqn> [ -s | -u ]\n" $(basename $0) >&2 -} - -valid_target_name() { # <target-name> - echo $1 | grep ':lu:' >/dev/null - return $? -} - -target_iqn_from_target_name() { # <target-name> - echo $1 | cut -d':' -f1,2,3 -} - -hg_from_initiator_iqn() { # <initiator-iqn> - echo $1 - return 0 -} - -lu_name_from_target_name() { # <target-name> - echo $1 | cut -d':' -f5 -} - -view_entry_from_hg_and_lu_name() { # <host-group-name> <lu-name> - local hg=$1 - local lu_name=$2 - local view= - local last_view= - local last_hg= - for w in $(stmfadm list-view -l $lu_name) - do - case $w in - [0-9]*) last_view=$w - ;; - esac - - if [ "$w" == "$hg" ] - then - echo $last_view - return 0 - fi - done - return 1 -} - -create_host_group() { # <initiator-iqn> - local hg=$1 - local i_iqn=$2 - local host_group= - - local result= - result=$(stmfadm create-hg $hg 2>&1) - if [ $? -ne 0 ] - then - echo $result | grep "already exists" > /dev/null - if [ $? -ne 0 ] - then - printf "%s: create-hg %s failed due to %s\n" $(basename $0) $i_iqn $result >&2 - return 11 - fi - fi - - result=$(stmfadm add-hg-member -g $hg $i_iqn 2>&1) - if [ $? -ne 0 ] - then - echo $result | grep "already exists" > /dev/null - if [ $? -ne 0 ] - then - printf "%s: unable to add %s due to %s\n" $(basename $0) $i_iqn $result >&2 - return 12 - fi - fi - return 0 -} - -add_view() { # <hg> <lu_name> - local i=1 - local hg=$1 - local lu=$2 - - while [ $i -lt 500 ] - do - local lun=$[ ( $RANDOM % 512 ) ] - local result= - result=$(stmfadm add-view -h $hg -n $lun $lu 2>&1) - if [ $? -eq 0 ] - then - printf "lun %s for luname %s\n" $lun $lu >&2 - #stmfadm list-view -l $lu - #sbdadm list-lu - return 0 - fi - echo $result | grep "view entry exists" > /dev/null - if [ $? -eq 0 ] - then - return 0 - fi - echo $result | grep "LUN already in use" > /dev/null - if [ $? -ne 0 ] - then - echo $result - return 1 - fi - let i=i+1 - done - printf "Unable to add view after lots of tries\n" >&2 - return 1 -} - -add_view_and_hg() { # <initiator_iqn> <lu_name> - local i_iqn=$1 - local lu_name=$2 - local hg="Migration" - local result= - - if ! create_host_group $hg $i_iqn - then - printf "%s: create_host_group failed: %s %s\n" $(basename $0) $i_iqn $lu_name >&2 - return 22 - fi - - if ! add_view $hg $lu_name - then - return 1 - fi - - return 0 -} - -remove_view() { # <initiator-iqn> <lu-name> - local lu_name=$1 - local hg="Migration" - local view=$(view_entry_from_hg_and_lu_name $hg $lu_name) - if [ -n "$view" ] - then - local result= - result=$(stmfadm remove-view -l $lu_name $view 2>&1) - if [ $? -ne 0 ] - then - echo $result | grep "not found" - if [ $? -eq 0 ] - then - return 0 - fi - echo $result | grep "no views found" - if [ $? -eq 0 ] - then - return 0 - fi - printf "Unable to remove view due to: $result\n" >&2 - return 5 - fi - fi - return 0 -} - -# set -x - -iflag= -sflag= -uflag= - -while getopts 'sui:' OPTION -do - case $OPTION in - i) iflag=1 - init_iqn="$OPTARG" - ;; - s) sflag=1 - ;; - u) uflag=1 - ;; - *) usage - exit 2 - ;; - esac -done - -if [ "$sflag$iflag" != "11" -a "$uflag" != "1" ] -then - usage - exit 3 -fi - -lu_names="$(stmfadm list-lu | cut -d":" -f2)" - -for lu_name in $lu_names -do - if [ "$uflag" == "1" ] - then - remove_view $lu_name - if [ $? -gt 0 ] - then - printf "%s: remove_view failed: %s\n" $(basename $0) $lu_name >&2 - exit 1 - fi - else - if [ "$sflag" == "1" ] - then - add_view_and_hg $init_iqn $lu_name - if [ $? -gt 0 ] - then - printf "%s: add_view failed: %s\n" $(basename $0) $lu_name >&2 - exit 1 - fi - fi - fi -done - -if [ "$uflag" == "1" ] -then - stmfadm delete-hg "Migration" -fi - -exit 0 http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5a9d7a79/tools/migration/upgrade.properties ---------------------------------------------------------------------- diff --git a/tools/migration/upgrade.properties b/tools/migration/upgrade.properties deleted file mode 100644 index 8cc0b55..0000000 --- a/tools/migration/upgrade.properties +++ /dev/null @@ -1,102 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. - -### Users to upgrade - -# Specify the list of user IDs to upgrade as a comma separated list; i.e. 3, 4, 5 -# This is optional; you can also run upgrade.py with a list of user IDs; i.e. "python upgrade.py 3 4 5". -USERS = - - - -### Information about the 1.0.x system - -# The management server IP -SRC_MANAGEMENT_SERVER_IP = - -# The database username and password -SRC_DB_LOGIN = -SRC_DB_PASSWORD = - -# A map between storage host IPs and root passwords -# Ex: 1.2.3.4:password1, 2.3.4.5:password2 -STORAGE_HOST_PASSWORDS = - -# The id of the zone -SRC_ZONE_ID = 1 - - - -### Information about the 2.1.x system - -# The management server IP -DEST_MANAGEMENT_SERVER_IP = localhost - -# The database username and password -DEST_DB_LOGIN = -DEST_DB_PASSWORD = - -# The private IP and root password of one of the XenServers in the 2.1.x system -# Fill this section out only if all of your XenServers have the same root password -DEST_XENSERVER_IP = -DEST_XENSERVER_PASSWORD = - -# A map between XenServer IPs in the 2.1.x system to passwords for each host -# I.e. 1.2.3.4:password1, 2.3.4.5:password2, 3.4.5.6:password3 -# Fill this section out only if your XenServers have different root passwords -DEST_XENSERVER_PASSWORDS = - -# A map between template IDs in the 1.0.x system to guest OS IDs in the 2.1.x system -# Should be in the format: [1.0 template ID]:[2.1 guest OS ID]. Ex: 3:12, 4:14, 5:64 -# To find the ID that corresponds to a guest OS, refer to the output of the API command: http://localhost:8096/client/api/?command=listOsTypes -GUEST_OS_MAP = - -# The id of the ISO you registered -DEST_ISO_ID = 201 - -# The id of the zone -DEST_ZONE_ID = 1 - -# The id of the default CentOS template -DEST_TEMPLATE_ID = 2 - -# The id of the default service offering -DEST_SERVICE_OFFERING_ID = 3 - -# The id of the default disk offering -DEST_DISK_OFFERING_ID = 5 - -# The id of the guest OS category that corresponds to Windows -DEST_WINDOWS_GUEST_OS_CATEGORY_ID = 6 - - - -### Misc. variables - -# The location of the log file -LOG_FILE = ./migrationLog - -# The location of the migrated users file -MIGRATED_ACCOUNTS_FILE = ./migratedAccounts - -# The number of retries for async API commands -ASYNC_RETRIES = 20 - -# The time to pause between retries for async API commands -ASYNC_SLEEP_TIME = 30 - -
