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

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

This section will guide you from CloudStack |version_to_upgrade| to latest
CloudStack |release|.

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

.. THIS LINE COMMENTED OUT AS NOT REQUIRED FOR 4.13
    include:: _sysvm_templates.rst

.. note::
    System VM Template upgrade is not required when upgrading from |version_to_upgrade| to |release|.

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 |release| 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:`ubuntu411` or :ref:`rhel411` and :ref:`kvm411` hosts upgrade.

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

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

Backup current database

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

   .. parsed-literal::

      $ sudo service cloudstack-management stop

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

   .. parsed-literal::

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

   .. parsed-literal::

      $ 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:

   .. parsed-literal::

      $ 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:

   .. parsed-literal::

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


.. _ubuntu411:

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

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

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

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:

.. parsed-literal::

   deb http://download.cloudstack.org/ubuntu precise 4.10

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

.. parsed-literal::

   deb http://download.cloudstack.org/ubuntu precise |version|

Setup the public key for the above repository:

.. parsed-literal::

   wget -qO - http://download.cloudstack.org/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:

   .. parsed-literal::

      $ sudo apt-get update

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

   .. parsed-literal::

      $ sudo apt-get upgrade cloudstack-management

#. If you use CloudStack usage server

   .. parsed-literal::

      $ sudo apt-get upgrade cloudstack-usage


.. _rhel411:

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 :ref:`upg_hyp_411`.

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


.. _rpm-repo411:

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:

.. parsed-literal::

   [apache-cloudstack]
   name=Apache CloudStack
   baseurl=http://download.cloudstack.org/centos/6/4.12/
   enabled=1
   gpgcheck=0

If you are using the community provided package repository, change
the base url to:

.. parsed-literal::

   http://download.cloudstack.org/centos/$releasever/|version|/

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

.. parsed-literal::

   rpm --import http://download.cloudstack.org/RPM-GPG-KEY



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

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

   .. parsed-literal::

      $ sudo yum upgrade cloudstack-management

#. If you use CloudStack usage server

   .. parsed-literal::

      $ sudo yum upgrade cloudstack-usage

.. _upg_hyp_411:

Upgrade Hypervisors
-------------------


Hypervisor: XenServer
^^^^^^^^^^^^^^^^^^^^^

No additional steps are required wrt for XenServer Hypervisor for this upgrade.


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

.. warning::
   For VMware hypervisor CloudStack management server packages must be
   build using "noredist". Refer to :ref:`building-noredist`.


No additional steps are requried for the VMware Hypervisor for this upgrade.


.. _kvm411:

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 repo <apt-repo411>` as detailed above.

#. Stop the running agent.

   .. parsed-literal::

      $ sudo service cloudstack-agent stop

#. Update the agent software.

   .. parsed-literal::

      $ sudo apt-get upgrade cloudstack-agent

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

   .. parsed-literal::

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

   If not, add the line.

#. Start the agent.

   .. parsed-literal::

      $ sudo service cloudstack-agent start


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

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

   .. parsed-literal::

      $ sudo yum upgrade cloudstack-agent

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

   .. parsed-literal::

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

   If not, add the line.

#. Restart the agent:

   .. parsed-literal::

      $ 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

   .. parsed-literal::

      $ sudo service cloudstack-management start

#. If you use it, start the usage server

   .. parsed-literal::

      $ sudo service cloudstack-usage start
