This section describes how to configure the Python environment to run experiments and develop code for the ETSI TeraFlowSDN controller. In particular, we use [PyEnv](https://github.com/pyenv/pyenv) to install the appropriate version of Python and manage the virtual environments. ## Upgrade the Ubuntu distribution Skip this step if you already did it during the installation of your machine. ```bash sudo apt-get update -y sudo apt-get dist-upgrade -y ``` ## Install PyEnv dependencies ```bash sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget \ curl llvm git libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev ``` ## Install PyEnv We recommend installing PyEnv through [PyEnv Installer](https://github.com/pyenv/pyenv-installer). Below you can find the instructions, but we refer you to the link for updated instructions. ```bash curl https://pyenv.run | bash # When finished, edit ~/.bash_profile // ~/.profile // ~/.bashrc as the installer proposes. # In general, it means to append the following lines to ~/.bashrc: export PYENV_ROOT="$HOME/.pyenv" command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)" ``` In case .bashrc is not linked properly to your profile, you may need to append the following line into your local .profile file: ```bash # Open ~/.profile and append this line: +source "$HOME"/.bashrc ``` ## Restart the machine Restart the machine for all the changes to take effect. ```bash sudo reboot ``` ## Install Python 3.9 over PyEnv ETSI TeraFlowSDN uses Python 3.9 by default. You should install the latest stable update of Python 3.9, i.e., avoid "-dev" versions. To find the latest version available in PyEnv, you can run the following command: ```bash pyenv install --list | grep " 3.9" ``` At the time of writing, this command will output the following list: ``` 3.9.0 3.9-dev 3.9.1 3.9.2 3.9.4 3.9.5 3.9.6 3.9.7 3.9.8 3.9.9 3.9.10 3.9.11 3.9.12 3.9.13 3.9.14 3.9.15 3.9.16 ** always select the latest version ** ``` Therefore, the latest stable version is Python 3.9.16. To install this version, you should run: ```bash pyenv install 3.9.16 # This command might take some minutes depending on your Internet connection speed # and the performance of your machine. ``` ## Create the Virtual Environment for TeraFlowSDN The following commands create a virtual environment named as `tfs` using Python 3.9 and associate that environment with the current folder, i.e., `~/tfs-ctrl`. That way, when you are in that folder, the associated virtual environment will be used, thus inheriting the Python interpreter, i.e., Python 3.9, and the Python packages installed on it. ```bash cd ~/tfs-ctrl pyenv virtualenv 3.9.16 tfs pyenv local 3.9.16/envs/tfs ``` After completing these commands, you should see in your prompt that now you're within the virtual environment `3.9.16/envs/tfs` on folder `~/tfs-ctrl`: ``` (3.9.16/envs/tfs) tfs@tfs-vm:~/tfs-ctrl$ ``` In case that the correct pyenv does not get automatically activated when you change to the tfs-ctrl/ folder, then execute the following command: ```bash cd ~/tfs-ctrl pyenv activate 3.9.16/envs/tfs ``` ## Install the basic Python packages within the virtual environment From within the `3.9.16/envs/tfs` environment on folder `~/tfs-ctrl`, run the following commands to install the basic Python packages required to work with TeraFlowSDN. ```bash cd ~/tfs-ctrl ./install_requirements.sh ``` Some dependencies require to re-load the session, so log-out and log-in again. ## Generate the Python code from the gRPC Proto messages and services The components, e.g., microservices, of the TeraFlowSDN controller, in general, use a gRPC-based open API to interoperate. All the protocol definitions can be found in sub-folder `proto` within the root project folder. For additional details on gRPC, visit the official web-page [gRPC](https://grpc.io/). In order to interact with the components, (re-)generate the Python code from gRPC definitions running the following command: ```bash cd ~/tfs-ctrl proto/generate_code_python.sh ```