+# 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