Setting up Environment ====================== For information on how to get source code see :ref:`getting-source`. .. _nailgun_dependencies: Preparing Development Environment --------------------------------- .. warning:: Nailgun requires Python 2.7. Please check installed Python version using ``python --version``. #. Nailgun can be found in fuel-web/nailgun #. Install and configure PostgreSQL database. Please note that Ubuntu 12.04 requires postgresql-server-dev-9.1 while Ubuntu 14.04 requires postgresql-server-dev-9.3:: sudo apt-get install --yes postgresql postgresql-server-dev-all sudo sed -ir 's/peer/trust/' /etc/postgresql/9.*/main/pg_hba.conf sudo service postgresql restart sudo -u postgres psql -c "CREATE ROLE nailgun WITH LOGIN PASSWORD 'nailgun'" sudo -u postgres createdb nailgun If required, you can specify Unix-domain socket in 'host' settings to connect to PostgreSQL database: .. code-block:: yaml DATABASE: engine: "postgresql" name: "nailgun" host: "/var/run/postgresql" port: "" user: "nailgun" passwd: "nailgun" #. Install pip and development tools:: sudo apt-get install --yes python-dev python-pip #. Install virtualenv. This step increases flexibility when dealing with environment settings and package installation:: sudo pip install virtualenv virtualenvwrapper . /usr/local/bin/virtualenvwrapper.sh # you can save this to .bashrc mkvirtualenv fuel # you can use any name instead of 'fuel' workon fuel # command selects the particular environment #. Install Python dependencies. This section assumes that you use virtual environment. Otherwise, you must install all packages globally. You can install pip and use it to require all the other packages at once:: sudo apt-get install --yes git git clone https://github.com/openstack/fuel-web.git cd fuel-web pip install -r nailgun/test-requirements.txt #. Install Nailgun in the developers mode by running the command below in the `nailgun` folder. Thanks to that, Nailgun extensions will be discovered:: python setup.py develop Or if you are using pip:: pip install -e . #. Create required folder for log files:: sudo mkdir /var/log/nailgun sudo chown -R `whoami`.`whoami` /var/log/nailgun sudo chmod -R a+w /var/log/nailgun Setup for Nailgun Unit Tests ---------------------------- #. Nailgun unit tests use `Tox `_ for generating test environments. This means that you don't need to install all Python packages required for the project to run them, because Tox does this by itself. #. First, create a virtualenv the way it's described in previous section. Then, install the Tox package:: workon fuel #activate virtual environment created in the previous section pip install tox #. Run the Nailgun backend unit tests and flake8 test:: sudo apt-get install puppet-common #install missing package required by tasklib tests ./run_tests.sh #. You can also run the same tests by hand, using tox itself:: cd nailgun tox -epy26 -- -vv nailgun/test tox -epep8 #. Tox reuses the previously created environment. After making some changes with package dependencies, tox should be run with **-r** option to recreate existing virtualenvs:: tox -r -epy26 -- -vv nailgun/test tox -r -epep8 Running Nailgun Performance Tests +++++++++++++++++++++++++++++++++ Now you can run performance tests using -x option: :: ./run_tests.sh -x If -x is not specified, run_tests.sh will not run performance tests. The -n or -N option works exactly as before: it states whether tests should be launched or not. For example: * run_tests.sh -n -x - run both regular and performance Nailgun tests. * run_tests.sh -x - run nailgun performance tests only, do not run regular Nailgun tests. * run_tests.sh -n - run regular Naigun tests only. * run_tests.sh -N - run all tests except for Nailgun regular and performance tests. .. _running-parallel-tests-py: Running parallel tests with py.test ----------------------------------- Now tests can be run over several processes in a distributed manner; each test is executed within an isolated database. Prerequisites +++++++++++++ - Nailgun user requires createdb permission. - Postgres database is used for initial connection. - If createdb cannot be granted for the environment, then several databases should be created. The number of databases should be equal to *TEST_WORKERS* variable. The *createdb* permission should have the following format: *nailgun0*, *nailgun1*. - If no *TEST_WORKERS* variable is provided, then a default database name will be used. Often it is nailgun, but you can overwrite it with *TEST_NAILGUN_DB* environment variable. - To execute parallel tests on your local environment, run the following command from *fuel-web/nailgun*: :: py.test -n 4 nailgun/test You can also run the it from *fuel-web*: :: py.test -n 4 nailgun/nailgun/test .. _running-nailgun-in-fake-mode: Running Nailgun in Fake Mode ---------------------------- #. Switch to virtual environment:: workon fuel #. Populate the database from fixtures:: cd nailgun ./manage.py syncdb ./manage.py loaddefault # It loads all basic fixtures listed in settings.yaml ./manage.py loaddata nailgun/fixtures/sample_environment.json # Loads fake nodes #. Start application in "fake" mode, when no real calls to orchestrator are performed:: python manage.py run -p 8000 --fake-tasks | egrep --line-buffered -v '^$|HTTP' >> /var/log/nailgun.log 2>&1 & #. (optional) You can also use --fake-tasks-amqp option if you want to make fake environment use real RabbitMQ instead of fake one:: python manage.py run -p 8000 --fake-tasks-amqp | egrep --line-buffered -v '^$|HTTP' >> /var/log/nailgun.log 2>&1 & Nailgun in fake mode is usually used for Fuel UI development and Fuel UI functional tests. For more information, please check out README file in the fuel-ui repo. Note: Diagnostic Snapshot is not available in a Fake mode. Running the Fuel System Tests ----------------------------- For fuel-devops configuration info please refer to :doc:`Devops Guide ` article. #. Run the integration test:: cd fuel-main make test-integration #. To save time, you can execute individual test cases from the integration test suite like this (nice thing about TestAdminNode is that it takes you from nothing to a Fuel master with 9 blank nodes connected to 3 virtual networks):: cd fuel-main export PYTHONPATH=$(pwd) export ENV_NAME=fuelweb export PUBLIC_FORWARD=nat export ISO_PATH=`pwd`/build/iso/fuelweb-centos-6.5-x86_64.iso ./fuelweb_tests/run_tests.py --group=test_cobbler_alive #. The test harness creates a snapshot of all nodes called 'empty' before starting the tests, and creates a new snapshot if a test fails. You can revert to a specific snapshot with this command:: dos.py revert --snapshot-name #. To fully reset your test environment, tell the Devops toolkit to erase it:: dos.py list dos.py erase Flushing database before/after running tests -------------------------------------------- The database should be cleaned after running tests; before parallel tests were enabled, you could only run dropdb with *./run_tests.sh* script. Now you need to run dropdb for each slave node: the *py.test --cleandb * command is introduced for this purpose.