.. 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 Installation Documentation master file, created by
   sphinx-quickstart on Sat Jan 25 15:15:31 2014.
   You can adapt this file completely to your liking, but it should at least
   contain the root `toctree` directive.

|menu_acs_logo|


Installation Guide
==================

This is the Apache CloudStack installation guide

.. toctree::

Building from Source
--------------------
.. toctree::
   :maxdepth: 2

   building_from_source


.. _installation:

General Installation
--------------------
.. toctree::
   :maxdepth: 2

   overview/index
   management-server/index


.. _primate:

Primate Installation
--------------------
.. toctree::
   :maxdepth: 2

   primate


.. _configuration:

Configuration
-------------
.. toctree::
   :maxdepth: 2

   configuration


.. _hypervisors:

Hypervisor Setup
----------------
.. toctree::
   :maxdepth: 2
   :glob:

   hypervisor/*

.. optional:


Optional Installation 
---------------------
.. toctree::
   :maxdepth: 2

   optional_installation
   encryption
