Skip to content
Snippets Groups Projects
Commit 8033d204 authored by Lluis Gifre Renom's avatar Lluis Gifre Renom
Browse files

NBI component - VNTM Recommendations:

- Added management of recommendation replies
- Corrected format of recommendations
parent ad9f57b9
No related branches found
No related tags found
4 merge requests!346Draft: support for restconf protocol,!345Draft: support ipinfusion devices via netconf,!328Resolve "(CTTC) Update recommendations to use SocketIO on NBI and E2E Orch components",!286Resolve "(CTTC) Implement integration test between E2E-IP-Optical SDN Controllers"
...@@ -12,9 +12,11 @@ ...@@ -12,9 +12,11 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import logging import json, logging
from flask import request from flask import request
from flask_socketio import Namespace, join_room, leave_room from flask_socketio import Namespace, join_room, leave_room
from kafka import KafkaProducer
from common.tools.kafka.Variables import KafkaConfig, KafkaTopic
from .Constants import SIO_NAMESPACE, SIO_ROOM from .Constants import SIO_NAMESPACE, SIO_ROOM
from .VntRecommThread import VntRecommThread from .VntRecommThread import VntRecommThread
...@@ -26,6 +28,10 @@ class VntRecommServerNamespace(Namespace): ...@@ -26,6 +28,10 @@ class VntRecommServerNamespace(Namespace):
self._thread = VntRecommThread(self) self._thread = VntRecommThread(self)
self._thread.start() self._thread.start()
self.kafka_producer = KafkaProducer(
bootstrap_servers = KafkaConfig.get_kafka_address(),
)
def stop_thread(self) -> None: def stop_thread(self) -> None:
self._thread.stop() self._thread.stop()
...@@ -38,3 +44,31 @@ class VntRecommServerNamespace(Namespace): ...@@ -38,3 +44,31 @@ class VntRecommServerNamespace(Namespace):
MSG = '[on_disconnect] Client disconnect: sid={:s}, reason={:s}' MSG = '[on_disconnect] Client disconnect: sid={:s}, reason={:s}'
LOGGER.info(MSG.format(str(request.sid), str(reason))) LOGGER.info(MSG.format(str(request.sid), str(reason)))
leave_room(SIO_ROOM, namespace=SIO_NAMESPACE) leave_room(SIO_ROOM, namespace=SIO_NAMESPACE)
def on_vlink_created(self, data):
MSG = '[on_vlink_created] begin: sid={:s}, data={:s}'
LOGGER.info(MSG.format(str(request.sid), str(data)))
data = json.loads(data)
request_key = data.pop('_request_key')
vntm_reply = json.dumps({'event': 'vlink_created', 'data': data}).encode('utf-8')
LOGGER.info('[on_vlink_created] vntm_reply={:s}'.format(str(vntm_reply)))
self.kafka_producer.send(
KafkaTopic.VNTMANAGER_RESPONSE.value, key=request_key, value=vntm_reply
)
self.kafka_producer.flush()
def on_vlink_removed(self, data):
MSG = '[on_vlink_removed] begin: sid={:s}, data={:s}'
LOGGER.info(MSG.format(str(request.sid), str(data)))
data = json.loads(data)
request_key = data.pop('_request_key')
vntm_reply = json.dumps({'event': 'vlink_removed', 'data': data}).encode('utf-8')
LOGGER.info('[on_vlink_removed] vntm_reply={:s}'.format(str(vntm_reply)))
self.kafka_producer.send(
KafkaTopic.VNTMANAGER_RESPONSE.value, key=request_key, value=vntm_reply
)
self.kafka_producer.flush()
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import logging, socketio, threading import json, logging, socketio, threading
from typing import Dict, List from typing import Dict, List
from common.tools.kafka.Variables import KafkaConfig, KafkaTopic from common.tools.kafka.Variables import KafkaConfig, KafkaTopic
from kafka import KafkaConsumer, TopicPartition from kafka import KafkaConsumer, TopicPartition
...@@ -71,13 +71,18 @@ class VntRecommThread(threading.Thread): ...@@ -71,13 +71,18 @@ class VntRecommThread(threading.Thread):
def emit_recommendation(self, record : ConsumerRecord) -> None: def emit_recommendation(self, record : ConsumerRecord) -> None:
message_key = record.key.decode('utf-8') message_key = record.key.decode('utf-8')
message_value = record.value.decode('utf-8') message_value = record.value.decode('utf-8')
message_value = json.loads(message_value)
message_event = message_value.pop('event')
message_data = json.loads(message_value['data'])
message_data['_request_key'] = message_key
message_data = json.dumps(message_data)
MSG = '[emit_recommendation] Recommendation: key={:s} value={:s}' MSG = '[emit_recommendation] Recommendation: event={:s} data={:s}'
LOGGER.debug(MSG.format(str(message_key), str(message_value))) LOGGER.debug(MSG.format(str(message_event), str(message_data)))
LOGGER.debug('[emit_recommendation] checking server namespace...') LOGGER.debug('[emit_recommendation] checking server namespace...')
server : socketio.Server = self._namespace.server server : socketio.Server = self._namespace.server
if server is None: return if server is None: return
LOGGER.debug('[emit_recommendation] emitting recommendation...') LOGGER.debug('[emit_recommendation] emitting recommendation...')
server.emit('recommendation', message_value, namespace=SIO_NAMESPACE, to=SIO_ROOM) server.emit(message_event, message_data, namespace=SIO_NAMESPACE, to=SIO_ROOM)
LOGGER.debug('[emit_recommendation] emitted') LOGGER.debug('[emit_recommendation] emitted')
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment