<table style="border-collapse: collapse; border: none;">
  <tr style="border-collapse: collapse; border: none;">
    <td style="border-collapse: collapse; border: none;">
      <a href="http://www.openairinterface.org/">
         <img src="../../doc/images/oai_final_logo.png" alt="" border=3 height=50 width=150>
         </img>
      </a>
    </td>
    <td style="border-collapse: collapse; border: none; vertical-align: center;">
      <b><font size = "5">OAI CI Virtual-Machine-based Test Environment: the Main Script</font></b>
    </td>
  </tr>
</table>

**Table of Contents**

[[_TOC_]]

# 1. Introduction #

The file name is `./ci-scripts/oai-ci-vm-tool` from the workspace root.

```bash
$ cd /tmp/CI-raphael
$ ./ci-scripts/oai-ci-vm-tool --help
OAI CI VM script
   Original Author: Raphael Defosseux
   Requirements:
     -- uvtool uvtool-libvirt apt-cacher
     -- xenial image already synced

Usage:
------
    oai-ci-vm-tool (-h|--help) {create,destroy,build,wait,test,report-build,report-test} ...

```

This is a **BASH** script.


# 2. Sub BASH scripts #

The main script is including a bunch of sub BASH scripts.

*  ci-scripts/createVM.sh
*  ci-scripts/buildOnVM.sh
*  ci-scripts/waitBuildOnVM.sh
*  ci-scripts/destroyAllRunningVM.sh
*  ci-scripts/runTestOnVM.sh
*  ci-scripts/reportBuildLocally.sh
*  ci-scripts/reportTestLocally.sh

**NOTE: ci-scripts/runTestOnVM.sh is getting big and will certainly be split to facilitate maintenance. Start functions will be also factorized.**

# 3. Main script features #

The main purpose of the main script is decipher the options and launch the requested function.

It is also **testing if uvtool and apt-cacher are installed.**

It finally provides parameters to the requested functions. Parameter definition is centralized there.

For example:

for VM instance creation:

*  the instance name:  VM_NAME
*  the RAM and number of CPUs: VM_MEMORY, VM_CPU

for OAI variant build:

*  build options: BUILD_OPTIONS
*  build log file to parse: LOG_PATTERN
*  the number of log files to parse: NB_PATTERN_FILES

You can get the list of variant specific variables specifying the variant argument when asking for help:

``` bash
./ci-scripts/oai-ci-vm-tool help variant
    --variant flexran-rtc     OR -v10    ( build and test non-OSA )
               VM_NAME=ci-flexran-rtc           ARCHIVES_LOC=flexran        
               VM_MEMORY=2048                   VM_CPU=4              
               NB_PATTERN_FILES=1               BUILD_OPTIONS="cmake . && make -j2"
               LOG_PATTERN=.txt

    --variant enb-usrp        OR -v1     ( build and test  )
               VM_NAME=ci-enb-usrp              ARCHIVES_LOC=enb_usrp       
               VM_MEMORY=2048                   VM_CPU=4              
               NB_PATTERN_FILES=9               BUILD_OPTIONS="--eNB -w USRP --mu"
               LOG_PATTERN=.txt

    --variant l1-sim          OR -v20    ( test  )
               VM_NAME=ci-l1-sim                ARCHIVES_LOC=l1_sim         
               VM_MEMORY=2048                   VM_CPU=4              
               NB_PATTERN_FILES=9               BUILD_OPTIONS=""             
               LOG_PATTERN=.txt

    --variant rf-sim          OR -v21    ( test  )
               VM_NAME=ci-rf-sim                ARCHIVES_LOC=rf_sim         
               VM_MEMORY=2048                   VM_CPU=4              
               NB_PATTERN_FILES=9               BUILD_OPTIONS=""             
               LOG_PATTERN=.txt

    --variant l2-sim          OR -v22    ( test  )
               VM_NAME=ci-l2-sim                ARCHIVES_LOC=l2_sim         
               VM_MEMORY=2048                   VM_CPU=4              
               NB_PATTERN_FILES=9               BUILD_OPTIONS=""             
               LOG_PATTERN=.txt

    --variant phy-sim         OR -v3     ( build and test  )
               VM_NAME=ci-phy-sim               ARCHIVES_LOC=phy_sim        
               VM_MEMORY=2048                   VM_CPU=4              
               NB_PATTERN_FILES=3               BUILD_OPTIONS="--phy_simulators"
               LOG_PATTERN=.txt

    --variant cppcheck        OR -v4     ( build and test  )
               VM_NAME=ci-cppcheck              ARCHIVES_LOC=cppcheck       
               VM_MEMORY=4096                   VM_CPU=4              
               NB_PATTERN_FILES=1               BUILD_OPTIONS="--enable=warning --force --xml --xml-version=2 --suppressions-list=ci-scripts/cppcheck_suppressions.list -I common/utils -j4"
               LOG_PATTERN=cppcheck.xml

    --variant enb-ethernet    OR -v7     ( build and test  )
               VM_NAME=ci-enb-ethernet          ARCHIVES_LOC=enb_eth        
               VM_MEMORY=4096                   VM_CPU=4              
               NB_PATTERN_FILES=8               BUILD_OPTIONS="--eNB"        
               LOG_PATTERN=.txt

    --variant ue-ethernet     OR -v8     ( build and test  )
               VM_NAME=ci-ue-ethernet           ARCHIVES_LOC=ue_eth         
               VM_MEMORY=4096                   VM_CPU=4              
               NB_PATTERN_FILES=12              BUILD_OPTIONS="--UE"         
               LOG_PATTERN=.txt

```

