================================
Step by step configuration guide
================================

Edit ``/etc/cloudkitty/cloudkitty.conf`` to configure cloudkitty.

Common options
--------------

Options supported by most OpenStack projects are also supported by cloudkitty:

.. code-block:: ini

    [DEFAULT]
    verbose = true
    debug = false
    log_dir = /var/log/cloudkitty
    transport_url = rabbit://RABBIT_USER:RABBIT_PASSWORD@RABBIT_HOST


API authentication method
-------------------------

The authentication method is defined through the ``auth_strategy`` option in
the ``[DEFAULT]`` section.

Standalone mode
+++++++++++++++

If you're using CloudKitty in standalone mode, you'll have to use noauth:

.. code-block:: ini

    [DEFAULT]
    auth_strategy = noauth

Keystone integration
++++++++++++++++++++

If you're using CloudKitty with OpenStack, you'll want to use Keystone
authentication:

.. code-block:: ini

    [DEFAULT]
    auth_strategy = keystone

When using Keystone, you'll have to provide the CloudKitty credentials for
Keystone. These must be specified in the ``[keystone_authtoken]`` section.
Since these credentials will be used in multiple places, it is convenient to
use a common section:

.. code-block:: ini

    [ks_auth]
    auth_type = v3password
    auth_protocol = http
    auth_url = http://KEYSTONE_HOST:5000/
    identity_uri = http://KEYSTONE_HOST:5000/
    username = cloudkitty
    password = CK_PASSWORD
    project_name = service
    user_domain_name = default
    project_domain_name = default

    [keystone_authtoken]
    auth_section = ks_auth

.. note:: The ``service`` project may also be called ``services``.

CloudKitty provides the ``rating`` OpenStack service.

To integrate cloudkitty to Keystone, run the following commands (as OpenStack
administrator):

.. code-block:: shell

    openstack user create cloudkitty --password CK_PASSWORD

    openstack role add --project service --user cloudkitty admin

    openstack service create rating --name cloudkitty \
        --description "OpenStack Rating Service"

    openstack endpoint create rating --region RegionOne \
        public http://localhost:8889

    openstack endpoint create rating --region RegionOne \
        admin http://localhost:8889

    openstack endpoint create rating --region RegionOne \
        internal http://localhost:8889

Storage
-------

The next step is to configure the storage. Start with the SQL and create the
``cloudkitty`` table and user:

.. code-block:: shell

    mysql -uroot -p << EOF
    CREATE DATABASE cloudkitty;
    GRANT ALL PRIVILEGES ON cloudkitty.* TO 'CK_DBUSER'@'localhost' IDENTIFIED BY 'CK_DBPASSWORD';
    EOF

Specify the SQL credentials in the ``[database]`` section of the configuration
file:

.. code-block:: ini

    [database]
    connection = mysql+pymysql://CK_DBUSER:CK_DBPASSWORD@DB_HOST/cloudkitty

Once you have set up the SQL database service, the storage backend for rated
data can be configured. A complete configuration reference can be found in the
`storage backend configuration guide`_. We'll use a v2 storage backend, which
enables the v2 API. The storage version and driver to use must be specified in
the ``[storage]`` section of the documentation:

.. code-block:: ini

   [storage]
   version = 2
   backend = influxdb

Driver-specific options are then specified in the ``[storage_{drivername}]``
section:

.. code-block:: ini

   [storage_influxdb]
   username = cloudkitty
   password = cloudkitty
   database = cloudkitty
   host = influxdb

Once you have configured the SQL and rated data storage backends, initalize
the storage::

   cloudkitty-storage-init

Then, run the database migrations::

   cloudkitty-dbsync upgrade

.. _storage backend configuration guide: ./storage.html

Fetcher
-------

The fetcher retrieves the list of scopes to rate, which will then be passed
to the collector. A complete configuration reference can be found in the
`fetcher configuration guide`_. For this example, we'll use the ``gnocchi``
fetcher, which will discover scopes (in this case OpenStack projects) to rate.
The fetcher to use is specified through the ``backend`` option of the
``[fetcher]`` section:

.. code-block:: ini

   [fetcher]
   backend = gnocchi

Fetcher-specific options are then specified in the ``[fetcher_{fetchername}]``
section:

.. code-block:: ini

   [fetcher_gnocchi]
   auth_section = ks_auth
   region_name = MyRegion

.. _fetcher configuration guide: ./fetcher.html

Collector
---------

The collector will retrieve data for the scopes provided by the fetcher and
pass them to the rating modules. The collector to use is specified in
the ``[collect]`` section, and the collector-specific options are specified
in the ``[collector_{collectorname}]`` section:

.. code-block:: ini

   [collect]
   collector = gnocchi

   [collector_gnocchi]
   auth_section = ks_auth
   region_name = MyRegion

Note that you'll also have to configure what metrics the collector should
collect, and how they should be collected. Have a look at the
`collector configuration guide`_ for this:

.. _collector configuration guide: ./collector.html
