Improve documentation. 94/5894/1
authorAlex Stancu <alexandru.stancu@highstreet-technologies.com>
Thu, 15 Apr 2021 12:47:31 +0000 (15:47 +0300)
committerAlex Stancu <alexandru.stancu@highstreet-technologies.com>
Thu, 15 Apr 2021 12:47:45 +0000 (15:47 +0300)
Issue-ID: SIM-62
Change-Id: If48345f7c2e6f64906f4fa0b0c6c59ba36180e96
Signed-off-by: Alex Stancu <alexandru.stancu@highstreet-technologies.com>
docs/overview.rst
docs/release-notes.rst

index 67db83e..d478ca5 100644 (file)
 
 
 sim/o1-interface Overview
-==========================
+**************************
 
 Network Topology Simulator (NTS) | next generation
-==================================================
+--------------------------------------------------
 
-The Network Topology Simulator is a framework that allows simulating devices that expose a management interface through a NETCONF/YANG interface.
+The Network Topology Simulator is a framework that allows simulating Network Functions (NF) that expose a management interface via NETCONF/YANG.
 
-# Description
-=============
+Overview
+--------
 
-## Overview
-===========
+The NETCONF/YANG management interface is simulated, and any YANG models can be loaded by the framework to be exposed. Random data is generated based on the specific models, such that each simulated NF presents different data on its management interface.
 
-The NETCONF/YANG management interface is simulated, and any YANG models can be loaded by the framework to be exposed. Random data is generated based on the specific models, such that each simulated device presents different data on its management interface.
+The NTS framework is based on several open-source projects
 
-The NTS framework is based on several open-source projects:
-
-* `cJSON <https://github.com/DaveGamble/cJSON>`_
-
-* `libcurl <https://curl.haxx.se>`_
-
-* `libyang <https://github.com/CESNET/libyang>`_
-
-* `sysrepo <https://github.com/sysrepo/sysrepo>`_
-
-* `libnetconf2 <https://github.com/CESNET/libnetconf2>`_
-
-* `Netopeer2 <https://github.com/CESNET/Netopeer2>`_ 
+- `cJSON <https://github.com/DaveGamble/cJSON>`_
+- `libcurl <https://curl.haxx.se>`_
+- `libyang <https://github.com/CESNET/libyang>`_
+- `sysrepo <https://github.com/sysrepo/sysrepo>`_
+- `libnetconf2 <https://github.com/CESNET/libnetconf2>`_
+- `Netopeer2 <https://github.com/CESNET/Netopeer2>`_
 
 The NTS Manager can be used to specify the simulation details and to manage the simulation environment at runtime.
 
-Each simulated device is represented as a docker container, where the NETCONF Server is running. The creation and deletion of docker containers associated with simulated devices is handled by the NTS Manager. The NTS Manager is also running as a docker container and exposes a NETCONF/YANG interface to control the simulation.
+Each simulated NF is represented as a docker container, where the NETCONF Server is running. The creation and deletion of docker containers associated with simulated NFs is handled by the NTS Manager. The NTS Manager is also running as a docker container and exposes a proprietary NETCONF/YANG interface to control the simulation.
 
-## NTS Manager
-==============
+NTS Manager
+-----------
 
 The purpose of the NTS Manager is to ease the utilization of the NTS framework. It enables the user to interact with the simulation framework through a NETCONF/YANG interface. The user has the ability to modify the simulation parameters at runtime and to see the status of the current state of the NTS. The NETCONF/YANG interface will be detailed below.
 
-
-module: nts-manager
-
-  +--rw simulation
-
-        +\-\-rw network\-functions
-
-        |  +\-\-rw network\-function\* [function\-type]
-
-        |     +\-\-rw function\-type                    identityref
-
-        |     +\-\-rw started\-instances                uint16
-
-        |     +\-\-rw mounted\-instances                uint16
-
-        |     +\-\-rw mount\-point\-addressing\-method?   enumeration
-
-        |     +\-\-rw docker\-instance\-name             string
-
-        |     +\-\-rw docker\-version\-tag               string
-
-        |     +\-\-rw docker\-repository                string
-
-        |     +\-\-rw fault\-generation
-
-        |     |  +\-\-rw fault\-delay\-list\* [index]
-
-        |     |  |  +\-\-rw index           uint16
-
-        |     |  |  +\-\-rw delay\-period?   uint16
-
-        |     |  +\-\-ro fault\-count {faults\-status}?
-
-        |     |     +\-\-ro normal?     uint32
-
-        |     |     +\-\-ro warning?    uint32
-
-        |     |     +\-\-ro minor?      uint32
-
-        |     |     +\-\-ro major?      uint32
-
-        |     |     +\-\-ro critical?   uint32
-
-        |     +\-\-rw netconf
-
-        |     |  +\-\-rw faults\-enabled?   boolean
-
-        |     |  +\-\-rw call\-home?        boolean
-
-        |     +\-\-rw ves
-
-        |     |  +\-\-rw faults\-enabled?     boolean
-
-        |     |  +\-\-rw pnf\-registration?   boolean
-
-        |     |  +\-\-rw heartbeat\-period?   uint16
-
-        |     +\-\-ro instances
-
-        |        +\-\-ro instance\* [name]
-
-        |           +\-\-ro mount\-point\-addressing\-method?   enumeration
-
-        |           +\-\-ro name                             string
-
-        |           +\-\-ro networking
-
-        |              +\-\-ro docker\-ip?     inet:ip\-address
-
-        |              +\-\-ro docker\-port\*   inet:port\-number
-
-        |              +\-\-ro host\-ip?       inet:ip\-address
-
-        |              +\-\-ro host\-port\*     inet:port\-number
-
-        +\-\-rw sdn\-controller
-
-        |  +\-\-rw controller\-ip?                       inet:ip\-address
-
-        |  +\-\-rw controller\-port?                     inet:port\-number
-
-        |  +\-\-rw controller\-netconf\-call\-home\-port?   inet:port\-number
-
-        |  +\-\-rw controller\-username?                 string
-
-        |  +\-\-rw controller\-password?                 string
-
-        +\-\-rw ves\-endpoint
-
-        |  +\-\-rw ves\-endpoint\-protocol?      enumeration
-
-        |  +\-\-rw ves\-endpoint\-ip?            inet:ip\-address
-
-        |  +\-\-rw ves\-endpoint\-port?          inet:port\-number
-
-        |  +\-\-rw ves\-endpoint\-auth\-method?   authentication\-method\-type
-
-        |  +\-\-rw ves\-endpoint\-username?      string
-
-        |  +\-\-rw ves\-endpoint\-password?      string
-
-        |  +\-\-rw ves\-endpoint\-certificate?   string
-
-        +\-\-ro base\-port?           inet:port\-number
-
-        +\-\-ro ssh\-connections?     uint8
-
-        +\-\-ro tls\-connections?     uint8
-
-        +\-\-ro cpu\-usage?           percent
-
-        +\-\-ro mem\-usage?           uint32
-
-
-### Detailed information about the YANG attributes
-==================================================
+::
+
+    module: nts-manager
+    +--rw simulation!
+        +--ro available-images
+        |  +--ro network-function-image* []
+        |     +--ro function-type?        identityref
+        |     +--ro docker-image-name     string
+        |     +--ro docker-version-tag    string
+        |     +--ro docker-repository     string
+        +--rw network-functions!
+        |  +--rw network-function* [function-type]
+        |     +--rw function-type                    identityref
+        |     +--rw started-instances                uint16
+        |     +--rw mounted-instances                uint16
+        |     +--rw mount-point-addressing-method?   enumeration
+        |     +--rw docker-instance-name             string
+        |     +--rw docker-version-tag               string
+        |     +--rw docker-repository                string
+        |     +--rw fault-generation!
+        |     |  +--rw fault-delay-list* [index]
+        |     |  |  +--rw index           uint16
+        |     |  |  +--rw delay-period?   uint16
+        |     |  +--ro fault-count {faults-status}?
+        |     |     +--ro normal?     uint32
+        |     |     +--ro warning?    uint32
+        |     |     +--ro minor?      uint32
+        |     |     +--ro major?      uint32
+        |     |     +--ro critical?   uint32
+        |     +--rw netconf!
+        |     |  +--rw faults-enabled?   boolean
+        |     |  +--rw call-home?        boolean
+        |     +--rw ves!
+        |     |  +--rw faults-enabled?     boolean
+        |     |  +--rw pnf-registration?   boolean
+        |     |  +--rw heartbeat-period?   uint16
+        |     +--ro instances
+        |        +--ro instance* [name]
+        |           +--ro mount-point-addressing-method?   enumeration
+        |           +--ro name                             string
+        |           +--ro is-mounted?                      boolean
+        |           +--ro networking
+        |              +--ro docker-ip?      inet:ip-address
+        |              +--ro docker-ports* [port]
+        |              |  +--ro port        inet:port-number
+        |              |  +--ro protocol?   identityref
+        |              +--ro host-ip?        inet:ip-address
+        |              +--ro host-ports* [port]
+        |                 +--ro port        inet:port-number
+        |                 +--ro protocol?   identityref
+        +--rw sdn-controller!
+        |  +--rw controller-protocol?                 enumeration
+        |  +--rw controller-ip?                       inet:ip-address
+        |  +--rw controller-port?                     inet:port-number
+        |  +--rw controller-netconf-call-home-port?   inet:port-number
+        |  +--rw controller-username?                 string
+        |  +--rw controller-password?                 string
+        +--rw ves-endpoint!
+        |  +--rw ves-endpoint-protocol?      enumeration
+        |  +--rw ves-endpoint-ip?            inet:ip-address
+        |  +--rw ves-endpoint-port?          inet:port-number
+        |  +--rw ves-endpoint-auth-method?   authentication-method-type
+        |  +--rw ves-endpoint-username?      string
+        |  +--rw ves-endpoint-password?      string
+        |  +--rw ves-endpoint-certificate?   string
+        +--ro ports
+        |  +--ro netconf-ssh-port?      inet:port-number
+        |  +--ro netconf-tls-port?      inet:port-number
+        |  +--ro transport-ftp-port?    inet:port-number
+        |  +--ro transport-sftp-port?   inet:port-number
+        +--ro ssh-connections?         uint8
+        +--ro tls-connections?         uint8
+        +--ro cpu-usage?               percent
+        +--ro mem-usage?               uint32
+        +--ro last-operation-status?   string
+
+    notifications:
+        +---n instance-changed
+        |  +--ro change-status    string
+        |  +--ro function-type    identityref
+        |  +--ro name             string
+        |  +--ro is-mounted?      boolean
+        |  +--ro networking
+        |     +--ro docker-ip?      inet:ip-address
+        |     +--ro docker-ports* [port]
+        |     |  +--ro port        inet:port-number
+        |     |  +--ro protocol?   identityref
+        |     +--ro host-ip?        inet:ip-address
+        |     +--ro host-ports* [port]
+        |        +--ro port        inet:port-number
+        |        +--ro protocol?   identityref
+        +---n operation-status-changed
+        +--ro operation-status    string
+        +--ro error-message?      string
+
+Detailed information about the YANG attributes
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 Under **simulation** there are 3 configuration containers and a couple of statistics leafs:
 
