PNF Simulator to support Control Loop subscription model

Change-Id: I9919edb32f3f68f86fad28c908f808fcee3fc548
Issue-ID: INT-1312
Signed-off-by: rajendrajaiswal <rajendra.jaiswal@ericsson.com>
diff --git a/test/mocks/pmsh-pnf-sim/docker-compose/subscriber.py b/test/mocks/pmsh-pnf-sim/docker-compose/subscriber.py
new file mode 100644
index 0000000..44109a1
--- /dev/null
+++ b/test/mocks/pmsh-pnf-sim/docker-compose/subscriber.py
@@ -0,0 +1,78 @@
+#!/usr/bin/env python
+import re
+import sysrepo as sr
+from pnf import PNF
+
+
+def module_change_cb(sess, module_name, event, private_ctx):
+    """  Handle event change based on yang operation. """
+    try:
+        change_path = "/" + module_name + ":*"
+        iterate = sess.get_changes_iter(change_path)
+        change = sess.get_change_next(iterate)
+        changelist = []
+        operation = change.oper()
+        pnf = PNF()
+        if event == sr.SR_EV_APPLY:
+            print("------------------> Start Handle Change <------------------")
+            if operation == sr.SR_OP_CREATED:
+                while True:
+                    change = sess.get_change_next(iterate)
+                    if change is None:
+                        break
+                    changelist.append(change.new_val().to_string())
+                result = re.findall(r'\'(.*?)\'', changelist[0])
+                jobid = result[0]
+                print("Subscription Created : " + changelist[0])
+                pnf.create_job_id(jobid, changelist)
+                pnf.pm_job()
+            elif operation == sr.SR_OP_DELETED:
+                changelist.append(change.old_val().to_string())
+                result = re.findall(r'\'(.*?)\'', changelist[0])
+                jobid = result[0]
+                print("Subscription Deleted : " + changelist[0])
+                pnf.delete_job_id(jobid)
+                pnf.pm_job()
+            elif operation == sr.SR_OP_MODIFIED:
+                changelist.append(change.new_val().to_string())
+                element = changelist[0]
+                print("Subscription Modified :" + element)
+                result = re.findall(r'\'(.*?)\'', changelist[0])
+                jobid = result[0]
+                administrative_state = ((element.rsplit('/', 1)[1]).split('=', 1))[1].strip()
+                if administrative_state == "LOCKED":
+                    pnf.delete_job_id(jobid)
+                    pnf.pm_job()
+                elif administrative_state == "UNLOCKED":
+                    select_xpath = "/" + module_name + ":*//*"
+                    values = sess.get_items(select_xpath)
+                    if values is not None:
+                        for i in range(values.val_cnt()):
+                            if jobid in values.val(i).to_string():
+                                changelist.append(values.val(i).to_string())
+                        pnf.create_job_id(jobid, changelist)
+                        pnf.pm_job()
+            else:
+                print("Unknown Operation")
+            print("------------------> End Handle Change <------------------")
+    except Exception as error:
+        print(error)
+    return sr.SR_ERR_OK
+
+
+def start():
+    """ main function to create connection based on moudule name. """
+    try:
+        module_name = "pnf-subscriptions"
+        conn = sr.Connection(module_name)
+        sess = sr.Session(conn)
+        subscribe = sr.Subscribe(sess)
+        subscribe.module_change_subscribe(module_name, module_change_cb)
+        sr.global_loop()
+        print("Application exit requested, exiting.")
+    except Exception as error:
+        print(error)
+
+
+if __name__ == '__main__':
+    start()