.. This work is a derivative of https://wiki.onap.org/display/DW/PNF+Simulator+Day-N+config-assign+and+config-deploy+use+case
.. This work is licensed under a Creative Commons Attribution 4.0
.. International License. http://creativecommons.org/licenses/by/4.0
.. Copyright (C) 2020 Deutsche Telekom AG.

PNF Simulator Day-N config-assign/deploy
========================================

Overview
~~~~~~~~~~

This use case shows in a very simple way how a blueprint model of a PNF is created in CDS and how the day-n configuration is
assigned and deployed through CDS. A Netconf server (docker image `sysrepo/sysrepo-netopeer2`) is used for simulating the PNF.

This use case (POC) solely requires a running CDS and the PNF Simulator running on a VM (Ubuntu is used by the author).
No other module of ONAP is needed.

There are different ways to run CDS, to run PNF simulator and to do configuration deployment. This guide will show
different possible options to allow the greatest possible flexibility.

Run CDS (Blueprint Processor)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

CDS can be run in Kubernetes (Minikube, Microk8s) or in an IDE. You can choose your favorite option.
Just the blueprint processor of CDS is needed. If you have desktop access it is recommended to run CDS in an IDE since
it is easy and enables debugging.

* CDS in Microk8s: https://wiki.onap.org/display/DW/Running+CDS+on+Microk8s (RDT link to be added)
* CDS in Minikube: https://wiki.onap.org/display/DW/Running+CDS+in+minikube (RDT link to be added)
* CDS in an IDE:  https://docs.onap.org/projects/onap-ccsdk-cds/en/latest/userguide/running-bp-processor-in-ide.html

Run PNF Simulator and install module
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

There are many different ways to run a Netconf Server to simulate the PNF, in this guide `sysrepo/sysrepo-netopeer2`
docker image is commonly used. The easiest way is to run the out-of-the-box docker container without any
other configuration, modules or scripts. In the ONAP community there are other workflows existing for running the
PNF Simulator. These workflows are also using `sysrepo/sysrepo-netopeer2` docker image. These workflow are also linked
here but they are not tested by the author of this guide.