-* **network-functions** - represents the simulation data, which will be best described below
-
-* **sdn-controller** - this container groups the configuration related to the ODL based SDN controller that the simulated devices can connect to
-
-       \* \*\*controller\-ip\*\* \- the IP address of the ODL based SDN controller where the simulated devices can be mounted. Both IPv4 and IPv6 are supported
-
-       \* \*\*controller\-port\*\* \- the port of the ODL based SDN controller
-
-       \* \*\*controller\-netconf\-call\-home\-port\*\* \- the NETCONF Call Home port of the ODL based SDN controller
-
-       \* \*\*controller\-username\*\* \- the username to be used when connecting to the ODL based SDN controller
-
-       \* \*\*controller\-password\*\* \- the password to be used when connecting to the ODL based SDN controller
-
-* **ves-endpoint** - this container groups the configuration related to the VES endpoint where the VES messages are targeted
-
-       \* \*\*ves\-endpoint\-protocol\*\* \- the protocol of the VES endpoint where VES messages are targeted
-
-       \* \*\*ves\-endpoint\-ip\*\* \- the IP address of the VES endpoint where VES messages are targeted
-
-       \* \*\*ves\-endpoint\-port\*\* \- the port address of the VES endpoint where VES messages are targeted
-
-       \* \*\*ves\-endpoint\-auth\-method\*\* \- the authentication method to be used when sending the VES message to the VES endpoint. Possible values are:
-
-               + \*no\-auth\* \- no authentication
-
-               + \*cert\-only\* \- certificate only authentication in this case the certificate to be used for the communication must be configured
-
-               + \*basic\-auth\* \- classic username/password authentication in this case both the username and password need to be configured
-
-               + \*cert\-basic\-auth\* \- authentication that uses both username/password and a certificate all three values need to be configured in this case
-
-       \* \*\*ves\-endpoint\-username\*\* \- the username to be used when authenticating to the VES endpoint
-
-       \* \*\*ves\-endpoint\-password\*\* \- the password to be used when authenticating to the VES endpoint
-
-       \* \*\*ves\-endpoint\-certificate\*\* \- the certificate to be used when authenticating to the VES endpoint
-
-* base-port - status node indicating the start port for mapping the simulated network functions; ports are assigned in an increasing order starting from this base port
-
-* ssh-connections - status node indicating the number of SSH Endpoints each network function instance exposes
-
-* tls-connections - status node indicating the number of TLS Endpoints each network function instance exposes
-
-* cpu-usage - status node indicating the **total** CPU usage of the simulation
-
-* mem-usage - status node indicating the **total** memory usage of the simulation
+- **network-functions** - represents the simulation data, which will be best described below
+- **sdn-controller** - this container groups the configuration related to the ODL based SDN controller that the simulated devices can connect to:
+  
+    - **controller-protocol** - SDN controller protocol (http/https)
+    - **controller-ip** - the IP address of the ODL based SDN controller where the simulated devices can be mounted. Both IPv4 and IPv6 are supported
+    - **controller-port** - the port of the ODL based SDN controller
+    - **controller-netconf-call-home-port** - the NETCONF Call Home port of the ODL based SDN controller
+    - **controller-username** - the username to be used when connecting to the ODL based SDN controller
+    - **controller-password** - the password to be used when connecting to the ODL based SDN controller
+
+- **ves-endpoint** - this container groups the configuration related to the VES endpoint where the VES messages are targeted:
+
+    - **ves-endpoint-protocol** - the protocol of the VES endpoint where VES messages are targeted (http/https)
+    - **ves-endpoint-ip** - the IP address of the VES endpoint where VES messages are targeted
+    - **ves-endpoint-port** - the port address of the VES endpoint where VES messages are targeted
+    - **ves-endpoint-auth-method** - the authentication method to be used when sending the VES message to the VES endpoint. Possible values are:
+
+        + *no-auth* - no authentication
+        + *cert-only* - certificate only authentication in this case the certificate to be used for the communication must be configured
+        + *basic-auth* - classic username/password authentication in this case both the username and password need to be configured
+        + *cert-basic-auth* - authentication that uses both username/password and a certificate all three values need to be configured in this case
+        + 
+    - **ves-endpoint-username** - the username to be used when authenticating to the VES endpoint
+    - **ves-endpoint-password** - the password to be used when authenticating to the VES endpoint
+    - **ves-endpoint-certificate** - the certificate to be used when authenticating to the VES endpoint
+- **ports**: if any ports share the same number, the order is: netconf-ssh (all ports), netconf-tls (all ports), ftp (1 port), sftp (1 port):
+
+    - **netconf-ssh-port** - base port for NETCONF SSH
+    - **netconf-tls-port** - base port for NETCONF TLS
+    - **transport-ftp-port** - base port for FTP
+    - **transport-sftp-port** - base port for SFTP
+
+- **ssh-connections** - status node indicating the number of SSH Endpoints each network function instance exposes
+- **tls-connections** - status node indicating the number of TLS Endpoints each network function instance exposes
+- **cpu-usage** - status node indicating the **total** CPU usage of the simulation
+- **mem-usage** - status node indicating the **total** memory usage of the simulation
+- **last-operation-status** - indicates the status of last manager ran operation
 
 Under the **network-functions** there is the **network-function** list. This list is automatically populated by the NTS Manager at start time with the available network functions. No changes at the actual list are allowed (adding or removing elements), only the changes of the properties of the elements have effect. The structure of an element of this list is described below:
 
