From 5a3a475f788c89c0049641efdd5ac41cf197299c Mon Sep 17 00:00:00 2001
From: Royer Yangali <royer.yangali@etsi.org>
Date: Mon, 21 Oct 2024 13:52:08 +0200
Subject: [PATCH] ADDS: adding Python section

---
 doc/development_guide/development_guide.md | 173 ++++++++++++++++++++-
 1 file changed, 169 insertions(+), 4 deletions(-)

diff --git a/doc/development_guide/development_guide.md b/doc/development_guide/development_guide.md
index 5e347b6..41ad18b 100644
--- a/doc/development_guide/development_guide.md
+++ b/doc/development_guide/development_guide.md
@@ -1,15 +1,180 @@
-- [2.1. Configure Environment](./2.-Development-Guide/2.1.-Configure-Environment)
-- [2.2. Configure VScode](./2.-Development-Guide/2.2.-Configure-VScode)
-- [2.3. Develop A Component (WIP)](./2.-Development-Guide/2.3.-Develop-A-Component)
+## **2.1. Configure Environment**
 
 
-## **2.1. Configure Environment**
 
 ### **2.1.1. Python**
 
+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.
+
+<h3><u>Upgrade the Ubuntu distribution</h3></u>
+
+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
+```
+
+
+<h3><u>Install PyEnv dependencies</h3></u>
+```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
+```
+
+
+<h3><u>Install PyEnv</h3></u>
+
+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
+```
+
+
+<h3><u>Restart the machine</h3></u>
+Restart the machine for all the changes to take effect.
+```bash
+sudo reboot
+```
+
+
+<h3><u>Install Python 3.9 over PyEnv</h3></u>
+
+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.
+```
+
+
+<h3><u>Create the Virtual Environment for TeraFlowSDN</h3></u>
+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
+```
+
+
+
+<h3><u>Install the basic Python packages within the virtual environment</h3></u>
+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.
+
+
+<h3><u>Generate the Python code from the gRPC Proto messages and services</h3></u>
+
+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
+```
 
 ### **2.1.2. Java (Quarkus)**
+
+
+
 ### **2.1.3. Java (Maven)**
+
+
+
 ### **2.1.4. Rust**
+
+
+
 ### **2.1.5. Erlang**
+
+
+
 ### **2.1.6. Kotlin**
+
+
+## **2.2. Configure VScode**
+
+
+
+## **2.3. Develop A Component (WIP)**
-- 
GitLab