Data Plane Broker Integration, Configuration & Implementation. Paul McCherry
Data Plane Broker Integration OSM Creation: Connection Points, Bandwidth Deletion: Service_Id DPB WIM Connector Modify: “In development”, Service_Id Bandwidth, Service_id Rest & Ssh Api Data Plane Broker Fabric Adapter Rest Api Openflow Controller Rest Api Hardware Layer Configure Athens Openflow Openflow Openflow London 1 2 1 2 2 1 VIM Switch B Switch C Switch A Trunk Trunk VIM 3 3 3
Data Plane Broker Integration OSM Creation: Connection Points, Bandwidth Deletion: Service_Id DPB WIM Connector Modify: “In development”, Service_Id Bandwidth, Service_id Rest & Ssh Api Data Plane Broker Fabric Adapter Rest Api Openflow Controller Rest Api Hardware Layer Configure Athens Openflow Openflow Openflow London 1 2 1 2 2 1 VIM Switch B Switch C Switch A Trunk Trunk VIM 3 3 3
Data Plane Broker Integration OSM Creation: Connection Points, Bandwidth Deletion: Service_Id DPB WIM Connector Modify: “In development”, Service_Id Bandwidth, Service_id Rest & Ssh Api Data Plane Broker Fabric Adapter Rest Api Ryu Openflow Controller Rest Api Corsa Hardware Layer Configure Athens Openflow Openflow Openflow London 1 2 1 2 2 1 VIM Switch B Switch C Switch A Trunk Trunk VIM 3 3 3
Data Plane Broker Integration • Identify Modules which needed editing to add Dpb Wim connector RO Container NBI Container Validation.PY Schemas.PY # WIM ------------------------------------------------------------------------- wim_types = ["tapi", "onos", "odl", "dynpac", "dpb","fake"] ……………………………………………… ……………………………………………… ……………………………………………… Wim_Thread.PY ……………………………………………… ……………………………………………… wim_account_new_schema = { "title": "wim_account creation input schema", ……………………………………………… "$schema": "http://json-schema.org/draft-04/schema#", ……………………………………………… Thread-based interaction with WIMs. Tasks are stored in the "type": "object", ………… database (vim_wim_actions table) and processed sequentially "properties": { wim_schema_properties = { "schema_version": schema_version, Please check the Action class for information about the content of each action. Wan_Link_Actions.PY "schema_type": schema_type, "name": name_schema, """ "name": name_schema, "description": description_schema, "description": description_schema, "type": { import logging "wim": name_schema, "type": "string", import threading "enum": ["tapi", "onos", "odl", "dynpac", "dpb", "fake"] "wim_type": {"enum": ["tapi", "onos", "odl", "dynpac", "dpb","fake"]}, from contextlib import contextmanager "wim_url": description_schema, }, from functools import partial "user": shortname_schema, "wim_url": description_schema, ……………………………………………… from itertools import islice, chain, takewhile "password": passwd_schema, "config": { ……………………………………………… from operator import itemgetter, attrgetter "config": { "type": "object", "properties": { from sys import exc_info "type": "object", @staticmethod from time import time, sleep "patternProperties": { a "wim_port_mapping": wim_port_mapping_desc def _derive_connection_point(wan_info): ".": {"not": {"type": "null"}} } point = {'service_endpoint_id': wan_info['wan_service_endpoint_id']} a from six import reraise } } # TODO: Cover other scenarios, e.g. VXLAN. from six.moves import queue } } details = wan_info.get('wan_service_mapping_info', {}) ……………………………………………… }, if details.get('encapsulation_type') == 'vlan': from . import wan_link_actions "required": ["name", "wim_url", "wim_type"], ……………………………………………… point['service_endpoint_encapsulation_type'] = 'dot1q' from ..utils import ensure, partition, pipe point['service_endpoint_encapsulation_info'] = { from .actions import IGNORE, PENDING, REFRESH ……………………………………………… 'vlan': details['encapsulation_id'] from .errors import ( ……………………………………………… a } DbBaseException, else: QueueFull, point['service_endpoint_encapsulation_type'] = 'none' InvalidParameters as Invalid, return point UndefinedAction, ) @staticmethod from .failing_connector import FailingConnector def _derive_service_type(connection_points): from .wimconn import WimConnectorError # TODO: add multipoint and L3 connectivity. a from .wimconn_dynpac import DynpacConnector if len(connection_points) == 2: from .wimconn_dpb import DpbConnector return 'ELINE' from .wimconn_fake import FakeConnector else: from .wimconn_ietfl2vpn import WimconnectorIETFL2VPN #raise NotImplementedError('Multipoint connectivity is not ' # 'supported yet.') ACTIONS = { return 'ELAN' 'instance_wim_nets': wan_link_actions.ACTIONS } ……………………………………………… ……………………………………………… CONNECTORS = { # "odl": wimconn_odl.OdlConnector, "dynpac": DynpacConnector, "dpb": DpbConnector, "fake": FakeConnector, ……………………………………………… ………………………………………………
Data Plane Broker Integration RO Container Wimconn_dpb.py # TODO: List # - Add correct HTTP error codes # - Add some comments.... # - PEP8 it class DpbSshInterface(): """ Communicate with the DPB via SSH """ __LOGGER_NAME_EXT = ".ssh" __FUNCTION_MAP_POS = 1 def __init__(self, wim_account, wim_url, wim_port, network, auth_data, logger_name): self.logger.info("SSH connection to DPB made OK") class DpbRestInterface(): """ Communicate with the DPB via the REST API """ __LOGGER_NAME_EXT = ".rest" __FUNCTION_MAP_POS = 0 def __init__(self, wim_account, wim_url, wim_port, network, logger_name): …………………………………….. class DpbConnector(WimConnector): a """ Use the DPB to establish multipoint connections """ __SUPPORTED_SERV_TYPES = ["ELAN (L2)", "ELINE (L2)"] __SUPPORTED_CONNECTION_TYPES = ["REST", "SSH"] __SUPPORTED_SSH_AUTH_TYPES = ["KEY", "PASS"] __SUPPORTED_SSH_KEY_TYPES = ["ECDSA", "RSA"] def create_connectivity_service(self, service_type, connection_points, **kwargs): self.logger.info("CREATING CONNECTIVITY SERVICE") #self.__check_service(service_type, connection_points, kwargs) response = self.__post(self.__ACTIONS_MAP.get("CREATE")) ……………………………………… "ingress-bw": 10.0, "egress-bw": 10.0}) #"ingress-bw": (bandwidth.get(point.get("service_endpoint_id"))).get("ingress"), #"egress-bw": (bandwidth.get(point.get("service_endpoint_id"))).get("egress")} …………………………………………… def delete_connectivity_service(self, service_uuid, conn_info=None): # self.__post(self.__ACTIONS_MAP.get("DEACTIVATE"), "/service/"+service_id) self.logger.debug("deletion infO - suuId= "+str(service_uuid)+" conn_info= "+str(conn_info)) …………………………………………… def edit_connectivity_service(self, service_uuid, conn_info=None, connection_points=None, **kwargs): """Change an existing connectivity service. This method's arguments and return value follow the same convention as :meth:`~.create_connectivity_service`.
Usage Case for a Network Service across a WIM Beta.sys Athens Tiny.sys London APACHE-MGMT HAPROXY-MGMT OSM_WAN 10.30.67.164 10.30.66.30 SERVICE_WAN 192.168.28.2 192.168.28.x/24 Ha-proxy_vnf Apache_vnf In Development Apache VDU Bandwidth passed to WIM Scale 1-15 1 Apache VDU = 10 VDU Leaf Bandwidth = 10 …….. Root Bandwidth = 10 x 15 192.168.200.11 15 Apache VDU = 150 = 150 PUBLIC
Recommend
More recommend