
Add the required code and Dockerfile to build a Debian based container image of notificationservice-base to support v1 API backwards compatibility. The notificationservice-base-v1 code added here is being ported forward from stx.6.0. This code existed as-is in StarlingX prior to the work done to implement the ORAN Notification API. It is being returned in order to support user's needs for backwards compatbility. Subsequent work will done to update the helm charts, allowing notificationservice-base-v1-api and notificationservice-base-v2-api (ORAN Notification) to be deployed in parallel. Test plan: PASS: Build container image PASS: Manually deploy image and test with v1 client Story: 2010538 Task: 47175 Change-Id: I2f672fe1b226cb60b62bd5fe7f8abbedc7b0c4cc
114 lines
4.2 KiB
Python
114 lines
4.2 KiB
Python
#
|
|
# Copyright (c) 2021-2023 Wind River Systems, Inc.
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
|
|
import os
|
|
import json
|
|
import time
|
|
import oslo_messaging
|
|
from oslo_config import cfg
|
|
from trackingfunctionsdk.common.helpers import rpc_helper
|
|
from trackingfunctionsdk.model.dto.rpc_endpoint import RpcEndpointInfo
|
|
|
|
import logging
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
from trackingfunctionsdk.common.helpers import log_helper
|
|
log_helper.config_logger(LOG)
|
|
|
|
class BrokerClientBase(object):
|
|
def __init__(self, broker_name, broker_transport_endpoint):
|
|
self.broker_name = broker_name
|
|
self.listeners = {}
|
|
self.broker_endpoint = RpcEndpointInfo(broker_transport_endpoint)
|
|
self.transport = rpc_helper.get_transport(self.broker_endpoint)
|
|
LOG.debug("Created Broker client:{0}".format(broker_name))
|
|
|
|
def __del__(self):
|
|
self.transport.cleanup()
|
|
del self.transport
|
|
return
|
|
|
|
def __create_listener(self, context):
|
|
target = oslo_messaging.Target(
|
|
topic=context['topic'],
|
|
server=context['server'])
|
|
endpoints = context['endpoints']
|
|
server = oslo_messaging.get_rpc_server(
|
|
self.transport, target, endpoints, executor=None)
|
|
return server
|
|
|
|
def _refresh(self):
|
|
for topic, servers in self.listeners.items():
|
|
for servername, context in servers.items():
|
|
try:
|
|
rpcserver = context.get('rpcserver', None)
|
|
isactive = context.get('active', False)
|
|
if isactive and not rpcserver:
|
|
rpcserver = self.__create_listener(context)
|
|
rpcserver.start()
|
|
context['rpcserver'] = rpcserver
|
|
LOG.debug("Started rpcserver@{0}@{1}".format(context['topic'], context['server']))
|
|
elif not isactive and rpcserver:
|
|
rpcserver.stop()
|
|
rpcserver.wait()
|
|
context.pop('rpcserver')
|
|
LOG.debug("Stopped rpcserver@{0}@{1}".format(context['topic'], context['server']))
|
|
except:
|
|
LOG.error("Failed to update listener for topic/server:{0}/{1}"
|
|
.format(topic, servername))
|
|
continue
|
|
|
|
def add_listener(self, topic, server, listener_endpoints=None):
|
|
context = self.listeners.get(topic,{}).get(server, {})
|
|
if not context:
|
|
context = {
|
|
'endpoints': listener_endpoints,
|
|
'topic': topic,
|
|
'server': server,
|
|
'active': True
|
|
}
|
|
if not self.listeners.get(topic, None):
|
|
self.listeners[topic] = {}
|
|
self.listeners[topic][server] = context
|
|
else:
|
|
context['endpoints'] = listener_endpoints
|
|
context['active'] = True
|
|
|
|
self._refresh()
|
|
|
|
def remove_listener(self, topic, server):
|
|
context = self.listeners.get(topic,{}).get(server, {})
|
|
if context:
|
|
context['active'] = False
|
|
self._refresh()
|
|
|
|
def is_listening(self, topic, server):
|
|
context = self.listeners.get(topic,{}).get(server, {})
|
|
return context.get('active', False)
|
|
|
|
def any_listener(self):
|
|
for topic, servers in self.listeners.items():
|
|
for servername, context in servers.items():
|
|
isactive = context.get('active', False)
|
|
if isactive:
|
|
return True
|
|
return False
|
|
|
|
def call(self, topic, server, api_name, timeout=2, retry=0, **api_kwargs):
|
|
target = oslo_messaging.Target(
|
|
topic=topic, server=server, version=self.broker_endpoint.Version,
|
|
namespace=self.broker_endpoint.Namespace)
|
|
queryclient = oslo_messaging.RPCClient(self.transport, target, timeout = timeout, retry = retry)
|
|
return queryclient.call({}, api_name, **api_kwargs)
|
|
|
|
def cast(self, topic, api_name, **api_kwargs):
|
|
target = oslo_messaging.Target(
|
|
topic=topic, fanout=True, version=self.broker_endpoint.Version,
|
|
namespace=self.broker_endpoint.Namespace)
|
|
queryclient = oslo_messaging.RPCClient(self.transport, target)
|
|
queryclient.cast({}, api_name, **api_kwargs)
|