Loading src/compute/service/rest_server/nbi_plugins/ietf_l2vpn/Constants.py +8 −1 Original line number Diff line number Diff line Loading @@ -14,4 +14,11 @@ DEFAULT_MTU = 1512 DEFAULT_ADDRESS_FAMILIES = ['IPV4'] DEFAULT_SUB_INTERFACE_INDEX = 0 # Bearer mappings: # device_uuid:endpoint_uuid => ( # device_uuid, endpoint_uuid, router_id, route_distinguisher, sub_if_index, address_ip, address_prefix) BEARER_MAPPINGS = { 'R1-INF:13/2/1': ('R1-INF', '13/2/1', '10.10.10.1', '65000:100', 400, '3.3.2.1', 24), 'R3-INF:13/2/1': ('R3-INF', '13/2/1', '20.20.20.1', '65000:200', 500, '3.3.1.1', 24), } src/compute/service/rest_server/nbi_plugins/ietf_l2vpn/L2VPN_SiteNetworkAccesses.py +42 −16 Original line number Diff line number Diff line Loading @@ -29,7 +29,7 @@ from .schemas.site_network_access import SCHEMA_SITE_NETWORK_ACCESS from .tools.Authentication import HTTP_AUTH from .tools.HttpStatusCodes import HTTP_NOCONTENT, HTTP_SERVERERROR from .tools.Validator import validate_message from .Constants import DEFAULT_ADDRESS_FAMILIES, DEFAULT_MTU, DEFAULT_SUB_INTERFACE_INDEX from .Constants import BEARER_MAPPINGS, DEFAULT_ADDRESS_FAMILIES, DEFAULT_MTU LOGGER = logging.getLogger(__name__) Loading @@ -38,10 +38,11 @@ def process_site_network_access(context_client : ContextClient, site_network_acc cvlan_id = site_network_access['connection']['tagged-interface']['dot1q-vlan-tagged']['cvlan-id'] bearer_reference = site_network_access['bearer']['bearer-reference'] # Assume bearer_reference = '<device_uuid>:<endpoint_uuid>:<router_id>' # Assume route_distinguisher = 0:<cvlan_id> device_uuid,endpoint_uuid,router_id = bearer_reference.split(':') route_distinguisher = '0:{:d}'.format(cvlan_id) mapping = BEARER_MAPPINGS.get(bearer_reference) if mapping is None: msg = 'Specified Bearer({:s}) is not configured.' raise Exception(msg.format(str(bearer_reference))) device_uuid,endpoint_uuid,router_id,route_distinguisher,sub_if_index,address_ip,address_prefix = mapping # pylint: disable=no-member service_id = ServiceId() Loading @@ -66,12 +67,6 @@ def process_site_network_access(context_client : ContextClient, site_network_acc if config_rule.resource_key != 'settings': continue json_settings = json.loads(config_rule.resource_value) if 'route_distinguisher' not in json_settings: # missing, add it json_settings['route_distinguisher'] = route_distinguisher elif json_settings['route_distinguisher'] != route_distinguisher: # differs, raise exception msg = 'Specified RouteDistinguisher({:s}) differs from Service RouteDistinguisher({:s})' raise Exception(msg.format(str(json_settings['route_distinguisher']), str(route_distinguisher))) if 'mtu' not in json_settings: # missing, add it json_settings['mtu'] = DEFAULT_MTU elif json_settings['mtu'] != DEFAULT_MTU: # differs, raise exception Loading @@ -92,7 +87,6 @@ def process_site_network_access(context_client : ContextClient, site_network_acc config_rule.action = ConfigActionEnum.CONFIGACTION_SET config_rule.resource_key = 'settings' config_rule.resource_value = json.dumps({ 'route_distinguisher': route_distinguisher, 'mtu': DEFAULT_MTU, 'address_families': DEFAULT_ADDRESS_FAMILIES, }, sort_keys=True) Loading @@ -108,12 +102,39 @@ def process_site_network_access(context_client : ContextClient, site_network_acc msg = 'Specified RouterId({:s}) differs from Service RouterId({:s})' raise Exception(msg.format(str(json_settings['router_id']), str(router_id))) if 'route_distinguisher' not in json_settings: # missing, add it json_settings['route_distinguisher'] = route_distinguisher elif json_settings['route_distinguisher'] != route_distinguisher: # differs, raise exception msg = 'Specified RouteDistinguisher({:s}) differs from Service RouteDistinguisher({:s})' raise Exception(msg.format(str(json_settings['route_distinguisher']), str(route_distinguisher))) if 'sub_interface_index' not in json_settings: # missing, add it json_settings['sub_interface_index'] = DEFAULT_SUB_INTERFACE_INDEX elif json_settings['sub_interface_index'] != DEFAULT_SUB_INTERFACE_INDEX: # differs, raise exception json_settings['sub_interface_index'] = sub_if_index elif json_settings['sub_interface_index'] != sub_if_index: # differs, raise exception msg = 'Specified SubInterfaceIndex({:s}) differs from Service SubInterfaceIndex({:s})' raise Exception(msg.format( str(json_settings['sub_interface_index']), str(DEFAULT_SUB_INTERFACE_INDEX))) str(json_settings['sub_interface_index']), str(sub_if_index))) if 'vlan_id' not in json_settings: # missing, add it json_settings['vlan_id'] = cvlan_id elif json_settings['vlan_id'] != cvlan_id: # differs, raise exception msg = 'Specified VLANId({:s}) differs from Service VLANId({:s})' raise Exception(msg.format( str(json_settings['vlan_id']), str(cvlan_id))) if 'address_ip' not in json_settings: # missing, add it json_settings['address_ip'] = address_ip elif json_settings['address_ip'] != address_ip: # differs, raise exception msg = 'Specified AddressIP({:s}) differs from Service AddressIP({:s})' raise Exception(msg.format( str(json_settings['address_ip']), str(address_ip))) if 'address_prefix' not in json_settings: # missing, add it json_settings['address_prefix'] = address_prefix elif json_settings['address_prefix'] != address_prefix: # differs, raise exception msg = 'Specified AddressPrefix({:s}) differs from Service AddressPrefix({:s})' raise Exception(msg.format( str(json_settings['address_prefix']), str(address_prefix))) config_rule.resource_value = json.dumps(json_settings, sort_keys=True) break Loading @@ -124,7 +145,12 @@ def process_site_network_access(context_client : ContextClient, site_network_acc config_rule.resource_key = endpoint_settings_key config_rule.resource_value = json.dumps({ 'router_id': router_id, 'sub_interface_index': DEFAULT_SUB_INTERFACE_INDEX, 'route_distinguisher': route_distinguisher, 'sub_interface_index': sub_if_index, 'vlan_id': cvlan_id, 'address_ip': address_ip, 'address_prefix': address_prefix, }, sort_keys=True) return service Loading src/service/service/service_handlers/l3nm_openconfig/L3NMOpenConfigServiceHandler.py +13 −7 Original line number Diff line number Diff line Loading @@ -69,7 +69,6 @@ class L3NMOpenConfigServiceHandler(_ServiceHandler): settings : TreeNode = get_subnode(self.__resolver, self.__config, 'settings', None) if settings is None: raise Exception('Unable to retrieve service settings') json_settings : Dict = settings.value route_distinguisher = json_settings.get('route_distinguisher', '0:0') # '60001:801' mtu = json_settings.get('mtu', 1450 ) # 1512 address_families = json_settings.get('address_families', [] ) # ['IPV4'] Loading @@ -89,8 +88,13 @@ class L3NMOpenConfigServiceHandler(_ServiceHandler): raise Exception('Unable to retrieve service settings for endpoint({:s})'.format( str(endpoint_settings_uri))) json_endpoint_settings : Dict = endpoint_settings.value router_id = json_endpoint_settings.get('router_id', '0.0.0.0') # '10.95.0.10' #router_id = json_endpoint_settings.get('router_id', '0.0.0.0') # '10.95.0.10' route_distinguisher = json_endpoint_settings.get('route_distinguisher', '0:0' ) # '60001:801' sub_interface_index = json_endpoint_settings.get('sub_interface_index', 0 ) # 1 vlan_id = json_endpoint_settings.get('vlan_id', 1 ) # 400 address_ip = json_endpoint_settings.get('address_ip', '0.0.0.0') # '2.2.2.1' address_prefix = json_endpoint_settings.get('address_prefix', 24 ) # 30 if_subif_name = '{:s}.{:d}'.format(endpoint_uuid, vlan_id) db_device : DeviceModel = get_object(self.__database, DeviceModel, device_uuid, raise_if_not_found=True) json_device = db_device.dump(include_config_rules=False, include_drivers=True, include_endpoints=True) Loading @@ -100,8 +104,8 @@ class L3NMOpenConfigServiceHandler(_ServiceHandler): config_rule_set( '/network_instance[{:s}]'.format(network_instance_name), { 'name': network_instance_name, 'description': network_interface_desc, 'type': 'L3VRF', 'router_id': router_id, 'route_distinguisher': route_distinguisher, 'address_families': address_families, 'route_distinguisher': route_distinguisher, #'router_id': router_id, 'address_families': address_families, }), config_rule_set( '/interface[{:s}]'.format(endpoint_uuid), { Loading @@ -110,11 +114,13 @@ class L3NMOpenConfigServiceHandler(_ServiceHandler): config_rule_set( '/interface[{:s}]/subinterface[{:d}]'.format(endpoint_uuid, sub_interface_index), { 'name': endpoint_uuid, 'index': sub_interface_index, 'description': network_subinterface_desc, 'mtu': mtu, 'description': network_subinterface_desc, 'vlan_id': vlan_id, 'address_ip': address_ip, 'address_prefix': address_prefix, }), config_rule_set( '/network_instance[{:s}]/interface[{:s}]'.format(network_instance_name, endpoint_uuid), { 'name': network_instance_name, 'id': endpoint_uuid, '/network_instance[{:s}]/interface[{:s}]'.format(network_instance_name, if_subif_name), { 'name': network_instance_name, 'id': if_subif_name, 'interface': endpoint_uuid, 'subinterface': sub_interface_index, }), config_rule_set( '/network_instance[{:s}]/table_connections'.format(network_instance_name), { Loading Loading
src/compute/service/rest_server/nbi_plugins/ietf_l2vpn/Constants.py +8 −1 Original line number Diff line number Diff line Loading @@ -14,4 +14,11 @@ DEFAULT_MTU = 1512 DEFAULT_ADDRESS_FAMILIES = ['IPV4'] DEFAULT_SUB_INTERFACE_INDEX = 0 # Bearer mappings: # device_uuid:endpoint_uuid => ( # device_uuid, endpoint_uuid, router_id, route_distinguisher, sub_if_index, address_ip, address_prefix) BEARER_MAPPINGS = { 'R1-INF:13/2/1': ('R1-INF', '13/2/1', '10.10.10.1', '65000:100', 400, '3.3.2.1', 24), 'R3-INF:13/2/1': ('R3-INF', '13/2/1', '20.20.20.1', '65000:200', 500, '3.3.1.1', 24), }
src/compute/service/rest_server/nbi_plugins/ietf_l2vpn/L2VPN_SiteNetworkAccesses.py +42 −16 Original line number Diff line number Diff line Loading @@ -29,7 +29,7 @@ from .schemas.site_network_access import SCHEMA_SITE_NETWORK_ACCESS from .tools.Authentication import HTTP_AUTH from .tools.HttpStatusCodes import HTTP_NOCONTENT, HTTP_SERVERERROR from .tools.Validator import validate_message from .Constants import DEFAULT_ADDRESS_FAMILIES, DEFAULT_MTU, DEFAULT_SUB_INTERFACE_INDEX from .Constants import BEARER_MAPPINGS, DEFAULT_ADDRESS_FAMILIES, DEFAULT_MTU LOGGER = logging.getLogger(__name__) Loading @@ -38,10 +38,11 @@ def process_site_network_access(context_client : ContextClient, site_network_acc cvlan_id = site_network_access['connection']['tagged-interface']['dot1q-vlan-tagged']['cvlan-id'] bearer_reference = site_network_access['bearer']['bearer-reference'] # Assume bearer_reference = '<device_uuid>:<endpoint_uuid>:<router_id>' # Assume route_distinguisher = 0:<cvlan_id> device_uuid,endpoint_uuid,router_id = bearer_reference.split(':') route_distinguisher = '0:{:d}'.format(cvlan_id) mapping = BEARER_MAPPINGS.get(bearer_reference) if mapping is None: msg = 'Specified Bearer({:s}) is not configured.' raise Exception(msg.format(str(bearer_reference))) device_uuid,endpoint_uuid,router_id,route_distinguisher,sub_if_index,address_ip,address_prefix = mapping # pylint: disable=no-member service_id = ServiceId() Loading @@ -66,12 +67,6 @@ def process_site_network_access(context_client : ContextClient, site_network_acc if config_rule.resource_key != 'settings': continue json_settings = json.loads(config_rule.resource_value) if 'route_distinguisher' not in json_settings: # missing, add it json_settings['route_distinguisher'] = route_distinguisher elif json_settings['route_distinguisher'] != route_distinguisher: # differs, raise exception msg = 'Specified RouteDistinguisher({:s}) differs from Service RouteDistinguisher({:s})' raise Exception(msg.format(str(json_settings['route_distinguisher']), str(route_distinguisher))) if 'mtu' not in json_settings: # missing, add it json_settings['mtu'] = DEFAULT_MTU elif json_settings['mtu'] != DEFAULT_MTU: # differs, raise exception Loading @@ -92,7 +87,6 @@ def process_site_network_access(context_client : ContextClient, site_network_acc config_rule.action = ConfigActionEnum.CONFIGACTION_SET config_rule.resource_key = 'settings' config_rule.resource_value = json.dumps({ 'route_distinguisher': route_distinguisher, 'mtu': DEFAULT_MTU, 'address_families': DEFAULT_ADDRESS_FAMILIES, }, sort_keys=True) Loading @@ -108,12 +102,39 @@ def process_site_network_access(context_client : ContextClient, site_network_acc msg = 'Specified RouterId({:s}) differs from Service RouterId({:s})' raise Exception(msg.format(str(json_settings['router_id']), str(router_id))) if 'route_distinguisher' not in json_settings: # missing, add it json_settings['route_distinguisher'] = route_distinguisher elif json_settings['route_distinguisher'] != route_distinguisher: # differs, raise exception msg = 'Specified RouteDistinguisher({:s}) differs from Service RouteDistinguisher({:s})' raise Exception(msg.format(str(json_settings['route_distinguisher']), str(route_distinguisher))) if 'sub_interface_index' not in json_settings: # missing, add it json_settings['sub_interface_index'] = DEFAULT_SUB_INTERFACE_INDEX elif json_settings['sub_interface_index'] != DEFAULT_SUB_INTERFACE_INDEX: # differs, raise exception json_settings['sub_interface_index'] = sub_if_index elif json_settings['sub_interface_index'] != sub_if_index: # differs, raise exception msg = 'Specified SubInterfaceIndex({:s}) differs from Service SubInterfaceIndex({:s})' raise Exception(msg.format( str(json_settings['sub_interface_index']), str(DEFAULT_SUB_INTERFACE_INDEX))) str(json_settings['sub_interface_index']), str(sub_if_index))) if 'vlan_id' not in json_settings: # missing, add it json_settings['vlan_id'] = cvlan_id elif json_settings['vlan_id'] != cvlan_id: # differs, raise exception msg = 'Specified VLANId({:s}) differs from Service VLANId({:s})' raise Exception(msg.format( str(json_settings['vlan_id']), str(cvlan_id))) if 'address_ip' not in json_settings: # missing, add it json_settings['address_ip'] = address_ip elif json_settings['address_ip'] != address_ip: # differs, raise exception msg = 'Specified AddressIP({:s}) differs from Service AddressIP({:s})' raise Exception(msg.format( str(json_settings['address_ip']), str(address_ip))) if 'address_prefix' not in json_settings: # missing, add it json_settings['address_prefix'] = address_prefix elif json_settings['address_prefix'] != address_prefix: # differs, raise exception msg = 'Specified AddressPrefix({:s}) differs from Service AddressPrefix({:s})' raise Exception(msg.format( str(json_settings['address_prefix']), str(address_prefix))) config_rule.resource_value = json.dumps(json_settings, sort_keys=True) break Loading @@ -124,7 +145,12 @@ def process_site_network_access(context_client : ContextClient, site_network_acc config_rule.resource_key = endpoint_settings_key config_rule.resource_value = json.dumps({ 'router_id': router_id, 'sub_interface_index': DEFAULT_SUB_INTERFACE_INDEX, 'route_distinguisher': route_distinguisher, 'sub_interface_index': sub_if_index, 'vlan_id': cvlan_id, 'address_ip': address_ip, 'address_prefix': address_prefix, }, sort_keys=True) return service Loading
src/service/service/service_handlers/l3nm_openconfig/L3NMOpenConfigServiceHandler.py +13 −7 Original line number Diff line number Diff line Loading @@ -69,7 +69,6 @@ class L3NMOpenConfigServiceHandler(_ServiceHandler): settings : TreeNode = get_subnode(self.__resolver, self.__config, 'settings', None) if settings is None: raise Exception('Unable to retrieve service settings') json_settings : Dict = settings.value route_distinguisher = json_settings.get('route_distinguisher', '0:0') # '60001:801' mtu = json_settings.get('mtu', 1450 ) # 1512 address_families = json_settings.get('address_families', [] ) # ['IPV4'] Loading @@ -89,8 +88,13 @@ class L3NMOpenConfigServiceHandler(_ServiceHandler): raise Exception('Unable to retrieve service settings for endpoint({:s})'.format( str(endpoint_settings_uri))) json_endpoint_settings : Dict = endpoint_settings.value router_id = json_endpoint_settings.get('router_id', '0.0.0.0') # '10.95.0.10' #router_id = json_endpoint_settings.get('router_id', '0.0.0.0') # '10.95.0.10' route_distinguisher = json_endpoint_settings.get('route_distinguisher', '0:0' ) # '60001:801' sub_interface_index = json_endpoint_settings.get('sub_interface_index', 0 ) # 1 vlan_id = json_endpoint_settings.get('vlan_id', 1 ) # 400 address_ip = json_endpoint_settings.get('address_ip', '0.0.0.0') # '2.2.2.1' address_prefix = json_endpoint_settings.get('address_prefix', 24 ) # 30 if_subif_name = '{:s}.{:d}'.format(endpoint_uuid, vlan_id) db_device : DeviceModel = get_object(self.__database, DeviceModel, device_uuid, raise_if_not_found=True) json_device = db_device.dump(include_config_rules=False, include_drivers=True, include_endpoints=True) Loading @@ -100,8 +104,8 @@ class L3NMOpenConfigServiceHandler(_ServiceHandler): config_rule_set( '/network_instance[{:s}]'.format(network_instance_name), { 'name': network_instance_name, 'description': network_interface_desc, 'type': 'L3VRF', 'router_id': router_id, 'route_distinguisher': route_distinguisher, 'address_families': address_families, 'route_distinguisher': route_distinguisher, #'router_id': router_id, 'address_families': address_families, }), config_rule_set( '/interface[{:s}]'.format(endpoint_uuid), { Loading @@ -110,11 +114,13 @@ class L3NMOpenConfigServiceHandler(_ServiceHandler): config_rule_set( '/interface[{:s}]/subinterface[{:d}]'.format(endpoint_uuid, sub_interface_index), { 'name': endpoint_uuid, 'index': sub_interface_index, 'description': network_subinterface_desc, 'mtu': mtu, 'description': network_subinterface_desc, 'vlan_id': vlan_id, 'address_ip': address_ip, 'address_prefix': address_prefix, }), config_rule_set( '/network_instance[{:s}]/interface[{:s}]'.format(network_instance_name, endpoint_uuid), { 'name': network_instance_name, 'id': endpoint_uuid, '/network_instance[{:s}]/interface[{:s}]'.format(network_instance_name, if_subif_name), { 'name': network_instance_name, 'id': if_subif_name, 'interface': endpoint_uuid, 'subinterface': sub_interface_index, }), config_rule_set( '/network_instance[{:s}]/table_connections'.format(network_instance_name), { Loading