Commit 8ddff38f authored by Manuel's avatar Manuel

semanticLinking: SSL + message format

parent b734c8c5
swagger: "2.0"
info:
title: Semantic Linking microservice
description: This is the documentation for the semantic linking microservice.
version: "1.0.0"
consumes:
- "application/json"
produces:
- "application/json"
basePath: "/api"
paths:
/debug:
post:
operationId: "routes.debug.echo"
tags:
- "Echo"
summary: "Echo function for debugging purposes"
description: "Echoes the input back to the caller."
parameters:
- in: body
name: "Object"
required: true
schema:
type: object
responses:
'200':
description: "Successful echo of request data"
#Raw_dataset region
/raw_dataset:
post:
operationId: "routes.raw-dataset.post"
tags:
- "Raw_Dataset"
summary: "Add a new dataset [TODO: or overwrite an existing one]"
parameters:
- in: body
name: "raw_dataset"
description: "The raw dataset to be added"
required: true
schema:
$ref: "#/definitions/Dataset"
responses:
'201':
description: "Successful operation"
'400':
description: "Invalid input"
get:
operationId: "routes.raw-dataset.get"
tags:
- "raw_dataset"
summary: "Get all datasets"
parameters: []
responses:
'200':
description: "Successful operation"
schema:
$ref: "#/definitions/DatasetCollection"
/raw_dataset/{name}:
get:
operationId: "routes.raw-dataset.get_by_usecase"
tags:
- "raw_dataset"
summary: "Get single usecase dataset"
parameters:
- name: "name"
in: "path"
description: "Name of the requested usecase dataset"
required: true
type: "string"
responses:
'200':
description: "Successful operation"
schema:
$ref: "#/definitions/Dataset"
'404':
description: "dataset not found"
#end region
#region Layers
/layers:
get:
operationId: "routes.layers.get"
tags:
- "Layers"
summary: "Get all layer data"
parameters: []
responses:
'200':
description: "Successful operation"
schema:
$ref: "#/definitions/LayerCollection"
/layers/{name}:
get:
operationId: "routes.layers.get_by_name"
tags:
- "Layers"
summary: "Get single layer data"
parameters:
- name: "name"
in: "path"
description: "Name of the requested layer"
required: true
type: "string"
responses:
'200':
description: "Successful operation"
schema:
$ref: "#/definitions/Layer"
'404':
description: "Layer not found"
/layers/{name}/nodes:
get:
operationId: "routes.layers.get_nodes"
tags:
- "Layers"
summary: "Get all individual nodes for the layer"
parameters:
- name: "name"
in: "path"
description: "Name of the layer"
required: true
type: "string"
responses:
'200':
description: "Successful operation"
schema:
$ref: "#/definitions/NodeCollection"
'404':
description: "Layer not found"
/multilayer:
get:
operationId: "routes.multilayer.test_multilayer_get_function"
tags:
- "Multilayer"
summary: "some demo testing"
parameters: []
responses:
'200':
description: "Successful echo of request data"
/agi/multilayer/multilayer.png:
get:
operationId: "routes.multilayer.get_image"
tags:
- "Multilayer"
summary: "Returning the multilayer created from AGI data"
parameters: []
produces:
- "image/png"
responses:
'200':
description: "Successful echo of request data"
/graphinfo:
get:
operationId: "routes.graphinfo.get"
tags:
- "GraphInfo"
summary: "Get info about clustered nodes"
description: "Returns multiple metrics for all nodes created by analyzing and clustering the blockchain traces"
parameters: []
responses:
'200':
description: "Successful operation"
schema:
$ref: "#/definitions/NodeInfo"
definitions:
NodeInfo:
type: "object"
properties:
label:
type: string
centrality:
type: number
adjacencies:
type: integer
degree:
type: number
betweenness:
type: object
properties:
to_node:
type: integer
value:
type: number
betweenness_centrality:
type: number
Layer:
type: object
properties:
layer_name:
type: string
properties:
type: array
items:
type: string
LayerCollection:
type: array
items:
$ref: "#/definitions/Layer"
Dataset:
type: object
properties:
usecase_name:
type: string
properties:
type: array
items:
type: string
DatasetCollection:
type: array
items:
$ref: "#/definitions/Dataset"
Node:
type: object
example:
"Finished_time": 1576631193265951
"Latitude_Destination": -5.973257
"Longitude_Destination": 37.416316
"TravelID": "5e57ec9159bc0668543f156a"
"TravelPrice": 15
"UniqueID": "a95075f5042b1b27060080156d87fe34ec7e712c5e57ec9159bc0668543f156a"
"UserID": "a95075f5042b1b27060080156d87fe34ec7e712c"
NodeCollection:
type: array
items:
$ref: "#/definitions/Node"
# add modules folder to interpreter path # add modules folder to interpreter path
import sys import sys
import os import os
import prance
from pathlib import Path
modules_path = '../../../modules/' modules_path = '../../../modules/'
if os.path.exists(modules_path): if os.path.exists(modules_path):
sys.path.insert(1, modules_path) sys.path.insert(1, modules_path)
...@@ -13,6 +15,8 @@ LOGGER = logging.getLogger(__name__) ...@@ -13,6 +15,8 @@ LOGGER = logging.getLogger(__name__)
################################# #################################
import connexion import connexion
from security import swagger_util
from env_info import is_running_locally
from messaging.ReconnectingMessageManager import ReconnectingMessageManager from messaging.ReconnectingMessageManager import ReconnectingMessageManager
from messaging.MessageHandler import MessageHandler from messaging.MessageHandler import MessageHandler
...@@ -23,15 +27,31 @@ def message_received_callback(channel, method, properties, body): ...@@ -23,15 +27,31 @@ def message_received_callback(channel, method, properties, body):
# load swagger config # load swagger config
app = connexion.App(__name__, specification_dir='configs/') app = connexion.App(__name__, specification_dir='configs/')
app.add_api('swagger.yml')
@app.route('/', methods=['GET']) @app.route('/', methods=['GET'])
def api_root(): def api_root():
return 'Endpoint of semantic-linking-microservice!' return 'Endpoint of semantic-linking-microservice!'
# SSL configuration
try:
certificate_path = os.environ['ARTICONF_CERTIFICATE_PATH']
except KeyError:
certificate_path = '/srv/articonf/'
context = (os.path.normpath(f'{certificate_path}/articonf1.crt'), os.path.normpath(f'{certificate_path}/articonf1.key')) # certificate and key files
if is_running_locally():
# Local Mode
print("Running with local settings...")
app.add_api(swagger_util.get_bundled_specs(Path("configs/swagger_local.yml")),
resolver = connexion.RestyResolver("cms_rest_api"))
context = 'adhoc'
else:
app.add_api(swagger_util.get_bundled_specs(Path("configs/swagger.yml")),
resolver = connexion.RestyResolver("cms_rest_api"))
# start app # start app
if __name__ == '__main__': if __name__ == '__main__':
message_manager = ReconnectingMessageManager.getInstance() message_manager = ReconnectingMessageManager.getInstance()
message_manager.start_consuming('datahub', 'direct', 'semantic-linking', True, message_received_callback) message_manager.start_consuming('datahub', 'direct', 'semantic-linking', True, message_received_callback)
app.run(host='0.0.0.0', port=5000, debug=True, use_reloader=False) app.run(host='0.0.0.0', port=5000, debug=True, use_reloader=False, ssl_context=context)
import json import json
import requests import requests
from typing import Dict
from threading import Thread from threading import Thread
import network_constants as netconst import network_constants as netconst
...@@ -24,11 +25,16 @@ class MessageHandler: ...@@ -24,11 +25,16 @@ class MessageHandler:
LOGGER.warning("Message has no type field and is ignored") LOGGER.warning("Message has no type field and is ignored")
return return
if message['type'] == 'new-traces-available': if message['type'] == 'new-trace':
self.handle_new_trace(message['content'])
elif message['type'] == 'new-traces-available':
self.handle_new_traces_available() self.handle_new_traces_available()
else: else:
LOGGER.info("Message Type could not be processed") LOGGER.info("Message Type could not be processed")
def handle_new_trace(self, content: Dict):
pass
def handle_new_traces_available(self): def handle_new_traces_available(self):
# get all traces and call the Processor # get all traces and call the Processor
url = f'http://{netconst.TRACE_RETRIEVAL_HOSTNAME}:{netconst.TRACE_RETRIEVAL_REST_PORT}/api/trace' url = f'http://{netconst.TRACE_RETRIEVAL_HOSTNAME}:{netconst.TRACE_RETRIEVAL_REST_PORT}/api/trace'
......
astroid==2.4.2 astroid==2.4.2
attrs==19.3.0 attrs==19.3.0
certifi==2020.4.5.2 certifi==2020.4.5.2
cffi==1.14.2
chardet==3.0.4 chardet==3.0.4
click==7.1.2 click==7.1.2
clickclick==1.2.2 clickclick==1.2.2
colorama==0.4.3 colorama==0.4.3
connexion==2.7.0 connexion==2.7.0
cryptography==3.1
Flask==1.1.2 Flask==1.1.2
idna==2.9 idna==2.9
importlib-metadata==1.6.1 importlib-metadata==1.6.1
...@@ -19,11 +21,14 @@ MarkupSafe==1.1.1 ...@@ -19,11 +21,14 @@ MarkupSafe==1.1.1
mccabe==0.6.1 mccabe==0.6.1
openapi-spec-validator==0.2.8 openapi-spec-validator==0.2.8
pika==1.1.0 pika==1.1.0
prance==0.19.0
pycparser==2.20
pylint==2.5.3 pylint==2.5.3
pymongo==3.10.1 pymongo==3.10.1
pyrsistent==0.16.0 pyrsistent==0.16.0
PyYAML==5.3.1 PyYAML==5.3.1
requests==2.23.0 requests==2.23.0
semver==2.10.2
six==1.15.0 six==1.15.0
swagger-ui-bundle==0.0.6 swagger-ui-bundle==0.0.6
toml==0.10.1 toml==0.10.1
......
...@@ -111,6 +111,7 @@ class MessageHandler: ...@@ -111,6 +111,7 @@ class MessageHandler:
flattened[mapping] = final_value flattened[mapping] = final_value
flattened["UniqueID"] = hashlib.sha256(flattened["UniqueID"].encode("utf-8")).hexdigest() flattened["UniqueID"] = hashlib.sha256(flattened["UniqueID"].encode("utf-8")).hexdigest()
return flattened return flattened
def handle_blockchain_transaction(self, transaction: Dict): def handle_blockchain_transaction(self, transaction: Dict):
...@@ -146,9 +147,14 @@ class MessageHandler: ...@@ -146,9 +147,14 @@ class MessageHandler:
transaction = Transaction(use_case, flattened) transaction = Transaction(use_case, flattened)
MessageHandler._repository.add_transaction(transaction) MessageHandler._repository.add_transaction(transaction)
msg = json.dumps(transaction.to_serializable_dict()) msg = {
"type": "new-trace",
"content": transaction.to_serializable_dict(),
}
msg_string = json.dumps(msg)
print(msg) print("OUT: "+msg_string)
# inform semantic linking microservice # inform semantic linking microservice
# self._message_sender.send_message('datahub', 'semantic-linking', msg) self._message_sender.send_message('datahub', 'semantic-linking', msg_string)
\ No newline at end of file \ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment