.. 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.


.. |version_to_upgrade| replace:: 4.6.x

Upgrade Instruction from |version_to_upgrade|
=============================================

This section will guide you from CloudStack |version_to_upgrade| to CloudStack 
|version|.

Any steps that are hypervisor-specific will be called out with a note.

We recommend reading through this section once or twice before beginning
your upgrade procedure, and working through it on a test system before
working on a production system.

.. note:: 
    The following upgrade instructions should be performed regardless of
    hypervisor type.

Upgrade Steps:

#. Backup CloudStack database (MySQL)
#. Add package repository for MySQL connector
#. Upgrade CloudStack management server(s)
#. Update hypervisors specific dependencies


Packages repository
-------------------

Most users of CloudStack manage the installation and upgrades of
CloudStack with one of Linux's predominant package systems, RPM or
APT. This guide assumes you'll be using RPM and Yum (for Red Hat
Enterprise Linux or CentOS), or APT and Debian packages (for Ubuntu).

Create RPM or Debian packages (as appropriate) and a repository from
the |version| source, or check the Apache CloudStack downloads page at
http://cloudstack.apache.org/downloads.html
for package repositories supplied by community members. You will need
them for :ref:`ubuntu46` or :ref:`rhel46` and :ref:`kvm46` hosts upgrade. 

Instructions for creating packages from the CloudStack source are in the 
`CloudStack Installation Guide`_.

.. include:: _sysvm_templates.rst

Database Preparation
--------------------

Backup current database

#. Stop your management server or servers. Run this on all management
   server hosts:

   .. sourcecode:: bash

      $ sudo service cloudstack-management stop

#. If you are running a usage server or usage servers, stop those as well:

   .. sourcecode:: bash

      $ sudo service cloudstack-usage stop

#. Make a backup of your MySQL database. If you run into any issues or
   need to roll back the upgrade, this will assist in debugging or
   restoring your existing environment. You'll be prompted for your
   password.

   .. sourcecode:: bash

      $ mysqldump -u root -p cloud > cloud-backup_`date '+%Y-%m-%d'`.sql
      $ mysqldump -u root -p cloud_usage > cloud_usage-backup_`date '+%Y-%m-%d'`.sql

#. **(KVM Only)** If primary storage of type local storage is in use, the
   path for this storage needs to be verified to ensure it passes new
   validation. Check local storage by querying the cloud.storage\_pool
   table:

   .. sourcecode:: bash

      $ mysql -u cloud -p -e "select id,name,path from cloud.storage_pool where pool_type='Filesystem'"

   If local storage paths are found to have a trailing forward slash,
   remove it:

   .. sourcecode:: bash

      $ mysql -u cloud -p -e 'update cloud.storage_pool set path="/var/lib/libvirt/images" where path="/var/lib/libvirt/images/"';


.. _ubuntu46:

Management Server on Ubuntu
---------------------------

If you are using Ubuntu, follow this procedure to upgrade your packages. If 
not, skip to step :ref:`rhel46`.

.. note:: 
   **Community Packages:** This section assumes you're using the community
   supplied packages for CloudStack. If you've created your own packages and
   APT repository, substitute your own URL for the ones used in these examples.

The first order of business will be to change the sources list for
each system with CloudStack packages. This means all management
servers, and any hosts that have the KVM agent. (No changes should
be necessary for hosts that are running VMware or Xen.)


.. _apt-repo46:

.. include:: _java_8_ubuntu.rst

CloudStack apt repository
^^^^^^^^^^^^^^^^^^^^^^^^^

Start by opening ``/etc/apt/sources.list.d/cloudstack.list`` on
any systems that have CloudStack packages installed.

This file should have one line, which contains:

.. sourcecode:: bash

   deb http://cloudstack.apt-get.eu/ubuntu precise 4.6

We'll change it to point to the new package repository:

.. sourcecode:: bash

   deb http://cloudstack.apt-get.eu/ubuntu precise 4.9

Setup the public key for the above repository:

.. sourcecode:: bash

   wget -qO - http://cloudstack.apt-get.eu/release.asc | sudo apt-key add -

If you're using your own package repository, change this line to
read as appropriate for your |version| repository.

#. Now update your apt package list:

   .. sourcecode:: bash

      $ sudo apt-get update

#. Now that you have the repository configured, it's time to upgrade
   the ``cloudstack-management`` package.

   .. sourcecode:: bash

      $ sudo apt-get upgrade cloudstack-management

#. If you use CloudStack usage server

   .. sourcecode:: bash

      $ sudo apt-get upgrade cloudstack-usage


.. _rhel46:

Management Server on CentOS/RHEL
--------------------------------

If you are using CentOS or RHEL, follow this procedure to upgrade your 
packages. If not, skip to hypervisors section, then :ref:`upg-sysvm46`.

.. note:: 
   **Community Packages:** This section assumes you're using the community
   supplied packages for CloudStack. If you've created your own packages and
   yum repository, substitute your own URL for the ones used in these examples.

.. include:: _mysql_connector.rst


.. _rpm-repo46:

CloudStack RPM repository
^^^^^^^^^^^^^^^^^^^^^^^^^^

The first order of business will be to change the yum repository
for each system with CloudStack packages. This means all
management servers, and any hosts that have the KVM agent.

(No changes should be necessary for hosts that are running VMware
or Xen.)

Start by opening ``/etc/yum.repos.d/cloudstack.repo`` on any
systems that have CloudStack packages installed.

This file should have content similar to the following:

.. sourcecode:: bash

   [apache-cloudstack]
   name=Apache CloudStack
   baseurl=http://cloudstack.apt-get.eu/rhel/4.6/
   enabled=1
   gpgcheck=0

If you are using the community provided package repository, change
the base url to ``http://cloudstack.apt-get.eu/centos/$releasever/4.9/``.

Setup the GPG public key if you wish to enable ``gpgcheck=1``:

.. sourcecode:: bash

   rpm --import http://cloudstack.apt-get.eu/RPM-GPG-KEY


If you're using your own package repository, change this line to
read as appropriate for your |version| repository.

#. Remove the deprecated dependency for awsapi.

   .. sourcecode:: bash

      $ sudo rpm -e --nodeps cloudstack-awsapi

#. Now that you have the repository configured, it's time to upgrade the 
   ``cloudstack-management``.

   .. sourcecode:: bash

      $ sudo yum upgrade cloudstack-management

#. If you use CloudStack usage server

   .. sourcecode:: bash

      $ sudo yum upgrade cloudstack-usage


Hypervisor: XenServer
---------------------

**(XenServer only)** Copy vhd-utils file on CloudStack management servers.
Copy the file `vhd-utils <http://download.cloud.com.s3.amazonaws.com/tools/vhd-util>`_
to ``/usr/share/cloudstack-common/scripts/vm/hypervisor/xenserver``.

.. sourcecode:: bash

   wget -P /usr/share/cloudstack-common/scripts/vm/hypervisor/xenserver \
   http://download.cloud.com.s3.amazonaws.com/tools/vhd-util


Hypervisor: VMware
------------------

.. warning::
   For VMware hypervisor CloudStack management server packages must be
   build using "noredist". Refer to `Building from Source
   <http://docs.cloudstack.apache.org/projects/cloudstack-installation/en/latest/building_from_source.html>`_.

**(VMware only)** Additional steps are required for each VMware cluster.
These steps will not affect running guests in the cloud. These steps
are required only for clouds using VMware clusters:

#. Stop the Management Server:

   .. sourcecode:: bash

      $ sudo service cloudstack-management stop

#. Generate the encrypted equivalent of your vCenter password:

   .. sourcecode:: bash

      $ java -classpath /usr/share/cloudstack-common/lib/jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI encrypt.sh input="_your_vCenter_password_" password="`cat /etc/cloudstack/management/key`" verbose=false

Store the output from this step, we need to add this in
cluster\_details table and vmware\_data\_center tables in place of
the plain text password

#. Find the ID of the row of cluster\_details table that you have to
   update:

   .. sourcecode:: bash

      $ mysql -u <username> -p<password>

   .. sourcecode:: bash

      select * from cloud.cluster_details;

#. Update the plain text password with the encrypted one

   .. sourcecode:: bash

      update cloud.cluster_details set value = '_ciphertext_from_step_1_'
      where id = _id_from_step_2_;

#. Confirm that the table is updated:

   .. sourcecode:: bash

      select * from cloud.cluster_details;

#. Find the ID of the correct row of vmware\_data\_center that you
    want to update

   .. sourcecode:: bash

      select * from cloud.vmware_data_center;

#. update the plain text password with the encrypted one:

   .. sourcecode:: bash

      update cloud.vmware_data_center set password = '_ciphertext_from_step_1_'
      where id = _id_from_step_5_;

#. Confirm that the table is updated:

   .. sourcecode:: bash

      select * from cloud.vmware_data_center;


.. _kvm46:

Hypervisor: KVM
---------------

KVM on Ubuntu
^^^^^^^^^^^^^

(KVM only) Additional steps are required for each KVM host. These
steps will not affect running guests in the cloud. These steps are
required only for clouds using KVM as hosts and only on the KVM
hosts.

#. Configure the :ref:`apt-repo46` as detailed above.

#. Stop the running agent.

   .. sourcecode:: bash

      $ sudo service cloudstack-agent stop

#. Update the agent software.

   .. sourcecode:: bash

      $ sudo apt-get upgrade cloudstack-agent

#. Verify that the file ``/etc/cloudstack/agent/environment.properties`` has a 
    line that reads:

   .. sourcecode:: bash

      paths.script=/usr/share/cloudstack-common

   If not, add the line.

#. Start the agent.

   .. sourcecode:: bash

      $ sudo service cloudstack-agent start


KVM on CentOS/RHEL
^^^^^^^^^^^^^^^^^^
For KVM hosts, upgrade the ``cloudstack-agent`` package

#. Configure the :ref:`rpm-repo46` as detailed above.

   .. sourcecode:: bash

      $ sudo yum upgrade cloudstack-agent

#. Verify that the file ``/etc/cloudstack/agent/environment.properties`` has a 
   line that reads:

   .. sourcecode:: bash

      paths.script=/usr/share/cloudstack-common

   If not, add the line.

#. Restart the agent:

   .. sourcecode:: bash

      $ sudo service cloudstack-agent stop
      $ sudo killall jsvc
      $ sudo service cloudstack-agent start


Restart management services
---------------------------

#. Now it's time to start the management server

   .. sourcecode:: bash

      $ sudo service cloudstack-management start

#. If you use it, start the usage server

   .. sourcecode:: bash

      $ sudo service cloudstack-usage start


.. include:: /global.rst
