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


CloudStack Administration Documentation
=======================================

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

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
   networking/using_remote_access


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

.. toctree::
   :maxdepth: 2

   management


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

.. toctree::
   :maxdepth: 2

   reliability


Plugins
-------

.. toctree::
   :maxdepth: 2

   plugins/quota


Tuning
------

.. toctree::
   :maxdepth: 2

   tuning


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

.. toctree::
   :maxdepth: 2

   events
   troubleshooting
