diff --git a/hackfest/tfs-descriptors/device-all.json b/hackfest/tfs-descriptors/device-all.json
index 8cb8e031488f0dd1fa4176b8d20d01fe2d24abc9..36a93fe98d253dbc5e6db7f91b3b890e529c2ffc 100644
--- a/hackfest/tfs-descriptors/device-all.json
+++ b/hackfest/tfs-descriptors/device-all.json
@@ -9,7 +9,7 @@
{"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {
"username": "admin", "password": "admin",
"force_running": false, "hostkey_verify": false, "look_for_keys": false,
- "allow_agent": false, "delete_rule": true, "device_params": {"name": "default"},
+ "allow_agent": false, "commit_per_rule": true, "device_params": {"name": "default"},
"manager_params": {"timeout" : 120}
}}}
]},
@@ -26,7 +26,7 @@
{"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {
"username": "admin", "password": "admin",
"force_running": false, "hostkey_verify": false, "look_for_keys": false,
- "allow_agent": false, "delete_rule": true, "device_params": {"name": "default"},
+ "allow_agent": false, "commit_per_rule": true, "device_params": {"name": "default"},
"manager_params": {"timeout" : 120}
}}}
]},
@@ -43,7 +43,7 @@
{"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {
"username": "admin", "password": "admin",
"force_running": false, "hostkey_verify": false, "look_for_keys": false,
- "allow_agent": false, "delete_rule": true, "device_params": {"name": "default"},
+ "allow_agent": false, "commit_per_rule": true, "device_params": {"name": "default"},
"manager_params": {"timeout" : 120}
}}}
]},
@@ -60,7 +60,7 @@
{"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {
"username": "admin", "password": "admin",
"force_running": false, "hostkey_verify": false, "look_for_keys": false,
- "allow_agent": false, "delete_rule": true, "device_params": {"name": "default"},
+ "allow_agent": false, "commit_per_rule": true, "device_params": {"name": "default"},
"manager_params": {"timeout" : 120}
}}}
]},
diff --git a/hackfest/tfs-descriptors/device-netconf-openconfig.json b/hackfest/tfs-descriptors/device-netconf-openconfig.json
index 7e01f037e744493a8cd1190b2510ed3d4d1c86aa..490e36efde5b428781b945ccc5060eb7b29a558a 100644
--- a/hackfest/tfs-descriptors/device-netconf-openconfig.json
+++ b/hackfest/tfs-descriptors/device-netconf-openconfig.json
@@ -9,7 +9,7 @@
{"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {
"username": "admin", "password": "admin",
"force_running": false, "hostkey_verify": false, "look_for_keys": false,
- "allow_agent": false, "delete_rule": true, "device_params": {"name": "default"},
+ "allow_agent": false, "commit_per_rule": true, "device_params": {"name": "default"},
"manager_params": {"timeout" : 15}
}}}
]},
diff --git a/hackfest/tfs-descriptors/old/device.json b/hackfest/tfs-descriptors/old/device.json
index 03736314dee9ea0a8aae27627361dcdd24457fca..abe529e729955b8048c00fd688ce1d1a8b5a0285 100644
--- a/hackfest/tfs-descriptors/old/device.json
+++ b/hackfest/tfs-descriptors/old/device.json
@@ -27,7 +27,7 @@
"device_config": {"config_rules": [
{"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.15"}},
{"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "8301"}},
- {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"username\": \"admin\", \"password\": \"admin\", \"force_running\": true, \"hostkey_verify\": false, \"look_for_keys\": false, \"allow_agent\": true, \"delete_rule\": false, \"device_params\" : {\"name\": \"default\"}, \"manager_params\" : {\"timeout\": 15}}"}}
+ {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"username\": \"admin\", \"password\": \"admin\", \"force_running\": true, \"hostkey_verify\": false, \"look_for_keys\": false, \"allow_agent\": true, \"commit_per_rule\": false, \"device_params\" : {\"name\": \"default\"}, \"manager_params\" : {\"timeout\": 15}}"}}
]},
"device_operational_status": 1,
"device_drivers": [1],
@@ -39,7 +39,7 @@
"device_config": {"config_rules": [
{"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.15"}},
{"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "8302"}},
- {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"username\": \"admin\", \"password\": \"admin\", \"force_running\": true, \"hostkey_verify\": false, \"look_for_keys\": false, \"allow_agent\": true, \"delete_rule\": false, \"device_params\" : {\"name\": \"default\"}, \"manager_params\" : {\"timeout\": 15}}"}}
+ {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"username\": \"admin\", \"password\": \"admin\", \"force_running\": true, \"hostkey_verify\": false, \"look_for_keys\": false, \"allow_agent\": true, \"commit_per_rule\": false, \"device_params\" : {\"name\": \"default\"}, \"manager_params\" : {\"timeout\": 15}}"}}
]},
"device_operational_status": 1,
"device_drivers": [1],
@@ -51,7 +51,7 @@
"device_config": {"config_rules": [
{"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.15"}},
{"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "8303"}},
- {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"username\": \"admin\", \"password\": \"admin\", \"force_running\": true, \"hostkey_verify\": false, \"look_for_keys\": false, \"allow_agent\": true, \"delete_rule\": false, \"device_params\" : {\"name\": \"default\"}, \"manager_params\" : {\"timeout\": 15}}"}}
+ {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": "{\"username\": \"admin\", \"password\": \"admin\", \"force_running\": true, \"hostkey_verify\": false, \"look_for_keys\": false, \"allow_agent\": true, \"commit_per_rule\": false, \"device_params\" : {\"name\": \"default\"}, \"manager_params\" : {\"timeout\": 15}}"}}
]},
"device_operational_status": 1,
"device_drivers": [1],
diff --git a/src/device/service/drivers/openconfig/OpenConfigDriver.py b/src/device/service/drivers/openconfig/OpenConfigDriver.py
index ef3d0728d5ed02ea4a15ba0c3ccd6f1428cab7df..a0c335193bdf91c71b2f24584f200361b0218310 100644
--- a/src/device/service/drivers/openconfig/OpenConfigDriver.py
+++ b/src/device/service/drivers/openconfig/OpenConfigDriver.py
@@ -38,8 +38,6 @@ logging.getLogger('apscheduler.executors.default').setLevel(logging.INFO if DEBU
logging.getLogger('apscheduler.scheduler').setLevel(logging.INFO if DEBUG_MODE else logging.ERROR)
logging.getLogger('monitoring-client').setLevel(logging.INFO if DEBUG_MODE else logging.ERROR)
-LOGGER = logging.getLogger(__name__)
-
RE_GET_ENDPOINT_FROM_INTERFACE_KEY = re.compile(r'.*interface\[([^\]]+)\].*')
RE_GET_ENDPOINT_FROM_INTERFACE_XPATH = re.compile(r".*interface\[oci\:name\='([^\]]+)'\].*")
@@ -60,18 +58,18 @@ class NetconfSessionHandler:
self.__connected = threading.Event()
self.__address = address
self.__port = int(port)
- self.__username = settings.get('username')
- self.__password = settings.get('password')
- self.__vendor = settings.get('vendor')
- self.__key_filename = settings.get('key_filename')
- self.__hostkey_verify = settings.get('hostkey_verify', True)
- self.__look_for_keys = settings.get('look_for_keys', True)
- self.__allow_agent = settings.get('allow_agent', True)
- self.__force_running = settings.get('force_running', False)
- self.__commit_per_delete = settings.get('delete_rule', False)
- self.__device_params = settings.get('device_params', {})
- self.__manager_params = settings.get('manager_params', {})
- self.__nc_params = settings.get('nc_params', {})
+ self.__username = settings.get('username')
+ self.__password = settings.get('password')
+ self.__vendor = settings.get('vendor')
+ self.__key_filename = settings.get('key_filename')
+ self.__hostkey_verify = settings.get('hostkey_verify', True)
+ self.__look_for_keys = settings.get('look_for_keys', True)
+ self.__allow_agent = settings.get('allow_agent', True)
+ self.__force_running = settings.get('force_running', False)
+ self.__commit_per_rule = settings.get('commit_per_rule', False)
+ self.__device_params = settings.get('device_params', {})
+ self.__manager_params = settings.get('manager_params', {})
+ self.__nc_params = settings.get('nc_params', {})
self.__manager : Manager = None
self.__candidate_supported = False
@@ -94,7 +92,7 @@ class NetconfSessionHandler:
def use_candidate(self): return self.__candidate_supported and not self.__force_running
@property
- def commit_per_rule(self): return self.__commit_per_delete
+ def commit_per_rule(self): return self.__commit_per_rule
@property
def vendor(self): return self.__vendor
@@ -141,8 +139,9 @@ def compute_delta_sample(previous_sample, previous_timestamp, current_sample, cu
return delta_sample
class SamplesCache:
- def __init__(self, netconf_handler : NetconfSessionHandler) -> None:
+ def __init__(self, netconf_handler : NetconfSessionHandler, logger : logging.Logger) -> None:
self.__netconf_handler = netconf_handler
+ self.__logger = logger
self.__lock = threading.Lock()
self.__timestamp = None
self.__absolute_samples = {}
@@ -166,7 +165,7 @@ class SamplesCache:
self.__absolute_samples[interface] = samples
self.__timestamp = now
except: # pylint: disable=bare-except
- LOGGER.exception('Error collecting samples')
+ self.__logger.exception('Error collecting samples')
def get(self, resource_key : str) -> Tuple[float, Dict]:
self._refresh_samples()
@@ -176,31 +175,33 @@ class SamplesCache:
interface = match.group(1)
return self.__timestamp, copy.deepcopy(self.__delta_samples.get(interface, {}))
-def do_sampling(samples_cache : SamplesCache, resource_key : str, out_samples : queue.Queue) -> None:
+def do_sampling(
+ samples_cache : SamplesCache, logger : logging.Logger, resource_key : str, out_samples : queue.Queue
+) -> None:
try:
timestamp, samples = samples_cache.get(resource_key)
counter_name = resource_key.split('/')[-1].split(':')[-1]
value = samples.get(counter_name)
if value is None:
- LOGGER.warning('[do_sampling] value not found for {:s}'.format(resource_key))
+ logger.warning('[do_sampling] value not found for {:s}'.format(resource_key))
return
sample = (timestamp, resource_key, value)
out_samples.put_nowait(sample)
except: # pylint: disable=bare-except
- LOGGER.exception('Error retrieving samples')
+ logger.exception('Error retrieving samples')
def edit_config(
- netconf_handler : NetconfSessionHandler, resources : List[Tuple[str, Any]], delete=False, commit_per_rule= False,
- target='running', default_operation='merge', test_option=None, error_option=None,
+ netconf_handler : NetconfSessionHandler, logger : logging.Logger, resources : List[Tuple[str, Any]], delete=False,
+ commit_per_rule=False, target='running', default_operation='merge', test_option=None, error_option=None,
format='xml' # pylint: disable=redefined-builtin
):
str_method = 'DeleteConfig' if delete else 'SetConfig'
- LOGGER.info('[{:s}] resources = {:s}'.format(str_method, str(resources)))
+ #logger.debug('[{:s}] resources = {:s}'.format(str_method, str(resources)))
results = [None for _ in resources]
for i,resource in enumerate(resources):
str_resource_name = 'resources[#{:d}]'.format(i)
try:
- LOGGER.info('[{:s}] resource = {:s}'.format(str_method, str(resource)))
+ #logger.debug('[{:s}] resource = {:s}'.format(str_method, str(resource)))
chk_type(str_resource_name, resource, (list, tuple))
chk_length(str_resource_name, resource, min_length=2, max_length=2)
resource_key,resource_value = resource
@@ -208,8 +209,8 @@ def edit_config(
str_config_message = compose_config(
resource_key, resource_value, delete=delete, vendor=netconf_handler.vendor)
if str_config_message is None: raise UnsupportedResourceKeyException(resource_key)
- LOGGER.info('[{:s}] str_config_message[{:d}] = {:s}'.format(
- str_method, len(str_config_message), str(str_config_message)))
+ #logger.debug('[{:s}] str_config_message[{:d}] = {:s}'.format(
+ # str_method, len(str_config_message), str(str_config_message)))
netconf_handler.edit_config(
config=str_config_message, target=target, default_operation=default_operation,
test_option=test_option, error_option=error_option, format=format)
@@ -219,8 +220,16 @@ def edit_config(
except Exception as e: # pylint: disable=broad-except
str_operation = 'preparing' if target == 'candidate' else ('deleting' if delete else 'setting')
msg = '[{:s}] Exception {:s} {:s}: {:s}'
- LOGGER.exception(msg.format(str_method, str_operation, str_resource_name, str(resource)))
+ logger.exception(msg.format(str_method, str_operation, str_resource_name, str(resource)))
results[i] = e # if validation fails, store the exception
+
+ if not commit_per_rule:
+ try:
+ netconf_handler.commit()
+ except Exception as e: # pylint: disable=broad-except
+ msg = '[{:s}] Exception committing: {:s}'
+ logger.exception(msg.format(str_method, str_operation, str(resources)))
+ results = [e for _ in resources] # if commit fails, set exception in each resource
return results
HISTOGRAM_BUCKETS = (
@@ -243,6 +252,7 @@ METRICS_POOL.get_or_create('UnsubscribeState', MetricTypeEnum.HISTOGRAM_DURATION
class OpenConfigDriver(_Driver):
def __init__(self, address : str, port : int, **settings) -> None: # pylint: disable=super-init-not-called
+ self.__logger = logging.getLogger('{:s}:[{:s}:{:s}]'.format(str(__name__), str(address), str(port)))
self.__lock = threading.Lock()
#self.__initial = TreeNode('.')
#self.__running = TreeNode('.')
@@ -257,7 +267,7 @@ class OpenConfigDriver(_Driver):
timezone=pytz.utc)
self.__out_samples = queue.Queue()
self.__netconf_handler : NetconfSessionHandler = NetconfSessionHandler(address, port, **settings)
- self.__samples_cache = SamplesCache(self.__netconf_handler)
+ self.__samples_cache = SamplesCache(self.__netconf_handler, self.__logger)
def Connect(self) -> bool:
with self.__lock:
@@ -295,13 +305,14 @@ class OpenConfigDriver(_Driver):
try:
chk_string(str_resource_name, resource_key, allow_empty=False)
str_filter = get_filter(resource_key)
- LOGGER.info('[GetConfig] str_filter = {:s}'.format(str(str_filter)))
+ #self.__logger.debug('[GetConfig] str_filter = {:s}'.format(str(str_filter)))
if str_filter is None: str_filter = resource_key
xml_data = self.__netconf_handler.get(filter=str_filter).data_ele
if isinstance(xml_data, Exception): raise xml_data
results.extend(parse(resource_key, xml_data))
except Exception as e: # pylint: disable=broad-except
- LOGGER.exception('Exception retrieving {:s}: {:s}'.format(str_resource_name, str(resource_key)))
+ MSG = 'Exception retrieving {:s}: {:s}'
+ self.__logger.exception(MSG.format(str_resource_name, str(resource_key)))
results.append((resource_key, e)) # if validation fails, store the exception
return results
@@ -312,17 +323,11 @@ class OpenConfigDriver(_Driver):
with self.__lock:
if self.__netconf_handler.use_candidate:
with self.__netconf_handler.locked(target='candidate'):
- if self.__netconf_handler.commit_per_rule:
- results = edit_config(self.__netconf_handler, resources, target='candidate', commit_per_rule= True)
- else:
- results = edit_config(self.__netconf_handler, resources, target='candidate')
- try:
- self.__netconf_handler.commit()
- except Exception as e: # pylint: disable=broad-except
- LOGGER.exception('[SetConfig] Exception commiting resources: {:s}'.format(str(resources)))
- results = [e for _ in resources] # if commit fails, set exception in each resource
+ results = edit_config(
+ self.__netconf_handler, self.__logger, resources, target='candidate',
+ commit_per_rule=self.__netconf_handler.commit_per_rule)
else:
- results = edit_config(self.__netconf_handler, resources)
+ results = edit_config(self.__netconf_handler, self.__logger, resources)
return results
@metered_subclass_method(METRICS_POOL)
@@ -332,17 +337,11 @@ class OpenConfigDriver(_Driver):
with self.__lock:
if self.__netconf_handler.use_candidate:
with self.__netconf_handler.locked(target='candidate'):
- if self.__netconf_handler.commit_per_rule:
- results = edit_config(self.__netconf_handler, resources, target='candidate', delete=True, commit_per_rule= True)
- else:
- results = edit_config(self.__netconf_handler, resources, target='candidate', delete=True)
- try:
- self.__netconf_handler.commit()
- except Exception as e: # pylint: disable=broad-except
- LOGGER.exception('[DeleteConfig] Exception commiting resources: {:s}'.format(str(resources)))
- results = [e for _ in resources] # if commit fails, set exception in each resource
+ results = edit_config(
+ self.__netconf_handler, self.__logger, resources, target='candidate', delete=True,
+ commit_per_rule=self.__netconf_handler.commit_per_rule)
else:
- results = edit_config(self.__netconf_handler, resources, delete=True)
+ results = edit_config(self.__netconf_handler, self.__logger, resources, delete=True)
return results
@metered_subclass_method(METRICS_POOL)
@@ -363,7 +362,8 @@ class OpenConfigDriver(_Driver):
chk_float(str_subscription_name + '.sampling_duration', sampling_duration, min_value=0)
chk_float(str_subscription_name + '.sampling_interval', sampling_interval, min_value=0)
except Exception as e: # pylint: disable=broad-except
- LOGGER.exception('Exception validating {:s}: {:s}'.format(str_subscription_name, str(resource_key)))
+ MSG = 'Exception validating {:s}: {:s}'
+ self.__logger.exception(MSG.format(str_subscription_name, str(resource_key)))
results.append(e) # if validation fails, store the exception
continue
@@ -374,7 +374,7 @@ class OpenConfigDriver(_Driver):
job_id = 'k={:s}/d={:f}/i={:f}'.format(resource_key, sampling_duration, sampling_interval)
job = self.__scheduler.add_job(
- do_sampling, args=(self.__samples_cache, resource_key, self.__out_samples),
+ do_sampling, args=(self.__samples_cache, self.__logger, resource_key, self.__out_samples),
kwargs={}, id=job_id, trigger='interval', seconds=sampling_interval,
start_date=start_date, end_date=end_date, timezone=pytz.utc)
@@ -401,7 +401,8 @@ class OpenConfigDriver(_Driver):
chk_float(str_subscription_name + '.sampling_duration', sampling_duration, min_value=0)
chk_float(str_subscription_name + '.sampling_interval', sampling_interval, min_value=0)
except Exception as e: # pylint: disable=broad-except
- LOGGER.exception('Exception validating {:s}: {:s}'.format(str_subscription_name, str(resource_key)))
+ MSG = 'Exception validating {:s}: {:s}'
+ self.__logger.exception(MSG.format(str_subscription_name, str(resource_key)))
results.append(e) # if validation fails, store the exception
continue
diff --git a/src/device/service/drivers/openconfig/templates/interface/edit_config.xml b/src/device/service/drivers/openconfig/templates/interface/edit_config.xml
index 4bc53ff1ddfbebbdcef2a0b4c37770210726676b..220f062b5da09d26ff6ec271491d6d40cfd46669 100644
--- a/src/device/service/drivers/openconfig/templates/interface/edit_config.xml
+++ b/src/device/service/drivers/openconfig/templates/interface/edit_config.xml
@@ -4,6 +4,7 @@
{% if operation is defined and operation != 'delete' %}
{{name}}
+ ianaift:{{type}}
{{mtu}}
diff --git a/src/device/service/drivers/openconfig/templates/network_instance/interface/edit_config.xml b/src/device/service/drivers/openconfig/templates/network_instance/interface/edit_config.xml
index bf8c0c0770f9344fbed16f3a6b09f7fa99a978ef..855f321b4a69ba1e660487c108a05d0ec4b5d475 100644
--- a/src/device/service/drivers/openconfig/templates/network_instance/interface/edit_config.xml
+++ b/src/device/service/drivers/openconfig/templates/network_instance/interface/edit_config.xml
@@ -2,7 +2,7 @@
{{name}}
-
+
{{id}}
{{id}}
diff --git a/src/device/tests/Device_OpenConfig_Template.py b/src/device/tests/Device_OpenConfig_Template.py
index 8ab45337514bf354d8b338c8bb97721d099355f4..b9aae79a2b0e5a38a556e50dd2445592caca4daf 100644
--- a/src/device/tests/Device_OpenConfig_Template.py
+++ b/src/device/tests/Device_OpenConfig_Template.py
@@ -32,7 +32,7 @@ DEVICE_OC_CONNECT_RULES = json_device_connect_rules(DEVICE_OC_ADDRESS, DEVICE_OC
'hostkey_verify' : True,
'look_for_keys' : True,
'allow_agent' : True,
- 'delete_rule' : False,
+ 'commit_per_rule': False,
'device_params' : {'name': 'default'},
'manager_params' : {'timeout' : DEVICE_OC_TIMEOUT},
})
diff --git a/src/load_generator/load_gen/RequestGenerator.py b/src/load_generator/load_gen/RequestGenerator.py
index e94dc0cb948d703f71925fd932e749ebb544650e..7e0acbe76371628f579cfcf2ebe702ce6170a8a7 100644
--- a/src/load_generator/load_gen/RequestGenerator.py
+++ b/src/load_generator/load_gen/RequestGenerator.py
@@ -34,6 +34,16 @@ from .Parameters import Parameters
LOGGER = logging.getLogger(__name__)
+ROUTER_ID = {
+ 'R149': '5.5.5.5',
+ 'R155': '5.5.5.1',
+}
+
+VIRTUAL_CIRCUIT = {
+ 'R149': '5.5.5.5',
+ 'R155': '5.5.5.1',
+}
+
class RequestGenerator:
def __init__(self, parameters : Parameters) -> None:
self._parameters = parameters
@@ -242,34 +252,32 @@ class RequestGenerator:
]
vlan_id = num_request % 1000
- circuit_id = '{:03d}'.format(vlan_id)
+ circuit_id = '{:03d}'.format(vlan_id + 100)
src_device_name = self._device_data[src_device_uuid]['name']
- src_router_id = '10.0.0.{:d}'.format(int(src_device_name.replace('R', '')))
+ src_router_id = ROUTER_ID.get(src_device_name, '10.0.0.{:d}'.format(int(src_device_name.replace('R', ''))))
dst_device_name = self._device_data[dst_device_uuid]['name']
- dst_router_id = '10.0.0.{:d}'.format(int(dst_device_name.replace('R', '')))
+ dst_router_id = ROUTER_ID.get(dst_device_name, '10.0.0.{:d}'.format(int(dst_device_name.replace('R', ''))))
config_rules = [
json_config_rule_set('/settings', {
'mtu': 1512
}),
json_config_rule_set(
- '/device[{:s}]/endpoint[{:s}]/settings'.format(src_device_uuid, src_endpoint_uuid), {
- 'router_id': src_router_id,
- 'sub_interface_index': vlan_id,
+ '/device[{:s}]/endpoint[{:s}]/settings'.format(src_device_name, src_endpoint_name), {
+ 'sub_interface_index': 0,
'vlan_id': vlan_id,
'remote_router': dst_router_id,
'circuit_id': circuit_id,
- }),
+ }),
json_config_rule_set(
- '/device[{:s}]/endpoint[{:s}]/settings'.format(dst_device_uuid, dst_endpoint_uuid), {
- 'router_id': dst_router_id,
- 'sub_interface_index': vlan_id,
+ '/device[{:s}]/endpoint[{:s}]/settings'.format(dst_device_name, dst_endpoint_name), {
+ 'sub_interface_index': 0,
'vlan_id': vlan_id,
'remote_router': src_router_id,
'circuit_id': circuit_id,
- }),
+ }),
]
return json_service_l2nm_planned(
request_uuid, endpoint_ids=endpoint_ids, constraints=constraints, config_rules=config_rules)
@@ -286,44 +294,56 @@ class RequestGenerator:
json_constraint_sla_latency(e2e_latency_ms),
]
- vlan_id = num_request % 1000
- bgp_as = 60000 + (num_request % 10000)
- bgp_route_target = '{:5d}:{:03d}'.format(bgp_as, 333)
+ bgp_as = 65000 + (num_request % 10000)
+
+ vlan_id = num_request % 100 +100
+ x = num_request % 255
+ y = num_request % 25 * num_request % 10
route_distinguisher = '{:5d}:{:03d}'.format(bgp_as, vlan_id)
src_device_name = self._device_data[src_device_uuid]['name']
src_endpoint_name = self._device_endpoint_data[src_device_uuid][src_endpoint_uuid]['name']
- src_router_id = '10.0.0.{:d}'.format(int(src_device_name.replace('R', '')))
- src_address_ip = '.'.join([src_device_name.replace('R', ''), '0'] + src_endpoint_name.split('/'))
+ src_router_id = ROUTER_ID.get(src_device_name)
+ src_router_num = int(src_device_name.replace('R', ''))
+ if src_router_id is None: src_router_id = '10.0.0.{:d}'.format(src_router_num)
+ src_address_ip = '10.{:d}.{:d}.{:d}'.format(x, y, src_router_num)
dst_device_name = self._device_data[dst_device_uuid]['name']
dst_endpoint_name = self._device_endpoint_data[dst_device_uuid][dst_endpoint_uuid]['name']
- dst_router_id = '10.0.0.{:d}'.format(int(dst_device_name.replace('R', '')))
- dst_address_ip = '.'.join([dst_device_name.replace('R', ''), '0'] + dst_endpoint_name.split('/'))
+ dst_router_num = int(dst_device_name.replace('R', ''))
+ dst_router_id = ROUTER_ID.get(dst_device_name)
+ if dst_router_id is None: dst_router_id = '10.0.0.{:d}'.format(dst_router_num)
+ dst_address_ip = '10.{:d}.{:d}.{:d}'.format(y, x, dst_router_num)
+
+ policy_AZ = 'srv_{:d}_a'.format(vlan_id)
+ policy_ZA = 'srv_{:d}_b'.format(vlan_id)
config_rules = [
json_config_rule_set('/settings', {
- 'mtu' : 1512,
'bgp_as' : bgp_as,
- 'bgp_route_target': bgp_route_target,
+ 'route_distinguisher': route_distinguisher,
}),
json_config_rule_set(
- '/device[{:s}]/endpoint[{:s}]/settings'.format(src_device_uuid, src_endpoint_uuid), {
+ '/device[{:s}]/endpoint[{:s}]/settings'.format(src_device_name, src_endpoint_name), {
'router_id' : src_router_id,
'route_distinguisher': route_distinguisher,
'sub_interface_index': vlan_id,
'vlan_id' : vlan_id,
'address_ip' : src_address_ip,
'address_prefix' : 16,
+ 'policy_AZ' : policy_AZ,
+ 'policy_ZA' : policy_ZA,
}),
json_config_rule_set(
- '/device[{:s}]/endpoint[{:s}]/settings'.format(dst_device_uuid, dst_endpoint_uuid), {
+ '/device[{:s}]/endpoint[{:s}]/settings'.format(dst_device_name, dst_endpoint_name), {
'router_id' : dst_router_id,
'route_distinguisher': route_distinguisher,
'sub_interface_index': vlan_id,
'vlan_id' : vlan_id,
'address_ip' : dst_address_ip,
'address_prefix' : 16,
+ 'policy_AZ' : policy_AZ,
+ 'policy_ZA' : policy_ZA,
}),
]
return json_service_l3nm_planned(
diff --git a/src/service/service/service_handlers/l2nm_openconfig/ConfigRules.py b/src/service/service/service_handlers/l2nm_openconfig/ConfigRules.py
index c2ea6e213ee8d18b4507089fb2762c913e03039a..bbd91df93b15c669878dce092d415a678beafa8a 100644
--- a/src/service/service/service_handlers/l2nm_openconfig/ConfigRules.py
+++ b/src/service/service/service_handlers/l2nm_openconfig/ConfigRules.py
@@ -20,58 +20,64 @@ def setup_config_rules(
service_uuid : str, connection_uuid : str, device_uuid : str, endpoint_uuid : str, endpoint_name : str,
service_settings : TreeNode, endpoint_settings : TreeNode
) -> List[Dict]:
+
+ if service_settings is None: return []
+ if endpoint_settings is None: return []
+
+ json_settings : Dict = service_settings.value
+ json_endpoint_settings : Dict = endpoint_settings.value
json_settings : Dict = {} if service_settings is None else service_settings.value
json_endpoint_settings : Dict = {} if endpoint_settings is None else endpoint_settings.value
- mtu = json_settings.get('mtu', 1450 ) # 1512
+ #mtu = json_settings.get('mtu', 1450 ) # 1512
#address_families = json_settings.get('address_families', [] ) # ['IPV4']
#bgp_as = json_settings.get('bgp_as', 0 ) # 65000
#bgp_route_target = json_settings.get('bgp_route_target', '0:0') # 65000:333
- 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
- remote_router = json_endpoint_settings.get('remote_router', '0.0.0.0') # '5.5.5.5'
- circuit_id = json_endpoint_settings.get('circuit_id', '000' ) # '111'
+ remote_router = json_endpoint_settings.get('remote_router', '5.5.5.5') # '5.5.5.5'
+ circuit_id = json_endpoint_settings.get('circuit_id', '111' ) # '111'
+
if_cirid_name = '{:s}.{:s}'.format(endpoint_name, str(circuit_id))
network_instance_name = 'ELAN-AC:{:s}'.format(str(circuit_id))
connection_point_id = 'VC-1'
json_config_rules = [
- json_config_rule_set(
- '/network_instance[default]',
- {'name': 'default', 'type': 'DEFAULT_INSTANCE', 'router_id': router_id}),
-
- json_config_rule_set(
- '/network_instance[default]/protocols[OSPF]',
- {'name': 'default', 'identifier': 'OSPF', 'protocol_name': 'OSPF'}),
-
- json_config_rule_set(
- '/network_instance[default]/protocols[STATIC]',
- {'name': 'default', 'identifier': 'STATIC', 'protocol_name': 'STATIC'}),
-
+
json_config_rule_set(
'/network_instance[{:s}]'.format(network_instance_name),
- {'name': network_instance_name, 'type': 'L2VSI'}),
+ {'name': network_instance_name,
+ 'type': 'L2VSI'}),
json_config_rule_set(
- '/interface[{:s}]/subinterface[{:d}]'.format(if_cirid_name, sub_interface_index),
- {'name': if_cirid_name, 'type': 'l2vlan', 'index': sub_interface_index, 'vlan_id': vlan_id}),
+ '/interface[{:s}]/subinterface[0]'.format(if_cirid_name),
+ {'name': if_cirid_name,
+ 'type': 'l2vlan',
+ 'index': sub_interface_index,
+ 'vlan_id': vlan_id}),
json_config_rule_set(
'/network_instance[{:s}]/interface[{:s}]'.format(network_instance_name, if_cirid_name),
- {'name': network_instance_name, 'id': if_cirid_name, 'interface': if_cirid_name,
- 'subinterface': sub_interface_index}),
+ {'name': network_instance_name,
+ 'id': if_cirid_name,
+ 'interface': if_cirid_name,
+ 'subinterface': 0
+ }),
json_config_rule_set(
'/network_instance[{:s}]/connection_point[{:s}]'.format(network_instance_name, connection_point_id),
- {'name': network_instance_name, 'connection_point': connection_point_id, 'VC_ID': circuit_id,
- 'remote_system': remote_router}),
+ {'name': network_instance_name,
+ 'connection_point': connection_point_id,
+ 'VC_ID': circuit_id,
+ 'remote_system': remote_router
+ }),
]
return json_config_rules
@@ -88,9 +94,9 @@ def teardown_config_rules(
#bgp_as = json_settings.get('bgp_as', 0 ) # 65000
#bgp_route_target = json_settings.get('bgp_route_target', '0:0') # 65000:333
- 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
+ #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
@@ -102,33 +108,16 @@ def teardown_config_rules(
connection_point_id = 'VC-1'
json_config_rules = [
- json_config_rule_delete(
- '/network_instance[{:s}]/connection_point[{:s}]'.format(network_instance_name, connection_point_id),
- {'name': network_instance_name, 'connection_point': connection_point_id}),
+
- json_config_rule_delete(
- '/network_instance[{:s}]/interface[{:s}]'.format(network_instance_name, if_cirid_name),
- {'name': network_instance_name, 'id': if_cirid_name, 'interface': if_cirid_name,
- 'subinterface': sub_interface_index}),
-
- json_config_rule_delete(
- '/interface[{:s}]/subinterface[{:d}]'.format(if_cirid_name, sub_interface_index),
- {'name': if_cirid_name, 'index': sub_interface_index}),
json_config_rule_delete(
'/network_instance[{:s}]'.format(network_instance_name),
{'name': network_instance_name}),
-
- json_config_rule_delete(
- '/network_instance[default]/protocols[STATIC]',
- {'name': 'default', 'identifier': 'STATIC', 'protocol_name': 'STATIC'}),
-
- json_config_rule_delete(
- '/network_instance[default]/protocols[OSPF]',
- {'name': 'default', 'identifier': 'OSPF', 'protocol_name': 'OSPF'}),
-
+
json_config_rule_delete(
- '/network_instance[default]',
- {'name': 'default', 'type': 'DEFAULT_INSTANCE', 'router_id': router_id}),
+ '/interface[{:s}]'.format(if_cirid_name), {
+ 'name': if_cirid_name,
+ }),
]
return json_config_rules
diff --git a/src/service/service/service_handlers/l2nm_openconfig/L2NMOpenConfigServiceHandler.py b/src/service/service/service_handlers/l2nm_openconfig/L2NMOpenConfigServiceHandler.py
index 6eb139dbd03b4dff781a08548c03627512501ab5..d511c8947ecb43052fd154ab3ce3293a468b4263 100644
--- a/src/service/service/service_handlers/l2nm_openconfig/L2NMOpenConfigServiceHandler.py
+++ b/src/service/service/service_handlers/l2nm_openconfig/L2NMOpenConfigServiceHandler.py
@@ -75,10 +75,12 @@ class L2NMOpenConfigServiceHandler(_ServiceHandler):
service_uuid, connection_uuid, device_uuid, endpoint_uuid, endpoint_name,
settings, endpoint_settings)
- del device_obj.device_config.config_rules[:]
- for json_config_rule in json_config_rules:
- device_obj.device_config.config_rules.append(ConfigRule(**json_config_rule))
- self.__task_executor.configure_device(device_obj)
+ if len(json_config_rules) > 0:
+ del device_obj.device_config.config_rules[:]
+ for json_config_rule in json_config_rules:
+ device_obj.device_config.config_rules.append(ConfigRule(**json_config_rule))
+ self.__task_executor.configure_device(device_obj)
+
results.append(True)
except Exception as e: # pylint: disable=broad-except
LOGGER.exception('Unable to SetEndpoint({:s})'.format(str(endpoint)))
@@ -110,10 +112,12 @@ class L2NMOpenConfigServiceHandler(_ServiceHandler):
service_uuid, connection_uuid, device_uuid, endpoint_uuid, endpoint_name,
settings, endpoint_settings)
- del device_obj.device_config.config_rules[:]
- for json_config_rule in json_config_rules:
- device_obj.device_config.config_rules.append(ConfigRule(**json_config_rule))
- self.__task_executor.configure_device(device_obj)
+ if len(json_config_rules) > 0:
+ del device_obj.device_config.config_rules[:]
+ for json_config_rule in json_config_rules:
+ device_obj.device_config.config_rules.append(ConfigRule(**json_config_rule))
+ self.__task_executor.configure_device(device_obj)
+
results.append(True)
except Exception as e: # pylint: disable=broad-except
LOGGER.exception('Unable to DeleteEndpoint({:s})'.format(str(endpoint)))
diff --git a/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py b/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py
index 903ad8cd5ae442a03d54fb49083f3837a3c8187c..351efe5a5f32db99c36846ad2fd96e2c8567148e 100644
--- a/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py
+++ b/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py
@@ -21,120 +21,162 @@ def setup_config_rules(
service_settings : TreeNode, endpoint_settings : TreeNode
) -> List[Dict]:
- json_settings : Dict = {} if service_settings is None else service_settings.value
- json_endpoint_settings : Dict = {} if endpoint_settings is None else endpoint_settings.value
+ if service_settings is None: return []
+ if endpoint_settings is None: return []
+
+ json_settings : Dict = service_settings.value
+ json_endpoint_settings : Dict = endpoint_settings.value
service_short_uuid = service_uuid.split('-')[-1]
network_instance_name = '{:s}-NetInst'.format(service_short_uuid)
network_interface_desc = '{:s}-NetIf'.format(service_uuid)
network_subinterface_desc = '{:s}-NetSubIf'.format(service_uuid)
- mtu = json_settings.get('mtu', 1450 ) # 1512
- #address_families = json_settings.get('address_families', [] ) # ['IPV4']
- bgp_as = json_settings.get('bgp_as', 0 ) # 65000
- bgp_route_target = json_settings.get('bgp_route_target', '0:0') # 65000:333
-
- #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'
+ mtu = json_settings.get('mtu', 1450 ) # 1512
+ #address_families = json_settings.get('address_families', [] ) # ['IPV4']
+ bgp_as = json_settings.get('bgp_as', 65000 ) # 65000
+ route_distinguisher = json_settings.get('route_distinguisher', '0:0' ) # '60001:801'
sub_interface_index = json_endpoint_settings.get('sub_interface_index', 0 ) # 1
+ router_id = json_endpoint_settings.get('router_id', '0.0.0.0') # '10.95.0.10'
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
+ policy_import = json_endpoint_settings.get('policy_AZ', '2' ) # 2
+ policy_export = json_endpoint_settings.get('policy_ZA', '7' ) # 30
+
if_subif_name = '{:s}.{:d}'.format(endpoint_name, vlan_id)
json_config_rules = [
+ # Configure Interface (not used)
+ #json_config_rule_set(
+ # '/interface[{:s}]'.format(endpoint_name), {
+ # 'name': endpoint_name, 'description': network_interface_desc, 'mtu': mtu,
+ #}),
+
+ #Create network instance
json_config_rule_set(
'/network_instance[{:s}]'.format(network_instance_name), {
- 'name': network_instance_name, 'description': network_interface_desc, 'type': 'L3VRF',
+ 'name': network_instance_name,
+ 'description': network_interface_desc,
+ 'type': 'L3VRF',
'route_distinguisher': route_distinguisher,
- #'router_id': router_id, 'address_families': address_families,
- }),
- json_config_rule_set(
- '/interface[{:s}]'.format(endpoint_name), {
- 'name': endpoint_name, 'description': network_interface_desc, 'mtu': mtu,
- }),
- json_config_rule_set(
- '/interface[{:s}]/subinterface[{:d}]'.format(endpoint_name, sub_interface_index), {
- 'name': endpoint_name, 'index': sub_interface_index,
- 'description': network_subinterface_desc, 'vlan_id': vlan_id,
- 'address_ip': address_ip, 'address_prefix': address_prefix,
- }),
- json_config_rule_set(
- '/network_instance[{:s}]/interface[{:s}]'.format(network_instance_name, if_subif_name), {
- 'name': network_instance_name, 'id': if_subif_name, 'interface': endpoint_name,
- 'subinterface': sub_interface_index,
+ #'router_id': router_id,
+ #'address_families': address_families,
}),
+
+ #Add BGP protocol to network instance
json_config_rule_set(
'/network_instance[{:s}]/protocols[BGP]'.format(network_instance_name), {
- 'name': network_instance_name, 'identifier': 'BGP', 'protocol_name': 'BGP', 'as': bgp_as,
+ 'name': network_instance_name,
+ 'protocol_name': 'BGP',
+ 'identifier': 'BGP',
+ 'as': bgp_as,
+ 'router_id': router_id,
}),
+
+ #Add DIRECTLY CONNECTED protocol to network instance
json_config_rule_set(
- '/network_instance[{:s}]/table_connections[STATIC][BGP][IPV4]'.format(network_instance_name), {
- 'name': network_instance_name, 'src_protocol': 'STATIC', 'dst_protocol': 'BGP',
- 'address_family': 'IPV4', #'default_import_policy': 'REJECT_ROUTE',
+ '/network_instance[{:s}]/protocols[DIRECTLY_CONNECTED]'.format(network_instance_name), {
+ 'name': network_instance_name,
+ 'identifier': 'DIRECTLY_CONNECTED',
+ 'protocol_name': 'DIRECTLY_CONNECTED',
}),
+
+
+ #Add STATIC protocol to network instance
json_config_rule_set(
- '/network_instance[{:s}]/table_connections[DIRECTLY_CONNECTED][BGP][IPV4]'.format(
- network_instance_name), {
- 'name': network_instance_name, 'src_protocol': 'DIRECTLY_CONNECTED', 'dst_protocol': 'BGP',
- 'address_family': 'IPV4', #'default_import_policy': 'REJECT_ROUTE',
+ '/network_instance[{:s}]/protocols[STATIC]'.format(network_instance_name), {
+ 'name': network_instance_name,
+ 'identifier': 'STATIC',
+ 'protocol_name': 'STATIC',
}),
+
+ #Create interface with subinterface
json_config_rule_set(
- '/routing_policy/bgp_defined_set[{:s}_rt_import]'.format(network_instance_name), {
- 'ext_community_set_name': '{:s}_rt_import'.format(network_instance_name),
+ '/interface[{:s}]/subinterface[{:d}]'.format(if_subif_name, sub_interface_index), {
+ 'name' : if_subif_name,
+ 'type' :'l3ipvlan',
+ 'mtu' : mtu,
+ 'index' : sub_interface_index,
+ 'description' : network_subinterface_desc,
+ 'vlan_id' : vlan_id,
+ 'address_ip' : address_ip,
+ 'address_prefix': address_prefix,
}),
+
+ #Associate interface to network instance
json_config_rule_set(
- '/routing_policy/bgp_defined_set[{:s}_rt_import][route-target:{:s}]'.format(
- network_instance_name, bgp_route_target), {
- 'ext_community_set_name': '{:s}_rt_import'.format(network_instance_name),
- 'ext_community_member' : 'route-target:{:s}'.format(bgp_route_target),
- }),
+ '/network_instance[{:s}]/interface[{:s}]'.format(network_instance_name, if_subif_name), {
+ 'name' : network_instance_name,
+ 'id' : if_subif_name,
+ 'interface' : if_subif_name,
+ 'subinterface': sub_interface_index,
+ }),
+
+ #Create routing policy
json_config_rule_set(
- '/routing_policy/policy_definition[{:s}_import]'.format(network_instance_name), {
- 'policy_name': '{:s}_import'.format(network_instance_name),
+ '/routing_policy/bgp_defined_set[{:s}_rt_import][{:s}]'.format(policy_import,route_distinguisher), {
+ 'ext_community_set_name': 'set_{:s}'.format(policy_import),
+ 'ext_community_member' : route_distinguisher,
}),
json_config_rule_set(
- '/routing_policy/policy_definition[{:s}_import]/statement[{:s}]'.format(
- network_instance_name, '3'), {
- 'policy_name': '{:s}_import'.format(network_instance_name), 'statement_name': '3',
- 'ext_community_set_name': '{:s}_rt_import'.format(network_instance_name),
- 'match_set_options': 'ANY', 'policy_result': 'ACCEPT_ROUTE',
+ # pylint: disable=duplicate-string-formatting-argument
+ '/routing_policy/policy_definition[{:s}_import]/statement[{:s}]'.format(policy_import, policy_import), {
+ 'policy_name' : policy_import,
+ 'statement_name' : 'stm_{:s}'.format(policy_import),
+ 'ext_community_set_name': 'set_{:s}'.format(policy_import),
+ 'policy_result' : 'ACCEPT_ROUTE',
}),
+
+ #Associate routing policy to network instance
json_config_rule_set(
- # pylint: disable=duplicate-string-formatting-argument
- '/network_instance[{:s}]/inter_instance_policies[{:s}_import]'.format(
- network_instance_name, network_instance_name), {
- 'name': network_instance_name, 'import_policy': '{:s}_import'.format(network_instance_name),
+ '/network_instance[{:s}]/inter_instance_policies[{:s}]'.format(network_instance_name, policy_import), {
+ 'name' : network_instance_name,
+ 'import_policy': policy_import,
}),
+
+ #Create routing policy
json_config_rule_set(
- '/routing_policy/bgp_defined_set[{:s}_rt_export]'.format(network_instance_name), {
- 'ext_community_set_name': '{:s}_rt_export'.format(network_instance_name),
+ '/routing_policy/bgp_defined_set[{:s}_rt_export][{:s}]'.format(policy_export, route_distinguisher), {
+ 'ext_community_set_name': 'set_{:s}'.format(policy_export),
+ 'ext_community_member' : route_distinguisher,
}),
json_config_rule_set(
- '/routing_policy/bgp_defined_set[{:s}_rt_export][route-target:{:s}]'.format(
- network_instance_name, bgp_route_target), {
- 'ext_community_set_name': '{:s}_rt_export'.format(network_instance_name),
- 'ext_community_member' : 'route-target:{:s}'.format(bgp_route_target),
+ # pylint: disable=duplicate-string-formatting-argument
+ '/routing_policy/policy_definition[{:s}_export]/statement[{:s}]'.format(policy_export, policy_export), {
+ 'policy_name' : policy_export,
+ 'statement_name' : 'stm_{:s}'.format(policy_export),
+ 'ext_community_set_name': 'set_{:s}'.format(policy_export),
+ 'policy_result' : 'ACCEPT_ROUTE',
}),
+
+ #Associate routing policy to network instance
json_config_rule_set(
- '/routing_policy/policy_definition[{:s}_export]'.format(network_instance_name), {
- 'policy_name': '{:s}_export'.format(network_instance_name),
+ '/network_instance[{:s}]/inter_instance_policies[{:s}]'.format(network_instance_name, policy_export),{
+ 'name' : network_instance_name,
+ 'export_policy': policy_export,
}),
+
+ #Create table connections
json_config_rule_set(
- '/routing_policy/policy_definition[{:s}_export]/statement[{:s}]'.format(
- network_instance_name, '3'), {
- 'policy_name': '{:s}_export'.format(network_instance_name), 'statement_name': '3',
- 'ext_community_set_name': '{:s}_rt_export'.format(network_instance_name),
- 'match_set_options': 'ANY', 'policy_result': 'ACCEPT_ROUTE',
+ '/network_instance[{:s}]/table_connections[DIRECTLY_CONNECTED][BGP][IPV4]'.format(network_instance_name), {
+ 'name' : network_instance_name,
+ 'src_protocol' : 'DIRECTLY_CONNECTED',
+ 'dst_protocol' : 'BGP',
+ 'address_family' : 'IPV4',
+ 'default_import_policy': 'ACCEPT_ROUTE',
}),
+
json_config_rule_set(
- # pylint: disable=duplicate-string-formatting-argument
- '/network_instance[{:s}]/inter_instance_policies[{:s}_export]'.format(
- network_instance_name, network_instance_name), {
- 'name': network_instance_name, 'export_policy': '{:s}_export'.format(network_instance_name),
+ '/network_instance[{:s}]/table_connections[STATIC][BGP][IPV4]'.format(network_instance_name), {
+ 'name' : network_instance_name,
+ 'src_protocol' : 'STATIC',
+ 'dst_protocol' : 'BGP',
+ 'address_family' : 'IPV4',
+ 'default_import_policy': 'ACCEPT_ROUTE',
}),
- ]
+ ]
return json_config_rules
def teardown_config_rules(
@@ -142,108 +184,86 @@ def teardown_config_rules(
service_settings : TreeNode, endpoint_settings : TreeNode
) -> List[Dict]:
+ if service_settings is None: return []
+ if endpoint_settings is None: return []
+
json_settings : Dict = {} if service_settings is None else service_settings.value
json_endpoint_settings : Dict = {} if endpoint_settings is None else endpoint_settings.value
- #mtu = json_settings.get('mtu', 1450 ) # 1512
- #address_families = json_settings.get('address_families', [] ) # ['IPV4']
- #bgp_as = json_settings.get('bgp_as', 0 ) # 65000
- bgp_route_target = json_settings.get('bgp_route_target', '0:0') # 65000:333
+ service_short_uuid = service_uuid.split('-')[-1]
+ network_instance_name = '{:s}-NetInst'.format(service_short_uuid)
+ #network_interface_desc = '{:s}-NetIf'.format(service_uuid)
+ #network_subinterface_desc = '{:s}-NetSubIf'.format(service_uuid)
+ #mtu = json_settings.get('mtu', 1450 ) # 1512
+ #address_families = json_settings.get('address_families', [] ) # ['IPV4']
+ #bgp_as = json_settings.get('bgp_as', 65000 ) # 65000
+ route_distinguisher = json_settings.get('route_distinguisher', '0:0' ) # '60001:801'
+ #sub_interface_index = json_endpoint_settings.get('sub_interface_index', 0 ) # 1
#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
+ policy_import = json_endpoint_settings.get('policy_AZ', '2' ) # 2
+ policy_export = json_endpoint_settings.get('policy_ZA', '7' ) # 30
if_subif_name = '{:s}.{:d}'.format(endpoint_name, vlan_id)
- service_short_uuid = service_uuid.split('-')[-1]
- network_instance_name = '{:s}-NetInst'.format(service_short_uuid)
- #network_interface_desc = '{:s}-NetIf'.format(service_uuid)
- #network_subinterface_desc = '{:s}-NetSubIf'.format(service_uuid)
json_config_rules = [
+ #Delete table connections
json_config_rule_delete(
- '/network_instance[{:s}]/interface[{:s}]'.format(network_instance_name, if_subif_name), {
- 'name': network_instance_name, 'id': if_subif_name,
- }),
- json_config_rule_delete(
- '/interface[{:s}]/subinterface[{:d}]'.format(endpoint_name, sub_interface_index), {
- 'name': endpoint_name, 'index': sub_interface_index,
- }),
- json_config_rule_delete(
- '/interface[{:s}]'.format(endpoint_name), {
- 'name': endpoint_name,
- }),
- json_config_rule_delete(
- '/network_instance[{:s}]/table_connections[DIRECTLY_CONNECTED][BGP][IPV4]'.format(
- network_instance_name), {
- 'name': network_instance_name, 'src_protocol': 'DIRECTLY_CONNECTED', 'dst_protocol': 'BGP',
- 'address_family': 'IPV4',
+ '/network_instance[{:s}]/table_connections[DIRECTLY_CONNECTED][BGP][IPV4]'.format(network_instance_name),{
+ 'name' : network_instance_name,
+ 'src_protocol' : 'DIRECTLY_CONNECTED',
+ 'dst_protocol' : 'BGP',
+ 'address_family': 'IPV4',
}),
+
+
json_config_rule_delete(
'/network_instance[{:s}]/table_connections[STATIC][BGP][IPV4]'.format(network_instance_name), {
- 'name': network_instance_name, 'src_protocol': 'STATIC', 'dst_protocol': 'BGP',
+ 'name' : network_instance_name,
+ 'src_protocol' : 'STATIC',
+ 'dst_protocol' : 'BGP',
'address_family': 'IPV4',
}),
+
+ #Delete export routing policy
+
json_config_rule_delete(
- '/network_instance[{:s}]/protocols[BGP]'.format(network_instance_name), {
- 'name': network_instance_name, 'identifier': 'BGP', 'protocol_name': 'BGP',
- }),
- json_config_rule_delete(
- # pylint: disable=duplicate-string-formatting-argument
- '/network_instance[{:s}]/inter_instance_policies[{:s}_import]'.format(
- network_instance_name, network_instance_name), {
- 'name': network_instance_name,
+ '/routing_policy/policy_definition[{:s}_export]'.format(network_instance_name), {
+ 'policy_name': '{:s}_export'.format(network_instance_name),
}),
json_config_rule_delete(
- '/routing_policy/policy_definition[{:s}_import]/statement[{:s}]'.format(
- network_instance_name, '3'), {
- 'policy_name': '{:s}_import'.format(network_instance_name), 'statement_name': '3',
+ '/routing_policy/bgp_defined_set[{:s}_rt_export][{:s}]'.format(policy_export, route_distinguisher), {
+ 'ext_community_set_name': 'set_{:s}'.format(policy_export),
}),
+
+ #Delete import routing policy
+
json_config_rule_delete(
'/routing_policy/policy_definition[{:s}_import]'.format(network_instance_name), {
'policy_name': '{:s}_import'.format(network_instance_name),
}),
json_config_rule_delete(
- '/routing_policy/bgp_defined_set[{:s}_rt_import][route-target:{:s}]'.format(
- network_instance_name, bgp_route_target), {
- 'ext_community_set_name': '{:s}_rt_import'.format(network_instance_name),
- 'ext_community_member' : 'route-target:{:s}'.format(bgp_route_target),
- }),
- json_config_rule_delete(
- '/routing_policy/bgp_defined_set[{:s}_rt_import]'.format(network_instance_name), {
- 'ext_community_set_name': '{:s}_rt_import'.format(network_instance_name),
- }),
- json_config_rule_delete(
- # pylint: disable=duplicate-string-formatting-argument
- '/network_instance[{:s}]/inter_instance_policies[{:s}_export]'.format(
- network_instance_name, network_instance_name), {
- 'name': network_instance_name,
- }),
- json_config_rule_delete(
- '/routing_policy/policy_definition[{:s}_export]/statement[{:s}]'.format(
- network_instance_name, '3'), {
- 'policy_name': '{:s}_export'.format(network_instance_name), 'statement_name': '3',
+ '/routing_policy/bgp_defined_set[{:s}_rt_import][{:s}]'.format(policy_import, route_distinguisher), {
+ 'ext_community_set_name': 'set_{:s}'.format(policy_import),
}),
- json_config_rule_delete(
- '/routing_policy/policy_definition[{:s}_export]'.format(network_instance_name), {
- 'policy_name': '{:s}_export'.format(network_instance_name),
- }),
- json_config_rule_delete(
- '/routing_policy/bgp_defined_set[{:s}_rt_export][route-target:{:s}]'.format(
- network_instance_name, bgp_route_target), {
- 'ext_community_set_name': '{:s}_rt_export'.format(network_instance_name),
- 'ext_community_member' : 'route-target:{:s}'.format(bgp_route_target),
- }),
- json_config_rule_delete(
- '/routing_policy/bgp_defined_set[{:s}_rt_export]'.format(network_instance_name), {
- 'ext_community_set_name': '{:s}_rt_export'.format(network_instance_name),
+
+ #Delete interface; automatically deletes:
+ # - /interface[]/subinterface[]
+ json_config_rule_delete('/interface[{:s}]'.format(if_subif_name),
+ {
+ 'name': if_subif_name,
}),
- json_config_rule_delete(
- '/network_instance[{:s}]'.format(network_instance_name), {
- 'name': network_instance_name
+
+ #Delete network instance; automatically deletes:
+ # - /network_instance[]/interface[]
+ # - /network_instance[]/protocols[]
+ # - /network_instance[]/inter_instance_policies[]
+ json_config_rule_delete('/network_instance[{:s}]'.format(network_instance_name),
+ {
+ 'name': network_instance_name
}),
]
return json_config_rules
diff --git a/src/service/service/service_handlers/l3nm_openconfig/L3NMOpenConfigServiceHandler.py b/src/service/service/service_handlers/l3nm_openconfig/L3NMOpenConfigServiceHandler.py
index e3af6302dc996bb1582f2c339b3296800aa9d655..b2639ddad58e4c453f1b1e2dc87fce8861ad79a2 100644
--- a/src/service/service/service_handlers/l3nm_openconfig/L3NMOpenConfigServiceHandler.py
+++ b/src/service/service/service_handlers/l3nm_openconfig/L3NMOpenConfigServiceHandler.py
@@ -75,10 +75,12 @@ class L3NMOpenConfigServiceHandler(_ServiceHandler):
service_uuid, connection_uuid, device_uuid, endpoint_uuid, endpoint_name,
settings, endpoint_settings)
- del device_obj.device_config.config_rules[:]
- for json_config_rule in json_config_rules:
- device_obj.device_config.config_rules.append(ConfigRule(**json_config_rule))
- self.__task_executor.configure_device(device_obj)
+ if len(json_config_rules) > 0:
+ del device_obj.device_config.config_rules[:]
+ for json_config_rule in json_config_rules:
+ device_obj.device_config.config_rules.append(ConfigRule(**json_config_rule))
+ self.__task_executor.configure_device(device_obj)
+
results.append(True)
except Exception as e: # pylint: disable=broad-except
LOGGER.exception('Unable to SetEndpoint({:s})'.format(str(endpoint)))
@@ -110,10 +112,12 @@ class L3NMOpenConfigServiceHandler(_ServiceHandler):
service_uuid, connection_uuid, device_uuid, endpoint_uuid, endpoint_name,
settings, endpoint_settings)
- del device_obj.device_config.config_rules[:]
- for json_config_rule in json_config_rules:
- device_obj.device_config.config_rules.append(ConfigRule(**json_config_rule))
- self.__task_executor.configure_device(device_obj)
+ if len(json_config_rules) > 0:
+ del device_obj.device_config.config_rules[:]
+ for json_config_rule in json_config_rules:
+ device_obj.device_config.config_rules.append(ConfigRule(**json_config_rule))
+ self.__task_executor.configure_device(device_obj)
+
results.append(True)
except Exception as e: # pylint: disable=broad-except
LOGGER.exception('Unable to DeleteEndpoint({:s})'.format(str(endpoint)))