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


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

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