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


|menu_acs_logo|


Usage Guide
===========

This guide is aimed at Administrators of a CloudStack based Cloud

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

.. toctree::
   :maxdepth: 4

   ui


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

.. toctree::
   :maxdepth: 4

   accounts


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

   projects


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

.. toctree::
   :maxdepth: 4

   service_offerings


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

.. toctree::
   :maxdepth: 4

   networking
   autoscale_without_netscaler


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

.. toctree::
   :maxdepth: 4

   virtual_machines


Working with Templates & ISOs
------------------------------

.. toctree::
   :maxdepth: 4

   templates


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

.. toctree::
   :maxdepth: 4

   hosts


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

.. toctree::
   :maxdepth: 4

   storage


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

.. toctree::
   :maxdepth: 4

   systemvm


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

.. toctree::
   :maxdepth: 4

   usage


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

.. toctree::
   :maxdepth: 4

   networking_and_traffic
   networking/using_remote_access


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

.. toctree::
   :maxdepth: 4

   management


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

.. toctree::
   :maxdepth: 4

   reliability


Tuning
------

.. toctree::
   :maxdepth: 4

   tuning


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

.. toctree::
   :maxdepth: 4

   events
   troubleshooting