-* **function-type** - the function type
-
-* **started-devices** - represents the number of simulated devices. The default value is 0, meaning that when the NTS is started, there are no simulated devices. When this value is increased to **n**, the NTS Manager starts docker containers in order to reach **n** simulated devices. If the value is decreased to **k**, the NTS Manager will remove docker containers in a LIFO manner, until the number of simulated devices reaches **k**
-
-* **mounted-devices** - represents the number of devices to be mounted to an ODL based SDN Controller. The same phylosophy as in the case of the previous leaf applies. If this number is increased, the number of ODL mountpoints increases. Else, the simulated devices are being unmounted from ODL. The number of mounted devices cannot exceed the number of started devices. The details about the ODL controller where to mount/unmount are given by the **sdn-controller** container
-
-* **mount-point-addressing-method** - addressing method of the mount point. Possible values are:
-
-       + \*docker\-mapping\* \- [default value] future started simulated devices will be mapped on the Docker container
-
-       + \*host\-mapping\* \- future started simulated devices will me mapped on the host's IP address and port based on \*base\-port\*
-
-* **docker-instance-name** - the prefix for future simulated devices (to this name a dash and an increasing number is added)
-
-* **docker-version-tag** - a specific version tag for the Docker container to be ran. if empty, the latest version is ran
-
-* **docker-repository** - the prefix for containing the Docker repository information. if local repository is used, value can be either blank or *local*
-
-* **fault-generation** - container which groups the fault generation features, explained later
-
-* **netconf** - container with settings for enabling or disabling netconf features
-
-       \* \*\*faults\-enabled\*\* \- enable or disable faults over netconf
-
-       \* \*\*call\-home\*\* \- enable the NETCONF Call Home feature. If set to 'true', each simulated device, when booting up, will try to Call Home to the SDN Controller.
-
-* **ves** - container with settings for enabling or disabling VES features
-
-       \* \*\*faults\-enabled\*\* \- enable or disable faults over VES
-
-       \* \*\*pnf\-registration\*\* \- enable PNF registration on start
-
-       \* \*\*heartbeat\-period\*\* \- the number of seconds between VES heartbeat messages
-       
-### Manager datastore changes mode of operation
-===============================================
+- **function-type** - the function type
+- **started-devices** - represents the number of simulated devices. The default value is 0, meaning that when the NTS is started, there are no simulated devices. When this value is increased to **n**, the NTS Manager starts docker containers in order to reach **n** simulated devices. If the value is decreased to **k**, the NTS Manager will remove docker containers in a LIFO manner, until the number of simulated devices reaches **k**
+- **mounted-devices** - represents the number of devices to be mounted to an ODL based SDN Controller. The same phylosophy as in the case of the previous leaf applies. If this number is increased, the number of ODL mountpoints increases. Else, the simulated devices are being unmounted from ODL. The number of mounted devices cannot exceed the number of started devices. The details about the ODL controller where to mount/unmount are given by the **sdn-controller** container
+- **mount-point-addressing-method** - addressing method of the mount point. Possible values are:
+  
+    + *docker-mapping* - [default value] future started simulated devices will be mapped on the Docker container
+    + *host-mapping* - future started simulated devices will me mapped on the host's IP address and port based on *base-port*
+- **docker-instance-name** - the prefix for future simulated devices (to this name a dash and an increasing number is added)
+- **docker-version-tag** - a specific version tag for the Docker container to be ran. if empty, the latest version is ran
+- **docker-repository** - the prefix for containing the Docker repository information. if local repository is used, value can be either blank or *local*
+- **fault-generation** - container which groups the fault generation features, explained later
+- **netconf** - container with settings for enabling or disabling netconf features:
+
+    - **faults-enabled** - enable or disable faults over netconf
+    - **call-home** - enable the NETCONF Call Home feature. If set to 'true', each simulated device, when booting up, will try to Call Home to the SDN Controller.
+- **ves** - container with settings for enabling or disabling VES features:
+
+    - **faults-enabled** - enable or disable faults over VES
+    - **pnf-registration** - enable PNF registration on start
+    - **heartbeat-period** - the number of seconds between VES heartbeat messages
+
+The **available-images** container has a list containing available (installed) simulations. The list corresponds (has the same name, and specific leafs) to the **network-function** list inside **simulation**, and the description is the same. This list is populated by the Manager at runtime after it checks which Docker images are pulled, including having multiple versions (both in tag and repository). To be more clear, each entry of this list is a possible simulation, and the list contains all the possible simulations. This allows the user to know the simulation capabilities of the Manager.
+
+There are 2 defined **notifications**:
+
+- **instance-changed** notification: is called by the manager whenever a change is done to any of the network functions. This contains data about the change:
+  
+    - **change-status**: is a string which has the following structure: operation STATUS - info. operation can be *start*, *stop*, *mount*, *unmount*, *config* and *reconfig*; STATUS can be SUCCESS or FAILED; info can be present or not, depending on what further information is available about the change
+    - **function-type**: the function-type for the instance
+    - **name**: name of the instance that is changed
+    - **networking**: when starting and configuring an instance, this container has all the necessary networking data, such as IP and ports
+  
+- **operation-status-changed** notification is called by the manager at the end of an operation:
+
+    - **status** returns the status of the operation: SUCCESS/FAILED. This status can also be statically read from the operational datastore under *nts-manager:simulation/last-operation-status*
+    - **error-mesage** an error message with details of the error (if any).
+
+Manager datastore changes mode of operation
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 Changing any value from **sdn-controller** or **ves-endpoint** containers will be propagated to all running simulated network functions, and all new ones will use the values here. In the same manner, triggering any changes to the **fault-generation**, **netconf** and **ves** settings in a network function element from the *network-function* list will automatically propagate to all running network functions of the same *function-type*. However, changing the *docker-\** leafs of the *network-function* won't propagate, as they're only used as settings for starting new network functions.
 
-## NTS network function
-=======================
+NTS network function
+---------------------
 
 The NTS network function represents the actual simulated device.
 
