Add subscription and notification for resource changes; fix a bug while pserver node...
[pti/o2.git] / mock_smo / mock_smo / entrypoints / mock_smo.py
diff --git a/mock_smo/mock_smo/entrypoints/mock_smo.py b/mock_smo/mock_smo/entrypoints/mock_smo.py
new file mode 100644 (file)
index 0000000..f5c5895
--- /dev/null
@@ -0,0 +1,116 @@
+# Copyright (C) 2021 Wind River Systems, Inc.\r
+#\r
+#  Licensed under the Apache License, Version 2.0 (the "License");\r
+#  you may not use this file except in compliance with the License.\r
+#  You may obtain a copy of the License at\r
+#\r
+#      http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+#  Unless required by applicable law or agreed to in writing, software\r
+#  distributed under the License is distributed on an "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+#  See the License for the specific language governing permissions and\r
+#  limitations under the License.\r
+\r
+import json\r
+import redis\r
+import http.client\r
+from flask import Flask, request\r
+from flask.helpers import url_for\r
+\r
+import mock_smo.config as config\r
+import mock_smo.logging as logging\r
+logger = logging.get_logger(__name__)\r
+\r
+apibase = config.get_o2ims_api_base()\r
+app = Flask(__name__)\r
+\r
+r = redis.Redis(**config.get_redis_host_and_port())\r
+REDIS_SUB_KEY = 'mock_smo_sub_key'\r
+REDIS_O2IMS_URL = 'mock_smo_o2ims_url'\r
+\r
+\r
+@app.route('/', methods=['GET', 'POST'])\r
+def index():\r
+    if request.method == 'POST':\r
+        url = request.form['url']\r
+        consumerSubscriptionId = request.form['consumerSubId']\r
+        sub_id = subscription_ims(url, consumerSubscriptionId)\r
+        return """\r
+<h1>Subscribed O2IMS</h1>\r
+<h3>Subscription ID: %s</h3>\r
+<h3>Subscribed O2IMS URL: %s</h3>\r
+<a href="%s">\r
+   <input type="button" value="Unsubscription" />\r
+</a>\r
+""" % (sub_id, url, url_for('unsubscription'))\r
+    return """\r
+<h1>Subscribe O2IMS</h1>\r
+<form method="POST">\r
+    <label for="url">O2 IMS URL: </label>\r
+    <input type="text" id="url" name="url" value="api:80"></br></br>\r
+    <label for="consumerSubId">Consumer Sub ID: </label>\r
+    <input type="text" id="consumerSubId" name="consumerSubId"></br></br>\r
+    <input type="submit" value="Submit">\r
+</form>\r
+"""\r
+\r
+\r
+@app.route('/unsubscription')\r
+def unsubscription():\r
+    sub_key = r.get(REDIS_SUB_KEY)\r
+    logger.info('Subscription key is {}'.format(sub_key))\r
+    if sub_key is None:\r
+        return '<h1>Already unsubscribed</h1>'\r
+    url = r.get(REDIS_O2IMS_URL).decode('utf-8')\r
+    logger.info('O2 IMS API is: {}'.format(url))\r
+    unsubscription_ims(url, sub_key.decode('utf-8'))\r
+    r.delete(REDIS_O2IMS_URL)\r
+    r.delete(REDIS_SUB_KEY)\r
+    return """\r
+<h1>Unsubscribed O2IMS</h1>\r
+<a href="/">\r
+   <input type="button" value="Go Back" />\r
+</a>\r
+"""\r
+\r
+\r
+@app.route('/callback', methods=['POST'])\r
+def callback():\r
+    logger.info('Callback data: {}'.format(request.get_data()))\r
+    return '', 202\r
+\r
+\r
+def subscription_ims(url, consumerSubscriptionId):\r
+    sub_key = r.get(REDIS_SUB_KEY)\r
+    logger.info('Subscription key is {}'.format(sub_key))\r
+    if sub_key is not None:\r
+        return sub_key.decode('utf-8')\r
+\r
+    logger.info(request.host_url)\r
+    conn = http.client.HTTPConnection(url)\r
+    headers = {'Content-type': 'application/json'}\r
+    post_val = {\r
+        'callback': 'http://mock_smo:80' + url_for('callback'),\r
+        'consumerSubscriptionId': consumerSubscriptionId,\r
+        'filter': '["pserver"]'  # '["pserver","pserver_mem"]'\r
+    }\r
+    json_val = json.dumps(post_val)\r
+    conn.request('POST', apibase+'/subscriptions', json_val, headers)\r
+    resp = conn.getresponse()\r
+    data = resp.read().decode('utf-8')\r
+    logger.info('Subscription response: {} {}, data: {}'.format(\r
+        resp.status, resp.reason, data))\r
+    json_data = json.loads(data)\r
+\r
+    r.set(REDIS_SUB_KEY, json_data['subscriptionId'])\r
+    r.set(REDIS_O2IMS_URL, url)\r
+    return json_data['subscriptionId']\r
+\r
+\r
+def unsubscription_ims(url, subId):\r
+    conn = http.client.HTTPConnection(url)\r
+    conn.request('DELETE', apibase + '/subscriptions/' + subId)\r
+    resp = conn.getresponse()\r
+    logger.info('Unsubscription response: {} {}'.format(\r
+        resp.status, resp.reason))\r