.. tabs::

   .. tab:: sysrepo/sysrepo-netopeer2 (latest)

      .. warning::
         Currently there is an issue for the SSH connection between CDS and the netconf server because of unmatching
         exchange key algorhithms
         (see `Stackoverflow <https://stackoverflow.com/questions/64047502/java-lang-illegalstateexception-unable-to-negotiate-key-exchange-for-server-hos>`_).
         **Use legacy version (right tab) until the issue is resolved.**

      Download and run docker container with ``docker run -d --name netopeer2 -p 830:830 -p 6513:6513 sysrepo/sysrepo-netopeer2:latest``

      Enter the container with ``docker exec -it netopeer2 bin/bash``

      Browse to the target location where all YANG modules exist: ``cd /etc/sysrepo/yang``

      Create a simple mock YANG model for a packet generator (:file:`pg.yang`).

      .. code-block:: sh
         :caption: **pg.yang**

         module sample-plugin {

            yang-version 1;
            namespace "urn:opendaylight:params:xml:ns:yang:sample-plugin";
            prefix "sample-plugin";

            description
            "This YANG module defines the generic configuration and
            operational data for sample-plugin in VPP";

            revision "2016-09-18" {
               description "Initial revision of sample-plugin model";
            }

            container sample-plugin {

               uses sample-plugin-params;
               description "Configuration data of sample-plugin in Honeycomb";

               // READ
               // curl -u admin:admin http://localhost:8181/restconf/config/sample-plugin:sample-plugin

               // WRITE
               // curl http://localhost:8181/restconf/operational/sample-plugin:sample-plugin

            }

            grouping sample-plugin-params {
               container pg-streams {
                  list pg-stream {

                     key id;
                     leaf id {
                        type string;
                     }

                     leaf is-enabled {
                        type boolean;
                     }
                  }
               }
            }
         }

      Create the following sample XML data definition for the above model (:file:`pg-data.xml`).
      Later on this will initialise one single PG stream.

      .. code-block:: sh
         :caption: **pg-data.xml**

         <sample-plugin xmlns="urn:opendaylight:params:xml:ns:yang:sample-plugin">
            <pg-streams>
               <pg-stream>
                  <id>1</id>
                  <is-enabled>true</is-enabled>
               </pg-stream>
            </pg-streams>
         </sample-plugin>

      Execute the following command within netopeer docker container to install the pg.yang model

      .. code-block:: sh

         sysrepoctl -v3 -i pg.yang

      .. note::
         This command will just schedule the installation, it will be applied once the server is restarted.

      Stop the container from outside with ``docker stop netopeer2`` and start it again with ``docker start netopeer2``

      Enter the container like it's mentioned above with ``docker exec -it netopeer2 bin/bash``.

      You can check all installed modules with ``sysrepoctl -l``.  `sample-plugin` module should appear with ``I`` flag.

      Execute the following the commands to initialise the Yang model with one pg-stream record.
      We will be using CDS to perform the day-1 and day-2 configuration changes.

      .. code-block:: sh

         netopeer2-cli
         > connect --host localhost --login root
         # passwort is root
         > get --filter-xpath /sample-plugin:*
         # shows existing pg-stream records (empty)
         > edit-config --target running --config=/etc/sysrepo/yang/pg-data.xml
         # initialises Yang model with one pg-stream record
         > get --filter-xpath /sample-plugin:*
         # shows initialised pg-stream

      If the output of the last command is like this, everything went successful:

      .. code-block:: sh

         DATA
         <sample-plugin xmlns="urn:opendaylight:params:xml:ns:yang:sample-plugin">
            <pg-streams>
               <pg-stream>
                  <id>1</id>
                  <is-enabled>true</is-enabled>
               </pg-stream>
            </pg-streams>
         </sample-plugin>


   .. tab:: sysrepo/sysrepo-netopeer2 (legacy)

      Download and run docker container with ``docker run -d --name netopeer2 -p 830:830 -p 6513:6513 sysrepo/sysrepo-netopeer2:legacy``

      Enter the container with ``docker exec -it netopeer2 bin/bash``

      Browse to the target location where all YANG modules exist: ``cd /opt/dev/sysrepo/yang``

      Create a simple mock YANG model for a packet generator (:file:`pg.yang`).

      .. code-block:: sh
         :caption: **pg.yang**

         module sample-plugin {

            yang-version 1;
            namespace "urn:opendaylight:params:xml:ns:yang:sample-plugin";
            prefix "sample-plugin";

            description
            "This YANG module defines the generic configuration and
            operational data for sample-plugin in VPP";

            revision "2016-09-18" {
               description "Initial revision of sample-plugin model";
            }

            container sample-plugin {

               uses sample-plugin-params;
               description "Configuration data of sample-plugin in Honeycomb";

               // READ
               // curl -u admin:admin http://localhost:8181/restconf/config/sample-plugin:sample-plugin

               // WRITE
               // curl http://localhost:8181/restconf/operational/sample-plugin:sample-plugin

            }

            grouping sample-plugin-params {
               container pg-streams {
                  list pg-stream {

                     key id;
                     leaf id {
                        type string;
                     }

                     leaf is-enabled {
                        type boolean;
                     }
                  }
               }
            }
         }

      Create the following sample XML data definition for the above model (:file:`pg-data.xml`).
      Later on this will initialise one single PG (packet-generator) stream.

      .. code-block:: sh
         :caption: **pg-data.xml**

         <sample-plugin xmlns="urn:opendaylight:params:xml:ns:yang:sample-plugin">
            <pg-streams>
               <pg-stream>
                  <id>1</id>
                  <is-enabled>true</is-enabled>
               </pg-stream>
            </pg-streams>
         </sample-plugin>

      Execute the following command within netopeer docker container to install the pg.yang model

      .. code-block:: sh

         sysrepoctl -i -g pg.yang

      You can check all installed modules with ``sysrepoctl -l``. `sample-plugin` module should appear with ``I`` flag.

      In legacy version of `sysrepo/sysrepo-netopeer2` subscribers of a module are required, otherwise they are not
      running and configurations changes are not accepted, see https://github.com/sysrepo/sysrepo/issues/1395. There is
      an predefined application mock up which can be used for that. The usage is described
      here: https://asciinema.org/a/160247. You need to run the following
      commands to start the example application for subscribing to our sample-plugin YANG module.

      .. code-block:: sh

         cd /opt/dev/sysrepo/build/examples
         ./application_example sample-plugin

      Following output should appear:

      .. code-block:: sh

         ========== READING STARTUP CONFIG sample-plugin: ==========

         /sample-plugin:sample-plugin (container)
         /sample-plugin:sample-plugin/pg-streams (container)


         ========== STARTUP CONFIG sample-plugin APPLIED AS RUNNING ==========


      The terminal session needs to be kept open after application has started.

      Open a new terminal and enter the container with ``docker exec -it netopeer2 bin/bash``.
      Execute the following commands in the container to initialise the Yang model with one pg-stream record.
      We will be using CDS to perform the day-1 configuration and day-2 configuration changes.

      .. code-block:: sh

         netopeer2-cli
         > connect --host localhost --login netconf
         # passwort is netconf
         > get --filter-xpath /sample-plugin:*
         # shows existing pg-stream records (empty)
         > edit-config --target running --config=/opt/dev/sysrepo/yang/pg-data.xml
         # initialises Yang model with one pg-stream record
         > get --filter-xpath /sample-plugin:*
         # shows initialised pg-stream

      If the output of the last command is like this, everything went successful:

      .. code-block:: sh

         DATA
         <sample-plugin xmlns="urn:opendaylight:params:xml:ns:yang:sample-plugin">
            <pg-streams>
               <pg-stream>
                  <id>1</id>
                  <is-enabled>true</is-enabled>
               </pg-stream>
            </pg-streams>
         </sample-plugin>

      You can also see that there are additional logs in the subscriber application after editing the configuration of our
      YANG module.

   .. tab:: PNF simulator integration project

      .. warning::
         This method of setting up the PNF simulator is not tested by the author of this guide

      You can refer to `PnP PNF Simulator wiki page <https://wiki.onap.org/display/DW/PnP+PNF+Simulator>`_
      to clone the GIT repo and start the required docker containers. We are interested in the
      `sysrepo/sysrepo-netopeer2` docker container to load a simple YANG similar to vFW Packet Generator.

      Start PNF simulator docker containers. You can consider changing the netopeer image verion to image:
      `sysrepo/sysrepo-netopeer2:iop` in docker-compose.yml file If you find any issues with the default image.

      .. code-block:: sh

         cd $HOME

         git clone https://github.com/onap/integration.git

         Start PNF simulator

         cd ~/integration/test/mocks/pnfsimulator

         ./simulator.sh start

      Verify that you have netopeer docker container are up and running. It will be mapped to host port 830.

      .. code-block:: sh

         docker ps -a | grep netopeer


