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


Welcome to CloudStack Administration Documentation
==================================================

.. figure:: /_static/images/acslogo.png
   :align: center

.. warning::
   We are in the process of changing documentation format as well as hosting mechanism.
   Please be patient with us as we migrate our entire documentation to this new setup.

This guide is aimed at Administrators of a CloudStack based Cloud, 
for Release Notes, Installation and General introduction to CloudStack 
see the following guides:

- `Documentation Start <http://docs.cloudstack.apache.org>`_

- `Installation Guide <http://docs.cloudstack.apache.org/projects/cloudstack-installation>`_

- `Release Notes <http://docs.cloudstack.apache.org/projects/cloudstack-release-notes>`_


User Interface
--------------

.. toctree::
   :maxdepth: 2

   ui


Managing Accounts, Users and Domains
------------------------------------

.. toctree::
   :maxdepth: 2

   accounts


Using Projects to Organize User Resources
------------------------------------------
.. toctree::
   :maxdepth: 2 

   projects


Service Offerings
-----------------

.. toctree::
   :maxdepth: 2

   service_offerings


Setting up Networking for Users
-------------------------------

.. toctree::
   :maxdepth: 2

   networking


Working with Virtual Machines
-----------------------------

.. toctree::
   :maxdepth: 2

   virtual_machines


Working with Templates
----------------------

.. toctree::
   :maxdepth: 2

   templates


Working with Hosts
------------------

.. toctree::
   :maxdepth: 2

   hosts


Working with Storage
--------------------

.. toctree::
   :maxdepth: 2

   storage


Working with System Virtual Machines
------------------------------------

.. toctree::
   :maxdepth: 2

   systemvm


Working with Usage
------------------

.. toctree::
   :maxdepth: 2

   usage


Managing Networks and Traffic
-----------------------------

.. toctree::
   :maxdepth: 2

   networking_and_traffic


Managing the Cloud
------------------

.. toctree::
   :maxdepth: 2

   management


System Reliability and Availability
-----------------------------------

.. toctree::
   :maxdepth: 2

   reliability


Tuning
------

.. toctree::
   :maxdepth: 2

   tuning


Events and Troubleshooting
--------------------------

.. toctree::
   :maxdepth: 2

   events
   troubleshooting
