aboutsummaryrefslogtreecommitdiffstats
path: root/resources/libraries/python/LispSetup.py
diff options
context:
space:
mode:
Diffstat (limited to 'resources/libraries/python/LispSetup.py')
-rw-r--r--resources/libraries/python/LispSetup.py403
1 files changed, 268 insertions, 135 deletions
diff --git a/resources/libraries/python/LispSetup.py b/resources/libraries/python/LispSetup.py
index 5ef8bc06a9..5fee5db87d 100644
--- a/resources/libraries/python/LispSetup.py
+++ b/resources/libraries/python/LispSetup.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2016 Cisco and/or its affiliates.
+# Copyright (c) 2016-2019 Cisco and/or its affiliates.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
@@ -13,9 +13,11 @@
"""Library to set up Lisp in topology."""
-from resources.libraries.python.topology import NodeType
-from resources.libraries.python.VatExecutor import VatExecutor
+from ipaddress import ip_address
+from resources.libraries.python.topology import NodeType
+from resources.libraries.python.PapiExecutor import PapiSocketExecutor
+from resources.libraries.python.L2Util import L2Util
class LispStatus(object):
"""Class for lisp API."""
@@ -33,10 +35,14 @@ class LispStatus(object):
:type state: str
"""
- VatExecutor.cmd_from_template(node,
- 'lisp/lisp_status.vat',
- state=state)
+ args = dict(is_en=0 if state == 'disable' else 1)
+
+ cmd = 'lisp_enable_disable'
+ err_msg = "Failed to set LISP status on host {host}".format(
+ host=node['host'])
+ with PapiSocketExecutor(node) as papi_exec:
+ papi_exec.add(cmd, **args).get_reply(err_msg)
class LispRemoteMapping(object):
"""Class for lisp remote mapping API."""
@@ -66,20 +72,40 @@ class LispRemoteMapping(object):
:type rloc: str
:type is_mac: bool
"""
- if is_mac:
- deid_prefix = ''
- seid_prefix = ''
+
+ if not is_mac:
+ eid_type = 0 if ip_address(unicode(deid)).version == 4 else 1
+ eid_packed = ip_address(unicode(deid)).packed
+ seid_packed = ip_address(unicode(seid)).packed
+ eid_len = deid_prefix
+ seid_len = seid_prefix
else:
- deid_prefix = '/{}'.format(deid_prefix)
- seid_prefix = '/{}'.format(seid_prefix)
- VatExecutor.cmd_from_template(node,
- 'lisp/add_lisp_remote_mapping.vat',
- vni=vni,
- deid=deid,
- deid_prefix=deid_prefix,
- seid=seid,
- seid_prefix=seid_prefix,
- rloc=rloc)
+ eid_type = 2
+ eid_packed = L2Util.mac_to_bin(deid)
+ seid_packed = L2Util.mac_to_bin(seid)
+ eid_len = 0
+ seid_len = 0
+
+ rlocs = [dict(is_ip4=1 if ip_address(unicode(rloc)).version == 4 else 0,
+ addr=ip_address(unicode(rloc)).packed)]
+
+ args = dict(is_add=1,
+ is_src_dst=1,
+ vni=int(vni),
+ eid_type=eid_type,
+ eid=eid_packed,
+ eid_len=eid_len,
+ seid=seid_packed,
+ seid_len=seid_len,
+ rloc_num=1,
+ rlocs=rlocs)
+
+ cmd = 'lisp_add_del_remote_mapping'
+ err_msg = "Failed to add remote mapping on host {host}".format(
+ host=node['host'])
+
+ with PapiSocketExecutor(node) as papi_exec:
+ papi_exec.add(cmd, **args).get_reply(err_msg)
@staticmethod
def vpp_del_lisp_remote_mapping(node, vni, deid, deid_prefix, seid,
@@ -102,15 +128,42 @@ class LispRemoteMapping(object):
:type rloc: str
"""
- VatExecutor.cmd_from_template(node,
- 'lisp/del_lisp_remote_mapping.vat',
- vni=vni,
- deid=deid,
- deid_prefix=deid_prefix,
- seid=seid,
- seid_prefix=seid_prefix,
- rloc=rloc)
+ # used only with IPs
+ is_mac = False
+ if not is_mac:
+ eid_type = 0 if ip_address(unicode(deid)).version == 4 else 1
+ eid_packed = ip_address(unicode(deid)).packed
+ seid_packed = ip_address(unicode(seid)).packed
+ eid_len = deid_prefix
+ seid_len = seid_prefix
+ else:
+ eid_type = 2
+ eid_packed = L2Util.mac_to_bin(deid)
+ seid_packed = L2Util.mac_to_bin(seid)
+ eid_len = 0
+ seid_len = 0
+
+ rlocs = [dict(is_ip4=1 if ip_address(unicode(rloc)).version == 4 else 0,
+ addr=ip_address(unicode(rloc)).packed)]
+
+ args = dict(is_add=0,
+ is_src_dst=1,
+ vni=int(vni),
+ eid_type=eid_type,
+ eid=eid_packed,
+ eid_len=eid_len,
+ seid=seid_packed,
+ seid_len=seid_len,
+ rloc_num=1,
+ rlocs=rlocs)
+
+ cmd = 'lisp_add_del_remote_mapping'
+ err_msg = "Failed to delete remote mapping on host {host}".format(
+ host=node['host'])
+
+ with PapiSocketExecutor(node) as papi_exec:
+ papi_exec.add(cmd, **args).get_reply(err_msg)
class LispAdjacency(object):
"""Class for lisp adjacency API."""
@@ -138,19 +191,34 @@ class LispAdjacency(object):
:type seid_prefix: int
:type is_mac: bool
"""
- if is_mac:
- deid_prefix = ''
- seid_prefix = ''
+
+ if not is_mac:
+ eid_type = 0 if ip_address(unicode(deid)).version == 4 else 1
+ reid = ip_address(unicode(deid)).packed
+ leid = ip_address(unicode(seid)).packed
+ reid_len = deid_prefix
+ leid_len = seid_prefix
else:
- deid_prefix = '/{}'.format(deid_prefix)
- seid_prefix = '/{}'.format(seid_prefix)
- VatExecutor.cmd_from_template(node,
- 'lisp/add_lisp_adjacency.vat',
- vni=vni,
- deid=deid,
- deid_prefix=deid_prefix,
- seid=seid,
- seid_prefix=seid_prefix)
+ eid_type = 2
+ reid = L2Util.mac_to_bin(deid)
+ leid = L2Util.mac_to_bin(seid)
+ reid_len = 0
+ leid_len = 0
+
+ args = dict(is_add=1,
+ vni=int(vni),
+ eid_type=eid_type,
+ reid=reid,
+ reid_len=reid_len,
+ leid=leid,
+ leid_len=leid_len)
+
+ cmd = 'lisp_add_del_adjacency'
+ err_msg = "Failed to add lisp adjacency on host {host}".format(
+ host=node['host'])
+
+ with PapiSocketExecutor(node) as papi_exec:
+ papi_exec.add(cmd, **args).get_reply(err_msg)
@staticmethod
def vpp_del_lisp_adjacency(node, vni, deid, deid_prefix, seid,
@@ -171,14 +239,36 @@ class LispAdjacency(object):
:type seid_prefix: int
"""
- VatExecutor.cmd_from_template(node,
- 'lisp/del_lisp_adjacency.vat',
- vni=vni,
- deid=deid,
- deid_prefix=deid_prefix,
- seid=seid,
- seid_prefix=seid_prefix)
+ # used only with IPs
+ is_mac = False
+ if not is_mac:
+ eid_type = 0 if ip_address(unicode(deid)).version == 4 else 1
+ reid = ip_address(unicode(deid)).packed
+ leid = ip_address(unicode(seid)).packed
+ reid_len = deid_prefix
+ leid_len = seid_prefix
+ else:
+ eid_type = 2
+ reid = L2Util.mac_to_bin(deid)
+ leid = L2Util.mac_to_bin(seid)
+ reid_len = 0
+ leid_len = 0
+
+ args = dict(is_add=0,
+ vni=int(vni),
+ eid_type=eid_type,
+ reid=reid,
+ reid_len=reid_len,
+ leid=leid,
+ leid_len=leid_len)
+
+ cmd = 'lisp_add_del_adjacency'
+ err_msg = "Failed to delete lisp adjacency on host {host}".format(
+ host=node['host'])
+
+ with PapiSocketExecutor(node) as papi_exec:
+ papi_exec.add(cmd, **args).get_reply(err_msg)
class LispGpeStatus(object):
"""Clas for LISP GPE status manipulation."""
@@ -196,29 +286,14 @@ class LispGpeStatus(object):
:type state: str
"""
- VatExecutor.cmd_from_template(node, 'lisp/lisp_gpe_status.vat',
- state=state)
-
-
-class LispGpeIface(object):
- """Class for Lisp gpe interface API."""
-
- def __init__(self):
- pass
-
- @staticmethod
- def vpp_lisp_gpe_iface(node, state):
- """Set lisp gpe interface up or down on the VPP node in topology.
+ args = dict(is_en=0 if state == 'disable' else 1)
- :param node: VPP node.
- :param state: State of the gpe iface, up or down.
- :type node: dict
- :type state: str
- """
-
- VatExecutor.cmd_from_template(node, 'lisp/lisp_gpe_iface.vat',
- state=state)
+ cmd = 'gpe_enable_disable'
+ err_msg = "Failed to set LISP GPE status on host {host}".format(
+ host=node['host'])
+ with PapiSocketExecutor(node) as papi_exec:
+ papi_exec.add(cmd, **args).get_reply(err_msg)
class LispGpeForwardEntry(object):
"""The functionality needed for these methods is not implemented in VPP
@@ -259,9 +334,17 @@ class LispMapResolver(object):
:type map_resolver_ip: str
"""
- VatExecutor.cmd_from_template(node,
- 'lisp/add_lisp_map_resolver.vat',
- address=map_resolver_ip)
+ args = dict(is_add=1,
+ is_ipv6=0 if ip_address(unicode(map_resolver_ip)).version \
+ == 4 else 1,
+ ip_address=ip_address(unicode(map_resolver_ip)).packed)
+
+ cmd = 'lisp_add_del_map_resolver'
+ err_msg = "Failed to add map resolver on host {host}".format(
+ host=node['host'])
+
+ with PapiSocketExecutor(node) as papi_exec:
+ papi_exec.add(cmd, **args).get_reply(err_msg)
@staticmethod
def vpp_del_map_resolver(node, map_resolver_ip):
@@ -273,10 +356,17 @@ class LispMapResolver(object):
:type map_resolver_ip: str
"""
- VatExecutor.cmd_from_template(node,
- 'lisp/del_lisp_map_resolver.vat',
- address=map_resolver_ip)
+ args = dict(is_add=0,
+ is_ipv6=0 if ip_address(unicode(map_resolver_ip)).version \
+ == 4 else 1,
+ ip_address=ip_address(unicode(map_resolver_ip)).packed)
+
+ cmd = 'lisp_add_del_map_resolver'
+ err_msg = "Failed to delete map resolver on host {host}".format(
+ host=node['host'])
+ with PapiSocketExecutor(node) as papi_exec:
+ papi_exec.add(cmd, **args).get_reply(err_msg)
class LispLocalEid(object):
"""Class for Lisp local eid API."""
@@ -301,19 +391,26 @@ class LispLocalEid(object):
:type prefix_len: int
"""
- if prefix_len is not None:
- VatExecutor.cmd_from_template(node,
- 'lisp/add_lisp_local_eid.vat',
- vni=vni,
- eid=eid,
- eid_prefix=prefix_len,
- locator_name=locator_set_name)
+ if prefix_len:
+ eid_type = 0 if ip_address(unicode(eid)).version == 4 else 1
+ eid_packed = ip_address(unicode(eid)).packed
else:
- VatExecutor.cmd_from_template(node,
- 'lisp/add_lisp_local_eid_mac.vat',
- vni=vni,
- eid=eid,
- locator_name=locator_set_name)
+ eid_type = 2
+ eid_packed = L2Util.mac_to_bin(eid)
+
+ args = dict(is_add=1,
+ eid_type=eid_type,
+ eid=eid_packed,
+ prefix_len=prefix_len,
+ locator_set_name=locator_set_name,
+ vni=int(vni))
+
+ cmd = 'lisp_add_del_local_eid'
+ err_msg = "Failed to add local eid on host {host}".format(
+ host=node['host'])
+
+ with PapiSocketExecutor(node) as papi_exec:
+ papi_exec.add(cmd, **args).get_reply(err_msg)
@staticmethod
def vpp_del_lisp_local_eid(node, locator_set_name, vni, eid,
@@ -332,20 +429,26 @@ class LispLocalEid(object):
:type prefix_len: int
"""
- if prefix_len is not None:
- VatExecutor.cmd_from_template(node,
- 'lisp/del_lisp_local_eid.vat',
- vni=vni,
- eid=eid,
- eid_prefix=prefix_len,
- locator_name=locator_set_name)
+ if prefix_len:
+ eid_type = 0 if ip_address(unicode(eid)).version == 4 else 1
+ eid_packed = ip_address(unicode(eid)).packed
else:
- VatExecutor.cmd_from_template(node,
- 'lisp/del_lisp_local_eid_mac.vat',
- vni=vni,
- eid=eid,
- locator_name=locator_set_name)
+ eid_type = 2
+ eid_packed = L2Util.mac_to_bin(eid)
+ args = dict(is_add=0,
+ eid_type=eid_type,
+ eid=eid_packed,
+ prefix_len=prefix_len,
+ locator_set_name=locator_set_name,
+ vni=int(vni))
+
+ cmd = 'lisp_add_del_local_eid'
+ err_msg = "Failed to delete local eid on host {host}".format(
+ host=node['host'])
+
+ with PapiSocketExecutor(node) as papi_exec:
+ papi_exec.add(cmd, **args).get_reply(err_msg)
class LispLocator(object):
"""Class for the Lisp Locator API."""
@@ -369,12 +472,18 @@ class LispLocator(object):
:type weight: int
"""
- VatExecutor.cmd_from_template(node,
- 'lisp/add_lisp_locator.vat',
- lisp_name=locator_name,
- sw_if_index=sw_if_index,
- priority=priority,
- weight=weight)
+ args = dict(is_add=1,
+ locator_set_name=locator_name,
+ sw_if_index=sw_if_index,
+ priority=priority,
+ weight=weight)
+
+ cmd = 'lisp_add_del_locator'
+ err_msg = "Failed to add locator on host {host}".format(
+ host=node['host'])
+
+ with PapiSocketExecutor(node) as papi_exec:
+ papi_exec.add(cmd, **args).get_reply(err_msg)
@staticmethod
def vpp_del_lisp_locator(node, locator_name, sw_if_index, priority, weight):
@@ -392,13 +501,18 @@ class LispLocator(object):
:type weight: int
"""
- VatExecutor.cmd_from_template(node,
- 'lisp/del_lisp_locator.vat',
- lisp_name=locator_name,
- sw_if_index=sw_if_index,
- priority=priority,
- weight=weight)
+ args = dict(is_add=0,
+ locator_set_name=locator_name,
+ sw_if_index=sw_if_index,
+ priority=priority,
+ weight=weight)
+
+ cmd = 'lisp_add_del_locator'
+ err_msg = "Failed to delete locator on host {host}".format(
+ host=node['host'])
+ with PapiSocketExecutor(node) as papi_exec:
+ papi_exec.add(cmd, **args).get_reply(err_msg)
class LispLocatorSet(object):
"""Class for Lisp Locator Set API."""
@@ -416,9 +530,17 @@ class LispLocatorSet(object):
:type name: str
"""
- VatExecutor.cmd_from_template(node,
- 'lisp/add_lisp_locator_set.vat',
- lisp_name=name)
+ args = dict(is_add=1,
+ locator_set_name=name,
+ locator_num=0,
+ locators=[])
+
+ cmd = 'lisp_add_del_locator_set'
+ err_msg = "Failed to add locator set on host {host}".format(
+ host=node['host'])
+
+ with PapiSocketExecutor(node) as papi_exec:
+ papi_exec.add(cmd, **args).get_reply(err_msg)
@staticmethod
def vpp_del_lisp_locator_set(node, name):
@@ -430,10 +552,17 @@ class LispLocatorSet(object):
:type name: str
"""
- VatExecutor.cmd_from_template(node,
- 'lisp/del_lisp_locator_set.vat',
- lisp_name=name)
+ args = dict(is_add=0,
+ locator_set_name=name,
+ locator_num=0,
+ locators=[])
+
+ cmd = 'lisp_add_del_locator_set'
+ err_msg = "Failed to delete locator set on host {host}".format(
+ host=node['host'])
+ with PapiSocketExecutor(node) as papi_exec:
+ papi_exec.add(cmd, **args).get_reply(err_msg)
class LispSetup(object):
"""Lisp setup in topology."""
@@ -590,20 +719,6 @@ class LispSetup(object):
for map_ip in map_resolver:
lisp_map_res.vpp_del_map_resolver(node, map_ip.get('map resolver'))
- @staticmethod
- def vpp_lisp_gpe_interface_status(node, state):
- """Set lisp gpe interface status on VPP node in topology.
-
- :param node: VPP node.
- :param state: State of the gpe iface, up or down
- :type node: dict
- :type state: str
- """
-
- lgi = LispGpeIface()
- lgi.vpp_lisp_gpe_iface(node, state)
-
-
class LispEidTableMap(object):
"""
Class for EID table map.
@@ -623,11 +738,29 @@ class LispEidTableMap(object):
:type bd_id: int
:type vrf: int
"""
+
+ # adding default mapping vni=0, vrf=0 needs to be skipped
+ skip = False
+
if bd_id:
- bd_or_vrf = 'bd_index {}'.format(bd_id)
+ is_l2 = 1
+ dp_table = bd_id
else:
- bd_or_vrf = 'vrf {}'.format(vrf)
- VatExecutor.cmd_from_template(node,
- 'lisp/lisp_eid_table_add_del_map.vat',
- vni=vni,
- bd_or_vrf=bd_or_vrf)
+ is_l2 = 0
+ dp_table = vrf
+ # skip adding default mapping
+ if (int(vrf) == 0) and (int(vni) == 0):
+ skip = True
+
+ args = dict(is_add=1,
+ vni=int(vni),
+ dp_table=int(dp_table),
+ is_l2=is_l2)
+
+ cmd = 'lisp_eid_table_add_del_map'
+ err_msg = "Failed to add eid table map on host {host}".format(
+ host=node['host'])
+
+ if not skip:
+ with PapiSocketExecutor(node) as papi_exec:
+ papi_exec.add(cmd, **args).get_reply(err_msg)