Config-assign and config-deploy in CDS
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

In the following steps the CBA is published in CDS, config-assignment is done and the config is deployed to to the
Netconf server through CDS in the last step. We will use this CBA: :download:`zip <media/pnf-simulator-demo-cba-unenriched.zip>`.
If you want to use scripts instead of Postman the CBA also contains all necessary scripts.

.. tabs::

   .. tab:: Scripts

      **There will be different scripts depending on your CDS installation. For running it in an IDE always use scripts with**
      **-ide.sh prefix. For running CDS in Kubernetes use scripts with -k8s.sh ending. In scripts with -ide.sh prefix**
      **host will be localhost and port will be 8081. For K8s host ip adress gets automatically detected, port is 8000.**

      **Set up CDS:**

      Unzip the downloaded CBA and go to ``/Scripts/`` directory.

      The below script will call Bootstrap API of CDS which loads the CDS default model artifacts into CDS DB.
      You should get HTTP status 200 for the below command.

      .. code-block:: sh

         bash -x ./bootstrap-cds-ide.sh
         # bash -x ./bootstrap-cds-k8s.sh

      Call ``bash -x ./get-cds-blueprint-models-ide.sh`` / ``bash -x ./get-cds-blueprint-models-k8s.sh`` to get all blueprint models in the CDS database.
      You will see a default model ``"artifactName": "vFW-CDS"``  which was loaded by calling bootstrap.

      Push the PNF CDS blueprint model data dictionary to CDS by calling ``bash -x ./dd-microk8s-ide.sh ./dd.json`` /
      ``bash -x ./dd-microk8s-k8s.sh ./dd.json``.
      This will call the data dictionary endpoint of CDS.

      Check CDS database for PNF data dictionaries by entering the DB. You should see 6 rows as shown below.

      **For running CDS in an IDE (accessing mariadb container):**

      .. code-block:: sh

         sudo docker exec -it mariadb_container_id mysql -uroot -psdnctl
         > USE sdnctl;
         > select name, data_type from RESOURCE_DICTIONARY where updated_by='Aarna service <vmuthukrishnan@aarnanetworks.com>';

         +---------------------+-----------+
         | name | data_type |
         +---------------------+-----------+
         | netconf-password | string |
         | netconf-server-port | string |
         | netconf-username | string |
         | pnf-id | string |
         | pnf-ipv4-address | string |
         | stream-count | integer |
         +---------------------+-----------+

         quit

      Replace the container id with your running mariadb container id.


      **For running CDS in K8s (accessing MariaDB pod):**

      .. code-block:: sh

         ./connect-cds-mariadb-k8s.sh

         select name, data_type from RESOURCE_DICTIONARY where updated_by='Aarna service <vmuthukrishnan@aarnanetworks.com>';

         +---------------------+-----------+
         | name | data_type |
         +---------------------+-----------+
         | netconf-password | string |
         | netconf-server-port | string |
         | netconf-username | string |
         | pnf-id | string |
         | pnf-ipv4-address | string |
         | stream-count | integer |
         +---------------------+-----------+

         quit

      **Enrichment:**

      Move to the main folder of the CBA with ``cd ..`` and archive all folders with ``zip -r pnf-demo.zip *``.

      .. warning::
         Sometimes there might be issues during enrichment (e.g. some parameters get deleted in the CBA)). If you face problems
         during enrichment or deployment later on use the following CBA, which is already enriched:
         :download:`zip <media/pnf-simulator-demo-cba-enriched.zip>`. If you use the enriched CBA, skip
         this section until Deploy/Save Blueprint.

      Enrich the blueprint through calling the following script. Take care to provide the zip file you downloader earlier.

      .. code-block:: sh

         cd Scripts
         bash -x ./enrich-and-download-cds-blueprint-ide.sh ../pnf-demo.zip
         # bash -x ./enrich-and-download-cds-blueprint-k8s.sh ../pnf-demo.zip

      Go to the enriched CBA folder with ``cd /tmp/CBA/`` and unzip with ``unzip pnf-demo.zip``.

      **Deploy/Save the Blueprint into CDS database**

      Go to Scripts folder with ``cd Scripts``.

      Run the following script to save/deploy the Blueprint into the CDS database.

      .. code-block:: sh

         bash -x ./save-enriched-blueprint-ide.sh ../pnf-demo.zip
         # bash -x ./save-enriched-blueprint-k8s.sh ../pnf-demo.zip

      After that you should see the new model "artifactName": "pnf_netconf" by calling ``bash -x ./get-cds-blueprint-models.sh``

      **Config-Assign**

      The assumption is that we are using the same host to run PNF NETCONF simulator as well as CDS. You will need the
      IP Adress of the Netconf server container which can be found out with
      ``docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' netopeer2``. In the
      following examples we will use 172.17.0.2.

      Day-1 configuration:

      .. code-block:: sh

         bash -x ./create-config-assing-data-ide.sh day-1 172.17.0.2 5
         # bash -x ./create-config-assing-data-k8s.sh day-1 172.17.0.2 5

      You can verify the day-1 NETCONF RPC payload looking into CDS DB. You should see the NETCONF RPC with 5
      streams (fw_udp_1 TO fw_udp_5). Connect to the DB like mentioned above and run the below statement. You should
      see the day-1 configuration as an output.

      .. code-block:: sh

         MariaDB [sdnctl]> select * from TEMPLATE_RESOLUTION where resolution_key='day-1' AND artifact_name='netconfrpc';

         <rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1">
            <edit-config>
               <target>
                  <running/>
               </target>
               <config>
                  <sample-plugin xmlns="urn:opendaylight:params:xml:ns:yang:sample-plugin">
                     <pg-streams>
                        <pg-stream>
                           <id>fw_udp_1</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_2</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_3</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_4</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_5</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                     </pg-streams>
                  </sample-plugin>
               </config>
            </edit-config>
         </rpc>

      Create PNF configuration for resolution-key = day-2 (stream-count = 10).
      You can verify the CURL command JSON pay load file  /tmp/day-n-pnf-config.json

      .. code-block:: sh

         bash -x ./create-config-assing-data-ide.sh day-2 172.17.0.2 10
         # bash -x ./create-config-assing-data-k8s.sh day-2 172.17.0.2 10

      You can verify the day-2 NETCONF RPC payload looking into CDS DB. You should see the NETCONF RPC with 10
      streams (fw_udp_1 TO fw_udp_10). Connect to the DB like mentioned above and run the below statement. You should
      see the day-2 configuration as an output.

      .. code-block:: sh

         MariaDB [sdnctl]> select * from TEMPLATE_RESOLUTION where resolution_key='day-2' AND artifact_name='netconfrpc';

         <rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1">
            <edit-config>
               <target>
                  <running/>
               </target>
               <config>
                  <sample-plugin xmlns="urn:opendaylight:params:xml:ns:yang:sample-plugin">
                     <pg-streams>
                        <pg-stream>
                           <id>fw_udp_1</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_2</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_3</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_4</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_5</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_6</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_7</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_8</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_9</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_10</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                     </pg-streams>
                  </sample-plugin>
               </config>
            </edit-config>
         </rpc>

      .. note::
         Until this step CDS did not interact with the PNF simulator or device. We just created the day-1 and day-2
         configurations and stored it in CDS database

      **Config-Deploy:**

      Now we will make the CDS REST API calls to push the day-1 and day-2 configuration changes to the PNF simulator.

      If you run CDS in Kubernetes open a new terminal and keep it running with ``bash -x ./tail-cds-bp-log.sh``,
      we can use this to review the config-deploy actions. If you run CDS in an IDE you can have a look into the IDE terminal.

      Following command will deploy day-1 configuration.
      Syntax is ``# bash -x ./process-config-deploy.sh RESOLUTION_KEY PNF_IP_ADDRESS``

      .. code-block:: sh

         bash -x ./process-config-deploy-ide.sh day-1 127.17.0.2
         # bash -x ./process-config-deploy-k8s.sh day-1 127.17.0.2

      Go back to PNF netopeer cli console like mentioned above and verify if you can see 5 streams fw_udp_1 to fw_udp_5 enabled. If the 5 streams
      appear in the output as follows, the day-1 configuration got successfully deployed and the use case is successfully done.

      .. code-block:: sh

         > get --filter-xpath /sample-plugin:*
         DATA
         <sample-plugin xmlns="urn:opendaylight:params:xml:ns:yang:sample-plugin">
            <pg-streams>
               <pg-stream>
                  <id>1</id>
                  <is-enabled>true</is-enabled>
               </pg-stream>
               <pg-stream>
                  <id>fw_udp_1</id>
                  <is-enabled>true</is-enabled>
               </pg-stream>
               <pg-stream>
                  <id>fw_udp_2</id>
                  <is-enabled>true</is-enabled>
               </pg-stream>
               <pg-stream>
                  <id>fw_udp_3</id>
                  <is-enabled>true</is-enabled>
               </pg-stream>
               <pg-stream>
                  <id>fw_udp_4</id>
                  <is-enabled>true</is-enabled>
               </pg-stream>
               <pg-stream>
                  <id>fw_udp_5</id>
                  <is-enabled>true</is-enabled>
               </pg-stream>
            </pg-streams>
         </sample-plugin>
         >

      The same can be done for day-2 config (follow same steps just with day-2 configuration).

      .. note::
         Through deployment we did not deploy the PNF, we just modified the PNF. The PNF could also be installed by CDS
         but this is not targeted in this guide.

   .. tab:: Postman

      Download the Postman collection :download:`json <media/pnf-simulator.postman_collection.json>` and import it into
      your Postman application. Set the collection variables `ip adress` and `port` depending on your CDS installation.
      This can be done by right clicking the collection, click `edit` and then go to variables.
      For running CDS in an IDE host should be localhost and port should be 8081. If you run CDS in Kubernetes you can find
      out ip adress and port number of CDS blueprint processor by executing following command:

      .. code-block:: bash

         kubectl get svc -n onap | grep 'cds-blueprints-processor-http'

         cds-blueprints-processor-http      ClusterIP   10.152.183.211   <none>        8080/TCP              3h19m

      **Set up CDS:**

      First run `Bootstrap` request which will call Bootstrap API of CDS. This loads the CDS default model artifacts into CDS DB.
      You should get HTTP status 200 as a response.

      You can execute `Get Blueprints` to get all blueprint models in the CDS database. You will see a default
      model "artifactName": "vFW-CDS"  in the response body which was loaded by calling bootstrap.

      Push the PNF CDS blueprint model data dictionary to CDS with `Data Dictionary` request. Request body contains the
      data from ``dd.json`` of the CBA. This will call the data dictionary endpoint of CDS.

      .. note::
         For every data dictionary entry CDS API needs to be called seperately. The postman collection contains a loop to
         go through all entries of :file:`dd.json` and call data dictionary endpoint seperately. To execute this loop,
         open `Runner` in Postman and run `Data Dictionary` request like it is shown in the picture below.

      |imageDDPostmanRunner|

      Check CDS database for PNF data dictionaries by entering the DB in a terminal. You should see 6 rows as shown below.

      For running CDS in an IDE (accessing mariadb container):

      .. code-block:: sh

         sudo docker exec -it mariadb_container_id mysql -uroot -psdnctl
         > USE sdnctl;
         > select name, data_type from RESOURCE_DICTIONARY where updated_by='Aarna service <vmuthukrishnan@aarnanetworks.com>';

         +---------------------+-----------+
         | name | data_type |
         +---------------------+-----------+
         | netconf-password | string |
         | netconf-server-port | string |
         | netconf-username | string |
         | pnf-id | string |
         | pnf-ipv4-address | string |
         | stream-count | integer |
         +---------------------+-----------+

      Replace the container id with your running mariadb container id.


      For running CDS in K8s (accessing MariaDB pod):

      Open a terminal and go to  ``/Scripts`` directory of your CBA.

      .. code-block:: sh

         ./connect-cds-mariadb-k8s.sh

         select name, data_type from RESOURCE_DICTIONARY where updated_by='Aarna service <vmuthukrishnan@aarnanetworks.com>';

         +---------------------+-----------+
         | name | data_type |
         +---------------------+-----------+
         | netconf-password | string |
         | netconf-server-port | string |
         | netconf-username | string |
         | pnf-id | string |
         | pnf-ipv4-address | string |
         | stream-count | integer |
         +---------------------+-----------+


      **Enrichment:**

      .. warning::
         Sometimes there might be issues during enrichment (e.g. some parameters get deleted in the CBA). If you face problems
         during enrichment or deployment later on use the following CBA, which is already enriched:
         :download:`zip <media/pnf-simulator-demo-cba-enriched.zip>`. If you use the enriched CBA, skip
         this section until Deploy/Save Blueprint.

      Enrich the blueprint through executing the `Enrich Blueprint` request. Take care to provide the CBA file which you
      downloaded earlier in the request body. After the request got executed save the response body, this will be the
      enriched CBA file.

      |saveResponseImage|


      **Deploy/Save the Blueprint into CDS database**

      Run `Save Blueprint` request to save/deploy the Blueprint into the CDS database. Take care to provide the enriched
      CBA file in the request body.

      After that you should see the new model "artifactName": "pnf_netconf" by calling `Get Blueprints` request.

      **Config-Assign**

      The assumption is that we are using the same host to run PNF NETCONF simulator as well as CDS. You will need the
      IP Adress of the Netconf server container which can be found out in terminal with
      ``docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' netopeer2``. In the provided
      postman collection 172.17.0.2 is set as default.

      For creating the day-n config we are using the template file ``day-n-pnf-config.template`` in the folder
      ``Scripts/templates`` of the CBA. ``CONFIG_NAME``, ``PNF_IP_ADDRESS`` and ``STREAM_COUNT`` are replaced with specific values.

      Day-1 configuration:

      Execute the request `Create Config Assign Day-1`. Replace the values in the reqest body if needed.

      You can verify the day-1 NETCONF RPC payload looking into CDS DB. You should see the NETCONF RPC with 5
      streams (fw_udp_1 TO fw_udp_5). Connect to the DB like mentioned above and run the below statement. You should
      see the day-1 configuration as an output.

      .. code-block:: sh

         MariaDB [sdnctl]> select * from TEMPLATE_RESOLUTION where resolution_key='day-1' AND artifact_name='netconfrpc';

         <rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1">
            <edit-config>
               <target>
                  <running/>
               </target>
               <config>
                  <sample-plugin xmlns="urn:opendaylight:params:xml:ns:yang:sample-plugin">
                     <pg-streams>
                        <pg-stream>
                           <id>fw_udp_1</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_2</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_3</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_4</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_5</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                     </pg-streams>
                  </sample-plugin>
               </config>
            </edit-config>
         </rpc>


      **Day-2 configuration:**

      Execute the request `Create Config Assign Day-2`. It will do the same request like in day-1-config just with
      different values (resolution-key = day-2, stream-count = 10).

      You can verify the day-2 NETCONF RPC payload looking into CDS DB. You should see the NETCONF RPC with 10
      streams (fw_udp_1 TO fw_udp_10). Connect to the DB like mentioned above and run the below statement. You should
      see the day-2 configuration as an output.

      .. code-block:: sh

         MariaDB [sdnctl]> select * from TEMPLATE_RESOLUTION where resolution_key='day-2' AND artifact_name='netconfrpc';

         <rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1">
            <edit-config>
               <target>
                  <running/>
               </target>
               <config>
                  <sample-plugin xmlns="urn:opendaylight:params:xml:ns:yang:sample-plugin">
                     <pg-streams>
                        <pg-stream>
                           <id>fw_udp_1</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_2</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_3</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_4</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_5</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_6</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_7</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_8</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_9</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                        <pg-stream>
                           <id>fw_udp_10</id>
                           <is-enabled>true</is-enabled>
                        </pg-stream>
                     </pg-streams>
                  </sample-plugin>
               </config>
            </edit-config>
         </rpc>

      .. note::
         Until this step CDS did not interact with the PNF simulator or device. We just created the day-1 and day-2
         configurations and stored it in CDS database

      **Config-Deploy:**

      Now we will make the CDS REST API calls to push the day-1 and day-2 configuration changes to the PNF simulator.

      If you run CDS in Kubernetes open a terminal in `/Scripts` folder and keep it running with ``bash -x ./tail-cds-bp-log.sh``,
      we can use this to review the config-deploy actions. If you run CDS in an IDE you can have a look into the IDE terminal.

      Executing `Config Assign Day-1 Deploy` request will deploy day-1 configuration. Take care to provide the right PNF
      IP Adress in the request body.

      Go back to PNF netopeer cli console like mentioned above and verify if you can see 5 streams fw_udp_1 to fw_udp_5 enabled. If the 5 streams
      appear in the output as follows, the day-1 configuration got successfully deployed and the use case is successfully done.

      .. code-block:: sh

         > get --filter-xpath /sample-plugin:*
         DATA
         <sample-plugin xmlns="urn:opendaylight:params:xml:ns:yang:sample-plugin">
            <pg-streams>
               <pg-stream>
                  <id>1</id>
                  <is-enabled>true</is-enabled>
               </pg-stream>
               <pg-stream>
                  <id>fw_udp_1</id>
                  <is-enabled>true</is-enabled>
               </pg-stream>
               <pg-stream>
                  <id>fw_udp_2</id>
                  <is-enabled>true</is-enabled>
               </pg-stream>
               <pg-stream>
                  <id>fw_udp_3</id>
                  <is-enabled>true</is-enabled>
               </pg-stream>
               <pg-stream>
                  <id>fw_udp_4</id>
                  <is-enabled>true</is-enabled>
               </pg-stream>
               <pg-stream>
                  <id>fw_udp_5</id>
                  <is-enabled>true</is-enabled>
               </pg-stream>
            </pg-streams>
         </sample-plugin>
         >

      Day-2 configuration can be deployed the same way, just use `day-2` as a resolution key in the `Config Assign Depoy`
      request.

      .. note::
         Through deployment we did not deploy the PNF, we just modified the PNF. The PNF could also be installed by CDS
         but this is not targeted in this guide.


.. warning::
   Both CBA file and Postman collection should be integrated into source code of CDS. There is already an approach for that,
   see https://gerrit.onap.org/r/c/ccsdk/cds/+/112288. Updated Scripts and Postman collection needs to be added to this change.


Creators of this guide
~~~~~~~~~~~~~~~~~~~~~~~

Deutsche Telekom AG

Jakob Krieg (Rocketchat @jakob.Krieg); Eli Halych (Rocketchat @elihalych)

This guide is a derivate from https://wiki.onap.org/display/DW/PNF+Simulator+Day-N+config-assign+and+config-deploy+use+case.


.. |saveResponseImage| image:: media/save-response-postman.png
   :width: 500pt

.. |imageDDPostmanRunner| image:: media/dd-postman-runner.png
   :width: 500pt