From 93fa5090ef61a1db63009b97bbbe2cb9877e7bd2 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 6 Feb 2023 18:55:04 +0000 Subject: [PATCH 1/4] Hackfest: - updated descriptor IP addresses - updated commands.txt - updated my_deploy.sh --- hackfest/commands.txt | 23 ++++++++++++++----- .../tfs-descriptors/context-topology.json | 10 ++------ hackfest/tfs-descriptors/device-all.json | 10 ++++---- my_deploy.sh | 6 ++--- 4 files changed, 27 insertions(+), 22 deletions(-) diff --git a/hackfest/commands.txt b/hackfest/commands.txt index 31558364d..c8e4868de 100644 --- a/hackfest/commands.txt +++ b/hackfest/commands.txt @@ -115,6 +115,9 @@ python3 client_connection.py cd ~/tfs-ctrl/hackfest/tapi/server pip install -r requirements.txt +cd ~/tfs-ctrl/hackfest/tapi/tapi_app +./requirements.sh + # (done) Build & Implement methods for the TAPI v2.1.3 server: cd ~/tfs-ctrl/hackfest/tapi wget https://repo1.maven.org/maven2/io/swagger/codegen/v3/swagger-codegen-cli/3.0.35/swagger-codegen-cli-3.0.35.jar @@ -134,7 +137,7 @@ cd ~/tfs-ctrl/hackfest/tapi/server python3 -m tapi_server 8080 database/mini-ols-context.json # Run TAPI client using cURL (In a new window): -$ cd ~/tfs-ctrl/hackfest/tapi/client +cd ~/tfs-ctrl/hackfest/tapi/client # Interrogate Context and SIPs: curl -X GET -H "Content-Type: application/json" http://127.0.0.1:8080/restconf/data/tapi-common:context/ @@ -175,24 +178,30 @@ python3 tapi_app.py # Deploy TeraFlowSDN ################################################################################ -# Check status of Kubernetes +# Check status of MicroK8s microk8s.status --wait-ready +# If not running, start MicroK8s +microk8s.start + +# Periodically inspect status of MicroK8s until all addons are enabled +watch -n 1 microk8s.status --wait-ready + # Check all resources in Kubernetes -microk8s.kubectl get all --all-namespaces +watch -n 1 kubectl get all --all-namespaces # Deploy TeraFlowSDN cd ~/tfs-ctrl source my_deploy.sh -./deploy.sh +./deploy/all.sh # Show status of your deployment (if new terminal) cd ~/tfs-ctrl && source my_deploy.sh -./show_deploy.sh +./deploy/show.sh # Show logs of a specific component (if new terminal) cd ~/tfs-ctrl && source my_deploy.sh -scripts/show_logs_device.sh +./scripts/show_logs_device.sh @@ -262,6 +271,8 @@ Service b8c99e2c-39d8-424d-9833-554634269555 deleted (mock-osm) exit Bye! + + ############ # gNMI ############ diff --git a/hackfest/tfs-descriptors/context-topology.json b/hackfest/tfs-descriptors/context-topology.json index 36b3c44fd..afc2cc258 100644 --- a/hackfest/tfs-descriptors/context-topology.json +++ b/hackfest/tfs-descriptors/context-topology.json @@ -1,19 +1,13 @@ { "contexts": [ - { - "context_id": {"context_uuid": {"uuid": "admin"}}, - "topology_ids": [], - "service_ids": [] - } + {"context_id": {"context_uuid": {"uuid": "admin"}}} ], "topologies": [ { "topology_id": { "context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"} - }, - "device_ids": [], - "link_ids": [] + } } ] } diff --git a/hackfest/tfs-descriptors/device-all.json b/hackfest/tfs-descriptors/device-all.json index 8cb8e0314..b16d80e00 100644 --- a/hackfest/tfs-descriptors/device-all.json +++ b/hackfest/tfs-descriptors/device-all.json @@ -4,7 +4,7 @@ "device_id": {"device_uuid": {"uuid": "R1"}}, "device_type": "packet-router", "device_config": {"config_rules": [ - {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.15"}}, + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.10"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "8301"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { "username": "admin", "password": "admin", @@ -21,7 +21,7 @@ "device_id": {"device_uuid": {"uuid": "R2"}}, "device_type": "packet-router", "device_config": {"config_rules": [ - {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.15"}}, + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.10"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "8302"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { "username": "admin", "password": "admin", @@ -38,7 +38,7 @@ "device_id": {"device_uuid": {"uuid": "R3"}}, "device_type": "packet-router", "device_config": {"config_rules": [ - {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.15"}}, + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.10"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "8303"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { "username": "admin", "password": "admin", @@ -55,7 +55,7 @@ "device_id": {"device_uuid": {"uuid": "R4"}}, "device_type": "packet-router", "device_config": {"config_rules": [ - {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.15"}}, + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.10"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "8304"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { "username": "admin", "password": "admin", @@ -72,7 +72,7 @@ "device_id": {"device_uuid": {"uuid": "OLS"}}, "device_type": "open-line-system", "device_config": {"config_rules": [ - {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.15"}}, + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.10"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "8080"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"timeout": 120}}} ]}, diff --git a/my_deploy.sh b/my_deploy.sh index 6f0e64afe..f6caa0381 100755 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -20,7 +20,7 @@ export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/" # Set the list of components, separated by spaces, you want to build images for, and deploy. -export TFS_COMPONENTS="context device automation monitoring pathcomp service slice compute webui load_generator" +export TFS_COMPONENTS="context device automation pathcomp service slice compute webui" # Set the tag you want to use for your images. export TFS_IMAGE_TAG="dev" @@ -56,8 +56,8 @@ export CRDB_DATABASE="tfs" # See ./deploy/all.sh or ./deploy/crdb.sh for additional details export CRDB_DEPLOY_MODE="single" -# Disable flag for dropping database, if exists. -export CRDB_DROP_DATABASE_IF_EXISTS="" +# Enable flag for dropping database, if exists. +export CRDB_DROP_DATABASE_IF_EXISTS="YES" # Disable flag for re-deploying CockroachDB from scratch. export CRDB_REDEPLOY="" -- GitLab From 74e7db894fbe056a8ad5bd9c480c13c72cc6d019 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Tue, 7 Feb 2023 15:11:00 +0000 Subject: [PATCH 2/4] Hackfest: - updated containerlab scenario - updated gRPC generated code - addd commands for gRPC section - minor command updates --- hackfest/commands.txt | 66 ++++- .../gnmi/{sonic.clab.yml => srlinux.clab.yml} | 13 +- hackfest/grpc/connection/connection_pb2.py | 175 ++---------- .../connectionService_pb2.py | 214 ++------------ .../connectionService_pb2_grpc.py | 128 ++++++--- .../connectionServiceWithNotif_pb2.py | 266 +++--------------- .../connectionServiceWithNotif_pb2_grpc.py | 186 +++++++----- 7 files changed, 352 insertions(+), 696 deletions(-) rename hackfest/gnmi/{sonic.clab.yml => srlinux.clab.yml} (83%) diff --git a/hackfest/commands.txt b/hackfest/commands.txt index c8e4868de..a71e55a5c 100644 --- a/hackfest/commands.txt +++ b/hackfest/commands.txt @@ -166,6 +166,7 @@ curl -X DELETE -H "Content-Type: application/json" http://127.0.0.1:8080/restcon ## EXERCISE + # Exercise: retrieve and draw the topology # solution in folder tapi_app @@ -178,6 +179,8 @@ python3 tapi_app.py # Deploy TeraFlowSDN ################################################################################ +## GUIDED + # Check status of MicroK8s microk8s.status --wait-ready @@ -211,6 +214,8 @@ source my_deploy.sh # (done) Build a Netconf server supporting basic OpenConfig data model +## GUIDED + # Start the Netconf/OpenConfig server cd ~/tfs-ctrl/hackfest/netconf-oc python3 server_openconfig.py 8300 @@ -221,7 +226,8 @@ python3 server_openconfig.py 8300 # Service requests ################################################################################ -## L3VPN service from JSON descriptors +## EXERCISE +# Exercise: L3VPN service from JSON descriptors # (in a new terminal) Start OLS TAPI server: cd ~/tfs-ctrl/hackfest/tapi/server @@ -245,9 +251,8 @@ python3 server_openconfig.py 8304 -############ -# Mock OSM -############ +## EXERCISE +# Exercise: L2VPN slice from Mock OSM $ cd ~/tfs-ctrl/hackfest/ $ python -m mock_osm @@ -273,12 +278,63 @@ Bye! +############ +# gRPC +############ + +## GUIDED + +# Generate connection messages from .proto +cd ~/tfs-ctrl/hackfest/grpc +python -m grpc_tools.protoc -I=. --python_out=connection/ connection.proto + +# Create a connection message and save to a file +cd ~/tfs-ctrl/hackfest/grpc/connection +python3 create.py connection.txt + +# List a connection from a file +cd ~/tfs-ctrl/hackfest/grpc/connection +python3 list.py connection.txt + +# Build ConnectionService from .proto +cd ~/tfs-ctrl/hackfest/grpc +python -m grpc_tools.protoc -I=. --python_out=connectionService/ --grpc_python_out=connectionService/ connectionService.proto + +# Start ConnectionService server +cd ~/tfs-ctrl/hackfest/grpc/connectionService +python3 connectionService_server.py + +# Start ConnectionService client (in another terminal) +cd ~/tfs-ctrl/hackfest/grpc/connectionService +python3 connectionService_client.py + + +## EXERCISE +# Exercise: add streams + +# Build ConnectionServiceWithNotif from .proto +cd ~/tfs-ctrl/hackfest/grpc +python -m grpc_tools.protoc -I=. --python_out=connectionServiceWithNotif/ --grpc_python_out=connectionServiceWithNotif/ connectionServiceWithNotif.proto + +## Solution: +# Run ConnectionServiceWithNotif server +cd ~/tfs-ctrl/hackfest/grpc/connectionServiceWithNotif +python3 connectionServiceWithNotif_server.py + +# Run ConnectionServiceWithNotif client (in another terminal) +$ cd ~/tfs-ctrl/hackfest/grpc/connectionServiceWithNotif +$ python3 connectionServiceWithNotif_client.py + + + ############ # gNMI ############ +## GUIDED + ## Download and install the latest release -$ sudo bash -c "$(curl -sL https://get.containerlab.dev)“ +$ sudo bash -c "$(curl -sL https://get.containerlab.dev)" ## Deploy proposed two SR node scenario $ cd tfs-ctrl/hackfest/gnmi diff --git a/hackfest/gnmi/sonic.clab.yml b/hackfest/gnmi/srlinux.clab.yml similarity index 83% rename from hackfest/gnmi/sonic.clab.yml rename to hackfest/gnmi/srlinux.clab.yml index 47c1e6464..a589292ac 100644 --- a/hackfest/gnmi/sonic.clab.yml +++ b/hackfest/gnmi/srlinux.clab.yml @@ -12,18 +12,17 @@ # See the License for the specific language governing permissions and # limitations under the License. -# file: sonic.clab.yml -name: sonic-vs +# file: srlinux.clab.yml +name: srlinux topology: nodes: srl1: - kind: sonic-vs - image: docker-sonic-vs + kind: srl + image: ghcr.io/nokia/srlinux srl2: - kind: sonic-vs - image: docker-sonic-vs + kind: srl + image: ghcr.io/nokia/srlinux links: - endpoints: ["srl1:e1-1", "srl2:e1-1"] - diff --git a/hackfest/grpc/connection/connection_pb2.py b/hackfest/grpc/connection/connection_pb2.py index e66b665b2..4d642577d 100644 --- a/hackfest/grpc/connection/connection_pb2.py +++ b/hackfest/grpc/connection/connection_pb2.py @@ -1,9 +1,9 @@ +# -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: connection.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +"""Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database @@ -14,163 +14,34 @@ _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor.FileDescriptor( - name='connection.proto', - package='connection', - syntax='proto3', - serialized_options=None, - serialized_pb=_b('\n\x10\x63onnection.proto\x12\nconnection\"\xf5\x01\n\nConnection\x12\x14\n\x0c\x63onnectionId\x18\x01 \x01(\t\x12\x12\n\nsourceNode\x18\x02 \x01(\t\x12\x12\n\ntargetNode\x18\x03 \x01(\t\x12\x12\n\nsourcePort\x18\x04 \x01(\t\x12\x12\n\ntargetPort\x18\x05 \x01(\t\x12\x11\n\tbandwidth\x18\x06 \x01(\r\x12\x43\n\x11layerProtocolName\x18\x07 \x01(\x0e\x32(.connection.Connection.LayerProtocolName\")\n\x11LayerProtocolName\x12\x07\n\x03\x45TH\x10\x00\x12\x0b\n\x07OPTICAL\x10\x01\"<\n\x0e\x43onnectionList\x12*\n\nconnection\x18\x01 \x03(\x0b\x32\x16.connection.Connectionb\x06proto3') -) - - - -_CONNECTION_LAYERPROTOCOLNAME = _descriptor.EnumDescriptor( - name='LayerProtocolName', - full_name='connection.Connection.LayerProtocolName', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='ETH', index=0, number=0, - serialized_options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='OPTICAL', index=1, number=1, - serialized_options=None, - type=None), - ], - containing_type=None, - serialized_options=None, - serialized_start=237, - serialized_end=278, -) -_sym_db.RegisterEnumDescriptor(_CONNECTION_LAYERPROTOCOLNAME) - - -_CONNECTION = _descriptor.Descriptor( - name='Connection', - full_name='connection.Connection', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='connectionId', full_name='connection.Connection.connectionId', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='sourceNode', full_name='connection.Connection.sourceNode', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='targetNode', full_name='connection.Connection.targetNode', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='sourcePort', full_name='connection.Connection.sourcePort', index=3, - number=4, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='targetPort', full_name='connection.Connection.targetPort', index=4, - number=5, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='bandwidth', full_name='connection.Connection.bandwidth', index=5, - number=6, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='layerProtocolName', full_name='connection.Connection.layerProtocolName', index=6, - number=7, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _CONNECTION_LAYERPROTOCOLNAME, - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=33, - serialized_end=278, -) - +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10\x63onnection.proto\x12\nconnection\"\xf5\x01\n\nConnection\x12\x14\n\x0c\x63onnectionId\x18\x01 \x01(\t\x12\x12\n\nsourceNode\x18\x02 \x01(\t\x12\x12\n\ntargetNode\x18\x03 \x01(\t\x12\x12\n\nsourcePort\x18\x04 \x01(\t\x12\x12\n\ntargetPort\x18\x05 \x01(\t\x12\x11\n\tbandwidth\x18\x06 \x01(\r\x12\x43\n\x11layerProtocolName\x18\x07 \x01(\x0e\x32(.connection.Connection.LayerProtocolName\")\n\x11LayerProtocolName\x12\x07\n\x03\x45TH\x10\x00\x12\x0b\n\x07OPTICAL\x10\x01\"<\n\x0e\x43onnectionList\x12*\n\nconnection\x18\x01 \x03(\x0b\x32\x16.connection.Connectionb\x06proto3') -_CONNECTIONLIST = _descriptor.Descriptor( - name='ConnectionList', - full_name='connection.ConnectionList', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='connection', full_name='connection.ConnectionList.connection', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=280, - serialized_end=340, -) -_CONNECTION.fields_by_name['layerProtocolName'].enum_type = _CONNECTION_LAYERPROTOCOLNAME -_CONNECTION_LAYERPROTOCOLNAME.containing_type = _CONNECTION -_CONNECTIONLIST.fields_by_name['connection'].message_type = _CONNECTION -DESCRIPTOR.message_types_by_name['Connection'] = _CONNECTION -DESCRIPTOR.message_types_by_name['ConnectionList'] = _CONNECTIONLIST -_sym_db.RegisterFileDescriptor(DESCRIPTOR) -Connection = _reflection.GeneratedProtocolMessageType('Connection', (_message.Message,), dict( - DESCRIPTOR = _CONNECTION, - __module__ = 'connection_pb2' +_CONNECTION = DESCRIPTOR.message_types_by_name['Connection'] +_CONNECTIONLIST = DESCRIPTOR.message_types_by_name['ConnectionList'] +_CONNECTION_LAYERPROTOCOLNAME = _CONNECTION.enum_types_by_name['LayerProtocolName'] +Connection = _reflection.GeneratedProtocolMessageType('Connection', (_message.Message,), { + 'DESCRIPTOR' : _CONNECTION, + '__module__' : 'connection_pb2' # @@protoc_insertion_point(class_scope:connection.Connection) - )) + }) _sym_db.RegisterMessage(Connection) -ConnectionList = _reflection.GeneratedProtocolMessageType('ConnectionList', (_message.Message,), dict( - DESCRIPTOR = _CONNECTIONLIST, - __module__ = 'connection_pb2' +ConnectionList = _reflection.GeneratedProtocolMessageType('ConnectionList', (_message.Message,), { + 'DESCRIPTOR' : _CONNECTIONLIST, + '__module__' : 'connection_pb2' # @@protoc_insertion_point(class_scope:connection.ConnectionList) - )) + }) _sym_db.RegisterMessage(ConnectionList) +if _descriptor._USE_C_DESCRIPTORS == False: + DESCRIPTOR._options = None + _CONNECTION._serialized_start=33 + _CONNECTION._serialized_end=278 + _CONNECTION_LAYERPROTOCOLNAME._serialized_start=237 + _CONNECTION_LAYERPROTOCOLNAME._serialized_end=278 + _CONNECTIONLIST._serialized_start=280 + _CONNECTIONLIST._serialized_end=340 # @@protoc_insertion_point(module_scope) diff --git a/hackfest/grpc/connectionService/connectionService_pb2.py b/hackfest/grpc/connectionService/connectionService_pb2.py index 9f1951fa9..a7efb7d21 100644 --- a/hackfest/grpc/connectionService/connectionService_pb2.py +++ b/hackfest/grpc/connectionService/connectionService_pb2.py @@ -1,9 +1,9 @@ +# -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: connectionService.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +"""Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database @@ -15,197 +15,37 @@ _sym_db = _symbol_database.Default() from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -DESCRIPTOR = _descriptor.FileDescriptor( - name='connectionService.proto', - package='connection', - syntax='proto3', - serialized_options=None, - serialized_pb=_b('\n\x17\x63onnectionService.proto\x12\nconnection\x1a\x1bgoogle/protobuf/empty.proto\"\xf5\x01\n\nConnection\x12\x14\n\x0c\x63onnectionId\x18\x01 \x01(\t\x12\x12\n\nsourceNode\x18\x02 \x01(\t\x12\x12\n\ntargetNode\x18\x03 \x01(\t\x12\x12\n\nsourcePort\x18\x04 \x01(\t\x12\x12\n\ntargetPort\x18\x05 \x01(\t\x12\x11\n\tbandwidth\x18\x06 \x01(\r\x12\x43\n\x11layerProtocolName\x18\x07 \x01(\x0e\x32(.connection.Connection.LayerProtocolName\")\n\x11LayerProtocolName\x12\x07\n\x03\x45TH\x10\x00\x12\x0b\n\x07OPTICAL\x10\x01\"<\n\x0e\x43onnectionList\x12*\n\nconnection\x18\x01 \x03(\x0b\x32\x16.connection.Connection2\xa1\x01\n\x11\x43onnectionService\x12\x44\n\x10\x43reateConnection\x12\x16.connection.Connection\x1a\x16.google.protobuf.Empty\"\x00\x12\x46\n\x0eListConnection\x12\x16.google.protobuf.Empty\x1a\x1a.connection.ConnectionList\"\x00\x62\x06proto3') - , - dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,]) - - - -_CONNECTION_LAYERPROTOCOLNAME = _descriptor.EnumDescriptor( - name='LayerProtocolName', - full_name='connection.Connection.LayerProtocolName', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='ETH', index=0, number=0, - serialized_options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='OPTICAL', index=1, number=1, - serialized_options=None, - type=None), - ], - containing_type=None, - serialized_options=None, - serialized_start=273, - serialized_end=314, -) -_sym_db.RegisterEnumDescriptor(_CONNECTION_LAYERPROTOCOLNAME) - - -_CONNECTION = _descriptor.Descriptor( - name='Connection', - full_name='connection.Connection', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='connectionId', full_name='connection.Connection.connectionId', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='sourceNode', full_name='connection.Connection.sourceNode', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='targetNode', full_name='connection.Connection.targetNode', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='sourcePort', full_name='connection.Connection.sourcePort', index=3, - number=4, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='targetPort', full_name='connection.Connection.targetPort', index=4, - number=5, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='bandwidth', full_name='connection.Connection.bandwidth', index=5, - number=6, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='layerProtocolName', full_name='connection.Connection.layerProtocolName', index=6, - number=7, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _CONNECTION_LAYERPROTOCOLNAME, - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=69, - serialized_end=314, -) +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17\x63onnectionService.proto\x12\nconnection\x1a\x1bgoogle/protobuf/empty.proto\"\xf5\x01\n\nConnection\x12\x14\n\x0c\x63onnectionId\x18\x01 \x01(\t\x12\x12\n\nsourceNode\x18\x02 \x01(\t\x12\x12\n\ntargetNode\x18\x03 \x01(\t\x12\x12\n\nsourcePort\x18\x04 \x01(\t\x12\x12\n\ntargetPort\x18\x05 \x01(\t\x12\x11\n\tbandwidth\x18\x06 \x01(\r\x12\x43\n\x11layerProtocolName\x18\x07 \x01(\x0e\x32(.connection.Connection.LayerProtocolName\")\n\x11LayerProtocolName\x12\x07\n\x03\x45TH\x10\x00\x12\x0b\n\x07OPTICAL\x10\x01\"<\n\x0e\x43onnectionList\x12*\n\nconnection\x18\x01 \x03(\x0b\x32\x16.connection.Connection2\xa1\x01\n\x11\x43onnectionService\x12\x44\n\x10\x43reateConnection\x12\x16.connection.Connection\x1a\x16.google.protobuf.Empty\"\x00\x12\x46\n\x0eListConnection\x12\x16.google.protobuf.Empty\x1a\x1a.connection.ConnectionList\"\x00\x62\x06proto3') -_CONNECTIONLIST = _descriptor.Descriptor( - name='ConnectionList', - full_name='connection.ConnectionList', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='connection', full_name='connection.ConnectionList.connection', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=316, - serialized_end=376, -) -_CONNECTION.fields_by_name['layerProtocolName'].enum_type = _CONNECTION_LAYERPROTOCOLNAME -_CONNECTION_LAYERPROTOCOLNAME.containing_type = _CONNECTION -_CONNECTIONLIST.fields_by_name['connection'].message_type = _CONNECTION -DESCRIPTOR.message_types_by_name['Connection'] = _CONNECTION -DESCRIPTOR.message_types_by_name['ConnectionList'] = _CONNECTIONLIST -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -Connection = _reflection.GeneratedProtocolMessageType('Connection', (_message.Message,), dict( - DESCRIPTOR = _CONNECTION, - __module__ = 'connectionService_pb2' +_CONNECTION = DESCRIPTOR.message_types_by_name['Connection'] +_CONNECTIONLIST = DESCRIPTOR.message_types_by_name['ConnectionList'] +_CONNECTION_LAYERPROTOCOLNAME = _CONNECTION.enum_types_by_name['LayerProtocolName'] +Connection = _reflection.GeneratedProtocolMessageType('Connection', (_message.Message,), { + 'DESCRIPTOR' : _CONNECTION, + '__module__' : 'connectionService_pb2' # @@protoc_insertion_point(class_scope:connection.Connection) - )) + }) _sym_db.RegisterMessage(Connection) -ConnectionList = _reflection.GeneratedProtocolMessageType('ConnectionList', (_message.Message,), dict( - DESCRIPTOR = _CONNECTIONLIST, - __module__ = 'connectionService_pb2' +ConnectionList = _reflection.GeneratedProtocolMessageType('ConnectionList', (_message.Message,), { + 'DESCRIPTOR' : _CONNECTIONLIST, + '__module__' : 'connectionService_pb2' # @@protoc_insertion_point(class_scope:connection.ConnectionList) - )) + }) _sym_db.RegisterMessage(ConnectionList) - - -_CONNECTIONSERVICE = _descriptor.ServiceDescriptor( - name='ConnectionService', - full_name='connection.ConnectionService', - file=DESCRIPTOR, - index=0, - serialized_options=None, - serialized_start=379, - serialized_end=540, - methods=[ - _descriptor.MethodDescriptor( - name='CreateConnection', - full_name='connection.ConnectionService.CreateConnection', - index=0, - containing_service=None, - input_type=_CONNECTION, - output_type=google_dot_protobuf_dot_empty__pb2._EMPTY, - serialized_options=None, - ), - _descriptor.MethodDescriptor( - name='ListConnection', - full_name='connection.ConnectionService.ListConnection', - index=1, - containing_service=None, - input_type=google_dot_protobuf_dot_empty__pb2._EMPTY, - output_type=_CONNECTIONLIST, - serialized_options=None, - ), -]) -_sym_db.RegisterServiceDescriptor(_CONNECTIONSERVICE) - -DESCRIPTOR.services_by_name['ConnectionService'] = _CONNECTIONSERVICE - +_CONNECTIONSERVICE = DESCRIPTOR.services_by_name['ConnectionService'] +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + _CONNECTION._serialized_start=69 + _CONNECTION._serialized_end=314 + _CONNECTION_LAYERPROTOCOLNAME._serialized_start=273 + _CONNECTION_LAYERPROTOCOLNAME._serialized_end=314 + _CONNECTIONLIST._serialized_start=316 + _CONNECTIONLIST._serialized_end=376 + _CONNECTIONSERVICE._serialized_start=379 + _CONNECTIONSERVICE._serialized_end=540 # @@protoc_insertion_point(module_scope) diff --git a/hackfest/grpc/connectionService/connectionService_pb2_grpc.py b/hackfest/grpc/connectionService/connectionService_pb2_grpc.py index 94ffffbf7..0278d6fa4 100644 --- a/hackfest/grpc/connectionService/connectionService_pb2_grpc.py +++ b/hackfest/grpc/connectionService/connectionService_pb2_grpc.py @@ -1,4 +1,5 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" import grpc import connectionService_pb2 as connectionService__pb2 @@ -6,59 +7,94 @@ from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 class ConnectionServiceStub(object): - # missing associated documentation comment in .proto file - pass + """Missing associated documentation comment in .proto file.""" - def __init__(self, channel): - """Constructor. + def __init__(self, channel): + """Constructor. - Args: - channel: A grpc.Channel. - """ - self.CreateConnection = channel.unary_unary( - '/connection.ConnectionService/CreateConnection', - request_serializer=connectionService__pb2.Connection.SerializeToString, - response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString, - ) - self.ListConnection = channel.unary_unary( - '/connection.ConnectionService/ListConnection', - request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString, - response_deserializer=connectionService__pb2.ConnectionList.FromString, - ) + Args: + channel: A grpc.Channel. + """ + self.CreateConnection = channel.unary_unary( + '/connection.ConnectionService/CreateConnection', + request_serializer=connectionService__pb2.Connection.SerializeToString, + response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString, + ) + self.ListConnection = channel.unary_unary( + '/connection.ConnectionService/ListConnection', + request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString, + response_deserializer=connectionService__pb2.ConnectionList.FromString, + ) class ConnectionServiceServicer(object): - # missing associated documentation comment in .proto file - pass + """Missing associated documentation comment in .proto file.""" - def CreateConnection(self, request, context): - # missing associated documentation comment in .proto file - pass - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + def CreateConnection(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') - def ListConnection(self, request, context): - # missing associated documentation comment in .proto file - pass - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + def ListConnection(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') def add_ConnectionServiceServicer_to_server(servicer, server): - rpc_method_handlers = { - 'CreateConnection': grpc.unary_unary_rpc_method_handler( - servicer.CreateConnection, - request_deserializer=connectionService__pb2.Connection.FromString, - response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString, - ), - 'ListConnection': grpc.unary_unary_rpc_method_handler( - servicer.ListConnection, - request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString, - response_serializer=connectionService__pb2.ConnectionList.SerializeToString, - ), - } - generic_handler = grpc.method_handlers_generic_handler( - 'connection.ConnectionService', rpc_method_handlers) - server.add_generic_rpc_handlers((generic_handler,)) + rpc_method_handlers = { + 'CreateConnection': grpc.unary_unary_rpc_method_handler( + servicer.CreateConnection, + request_deserializer=connectionService__pb2.Connection.FromString, + response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString, + ), + 'ListConnection': grpc.unary_unary_rpc_method_handler( + servicer.ListConnection, + request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString, + response_serializer=connectionService__pb2.ConnectionList.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'connection.ConnectionService', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + + + # This class is part of an EXPERIMENTAL API. +class ConnectionService(object): + """Missing associated documentation comment in .proto file.""" + + @staticmethod + def CreateConnection(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/connection.ConnectionService/CreateConnection', + connectionService__pb2.Connection.SerializeToString, + google_dot_protobuf_dot_empty__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ListConnection(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/connection.ConnectionService/ListConnection', + google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString, + connectionService__pb2.ConnectionList.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) diff --git a/hackfest/grpc/connectionServiceWithNotif/connectionServiceWithNotif_pb2.py b/hackfest/grpc/connectionServiceWithNotif/connectionServiceWithNotif_pb2.py index 403dd0ce4..f6ce23ef0 100644 --- a/hackfest/grpc/connectionServiceWithNotif/connectionServiceWithNotif_pb2.py +++ b/hackfest/grpc/connectionServiceWithNotif/connectionServiceWithNotif_pb2.py @@ -1,9 +1,9 @@ +# -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: connectionServiceWithNotif.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +"""Generated protocol buffer code.""" from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database @@ -15,245 +15,47 @@ _sym_db = _symbol_database.Default() from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -DESCRIPTOR = _descriptor.FileDescriptor( - name='connectionServiceWithNotif.proto', - package='connection', - syntax='proto3', - serialized_options=None, - serialized_pb=_b('\n connectionServiceWithNotif.proto\x12\nconnection\x1a\x1bgoogle/protobuf/empty.proto\"\x14\n\x03\x42\x65r\x12\r\n\x05value\x18\x01 \x01(\x01\"\xf5\x01\n\nConnection\x12\x14\n\x0c\x63onnectionId\x18\x01 \x01(\t\x12\x12\n\nsourceNode\x18\x02 \x01(\t\x12\x12\n\ntargetNode\x18\x03 \x01(\t\x12\x12\n\nsourcePort\x18\x04 \x01(\t\x12\x12\n\ntargetPort\x18\x05 \x01(\t\x12\x11\n\tbandwidth\x18\x06 \x01(\r\x12\x43\n\x11layerProtocolName\x18\x07 \x01(\x0e\x32(.connection.Connection.LayerProtocolName\")\n\x11LayerProtocolName\x12\x07\n\x03\x45TH\x10\x00\x12\x0b\n\x07OPTICAL\x10\x01\"<\n\x0e\x43onnectionList\x12*\n\nconnection\x18\x01 \x03(\x0b\x32\x16.connection.Connection2\xe1\x01\n\x1a\x43onnectionServiceWithNotif\x12\x44\n\x10\x43reateConnection\x12\x16.connection.Connection\x1a\x16.google.protobuf.Empty\"\x00\x12\x46\n\x0eListConnection\x12\x16.google.protobuf.Empty\x1a\x1a.connection.ConnectionList\"\x00\x12\x35\n\x06GetBer\x12\x16.connection.Connection\x1a\x0f.connection.Ber\"\x00\x30\x01\x62\x06proto3') - , - dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,]) - - - -_CONNECTION_LAYERPROTOCOLNAME = _descriptor.EnumDescriptor( - name='LayerProtocolName', - full_name='connection.Connection.LayerProtocolName', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='ETH', index=0, number=0, - serialized_options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='OPTICAL', index=1, number=1, - serialized_options=None, - type=None), - ], - containing_type=None, - serialized_options=None, - serialized_start=304, - serialized_end=345, -) -_sym_db.RegisterEnumDescriptor(_CONNECTION_LAYERPROTOCOLNAME) - - -_BER = _descriptor.Descriptor( - name='Ber', - full_name='connection.Ber', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='value', full_name='connection.Ber.value', index=0, - number=1, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=77, - serialized_end=97, -) - +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n connectionServiceWithNotif.proto\x12\nconnection\x1a\x1bgoogle/protobuf/empty.proto\"\x14\n\x03\x42\x65r\x12\r\n\x05value\x18\x01 \x01(\x01\"\xf5\x01\n\nConnection\x12\x14\n\x0c\x63onnectionId\x18\x01 \x01(\t\x12\x12\n\nsourceNode\x18\x02 \x01(\t\x12\x12\n\ntargetNode\x18\x03 \x01(\t\x12\x12\n\nsourcePort\x18\x04 \x01(\t\x12\x12\n\ntargetPort\x18\x05 \x01(\t\x12\x11\n\tbandwidth\x18\x06 \x01(\r\x12\x43\n\x11layerProtocolName\x18\x07 \x01(\x0e\x32(.connection.Connection.LayerProtocolName\")\n\x11LayerProtocolName\x12\x07\n\x03\x45TH\x10\x00\x12\x0b\n\x07OPTICAL\x10\x01\"<\n\x0e\x43onnectionList\x12*\n\nconnection\x18\x01 \x03(\x0b\x32\x16.connection.Connection2\xe1\x01\n\x1a\x43onnectionServiceWithNotif\x12\x44\n\x10\x43reateConnection\x12\x16.connection.Connection\x1a\x16.google.protobuf.Empty\"\x00\x12\x46\n\x0eListConnection\x12\x16.google.protobuf.Empty\x1a\x1a.connection.ConnectionList\"\x00\x12\x35\n\x06GetBer\x12\x16.connection.Connection\x1a\x0f.connection.Ber\"\x00\x30\x01\x62\x06proto3') -_CONNECTION = _descriptor.Descriptor( - name='Connection', - full_name='connection.Connection', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='connectionId', full_name='connection.Connection.connectionId', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='sourceNode', full_name='connection.Connection.sourceNode', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='targetNode', full_name='connection.Connection.targetNode', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='sourcePort', full_name='connection.Connection.sourcePort', index=3, - number=4, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='targetPort', full_name='connection.Connection.targetPort', index=4, - number=5, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='bandwidth', full_name='connection.Connection.bandwidth', index=5, - number=6, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='layerProtocolName', full_name='connection.Connection.layerProtocolName', index=6, - number=7, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _CONNECTION_LAYERPROTOCOLNAME, - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=100, - serialized_end=345, -) -_CONNECTIONLIST = _descriptor.Descriptor( - name='ConnectionList', - full_name='connection.ConnectionList', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='connection', full_name='connection.ConnectionList.connection', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=347, - serialized_end=407, -) - -_CONNECTION.fields_by_name['layerProtocolName'].enum_type = _CONNECTION_LAYERPROTOCOLNAME -_CONNECTION_LAYERPROTOCOLNAME.containing_type = _CONNECTION -_CONNECTIONLIST.fields_by_name['connection'].message_type = _CONNECTION -DESCRIPTOR.message_types_by_name['Ber'] = _BER -DESCRIPTOR.message_types_by_name['Connection'] = _CONNECTION -DESCRIPTOR.message_types_by_name['ConnectionList'] = _CONNECTIONLIST -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -Ber = _reflection.GeneratedProtocolMessageType('Ber', (_message.Message,), dict( - DESCRIPTOR = _BER, - __module__ = 'connectionServiceWithNotif_pb2' +_BER = DESCRIPTOR.message_types_by_name['Ber'] +_CONNECTION = DESCRIPTOR.message_types_by_name['Connection'] +_CONNECTIONLIST = DESCRIPTOR.message_types_by_name['ConnectionList'] +_CONNECTION_LAYERPROTOCOLNAME = _CONNECTION.enum_types_by_name['LayerProtocolName'] +Ber = _reflection.GeneratedProtocolMessageType('Ber', (_message.Message,), { + 'DESCRIPTOR' : _BER, + '__module__' : 'connectionServiceWithNotif_pb2' # @@protoc_insertion_point(class_scope:connection.Ber) - )) + }) _sym_db.RegisterMessage(Ber) -Connection = _reflection.GeneratedProtocolMessageType('Connection', (_message.Message,), dict( - DESCRIPTOR = _CONNECTION, - __module__ = 'connectionServiceWithNotif_pb2' +Connection = _reflection.GeneratedProtocolMessageType('Connection', (_message.Message,), { + 'DESCRIPTOR' : _CONNECTION, + '__module__' : 'connectionServiceWithNotif_pb2' # @@protoc_insertion_point(class_scope:connection.Connection) - )) + }) _sym_db.RegisterMessage(Connection) -ConnectionList = _reflection.GeneratedProtocolMessageType('ConnectionList', (_message.Message,), dict( - DESCRIPTOR = _CONNECTIONLIST, - __module__ = 'connectionServiceWithNotif_pb2' +ConnectionList = _reflection.GeneratedProtocolMessageType('ConnectionList', (_message.Message,), { + 'DESCRIPTOR' : _CONNECTIONLIST, + '__module__' : 'connectionServiceWithNotif_pb2' # @@protoc_insertion_point(class_scope:connection.ConnectionList) - )) + }) _sym_db.RegisterMessage(ConnectionList) - - -_CONNECTIONSERVICEWITHNOTIF = _descriptor.ServiceDescriptor( - name='ConnectionServiceWithNotif', - full_name='connection.ConnectionServiceWithNotif', - file=DESCRIPTOR, - index=0, - serialized_options=None, - serialized_start=410, - serialized_end=635, - methods=[ - _descriptor.MethodDescriptor( - name='CreateConnection', - full_name='connection.ConnectionServiceWithNotif.CreateConnection', - index=0, - containing_service=None, - input_type=_CONNECTION, - output_type=google_dot_protobuf_dot_empty__pb2._EMPTY, - serialized_options=None, - ), - _descriptor.MethodDescriptor( - name='ListConnection', - full_name='connection.ConnectionServiceWithNotif.ListConnection', - index=1, - containing_service=None, - input_type=google_dot_protobuf_dot_empty__pb2._EMPTY, - output_type=_CONNECTIONLIST, - serialized_options=None, - ), - _descriptor.MethodDescriptor( - name='GetBer', - full_name='connection.ConnectionServiceWithNotif.GetBer', - index=2, - containing_service=None, - input_type=_CONNECTION, - output_type=_BER, - serialized_options=None, - ), -]) -_sym_db.RegisterServiceDescriptor(_CONNECTIONSERVICEWITHNOTIF) - -DESCRIPTOR.services_by_name['ConnectionServiceWithNotif'] = _CONNECTIONSERVICEWITHNOTIF - +_CONNECTIONSERVICEWITHNOTIF = DESCRIPTOR.services_by_name['ConnectionServiceWithNotif'] +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + _BER._serialized_start=77 + _BER._serialized_end=97 + _CONNECTION._serialized_start=100 + _CONNECTION._serialized_end=345 + _CONNECTION_LAYERPROTOCOLNAME._serialized_start=304 + _CONNECTION_LAYERPROTOCOLNAME._serialized_end=345 + _CONNECTIONLIST._serialized_start=347 + _CONNECTIONLIST._serialized_end=407 + _CONNECTIONSERVICEWITHNOTIF._serialized_start=410 + _CONNECTIONSERVICEWITHNOTIF._serialized_end=635 # @@protoc_insertion_point(module_scope) diff --git a/hackfest/grpc/connectionServiceWithNotif/connectionServiceWithNotif_pb2_grpc.py b/hackfest/grpc/connectionServiceWithNotif/connectionServiceWithNotif_pb2_grpc.py index 9a88a22b4..9a5a844c8 100644 --- a/hackfest/grpc/connectionServiceWithNotif/connectionServiceWithNotif_pb2_grpc.py +++ b/hackfest/grpc/connectionServiceWithNotif/connectionServiceWithNotif_pb2_grpc.py @@ -1,4 +1,5 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" import grpc import connectionServiceWithNotif_pb2 as connectionServiceWithNotif__pb2 @@ -6,76 +7,127 @@ from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 class ConnectionServiceWithNotifStub(object): - # missing associated documentation comment in .proto file - pass - - def __init__(self, channel): - """Constructor. - - Args: - channel: A grpc.Channel. - """ - self.CreateConnection = channel.unary_unary( - '/connection.ConnectionServiceWithNotif/CreateConnection', - request_serializer=connectionServiceWithNotif__pb2.Connection.SerializeToString, - response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString, - ) - self.ListConnection = channel.unary_unary( - '/connection.ConnectionServiceWithNotif/ListConnection', - request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString, - response_deserializer=connectionServiceWithNotif__pb2.ConnectionList.FromString, - ) - self.GetBer = channel.unary_stream( - '/connection.ConnectionServiceWithNotif/GetBer', - request_serializer=connectionServiceWithNotif__pb2.Connection.SerializeToString, - response_deserializer=connectionServiceWithNotif__pb2.Ber.FromString, - ) + """Missing associated documentation comment in .proto file.""" + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.CreateConnection = channel.unary_unary( + '/connection.ConnectionServiceWithNotif/CreateConnection', + request_serializer=connectionServiceWithNotif__pb2.Connection.SerializeToString, + response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString, + ) + self.ListConnection = channel.unary_unary( + '/connection.ConnectionServiceWithNotif/ListConnection', + request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString, + response_deserializer=connectionServiceWithNotif__pb2.ConnectionList.FromString, + ) + self.GetBer = channel.unary_stream( + '/connection.ConnectionServiceWithNotif/GetBer', + request_serializer=connectionServiceWithNotif__pb2.Connection.SerializeToString, + response_deserializer=connectionServiceWithNotif__pb2.Ber.FromString, + ) class ConnectionServiceWithNotifServicer(object): - # missing associated documentation comment in .proto file - pass - - def CreateConnection(self, request, context): - # missing associated documentation comment in .proto file - pass - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def ListConnection(self, request, context): - # missing associated documentation comment in .proto file - pass - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def GetBer(self, request, context): - # missing associated documentation comment in .proto file - pass - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + """Missing associated documentation comment in .proto file.""" + + def CreateConnection(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListConnection(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetBer(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') def add_ConnectionServiceWithNotifServicer_to_server(servicer, server): - rpc_method_handlers = { - 'CreateConnection': grpc.unary_unary_rpc_method_handler( - servicer.CreateConnection, - request_deserializer=connectionServiceWithNotif__pb2.Connection.FromString, - response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString, - ), - 'ListConnection': grpc.unary_unary_rpc_method_handler( - servicer.ListConnection, - request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString, - response_serializer=connectionServiceWithNotif__pb2.ConnectionList.SerializeToString, - ), - 'GetBer': grpc.unary_stream_rpc_method_handler( - servicer.GetBer, - request_deserializer=connectionServiceWithNotif__pb2.Connection.FromString, - response_serializer=connectionServiceWithNotif__pb2.Ber.SerializeToString, - ), - } - generic_handler = grpc.method_handlers_generic_handler( - 'connection.ConnectionServiceWithNotif', rpc_method_handlers) - server.add_generic_rpc_handlers((generic_handler,)) + rpc_method_handlers = { + 'CreateConnection': grpc.unary_unary_rpc_method_handler( + servicer.CreateConnection, + request_deserializer=connectionServiceWithNotif__pb2.Connection.FromString, + response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString, + ), + 'ListConnection': grpc.unary_unary_rpc_method_handler( + servicer.ListConnection, + request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString, + response_serializer=connectionServiceWithNotif__pb2.ConnectionList.SerializeToString, + ), + 'GetBer': grpc.unary_stream_rpc_method_handler( + servicer.GetBer, + request_deserializer=connectionServiceWithNotif__pb2.Connection.FromString, + response_serializer=connectionServiceWithNotif__pb2.Ber.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'connection.ConnectionServiceWithNotif', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + + + # This class is part of an EXPERIMENTAL API. +class ConnectionServiceWithNotif(object): + """Missing associated documentation comment in .proto file.""" + + @staticmethod + def CreateConnection(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/connection.ConnectionServiceWithNotif/CreateConnection', + connectionServiceWithNotif__pb2.Connection.SerializeToString, + google_dot_protobuf_dot_empty__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ListConnection(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/connection.ConnectionServiceWithNotif/ListConnection', + google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString, + connectionServiceWithNotif__pb2.ConnectionList.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetBer(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream(request, target, '/connection.ConnectionServiceWithNotif/GetBer', + connectionServiceWithNotif__pb2.Connection.SerializeToString, + connectionServiceWithNotif__pb2.Ber.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) -- GitLab From c6d920c61d7f1c57a554363adff072f64169ba00 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Tue, 7 Feb 2023 15:12:23 +0000 Subject: [PATCH 3/4] Hackfest: - cosmetic updates --- hackfest/commands.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hackfest/commands.txt b/hackfest/commands.txt index a71e55a5c..1b5d03dd4 100644 --- a/hackfest/commands.txt +++ b/hackfest/commands.txt @@ -297,7 +297,7 @@ cd ~/tfs-ctrl/hackfest/grpc/connection python3 list.py connection.txt # Build ConnectionService from .proto -cd ~/tfs-ctrl/hackfest/grpc +cd ~/tfs-ctrl/hackfest/grpc python -m grpc_tools.protoc -I=. --python_out=connectionService/ --grpc_python_out=connectionService/ connectionService.proto # Start ConnectionService server -- GitLab From 03939ecfe6ab482625ae8f83b9c4937ebdf8f7cd Mon Sep 17 00:00:00 2001 From: Lluis Gifre Renom Date: Sat, 17 Jun 2023 21:45:01 +0000 Subject: [PATCH 4/4] Update EroPathToHops.py to adapt it to the TAPI server example --- .../service/algorithms/tools/EroPathToHops.py | 48 ++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/src/pathcomp/frontend/service/algorithms/tools/EroPathToHops.py b/src/pathcomp/frontend/service/algorithms/tools/EroPathToHops.py index c8a902999..4c025318d 100644 --- a/src/pathcomp/frontend/service/algorithms/tools/EroPathToHops.py +++ b/src/pathcomp/frontend/service/algorithms/tools/EroPathToHops.py @@ -47,7 +47,50 @@ from typing import Dict, List LOGGER = logging.getLogger(__name__) +MAP_TAPI_UUIDS = { + "c3dbaa44-9cda-5d54-8f99-0f282362be65": "5b835e46-53f7-52e8-9c8a-077322679e36", # node-1-port-13-input => node-1-port-13-output + "1fb9ac86-b7ad-5d6d-87b1-a09d995f1ddd": "c9df6ece-1650-5078-876a-1e488a453625", # node-1-port-14-input => node-1-port-14-output + "aa109937-8291-5a09-853a-97bff463e569": "b245480f-027c-53a0-9320-fca5b9d7a1e1", # node-1-port-15-input => node-1-port-15-output + "6653ae16-42a3-56b5-adf3-71adda024a61": "ac356900-ce2f-5c15-b038-1b05e6f50bf7", # node-1-port-17-input => node-1-port-17-output + "d782ef85-a473-50b4-93b5-2af86024a42a": "dcfeedd3-2d47-5bc8-b31c-ed9f973d8b76", # node-2-port-13-input => node-2-port-13-output + "bbbd83ef-6053-55dc-ab08-06fb0c2bd081": "57bcf45b-eb47-5a9c-86d1-d9cff0c910fd", # node-2-port-14-input => node-2-port-14-output + "27cdf70d-4e48-53ff-bc4f-20addf6524c0": "fd31eff5-392e-5fb5-a6f4-6dfca583344d", # node-2-port-15-input => node-2-port-15-output + "55ac2364-fad8-5a05-ac2b-5003997ff89e": "d12a2591-7f4a-575d-8fda-0bc3d6b7ca32", # node-2-port-17-input => node-2-port-17-output + "59f44a3c-32a5-5abf-af58-45e6fa7ca657": "1977ef5c-4383-5195-9221-0cdf8ee26cb7", # node-3-port-13-input => node-3-port-13-output + "1be3f905-d553-5291-9906-47c0772d45aa": "9def067b-9a75-54df-8867-853f35a42e87", # node-3-port-14-input => node-3-port-14-output + "fb4ece7a-2dd1-593a-b6ca-a787b3b59fc5": "1f294257-132a-54ad-b653-ef8b7517c9d8", # node-3-port-15-input => node-3-port-15-output + "a571d2fe-c7f8-5ac8-b2af-8e5b92a558b0": "5b60a688-deac-567a-8e36-0d52e56fd4fc", # node-3-port-16-input => node-3-port-16-output + "9ea9dc53-2d6a-5f28-b81a-e930f7cbedf9": "2aec14c1-3a84-5cba-8f22-783bd0273cd0", # node-3-port-17-input => node-3-port-17-output + "9ec8e0f3-3378-55e0-bed1-be1fe120a1a9": "ece2ed55-ce16-59d3-8137-3f4cf17e67ab", # node-3-port-18-input => node-3-port-18-output + "a7e114aa-a3b6-52ae-b7b7-0e5fe4dd4d1c": "0a05e43d-a13c-5276-9839-613600f3ff28", # node-4-port-13-input => node-4-port-13-output + "4ca8357a-3468-51e6-bba8-65137486666f": "18926fdf-de5c-5a52-be88-cccc065e5e03", # node-4-port-14-input => node-4-port-14-output + "a7e9f06f-6fd2-594e-8a0c-25bfe8c652d7": "1adb9e17-e499-58dc-8aa2-881ed5ce9670", # node-4-port-15-input => node-4-port-15-output + "9f6a23b2-c71c-5559-8fb3-f76421bea1d9": "049bb1f1-cc04-5b72-8c0f-43891d9637bf", # node-4-port-16-input => node-4-port-16-output + "f1d74c96-41f5-5eb9-a160-a38463184934": "2206440b-ef66-5d3e-8da5-40608fb00a10", # node-4-port-17-input => node-4-port-17-output + + "5b835e46-53f7-52e8-9c8a-077322679e36": "c3dbaa44-9cda-5d54-8f99-0f282362be65", # node-1-port-13-output => node-1-port-13-input + "c9df6ece-1650-5078-876a-1e488a453625": "1fb9ac86-b7ad-5d6d-87b1-a09d995f1ddd", # node-1-port-14-output => node-1-port-14-input + "b245480f-027c-53a0-9320-fca5b9d7a1e1": "aa109937-8291-5a09-853a-97bff463e569", # node-1-port-15-output => node-1-port-15-input + "ac356900-ce2f-5c15-b038-1b05e6f50bf7": "6653ae16-42a3-56b5-adf3-71adda024a61", # node-1-port-17-output => node-1-port-17-input + "dcfeedd3-2d47-5bc8-b31c-ed9f973d8b76": "d782ef85-a473-50b4-93b5-2af86024a42a", # node-2-port-13-output => node-2-port-13-input + "57bcf45b-eb47-5a9c-86d1-d9cff0c910fd": "bbbd83ef-6053-55dc-ab08-06fb0c2bd081", # node-2-port-14-output => node-2-port-14-input + "fd31eff5-392e-5fb5-a6f4-6dfca583344d": "27cdf70d-4e48-53ff-bc4f-20addf6524c0", # node-2-port-15-output => node-2-port-15-input + "d12a2591-7f4a-575d-8fda-0bc3d6b7ca32": "55ac2364-fad8-5a05-ac2b-5003997ff89e", # node-2-port-17-output => node-2-port-17-input + "1977ef5c-4383-5195-9221-0cdf8ee26cb7": "59f44a3c-32a5-5abf-af58-45e6fa7ca657", # node-3-port-13-output => node-3-port-13-input + "9def067b-9a75-54df-8867-853f35a42e87": "1be3f905-d553-5291-9906-47c0772d45aa", # node-3-port-14-output => node-3-port-14-input + "1f294257-132a-54ad-b653-ef8b7517c9d8": "fb4ece7a-2dd1-593a-b6ca-a787b3b59fc5", # node-3-port-15-output => node-3-port-15-input + "5b60a688-deac-567a-8e36-0d52e56fd4fc": "a571d2fe-c7f8-5ac8-b2af-8e5b92a558b0", # node-3-port-16-output => node-3-port-16-input + "2aec14c1-3a84-5cba-8f22-783bd0273cd0": "9ea9dc53-2d6a-5f28-b81a-e930f7cbedf9", # node-3-port-17-output => node-3-port-17-input + "ece2ed55-ce16-59d3-8137-3f4cf17e67ab": "9ec8e0f3-3378-55e0-bed1-be1fe120a1a9", # node-3-port-18-output => node-3-port-18-input + "0a05e43d-a13c-5276-9839-613600f3ff28": "a7e114aa-a3b6-52ae-b7b7-0e5fe4dd4d1c", # node-4-port-13-output => node-4-port-13-input + "18926fdf-de5c-5a52-be88-cccc065e5e03": "4ca8357a-3468-51e6-bba8-65137486666f", # node-4-port-14-output => node-4-port-14-input + "1adb9e17-e499-58dc-8aa2-881ed5ce9670": "a7e9f06f-6fd2-594e-8a0c-25bfe8c652d7", # node-4-port-15-output => node-4-port-15-input + "049bb1f1-cc04-5b72-8c0f-43891d9637bf": "9f6a23b2-c71c-5559-8fb3-f76421bea1d9", # node-4-port-16-output => node-4-port-16-input + "2206440b-ef66-5d3e-8da5-40608fb00a10": "f1d74c96-41f5-5eb9-a160-a38463184934", # node-4-port-17-output => node-4-port-17-input +} + def eropath_to_hops(ero_path : List[Dict], endpoint_to_link_dict : Dict) -> List[Dict]: + LOGGER.debug('ero_path = {:s}'.format(str(ero_path))) try: path_hops = [] for endpoint in ero_path: @@ -72,11 +115,14 @@ def eropath_to_hops(ero_path : List[Dict], endpoint_to_link_dict : Dict) -> List (ep_id['endpoint_id']['endpoint_uuid'] != endpoint_uuid) ]), None) if ingress['endpoint_id']['device_id'] != device_uuid: raise Exception('Malformed path') + ingress_ep = ingress['endpoint_id']['endpoint_uuid'] + ingress_ep = MAP_TAPI_UUIDS.get(ingress_ep, ingress_ep) path_hops.append({ 'device': ingress['endpoint_id']['device_id'], - 'ingress_ep': ingress['endpoint_id']['endpoint_uuid'], + 'ingress_ep': ingress_ep, 'egress_ep': endpoint_uuid, }) + LOGGER.debug('path_hops = {:s}'.format(str(path_hops))) return path_hops except: LOGGER.exception('Unhandled exception: ero_path={:s} endpoint_to_link_dict={:s}'.format( -- GitLab