# Copyright (C) 2021 Wind River Systems, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import json import redis import http.client from flask import Flask, request from flask.helpers import url_for import mock_smo.config as config import mock_smo.logging as logging logger = logging.get_logger(__name__) apibase = config.get_o2ims_api_base() app = Flask(__name__) r = redis.Redis(**config.get_redis_host_and_port()) REDIS_SUB_KEY = 'mock_smo_sub_key' REDIS_O2IMS_URL = 'mock_smo_o2ims_url' @app.route('/', methods=['GET', 'POST']) def index(): if request.method == 'POST': url = request.form['url'] consumerSubscriptionId = request.form['consumerSubId'] sub_id = subscription_ims(url, consumerSubscriptionId) return """

Subscribed O2IMS

Subscription ID: %s

Subscribed O2IMS URL: %s

""" % (sub_id, url, url_for('unsubscription')) return """

Subscribe O2IMS





""" @app.route('/unsubscription') def unsubscription(): sub_key = r.get(REDIS_SUB_KEY) logger.info('Subscription key is {}'.format(sub_key)) if sub_key is None: return '

Already unsubscribed

' url = r.get(REDIS_O2IMS_URL).decode('utf-8') logger.info('O2 IMS API is: {}'.format(url)) unsubscription_ims(url, sub_key.decode('utf-8')) r.delete(REDIS_O2IMS_URL) r.delete(REDIS_SUB_KEY) return """

Unsubscribed O2IMS

""" @app.route('/callback', methods=['POST']) def callback(): logger.info('Callback data: {}'.format(request.get_data())) return '', 202 @app.route('/registration', methods=['POST']) def registration(): logger.info('Registration data: {}'.format(request.get_data())) return '', 200 def subscription_ims(url, consumerSubscriptionId): sub_key = r.get(REDIS_SUB_KEY) logger.info('Subscription key is {}'.format(sub_key)) if sub_key is not None: return sub_key.decode('utf-8') logger.info(request.host_url) conn = http.client.HTTPConnection(url) headers = {'Content-type': 'application/json'} post_val = { 'callback': 'http://mock_smo:80' + url_for('callback'), 'consumerSubscriptionId': consumerSubscriptionId, 'filter': '["pserver"]' # '["pserver","pserver_mem"]' } json_val = json.dumps(post_val) conn.request('POST', apibase+'/subscriptions', json_val, headers) resp = conn.getresponse() data = resp.read().decode('utf-8') logger.info('Subscription response: {} {}, data: {}'.format( resp.status, resp.reason, data)) json_data = json.loads(data) r.set(REDIS_SUB_KEY, json_data['subscriptionId']) r.set(REDIS_O2IMS_URL, url) return json_data['subscriptionId'] def unsubscription_ims(url, subId): conn = http.client.HTTPConnection(url) conn.request('DELETE', apibase + '/subscriptions/' + subId) resp = conn.getresponse() logger.info('Unsubscription response: {} {}'.format( resp.status, resp.reason))