-
-module: nts-network-function
-
-  +--rw simulation
-
-        +\-\-rw network\-function
-
-        |  +\-\-rw mount\-point\-addressing\-method?   enumeration
-
-        |  +\-\-rw fault\-generation
-
-        |  |  +\-\-rw fault\-delay\-list\* [index]
-
-        |  |  |  +\-\-rw index           uint16
-
-        |  |  |  +\-\-rw delay\-period?   uint16
-
-        |  |  +\-\-ro fault\-count {faults\-status}?
-
-        |  |     +\-\-ro normal?     uint32
-
-        |  |     +\-\-ro warning?    uint32
-
-        |  |     +\-\-ro minor?      uint32
-
-        |  |     +\-\-ro major?      uint32
-
-        |  |     +\-\-ro critical?   uint32
-
-        |  +\-\-rw netconf
-
-        |  |  +\-\-rw faults\-enabled?   boolean
-
-        |  |  +\-\-rw call\-home?        boolean
-
-        |  +\-\-rw ves
-
-        |     +\-\-rw faults\-enabled?     boolean
-
-        |     +\-\-rw pnf\-registration?   boolean
-
-        |     +\-\-rw heartbeat\-period?   uint16
-
-        +\-\-rw sdn\-controller
-
-        |  +\-\-rw controller\-ip?                       inet:ip\-address
-
-        |  +\-\-rw controller\-port?                     inet:port\-number
-
-        |  +\-\-rw controller\-netconf\-call\-home\-port?   inet:port\-number
-
-        |  +\-\-rw controller\-username?                 string
-
-        |  +\-\-rw controller\-password?                 string
-
-        +\-\-rw ves\-endpoint
-
-               +\-\-rw ves\-endpoint\-protocol?      enumeration
-
-               +\-\-rw ves\-endpoint\-ip?            inet:ip\-address
-
-               +\-\-rw ves\-endpoint\-port?          inet:port\-number
-
-               +\-\-rw ves\-endpoint\-auth\-method?   authentication\-method\-type
-
-               +\-\-rw ves\-endpoint\-username?      string
-
-               +\-\-rw ves\-endpoint\-password?      string
-
-               +\-\-rw ves\-endpoint\-certificate?   string
-
-  rpcs:
-
-       +\-\-\-x datastore\-random\-populate
-
-       |  +\-\-ro output
-
-       |     +\-\-ro status    enumeration
-
-       +\-\-\-x feature\-control
-
-       |  +\-\-\-w input
-
-       |  |  +\-\-\-w features    ntsc:feature\-type
-
-       |  +\-\-ro output
-
-       |     +\-\-ro status    enumeration
-
-       +\-\-\-x invoke\-notification
-
-       |  +\-\-\-w input
-
-       |  |  +\-\-\-w notification\-format    enumeration
-
-       |  |  +\-\-\-w notification\-object    string
-
-       |  +\-\-ro output
-
-       |     +\-\-ro status    enumeration
-
-       +\-\-\-x invoke\-ves\-pm\-file\-ready
-
-       |  +\-\-\-w input
-
-       |  |  +\-\-\-w file\-location    string
-
-       |  +\-\-ro output
-
-       |     +\-\-ro status    enumeration
-
-       +\-\-\-x clear\-fault\-counters
-
-          +\-\-ro output
-
-                 +\-\-ro status    enumeration
-
-
-### Detailed information about the YANG attributes
-==================================================
+::
+
+    module: nts-network-function
+    +--ro info
+    |  +--ro build-time?         yang:date-and-time
+    |  +--ro version?            string
+    |  +--ro started-features?   ntsc:feature-type
+    +--rw simulation
+        +--rw network-function
+        |  +--rw function-type?                   string
+        |  +--rw mount-point-addressing-method?   enumeration
+        |  +--rw fault-generation!
+        |  |  +--rw fault-delay-list* [index]
+        |  |  |  +--rw index           uint16
+        |  |  |  +--rw delay-period?   uint16
+        |  |  +--ro fault-count {faults-status}?
+        |  |     +--ro normal?     uint32
+        |  |     +--ro warning?    uint32
+        |  |     +--ro minor?      uint32
+        |  |     +--ro major?      uint32
+        |  |     +--ro critical?   uint32
+        |  +--rw netconf!
+        |  |  +--rw faults-enabled?   boolean
+        |  |  +--rw call-home?        boolean
+        |  +--rw ves!
+        |     +--rw faults-enabled?     boolean
+        |     +--rw pnf-registration?   boolean
+        |     +--rw heartbeat-period?   uint16
+        +--rw sdn-controller
+        |  +--rw controller-ip?                       inet:ip-address
+        |  +--rw controller-port?                     inet:port-number
+        |  +--rw controller-netconf-call-home-port?   inet:port-number
+        |  +--rw controller-username?                 string
+        |  +--rw controller-password?                 string
+        +--rw ves-endpoint
+            +--rw ves-endpoint-protocol?      enumeration
+            +--rw ves-endpoint-ip?            inet:ip-address
+            +--rw ves-endpoint-port?          inet:port-number
+            +--rw ves-endpoint-auth-method?   authentication-method-type
+            +--rw ves-endpoint-username?      string
+            +--rw ves-endpoint-password?      string
+            +--rw ves-endpoint-certificate?   string
+
+    rpcs:
+        +---x datastore-populate
+        |  +--ro output
+        |     +--ro status    enumeration
+        +---x feature-control
+        |  +---w input
+        |  |  +---w start-features?   ntsc:feature-type
+        |  |  +---w stop-features?    ntsc:feature-type
+        |  +--ro output
+        |     +--ro status    enumeration
+        +---x invoke-notification
+        |  +---w input
+        |  |  +---w notification-format    enumeration
+        |  |  +---w notification-object    string
+        |  +--ro output
+        |     +--ro status    enumeration
+        +---x invoke-ves-pm-file-ready
+        |  +---w input
+        |  |  +---w file-location    string
+        |  +--ro output
+        |     +--ro status    enumeration
+        +---x clear-fault-counters
+        +--ro output
+            +--ro status    enumeration
+
+
+Detailed information about the YANG attributes
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 All de details and mechanisms of the **network-function** container are explained in the **NTS Manager** section. Besides this container, there are also a couple of RPCs defined:
 
-* **datastore-random-populate** - calling this will trigger the network function to populate all its datastore with random data, and based on the *config.json* defined rules
-
-* **feature-control** - calling this will enable selected features. currently available features are:
-
-       \* \*\*ves\-file\-ready\*\* \- enables VES file ready, and stats a FTP and a SFTP server on the network function
-
-       \* \*\*ves\-heartbeat\*\* \- enabled VES heartbeat feature
-
-       \* \*\*ves\-pnf\-registration\*\* \- enables VES PNF registration
-
-       \* \*\*manual\-notification\-generation\*\* \- enables the manual notification generation feature
-
-       \* \*\*netconf\-call\-home\*\* \- enables NETCONF's Call Home feature
+- **datastore-populate** - calling this will trigger the network function to populate all its datastores with data based on the *config.json* defined rules
+- **feature-control** - calling this will start or stop selected features. currently available features are (features marked with * can not be stopped once started):
 
-       \* \*\*web\-cut\-through\*\* \- enables web cut through, adding the info to the ietf\-system module
+    - **ves-file-ready** - enables VES file ready, and stats a FTP and a SFTP server on the network function
+    - **ves-heartbeat** - enabled VES heartbeat feature
+    - **ves-pnf-registration*** - enables VES PNF registration
+    - **manual-notification-generation** - enables the manual notification generation feature
+    - **netconf-call-home*** - enables NETCONF's Call Home feature
+    - **web-cut-through** - enables web cut through, adding the info to the ietf-system module
 
-* **invoke-notification** - this RPC is used for forcing a simulated device to send a NETCONF notification, as defined by the user. 
+- **invoke-notification** - this RPC is used for forcing a simulated device to send a NETCONF notification, as defined by the user:
 
-       \- The \*\*input\*\* needed by the RPC:
+    - The **input** needed by the RPC:
+  
+        - **notification-format** - can be either *json* or *xml*
+        - **notification-object** - this is a string containing the notification object that we are trying to send from the simulated device, in JSON format. **Please note that the user has the responsibility to ensure that the JSON object is valid, according to the definition of the notification in the YANG module.** There is no possibility to see what was wrong when trying to send an incorrect notification. The RPC will only respond with an "ERROR" status in that case, without further information. E.g. of a JSON containing a notification object of type ***otdr-scan-result*** defined in the ***org-openroadm-device*** YANG module: ***{"org-openroadm-device:otdr-scan-result":{"status":"Successful","status-message":"Scan result was successful","result-file":"/home/result-file.txt"}}***. **Please note that the notification object contains also the name of the YANG model defning it, as a namespace, as seen in the example.**
+    - The **output** returned by the RPC:
+  
+        - **status** - if the notification was send successfully by the simulated device, the RPC will return a **SUCCESS** value. Else, the RPC will return a **ERROR** value.
 
-               \- \*\*notification\-format\*\* \- can be either \*json\* or \*xml\*
+- **invoke-ves-pm-file-ready** - as name impiles, it invokes a file ready VES request, with a specified *file-location*
+- **clear-fault-counters** - clears all counters for the fault generation system. see **Fault generation** below.
 
-               \- \*\*notification\-object\*\* \- this is a string containing the notification object that we are trying to send from the simulated device, in JSON format. \*\*Please note that the user has the responsibility to ensure that the JSON object is valid, according to the definition of the notification in the YANG module.\*\* There is no possibility to see what was wrong when trying to send an incorrect notification. The RPC will only respond with an "ERROR" status in that case, without further information. E.g. of a JSON containing a notification object of type \*\*\*otdr\-scan\-result\*\*\* defined in the \*\*\*org\-openroadm\-device\*\*\* YANG module: \*\*\*{"org\-openroadm\-device:otdr\-scan\-result":{"status":"Successful","status\-message":"Scan result was successful","result\-file":"/home/result\-file.txt"}}\*\*\*. \*\*Please note that the notification object contains also the name of the YANG model defning it, as a namespace, as seen in the example.\*\*
+It is worth mentioning that the *NTS Manager* also populates the `function-type` leaf of its own *nts-network-function* module with the value `NTS_FUNCTION_TYPE_MANAGER`. This is done to help users which are connected to a NETCONF server get the data from *nts-network-function* and immediatly see what they are connected to.
 
-       \- The \*\*output\*\* returned by the RPC:
-
-               \- \*\*status\*\* \- if the notification was send successfully by the simulated device, the RPC will return a \*\*SUCCESS\*\* value. Else, the RPC will return a \*\*ERROR\*\* value.
-
-* **invoke-ves-pm-file-ready** - as name impiles, it invokes a file ready VES request, with a specified *file-location*
-
-* **clear-fault-counters** - clears all counters for the fault generation system. see **Fault generation** below.
-
-### Network function operation
-==============================
-
-Under usual operation, the network functions are managed by the manager which will perform the operations listed below. However, if a user chooses to, it can manually start up a network function, and manage it via NETCONF (datastore and RPCs).
+Network function operation
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
+Under usual operation, the network functions are managed by the manager which will perform the operations listed below. However, if a user chooses to, it can manually start up a network function, and manage it via NETCONF (datastore and RPCs) or enviroment (see below).
 1. Create and start Docker container
-
 2. Set the VES and SDN controller data via NETCONF
-
-3. Invoke **datastore-random-populate** RPC to populate the datastore
-
+3. Invoke **datastore-populate** RPC to populate the datastore
 4. Invoke **feature-control**, enabling **ALL** the features.
 
-### Datastore random population
-===============================
-
-The datastore will be populated with random values on each of its leafs. However, certain there is some control on the population itself, which can be found in *config.json*, which is commented. Please note that the nodes below should be main nodes in *config.json*:
-
-
-"debug-max-string-size" : 50,       //max size of string. if not set, default is 255
-       
-"populate-rules" : {
-
-       "excluded\-modules": [           //modules to be excluded from populating
-
-               "sysrepo",
-
-               "sysrepo\-monitoring",
-
-               "ietf\-yang\-library",
-
-               "ietf\-netconf\-acm",
-
-               "ietf\-netconf\-monitoring",
-
-               "nc\-notifications",
-
-               "ietf\-keystore",
-
-               "ietf\-truststore",
-
-               "ietf\-system",
-
-               "ietf\-netconf\-server"
-
-       ],
-       
-       "default\-list\-instances": 1,    //default number of instances a list or a leaflist should be populated with
-
-       "custom\-list\-instances" : [     //custom number of list instances. instance is schema name, and should reflect a list or a leaflist
-
-               {"/ietf\-interfaces:interfaces/interface": 2}, //2 instances of this. if 0, list will be excluded from populating
-
-       ],
-
-       "restrict\-schema" : [           //restrictions to certain schema nodes to a set of values (so no random here)
-
-               {"/ietf\-interfaces:interfaces/interface/type" : ["iana\-if\-type:ethernetCsmacd", "other\-value"]},
-
-               {"/ietf\-interfaces:interfaces/interface/name" : ["name1", "name2"]}
-
-       ]
-
-}
-
-
-### Fault generation
-====================
 
-Fault generation is controlled using a combination of JSON and YANG settings.
+Network function standalone operation
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-From the JSON perspective, the settings are as below:
+The network function can run in standalone mode when the **NTS_NF_STANDALONE_START_FEATURES** environment variable is not blank. The value found here determines the standalone operation, and it can be combined of two values:
 
+- datastore-populate, which populates the datastore by the rules
+- any bits of the feature-type YANG typedef (defined in nts-common.yang), which will enable the respective features.
 
-"alarm-rules" : {
+Other than this, the network-function will operate just as it would when started by the manager and it can be controller through the **nts-network-function.yang** interface.
 
-       "yang\-notif\-template" : "<xml ... %%severity%%  $$time$$  %%custom1%%>",
+Datastore random population
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-       "choosing\-method" : "random | linear",
-
-       "alarms" : [
-
-               {
-
-                       //ves mandatory fields
-
-                       "condition" : "",
-
-                       "object"    : "",
-
-                       "severity"  : "",
-
-                       "date\-time" : "$$time$$",
-
-                       "specific\-problem" : "",
-
-                       //template custom fileds
-
-                       "custom1" : "",
-
-                       "custom2" : ""
-
-               }
-
-               ...
-
-               {
-
-                       ...
-
-               }
-
-       ]
-
-}
-
-
-* **alarm-rules** node should be a main node in *config.json* for the respective network function in order for the fault generation to be enabled
-
-       \* \*\*yang\-notif\-template\*\* \- template of the yang notification model in current network function. can be "" to disable notifications. must always be present
-
-       \* \*\*choosing\-method\*\* \- method to choose the alarm. can be either \*linear\* or \*random\*, and must always be present
-
-       \* \*\*alarms\*\* list of alarms to choose from by "choosing\-method". it can contain any number of fields, custom ones, along with the mandatory VES fields presented below:
-
-               \* \*\*condition\*\*
-
-               \* \*\*object\*\*
-
-               \* \*\*severity\*\* \- should correspond to VES defined: NORMAL, WARNING, MINOR, MAJOR, CRITICAL (case sensitive)
-
-               \* \*\*date\-time\*\*
+The datastore will be populated with random values on each of its leafs. However, certain there is some control on the population itself, which can be found in *config.json*, which is commented. Please note that the nodes below should be main nodes in *config.json*:
 
-               \* \*\*specific\-problem\*\*
+::
+
+    "datastore-random-generation-rules" : {
+        "excluded-modules": [           //modules to be excluded from populating
+            "sysrepo",
+            "sysrepo-monitoring",
+            "ietf-yang-library",
+            "ietf-netconf-acm",
+            "ietf-netconf-monitoring",
+            "nc-notifications",
+            "ietf-keystore",
+            "ietf-truststore",
+            "ietf-system",
+            "ietf-netconf-server"
+        ],
+
+        "debug-max-string-size" : 50,       //max size of string. if not set, default is 255
+        
+        "default-list-instances": 1,    //default number of instances a list or a leaflist should be populated with
+        "custom-list-instances" : [     //custom number of list instances. instance is schema name, and should reflect a list or a leaflist
+            {"/ietf-interfaces:interfaces/interface": 2}, //2 instances of this. if 0, list will be excluded from populating
+        ],
+        "restrict-schema" : [           //restrictions to certain schema nodes to a set of values (so no random here)
+            {"/ietf-interfaces:interfaces/interface/type" : ["iana-if-type:ethernetCsmacd", "other-value"]},
+            {"/ietf-interfaces:interfaces/interface/name" : ["name1", "name2"]}
+        ]
+    },
+
+    "datastore-populate-rules": {
+        "random-generation-enabled": true,  //true or false, whether to generate random data or not (use false only if you want to load pre-generated data only and nothing more)
+
+        "pre-generated-operational-data": [ //path with files containing NETCONF data, either JSON or XML
+            "path/to/data.json",
+            "path/to/data.xml"
+        ],
+        
+        "pre-generated-running-data": [ //path with files containing NETCONF data, either JSON or XML
+            "path/to/data.json",
+            "path/to/data.xml"
+        ]
+    }
+
+NOTE: pre-generated data must be in either JSON or XML format; be careful on how the file name is saved, because the simulator can only discover format based on filename (case-sensitve ".json" or ".xml")
+
+NOTE: when generating random data, the pre-generated data is loaded first, and any module affected by the pre-generated data is automatically excluded from random populating. The order in which data is added to the datastore is:
+
+1. pre-generated data
+2. random data
+
+NOTE: the order in which datastores are being populated:
+
+1. the RUNNING datastore
+2. the OPERATIONAL datastore
+
+Fault generation
+^^^^^^^^^^^^^^^^
+
+Fault generation is controlled using a combination of JSON and YANG settings. From the JSON perspective, the settings are as below:
+
+::
+
+    "fault-rules" : {
+        "yang-notif-template" : "<xml ... %%severity%%  $$time$$  %%custom1%%>",
+        "choosing-method" : "random | linear",
+        "faults" : [
+            {
+                //ves mandatory fields
+                "condition" : "",
+                "object"    : "",
+                "severity"  : "",
+                "date-time" : "$$time$$",
+                "specific-problem" : "",
+
+                //template custom fileds
+                "custom1" : "",
+                "custom2" : ""
+            }
+            ...
+            {
+                ...
+            }
+        ]
+    }
+
+    * **fault-rules** node should be a main node in *config.json* for the respective network function in order for the fault generation to be enabled
+    * **yang-notif-template** - template of the yang notification model in current network function. can be "" to disable notifications. must always be present
+    * **choosing-method** - method to choose the fault. can be either *linear* or *random*, and must always be present
+    * **faults** list of faults to choose from by "choosing-method". it can contain any number of fields, custom ones, along with the mandatory VES fields presented below:
+        * **condition**
+        * **object**
+        * **severity** - should correspond to VES defined: NORMAL, WARNING, MINOR, MAJOR, CRITICAL (case sensitive)
+        * **date-time**
+        * **specific-problem**
 
 On the **yang-notif-template** and on any of the fields, there are two options for creating "dynamic" content (also see example above):
+- **variables** - any field put in between %% will be replaced with the field's value
+- **functions** - function names are put in between $$. Available functions are:
 
-* **variables** - any field put in between %% will be replaced with the field's value
-
-* **functions** - function names are put in between $$. Available functions are:
-
-       \* \*\*time\*\* \- returns current timestamp in a YANG date\-time format
-
-       \* \*\*uint8\_counter\*\* \- a unique 8\-bit counter, starting from 0, each time this function is found, the counter is automatically increased; when going above the max value, it will reset from 0
-
-       \* \*\*uint16\_counter\*\* \- a unique 16\-bit counter, starting from 0, each time this function is found, the counter is automatically increased; when going above the max value, it will reset from 0
-
-       \* \*\*uint32\_counter\*\* \- a unique 32\-bit counter, starting from 0, each time this function is found, the counter is automatically increased; when going above the max value, it will reset from 0
+    - **time** - returns current timestamp in a YANG date-time format
+    - **uint8_counter** - a unique 8-bit counter, starting from 0, each time this function is found, the counter is automatically increased; when going above the max value, it will reset from 0
+    - **uint16_counter** - a unique 16-bit counter, starting from 0, each time this function is found, the counter is automatically increased; when going above the max value, it will reset from 0
+    - **uint32_counter** - a unique 32-bit counter, starting from 0, each time this function is found, the counter is automatically increased; when going above the max value, it will reset from 0
 
 It is worth to mention that the replacement is done within any field, of any field. This means that it is possible to have nested fields and functions. See example for better understanding.
 
 From the YANG perspective, one can control whether faults are enabled or disabled independently via NETCONF and/or VES, through their respective containers described in the sections above. The YANG **fault-generation** container contains:
 
-* **fault-delay-list** - a list with elements which consists of *index* (unimportant, but needs to be unique) and *delay-period* which represents the number of seconds in between the current fault and the next fault. Please note that the fault is chosen from and based on the settings esablished in *config.json*
-
-* **fault-count** - the status of the faults encountered by the network function; it is not present in the manager's schema
+- **fault-delay-list** - a list with elements which consists of *index* (unimportant, but needs to be unique) and *delay-period* which represents the number of seconds in between the current fault and the next fault. Please note that the fault is chosen from and based on the settings esablished in *config.json*
+- **fault-count** - the status of the faults encountered by the network function; it is not present in the manager's schema
 
 In order to clear the **fault-count** counters, on the **network-function** module there is a **clear-fault-counters** RPC which can be called via NETCONF.
 
-## NTS Application
-==================
+NTS Application
+---------------
 
-Either of the two main functionalities (*manager* and *network-function*) are implemented by the same binary application. Besides this functionality, the application can also do some utility functions, which can be used if the application is ran from the CLI (command line interface), along with some parameters.
+Either of the two main functionalities (*manager* and *network-function*) are implemented by the same binary application. This another functionality added in v1.0.8 which implements supervisor capabilities for governing the Docker container. Besides these functionalities, the application can also do some utility functions, which can be used if the application is ran from the CLI (command line interface), along with some parameters.
 
-### CLI paramters
-=================
+CLI paramters
+^^^^^^^^^^^^^^
 
 The paramers are described below:
 - --help - shows the help (also described here)
-- --docker-init - is automatically used by Docker when building the images to install modules and enable features. Described in the next chapter. **Do not run manually**
-- the two main modes:
-
-       \- \-\-manager \- runs in manager mode
-
-       \- \-\-network\-function \- runs in network function mode
-    
-    - global settings, which can be used with **ANY** of the other operating modes:
-
-       \- \-\-operational\-only \- used in testing. do not use the RUNNING datastore, only do the population on OPERATIONAL datastore
-
-       \- \-\-fixed\-rand \- used in testing. specify a fixed value seed for the randomness
-
-       \- \-\-verbose \- set the verbose level. can range from 0 to 2, default is 1
-
-       \- \-\-workspace \- set the current working workspace. the workspace must contain the \*config\* and \*log\* folders    
-
-- test modes - do not use
-
-- utilitary functions:
-
-       \- \-\-ls \- list all modules in the datastore with their attributes
-
-       \- \-\-schema \- list the schema of an xpath given as parameter
-
-       \- \-\-populate \- populate the datastore upon starting
-
-       \- \-\-enable\-features \- enable all features upon starting, after (if requested) the populating was done
-
-       \- \-\-nc\-server\-init \- initialize netconf server
-
-       \- \-\-loop \- after everything is done, run an endless loop
-
-### Docker container initialization
-===================================
+- --version - describes ntsng version and build time
+- **main modes**:
+  
+    - --container-init - is automatically used by Docker when building the images to install modules and enable features. Described in the next chapter. **Do not run manually**
+    - --supervisor - runs in supervisor mode (configuration is done via config.json)
+    - --manager - runs in manager mode
+    - --network-function - runs in network function mode
+    - --generate - generates data based on current settings and datastores, without commiting the data (saves to file)
+    - --test-mode - test mode for automated tests. **Do not use**
+
+- global settings changer:
+
+    - --fixed-rand - used in testing. specify a fixed value seed for the randomness
+    - --verbose - set the verbose level. can range from 0 (errors-only) to 2 (verbose), default is 1 (info)
+    - --workspace - set the current working workspace. the workspace **MUST** be writeable and should contain *config/config.json* file, otherwise a blank json file will be created
+- tools:
+  
+    - --ls - list all modules in the datastore with their attributes
+    - --schema - list the schema of an xpath given as parameter
+
+Environment variables
+^^^^^^^^^^^^^^^^^^^^^
+
+Below all the available enviroment variables are listed. Please note that if a variable is not defined, it will have a default behaviour:
+
+- **NTS_MANUAL** - when defined, SUPERVISOR will not start any tasks marked as "nomanual"
+- **NTS_BUILD_VERSION** - defines build version, set by Dockerfile
+- **NTS_BUILD_DATE** - defines build date, set by Dockerfile
+- **NTS_NF_STANDALONE_START_FEATURES** - when value is not blank, it allows the network function to run in standalone mode; see "Network function standalone mode" sub-chapter for this
+
+- **DOCKER_ENGINE_VERSION** - Docker engine version, defaults to 1.40 if not set
+- **HOSTNAME** - Container hostname
+- **IPv6_ENABLED** - true/false whether IP v6 is enabled (default false)
+- **SSH_CONNECTIONS** - number of NETCONF SSH connections that should be enabled (default 1)
+- **TLS_CONNECTIONS** - number of NETCONF TLS connections that should be enabled (default 0)
+
+- **NTS_HOST_IP** - Docker host IP address
+- **NTS_HOST_BASE_PORT** - see "Starting the NTS Manager" sub-chapter
+- **NTS_HOST_NETCONF_SSH_BASE_PORT** - see "Starting the NTS Manager" sub-chapter
+- **NTS_HOST_NETCONF_TLS_BASE_PORT** - see "Starting the NTS Manager" sub-chapter
+- **NTS_HOST_TRANSFER_FTP_BASE_PORT** - see "Starting the NTS Manager" sub-chapter
+- **NTS_HOST_TRANSFER_SFTP_BASE_PORT** - see "Starting the NTS Manager" sub-chapter
+
+- **SDN_CONTROLLER_PROTOCOL** - protocol used for communication with the SDN controller (http or https, defaults to https)
+- **SDN_CONTROLLER_IP** - SDN controller IP address
+- **SDN_CONTROLLER_PORT** - SDN controller port
+- **SDN_CONTROLLER_CALLHOME_PORT** - SDN controller port for NETCONF call-home
+- **SDN_CONTROLLER_USERNAME** - SDN controller username
+- **SDN_CONTROLLER_PASSWORD** - SDN controller password
+
+- **VES_COMMON_HEADER_VERSION** - VES protocol version to report (defaults to 7.2)
+- **VES_ENDPOINT_PROTOCOL** - protocol used for communication with the VES endpoint (http or https, defaults to https)
+- **VES_ENDPOINT_IP** - VES endpoint IP address
+- **VES_ENDPOINT_PORT** - VES endpoint port
+- **VES_ENDPOINT_AUTH_METHOD** - VES endpoint auth method; see YANG definition for possible values
+- **VES_ENDPOINT_USERNAME** - VES endpoint username
+- **VES_ENDPOINT_PASSWORD** - VES endpoint password
+- **VES_ENDPOINT_CERTIFICATE** - VES endpoint certificate; not implemented at the moment of writing
+
+Supervisor functionality and configuration
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The NTS app tries to be very little dependent on other tools. Until v1.0.8 one of these tools was supervisord, and now its functionality is embedded inside the NTS app. Now the Docker image runs the NTS app with --supervisor parameter to start the supervisor. When supervisor is ran, other main modes and their options are unavailable for that instance (the supervisor will spawn another instance for the main functionalities). Configuration of the supervisor functionality is done via config.json:
+
+::
+
+    "supervisor-rules": {
+        "netopeer": {
+            "path": "/usr/local/bin/netopeer2-server",
+            "args": ["-d", "-v2"],
+            "autorestart": true,
+            "stdout": "log/netopeer-stdout.log",
+            "stderr": "log/netopeer-stderr.log"
+        },
+
+        "sshd": {
+            "path": "/usr/sbin/sshd",
+            "args": ["-D"],
+            "autorestart": true,
+            "stdout": "log/sshd-stdout.log",
+            "stderr": "log/sshd-stderr.log"
+        },
+
+        "ntsim-network-function": {
+            "path": "/opt/dev/ntsim-ng/ntsim-ng",
+            "args": ["-w/opt/dev/ntsim-ng", "-f"],
+            "nomanual": true,
+            "stdout": "",
+            "stderr": ""
+        }
+    }
+
+The example above is the default example for a network function. The *supervisor-rules* object contains a list of tasks to run, each with their own settings. Below is a description of all parameters:
+
+- path: *mandatory field* - full path to the the binary
+- args: a list of arguments to be passed to the binary, default is no arguments
+- autorestart: this is true or false, whether to autorestart the application on exit/kill, default is false
+- nomanual: when this is true, the task **won't** be automatically ran when the **NTS_MANUAL** environment variable is present. Default is false, and using this is usually good for debugging.
+- stdout and stderr: path to redirect stdout or stderr to; if **blank**, it will be replaced by **/dev/null** for discarding. If any of the fields are not present in configuration, default value will be used (actual stdout/stderr).
+
+Docker container initialization
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 The NTS app is responsible for initializing the Docker container upon build. What it actually does is described below:
 
 1. Install modules located in the *deploy/yang/* folder recusively
-
-       \- note that if a module requires startup data (mandatory data), this can be acheived by having an \*\*XML\*\* file with this data along the YANG file. For example, if, let's say \*ietf\-interfaces.yang\* would require startup date, there must be a \*ietf\-interfaces.xml\* located in the same folder.
-
+    - note that if a module requires startup data (mandatory data), this can be acheived by having an **XML** or a **JSON** file with this data along the YANG file. For example, if, let's say *ietf-interfaces.yang* would require startup date, there must be a *ietf-interfaces.xml* or *ietf-interfaces.json* located in the same folder.
 2. Enable all YANG features of the modules, unless specifically excluded
 
-If the initialization failes, the result is returned to the Docker builder, so the build will fail, and user can see the output. Docker initialization can be customized from the *config.json* file, as described below. The example is self-expainatory, and the *docker-rules* node needs to be a main node of *config.json*:
+If the initialization failes, the result is returned to the Docker builder, so the build will fail, and user can see the output. Docker initialization can be customized from the *config.json* file, as described below. The example is self-expainatory, and the *container-rules* node needs to be a main node of *config.json*:
 
+::
 
-"docker-rules": {
+    "container-rules": {
+        "excluded-modules": [          //excluded modules from installing
+            "module1",
+            "module2"
+        ],
+        "excluded-features": [         //excluded features from installing
+            "feature1",
+            "feature2"
+        ]
+    }
 
-       "excluded\-modules": [          //excluded modules from installing
-
-               "module1",
-
-               "module2"
-
-       ],
-
-       "excluded\-features": [         //excluded features from installing
-
-               "feature1",
-
-               "feature2"
-
-       ]
-
-}
-
-
-# Usage
-=======
-
-The NTS Manager can be used to start any type of simulated network function.
-
-## Building the images
-======================
+Building the images locally
+---------------------------
 
 The `nts_build.sh` script should be used for building the docker images needed by the NTS to the local machine. This will create docker images for the Manager and for each type of simulated network function.
 
-The user can also directly use the already built docker images, that are pushed to the highstreet docker repository. This can be done by using the `nts*pull*highstreet_repo.sh` script, which will pull all the images locally.
+The user can also directly use the already built docker images, that are pushed to the nexus3 docker repository by the LF Jenkins Job. E.g.: *nexus3.o-ran-sc.org:10004/o-ran-sc/nts-ng-o-ran-du:1.2.0*
 
-## Starting the NTS Manager
-===========================
+Starting the NTS Manager
+------------------------
 
-The **nts-manager-ng** can be started using the docker-compose file in this repo. The file assumes that the docker images were pulled from the highstreet docker repository.
+The **nts-manager-ng** can be started using the docker-compose file in this repo. The file assumes that the docker images were built locally previously.
 
+::
 
-docker-compose up
+    docker-compose up -d ntsim-ng
 
 
 Before starting, the user should set the environment variables defined in the docker-compose file according to his needs:
 
-* **NETCONF*NTS*HOST_IP**: an IP address from the host, which should be used by systems outside the local machine to address the simulators;
-
-* **NETCONF*NTS*HOST*BASE*PORT**: the port from where the allocation for the simulated network functions should start;
-
-* **IPv6Enabled**: should be set to `true` if IPv6 is enabled in the docker daemon and the user wants to use IPv6 to address the simulated  network functions.
-
-# Release notes
-===============
-## version 1.0.3
-================
-- [fixed] fixed issues where ODL could not parse the correct versions for yang files
-
-## version 1.0.2
-================
-- [fixed] bug that occured when trying to start a wrong instance (bad docker-repository or docker-tag)
-- [fixed] when populating the fault-delay-list, if the sum of all the faults was 0, the network funciton kept on generating faults and crashed
+- **NTS_HOST_IP**: an IP address from the host, which should be used by systems outside the local machine to address the simulators;
+- **NTS_HOST_BASE_PORT**: the port from where the allocation for the simulated network functions should start, if not specified otherwise sepparately (see below); any port not defined will automatically be assigned to *BASE_PORT*; **NOTE** that in order for a port to be eligible, it must be greater than or equal to **1000**:
+  
+    - **NTS_HOST_NETCONF_SSH_BASE_PORT**
+    - **NTS_HOST_NETCONF_TLS_BASE_PORT**
+    - **NTS_HOST_TRANSFER_FTP_BASE_PORT**
+    - **NTS_HOST_TRANSFER_SFTP_BASE_PORT**
 
-## version 1.0.1
-================
-- [feature-add] added web-cut-through feature
-- [fixed] mount-point-addressing-method was mistakenly changing after starting
+- **IPv6_ENABLED**: should be set to `true` if IPv6 is enabled in the docker daemon and the user wants to use IPv6 to address the simulated network functions.
 
-## version 1.0.0
-================
+In each simulated network-function the **docker-repository** leaf must be set accordingly  (to the value: *o-ran-sc/*), because all the docker images that are being built locally have this prefix.
 
-Initial release.
+Starting standalone NFs
+-----------------------
 
+One could start 1 instance of a simulated O-RU-FH and 1 instance of a simulated O-DU by running the `nts-start.sh` script. Pre-configured values can be set in the `.env` file.
index 0f33311..1cb199c 100644 (file)
@@ -21,6 +21,9 @@ Version history
 | **Date**           | **Ver.**           | **Author**         | **Comment**        |
 |                    |                    |                    |                    |
 +--------------------+--------------------+--------------------+--------------------+
+| 2021-04-12         | 1.2.0              |  Alex Stancu       | "D" release        |
+|                    |                    |                    |                    |
++--------------------+--------------------+--------------------+--------------------+
 | 2020-12-02         | 1.0.3              |  Alex Stancu       | Cherry release     |
 |                    |                    |                    |                    |
 +--------------------+--------------------+--------------------+--------------------+
@@ -38,26 +41,43 @@ Version history
 Summary
 -------
 
-The O1 interface simulator is a framework that provides simulated devices with a management plane exposed through a NETCONF/YANG interface, using the O-RAN O1 interface YANG modules.
+The O1 interface simulator is a framework that provides simulated network functions (NF) with a management plane exposed through a NETCONF/YANG interface, using YANG models defined in O-RAN.
 
 
 Release Data
 ------------
+version 1.2.0
+
+- [change] **Default password of the NETCONF Server was changed to "netconf!", to be complant with O-RAN requirements**
+
+- [feature-add] NACM (NETCONF Access Control Module) default configuration is now according to O-RAN WG4 requirements instead of disabled, like before
+
+- [change] Do not expose sysrepo internal YANG models in the yang-schema-list
+
+- [change] Provide both IPv4 and IPv6 addresses (if available) in pnfRegistration message
+
+- [change] Change ietf-system default configuration and web-ui URL (now points to ConfigApp in SDN-R)
+
+- [fix] Correctly construct URL for SDN Controller and VES Collector when they are addressed via IPv6
+
+- [fix] VES commmon header made uniform across all VES-related messages
+
+
 version 1.0.3
 
-[fixed] fixed issues where ODL could not parse the correct versions for yang files
+[fixed] fixed issues where ODL could not parse the correct versions for yang files
 
 
 version 1.0.2
 
-[fixed] bug that occured when trying to start a wrong instance (bad docker-repository or docker-tag)
-[fixed] when populating the fault-delay-list, if the sum of all the faults was 0, the network funciton kept on generating faults and crashed
+[fixed] bug that occured when trying to start a wrong instance (bad docker-repository or docker-tag)
+[fixed] when populating the fault-delay-list, if the sum of all the faults was 0, the network funciton kept on generating faults and crashed
 
 
 version 1.0.1
 
-[feature-add] added web-cut-through feature
-[fixed] mount-point-addressing-method was mistakenly changing after starting
+[feature-add] added web-cut-through feature
+[fixed] mount-point-addressing-method was mistakenly changing after starting
 
 
 version 1.0.0
@@ -85,10 +105,13 @@ The following docker containers are the resulting artefacts of the sim-o1-projec
 
 * **o-ran-sc/ntsim-manager** - this image contains the NTS Manager, which handles the simulation environment;
 
-* **o-ran-sc/ntsim-o-ran-ru-fh** - this image contains a simulated device which exposes a management interface via NETCONF/YANG, implementing the O1 FH interface specifications;
+* **o-ran-sc/ntsim-o-ran-fh** - this image contains a simulated device which exposes a management interface via NETCONF/YANG, implementing the O1 FH interface specifications;
 
 * **o-ran-sc/ntsim-x-ran** - this image contains a simulated device which exposes a management interface via NETCONF/YANG, implementing the X-RAN Management interface.
 
+* **o-ran-sc/ntsim-o-ran-ru-fh** - this image contains a simulated device which exposes a management interface via NETCONF/YANG, implementing the O-RU FH YANG models, as per the November 2020 train;
+
+* **o-ran-sc/ntsim-o-ran-du** - this image contains a simulated device which exposes a management interface via NETCONF/YANG, implementing the O-DU YANG models;
 
 Documentation Deliverables
 ++++++++++++++++++++++++++