Build Python Packages and Docker Images
=======================================

Python Package
--------------

pre-requist
~~~~~~~~~~~

Get the code

    git clone https://git.opnfv.org/moon
    cd moon/moonv4
    export MOON_HOME=$(pwd)
    sudo ln -s $(pwd)/conf /etc/moon


Install python wheel

    sudo apt install python3-wheel

Install pip twine

    sudo pip install twine

Package code, wheel is a new format instead of `tar.gz`

    python setup.py sdist bdist_wheel

Upload to PyPi

    twine upload dist/moon_xxx-y.y.y.whl
    twine upload dist/moon_xxx-y.y.y.tar.gz

Install a package from PyPi

    sudo pypi install moon_xxx --upgrade

moon_db
~~~~~~~

- change version in `moon_db/__init__.py`
- add `Changelog`

moon_utilities
~~~~~~~~~~~~~~

- change version in `moon_utilities/__init__.py`
- add `Changelog`

moon_orchestrator
~~~~~~~~~~~~~~~~~

- change version in `moon_orchestrator/__init__.py`
- add `Changelog`


Build All Pip
~~~~~~~~~~~~~

    sudo pip3 install pip --upgrade
    cd ${MOON_HOME}/bin
    source build_all_pip.sh

Container
---------

keystone_mitaka
~~~~~~~~~~~~~~~

see `templates/docker/keystone/README.md` to build the `keystone_mitaka` container


How to hack the Moon platform
-----------------------------

Force the build of components
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

If you want to rebuild one or more component, you have to modify the configuration file `moon.conf`.

For example, if you want to rebuild the moon_interface, got to the `[interface]` section and delete the
value of the container key like this:

    [interface]
    host=172.18.0.11
    port=38001
    # Name of the container to download (if empty build from scratch)
    # example: container=moon/moon_interface:latest
    container=

You can configure the interface, the router and both the security_function and security_policy.
You can also force the version of the component like this: `container=moon/moon_interface:4.0.0`

Update the moon_interface
~~~~~~~~~~~~~~~~~~~~~~~~~

Go to the directory `${MOON_HOME}/moon_interface` and update the code accordingly to your needs,
then update the python package.

    cd ${MOON_HOME}/moon_interface
    python setup.py sdist
    cp dist/moon_interface_* ../moon_orchestrator/dist
    # kill moon_orchestrator if needed and restart it

Update the moon_secrouter
~~~~~~~~~~~~~~~~~~~~~~~~~

Go to the directory `${MOON_HOME}/moon_secrouter` and update the code accordingly to your needs,
then update the python package.

    cd ${MOON_HOME}/moon_secrouter
    python setup.py sdist
    cp dist/moon_secrouter* ../moon_orchestrator/dist
    # kill moon_orchestrator if needed and restart it

Problems that may arise
-----------------------

If the moon_orchestrator doesn't want to start
(with, for example, the following error: `docker.errors.APIError: 409 Client Error: Conflict`),
check if the router and interface containers still exist and kill and delete them:

    docker kill moon_interface
    docker kill moon_router
    docker rm moon_interface
    docker rm moon_router

If the moon_orchestrator complains that it cannot request the RabbitMQ server,
check if the messenger server is up and running:

    docker ps
    # you must see the messenger running here
    # if not, restart it
    docker run -dti --net=moon --hostname messenger --name messenger --link messenger:messenger \
        -e RABBITMQ_DEFAULT_USER=moon -e RABBITMQ_DEFAULT_PASS=password -e RABBITMQ_NODENAME=rabbit@messenger \
        -e RABBITMQ_DEFAULT_VHOST=moon -p 5671:5671 -p 5672:5672 rabbitmq:3-management

Configure DB
------------

Relaunch Keystone docker
~~~~~~~~~~~~~~~~~~~~~~~~

If error of `get_keystone_projects()`, then relaunch the Keystone docker, and wait 40 seconds!!!

    docker rm -f keystone
    docker run -dti --net moon --name keystone --hostname=keystone -e DB_HOST=db -e DB_PASSWORD_ROOT=p4sswOrd1 -p 35357:35357 -p 5000:5000 keystone:mitaka

Add default data in DB
~~~~~~~~~~~~~~~~~~~~~~

Pre-fill the DB with a RBAC policy

    cd ${MOON_HOME}/moon_interface/tests/apitests
    python3 populate_default_values.py scenario/ rbac.py