<!--
// © University of Southampton IT Innovation Centre, 2017
//
// Copyright in this software belongs to University of Southampton
// IT Innovation Centre of Gamma House, Enterprise Road,
// Chilworth Science Park, Southampton, SO16 7NS, UK.
//
// This software may not be used, sold, licensed, transferred, copied
// or reproduced in whole or in part in any manner or form or in or
// on any media by any person other than in accordance with the terms
// of the Licence Agreement supplied with the software, or otherwise
// without the prior written consent of the copyright owners.
//
// This software is distributed WITHOUT ANY WARRANTY, without even the
// implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE, except where stated in the Licence Agreement supplied with
// the software.
//
//      Created By :            Michael Boniface
//      Created Date :          18-12-2017
//      Created for Project :   FLAME
-->

# FLAME Cross Layer Management and Control
#### Version: 1.0.0

### About this document

#### Authors

|Authors|Organisation|
|-|-|
|[Michael Boniface](mailto:mjb@it-innovation.soton.ac.uk)|[University of Southampton, IT Innovation Centre](http://www.it-innovation.soton.ac.uk)|
|[Simon Crowle](mailto:sgc@it-innovation.soton.ac.uk)|[University of Southampton, IT Innovation Centre](http://www.it-innovation.soton.ac.uk)|

### Contents

#### Documentation

Implementation documentation and discussion can be found in the docs directory.

#### Testing

Testing is implemented using pytest using the following convention:

* The testing environment is Vagrant/Virtualbox for a base VM with LXD is installed for specific containers.
* Tests are written in python using pytest
* Related tests are stored in a python module `src/test/clmctest/<testmodule>` to create a suite of tests. All tests are stored in files test_*.py, there can be many tests per file, and many files per module
* Tests are executed against a set of LXC containers described in `src/test/clmctest/rspec.json`.
* Tests are executed from the test-runner container on the VM using install python modules
* CI testing is on givry using nested LXD containers

Create a single VM with LXC installed and configured with lxcbr0 configured for the network 172.40.231.0/24

```shell
vagrant up
```

SSH into the VM:

```shell
vagrant ssh
```

The containers are controlled using a script called `/vagrant/scripts/test/fixtures.sh`

```shell
Usage: fixture.sh create|start|stop|destroy [-f config_file] [-r repo_root] [-c container_name|all]
```

The containers created are defined an rspec.json file, there's an example here: `/vagrant/src/test/clmctest/rspec.json`. The `fixtures.sh` script defaults to look for a `rspec.json` in the current directory, you can specify a specific `rspec.json` file using the `-f` option.

To create|start|stop|destroy specific services use the `-c` option e.g.

```shell
/vagrant/scripts/test/fixture.sh create -f /vagrant/src/test/clmctest/rspec.json -c clmc-service
```

The installation of several of the services depend on accessing the Nexus binary repository (for the custom Telegraf agent). To do this, a username and password for the repository must be specified in a `reporc` file in the user's home directory, e.g.

```shell
REPO_USER=itinnov.flame.integration
REPO_PASS=xxxxxxx
```

Create all the services needed for integration tests:

```shell
sudo su
/vagrant/scripts/test/fixture.sh create -f /vagrant/src/test/clmctest/rspec.json -c all
```

As part of the clmc-service installation, the service's unit tests have been run. The fixture script will fail if any individual service installation fails to install (or fails its tests).

Attach to the test-runner to run the tests

```shell
lxc-attach -n test-runner
```

Build and install the CLMC test Python module:

```shell
cd /vagrant/src/test
python setup.py sdist --dist-dir=../../build
pip3 install /vagrant/build/clmctest-<version>.tar.gz
```

The following module is unit tests:

```shell
pytest -s --pyargs clmctest.scripts
```

The following modules are integration tests:

```shell
pytest -s --pyargs clmctest.inputs
pytest -s --pyargs clmctest.monitoring
```

#### CI Testing


A lxd container is setup on givry called `flame-clmc-ci`. The container is priviledged and allows for nested containers. The container was created using the following commands

```
lxc launch ubuntu:18.04 flame-clmc-ci -c security.privileged=true -c security.nesting=true
```

the container is then started and LXD initialised

```
lxc exec flame-clmc-ci -- bash
lxd init --auto --storage-backend dir 
lxc network create lxcbr0 ipv6.address=none ipv4.address=172.40.231.1/24 ipv4.nat=true

```

Now configure ip table persistence, this is needed for the fixtures script to work but not for CI

```
apt update
echo iptables-persistent iptables-persistent/autosave_v4 boolean true | sudo debconf-set-selections
echo iptables-persistent iptables-persistent/autosave_v6 boolean true | sudo debconf-set-selections
apt -y install iptables-persistent
```

The install git runner file was just copied to the container from a tmp director

```
lxc file push /home/mjb/dev/flame-clmc/scripts/test/install-git-runner.sh flame-clmc-ci/root/
lxc exec flame-clmc-ci -- chmod 755 ./install-git-runner.sh
lxc exec flame-clmc-ci -- ./install-git-runner.sh
```

Note that the branch must be "protected" for the secret repo rc variables to be passed to the CI script