To define a new variant you just need to define a function which name conforms to `function variant__v<n>__<variant_name>` where n and variant_name will respectively define the short and long options for your variant. The function only needs to define the variant dependent variables. For many variables, default values are set in the `check_set_variant` function. When a variant doesn't define the BUILD_OPTIONS variable it cannot be used for the `build` `wait` and `create` commands.

The main scripts also allows the definition of non variant-dependant variable via the `--setvar_<variable name> <variable value>` options.
You can get the list of these variables by using `help setvar`:

```BASH
./ci-scripts/oai-ci-vm-tool help setvar
--setvar_<varname> <value> where varname is one of:
            VM_OSREL :     OS release to use in virtual machines
    RUN_EXPERIMENTAL :     Enforce execution of variants with EXPERIMENTAL variable set to "true"
```

To add a new non-variant dependant variable you need:
* Add an item to the `AUTHORIZED_VAR` array
* In the `setvar_usage`function,  add your help string in the HELP_VAR["<your variable name>"] variable.
* Write the bash code for your variable.

Example of non variant dependent usage:

``` bash
./ci-scripts/oai-ci-vm-tool test -v21  -ws /usr/local/oai/enhance_CI_extEPC/openairinterface5g -id 1 -jn testci
Currently testci-b1-rf-sim Testing is not implemented / enabled
Comment out these lines in ./ci-scripts/oai-ci-vm-tool if you want to run it
 or use option --setvar_RUN_EXPERIMENTAL=true to test it


 ./ci-scripts/oai-ci-vm-tool test -v21  -ws /usr/local/oai/enhance_CI_extEPC/openairinterface5g -id 1 -jn testci --setvar_RUN_EXPERIMENTAL true
 Setting RUN_EXPERIMENTAL to true...
 ############################################################
 OAI CI VM script
 ############################################################
 ENB_VM_NAME         = testci-b1-enb-ethernet
 ENB_VM_CMD_FILE     = testci-b1-enb-ethernet_cmds.txt
 UE_VM_NAME          = testci-b1-ue-ethernet
 UE_VM_CMD_FILE      = testci-b1-ue-ethernet_cmds.txt
 JENKINS_WKSP        = /usr/local/oai/enhance_CI_extEPC/openairinterface5g
 ARCHIVES_LOC        = /usr/local/oai/enhance_CI_extEPC/openairinterface5g/archives/rf_sim/test
 ############################################################
 Waiting for ENB VM to be started
...........................
```

In the same way, you can set the variable `VM_OSREL` to run the test in virtual machines of the specified OS release:

``` bash
./ci-scripts/oai-ci-vm-tool test -v21  -ws /usr/local/oai/enhance_CI_extEPC/openairinterface5g -id 1 -jn testci --setvar_VM_OSREL bionic
```

---

Next step: [how to create one or several VM instances](./vm_based_simulator_create.md)

You can also go back to the [CI dev main page](./ci_dev_home.md)
