aboutsummaryrefslogtreecommitdiffstats
path: root/resources/libraries
diff options
context:
space:
mode:
Diffstat (limited to 'resources/libraries')
-rw-r--r--resources/libraries/python/IPsecUtil.py108
-rw-r--r--resources/libraries/python/VatExecutor.py4
-rw-r--r--resources/libraries/robot/crypto/ipsec.robot13
3 files changed, 63 insertions, 62 deletions
diff --git a/resources/libraries/python/IPsecUtil.py b/resources/libraries/python/IPsecUtil.py
index a9cc6d155e..2479ec1822 100644
--- a/resources/libraries/python/IPsecUtil.py
+++ b/resources/libraries/python/IPsecUtil.py
@@ -20,9 +20,9 @@ from enum import Enum, IntEnum
from robot.api import logger
from resources.libraries.python.PapiExecutor import PapiExecutor
-from resources.libraries.python.PapiErrors import PapiError, PapiCommandError
+from resources.libraries.python.PapiErrors import PapiError
from resources.libraries.python.topology import Topology
-from resources.libraries.python.VatExecutor import VatExecutor, VatTerminal
+from resources.libraries.python.VatExecutor import VatExecutor
from resources.libraries.python.VatJsonUtil import VatJsonUtil
@@ -66,7 +66,7 @@ class IntegAlg(Enum):
class IPsecProto(IntEnum):
"""IPsec protocol."""
ESP = 1
- AH = 0
+ SEC_AH = 0
class IPsecUtil(object):
@@ -240,7 +240,7 @@ class IPsecUtil(object):
:returns: IPsecProto enum AH object.
:rtype: IPsecProto
"""
- return int(IPsecProto.AH)
+ return int(IPsecProto.SEC_AH)
@staticmethod
def vpp_ipsec_select_backend(node, protocol, index=1):
@@ -305,16 +305,15 @@ class IPsecUtil(object):
except AssertionError:
raise PapiError('Failed to dump IPsec backends on host {host}'.
format(host=node['host']))
- api_reply = papi_executor.get_papi_reply()
+ # After API change there is returned VPP internal enum object
+ # representing VPP IPSEC protocol instead of integer representation
+ # so JSON fails to decode it - we need to check if it is Python API
+ # bug or we need to adapt vpp_papi_provider to correctly encode
+ # such object into JSON
+ # api_reply = papi_executor.get_papi_reply()
+ api_reply = papi_executor.get_papi_stdout()
if api_reply is not None:
- # api_r = api_reply[0]['api_reply']['ipsec_select_backend_reply']
- # if api_r['retval'] == 0:
- # logger.trace('IPsec backend successfully selected on host '
- # '{host}'.format(host=node['host']))
- # else:
- # raise PapiError('Failed to select IPsec backend on host {host}'.
- # format(host=node['host']))
logger.trace('IPsec backend dump\n{dump}'.format(dump=api_reply))
else:
raise PapiError('No reply received for ipsec_select_backend API '
@@ -349,7 +348,7 @@ class IPsecUtil(object):
"""
ckey = crypto_key.encode('hex')
ikey = integ_key.encode('hex')
- tunnel = 'tunnel_src {0} tunnel_dst {1}'.format(tunnel_src, tunnel_dst)\
+ tunnel = 'tunnel-src {0} tunnel-dst {1}'.format(tunnel_src, tunnel_dst)\
if tunnel_src is not None and tunnel_dst is not None else ''
out = VatExecutor.cmd_from_template(node,
@@ -396,16 +395,16 @@ class IPsecUtil(object):
tmp_filename = '/tmp/ipsec_sad_{0}_add_del_entry.script'.format(sad_id)
ckey = crypto_key.encode('hex')
ikey = integ_key.encode('hex')
- tunnel = 'tunnel_src {0} tunnel_dst {1}'.format(tunnel_src, tunnel_dst)\
+ tunnel = 'tunnel-src {0} tunnel-dst {1}'.format(tunnel_src, tunnel_dst)\
if tunnel_src is not None and tunnel_dst is not None else ''
- integ = 'integ_alg {0} integ_key {1}'.format(integ_alg.alg_name, ikey)\
+ integ = 'integ-alg {0} integ-key {1}'.format(integ_alg.alg_name, ikey)\
if crypto_alg.alg_name != 'aes-gcm-128' else ''
with open(tmp_filename, 'w') as tmp_file:
for i in range(0, n_entries):
- buf_str = 'ipsec_sad_add_del_entry esp sad_id {0} spi {1} ' \
- 'crypto_alg {2} crypto_key {3} {4} {5}\n'.format(
+ buf_str = 'exec ipsec sa add {0} esp spi {1} ' \
+ 'crypto-alg {2} crypto-key {3} {4} {5}\n'.format(
sad_id+i, spi+i, crypto_alg.alg_name, ckey, integ,
tunnel)
tmp_file.write(buf_str)
@@ -430,10 +429,9 @@ class IPsecUtil(object):
ckey = crypto_key.encode('hex')
ikey = integ_key.encode('hex')
- out = VatExecutor.cmd_from_template(node,
- 'ipsec/ipsec_sa_set_key.vat',
- sa_id=sa_id,
- ckey=ckey, ikey=ikey)
+ out = VatExecutor.cmd_from_template(
+ node, 'ipsec/ipsec_sa_set_key.vat', json_param=False, sa_id=sa_id,
+ ckey=ckey, ikey=ikey)
VatJsonUtil.verify_vat_retval(
out[0],
err_msg='Update SA key failed on {0}'.format(node['host']))
@@ -476,9 +474,10 @@ class IPsecUtil(object):
interface, spd_id, node['host']))
@staticmethod
- def vpp_ipsec_spd_add_entry(node, spd_id, priority, action, inbound=True,
- sa_id=None, laddr_range=None, raddr_range=None,
- proto=None, lport_range=None, rport_range=None):
+ def vpp_ipsec_policy_add(node, spd_id, priority, action, inbound=True,
+ sa_id=None, laddr_range=None, raddr_range=None,
+ proto=None, lport_range=None, rport_range=None,
+ is_ipv6=False):
"""Create Security Policy Database entry on the VPP node.
:param node: VPP node to add SPD entry on.
@@ -499,6 +498,8 @@ class IPsecUtil(object):
<port_start>-<port_end>.
:param rport_range: Policy selector remote TCP/UDP port range in format
<port_start>-<port_end>.
+ :param is_ipv6: True in case of IPv6 policy when IPv6 address range is
+ not defined so it will default to address ::/0, otherwise False.
:type node: dict
:type spd_id: int
:type priority: int
@@ -510,40 +511,44 @@ class IPsecUtil(object):
:type proto: int
:type lport_range: string
:type rport_range: string
+ :type is_ipv6: bool
"""
direction = 'inbound' if inbound else 'outbound'
+ if laddr_range is None and is_ipv6:
+ laddr_range = '::/0'
+
+ if raddr_range is None and is_ipv6:
+ raddr_range = '::/0'
+
act_str = action.value
if PolicyAction.PROTECT == action and sa_id is not None:
- act_str += 'sa_id {0}'.format(sa_id)
+ act_str += ' sa {0}'.format(sa_id)
selector = ''
if laddr_range is not None:
net = ip_network(unicode(laddr_range), strict=False)
- selector += 'laddr_start {0} laddr_stop {1} '.format(
+ selector += 'local-ip-range {0} - {1} '.format(
net.network_address, net.broadcast_address)
if raddr_range is not None:
net = ip_network(unicode(raddr_range), strict=False)
- selector += 'raddr_start {0} raddr_stop {1} '.format(
+ selector += 'remote-ip-range {0} - {1} '.format(
net.network_address, net.broadcast_address)
if proto is not None:
selector += 'protocol {0} '.format(proto)
if lport_range is not None:
- selector += 'lport_start {p[0]} lport_stop {p[1]} '.format(
- p=lport_range.split('-'))
+ selector += 'local-port-range {0} '.format(lport_range)
if rport_range is not None:
- selector += 'rport_start {p[0]} rport_stop {p[1]} '.format(
- p=rport_range.split('-'))
+ selector += 'remote-port-range {0} '.format(rport_range)
- out = VatExecutor.cmd_from_template(node,
- 'ipsec/ipsec_spd_add_entry.vat',
- spd_id=spd_id, priority=priority,
- action=act_str, direction=direction,
- selector=selector)
+ out = VatExecutor.cmd_from_template(
+ node, 'ipsec/ipsec_policy_add.vat', json_param=False, spd_id=spd_id,
+ priority=priority, action=act_str, direction=direction,
+ selector=selector)
VatJsonUtil.verify_vat_retval(
out[0],
- err_msg='Add entry to SPD {0} failed on {1}'.format(spd_id,
- node['host']))
+ err_msg='Add IPsec policy ID {0} failed on {1}'.format(
+ spd_id, node['host']))
@staticmethod
def vpp_ipsec_spd_add_entries(node, n_entries, spd_id, priority, inbound,
@@ -578,13 +583,13 @@ class IPsecUtil(object):
direction = 'inbound' if inbound else 'outbound'
addr_incr = 1 << (32 - raddr_range)
addr_ip = int(ip_address(unicode(raddr_ip)))
- start_str = 'ipsec_spd_add_del_entry spd_id {0} priority {1} {2} ' \
- 'action protect sa_id'.format(spd_id, priority, direction)
+ start_str = 'exec ipsec policy add spd {0} priority {1} {2} ' \
+ 'action protect sa'.format(spd_id, priority, direction)
with open(tmp_filename, 'w') as tmp_file:
for i in range(0, n_entries):
r_ip_s = ip_address(addr_ip + addr_incr * i)
r_ip_e = ip_address(addr_ip + addr_incr * (i+1) - 1)
- buf_str = '{0} {1} raddr_start {2} raddr_stop {3}\n'.format(
+ buf_str = '{0} {1} remote-ip-range {2} - {3}\n'.format(
start_str, sa_id+i, r_ip_s, r_ip_e)
tmp_file.write(buf_str)
vat = VatExecutor()
@@ -649,7 +654,6 @@ class IPsecUtil(object):
with open(tmp_fn1, 'w') as tmp_f1, open(tmp_fn2, 'w') as tmp_f2:
for i in range(0, n_tunnels):
integ = ''
- # if crypto_alg.alg_name != 'aes-gcm-128':
if not crypto_alg.alg_name.startswith('aes-gcm-'):
integ = 'integ_alg {integ_alg} '\
'local_integ_key {local_integ_key} '\
@@ -777,21 +781,17 @@ class IPsecUtil(object):
IPsecUtil.vpp_ipsec_add_spd(node1, spd_id)
IPsecUtil.vpp_ipsec_spd_add_if(node1, spd_id, interface1)
- IPsecUtil.vpp_ipsec_spd_add_entry(node1, spd_id, p_hi,
- PolicyAction.BYPASS, inbound=False,
- proto=proto)
- IPsecUtil.vpp_ipsec_spd_add_entry(node1, spd_id, p_hi,
- PolicyAction.BYPASS, inbound=True,
- proto=proto)
+ IPsecUtil.vpp_ipsec_policy_add(node1, spd_id, p_hi, PolicyAction.BYPASS,
+ inbound=False, proto=proto)
+ IPsecUtil.vpp_ipsec_policy_add(node1, spd_id, p_hi, PolicyAction.BYPASS,
+ inbound=True, proto=proto)
IPsecUtil.vpp_ipsec_add_spd(node2, spd_id)
IPsecUtil.vpp_ipsec_spd_add_if(node2, spd_id, interface2)
- IPsecUtil.vpp_ipsec_spd_add_entry(node2, spd_id, p_hi,
- PolicyAction.BYPASS, inbound=False,
- proto=proto)
- IPsecUtil.vpp_ipsec_spd_add_entry(node2, spd_id, p_hi,
- PolicyAction.BYPASS, inbound=True,
- proto=proto)
+ IPsecUtil.vpp_ipsec_policy_add(node2, spd_id, p_hi, PolicyAction.BYPASS,
+ inbound=False, proto=proto)
+ IPsecUtil.vpp_ipsec_policy_add(node2, spd_id, p_hi, PolicyAction.BYPASS,
+ inbound=True, proto=proto)
IPsecUtil.vpp_ipsec_add_sad_entries(node1, n_tunnels, sa_id_1, spi_1,
crypto_alg, crypto_key, integ_alg,
diff --git a/resources/libraries/python/VatExecutor.py b/resources/libraries/python/VatExecutor.py
index 03379ba33f..1f7a6f8d6d 100644
--- a/resources/libraries/python/VatExecutor.py
+++ b/resources/libraries/python/VatExecutor.py
@@ -201,7 +201,7 @@ class VatExecutor(object):
return self._stderr
@staticmethod
- def cmd_from_template(node, vat_template_file, **vat_args):
+ def cmd_from_template(node, vat_template_file, json_param=True, **vat_args):
"""Execute VAT script on specified node. This method supports
script templates with parameters.
@@ -210,7 +210,7 @@ class VatExecutor(object):
:param vat_args: Arguments to the template file.
:returns: List of JSON objects returned by VAT.
"""
- with VatTerminal(node) as vat:
+ with VatTerminal(node, json_param=json_param) as vat:
return vat.vat_terminal_exec_cmd_from_template(vat_template_file,
**vat_args)
diff --git a/resources/libraries/robot/crypto/ipsec.robot b/resources/libraries/robot/crypto/ipsec.robot
index 5064646212..91a4847671 100644
--- a/resources/libraries/robot/crypto/ipsec.robot
+++ b/resources/libraries/robot/crypto/ipsec.robot
@@ -160,6 +160,7 @@
| | [Arguments] | ${node} | ${interface} | ${crypto_alg} | ${crypto_key}
| | ... | ${integ_alg} | ${integ_key} | ${l_spi} | ${r_spi} | ${l_ip}
| | ... | ${r_ip} | ${l_tunnel}=${None} | ${r_tunnel}=${None}
+| | ... | ${is_ipv6}=${FALSE}
| | Set Test Variable | ${l_sa_id} | ${10}
| | Set Test Variable | ${r_sa_id} | ${20}
| | ${spd_id}= | Set Variable | ${1}
@@ -174,15 +175,15 @@
| | VPP IPsec Add SPD | ${node} | ${spd_id}
| | VPP IPsec SPD Add If | ${node} | ${spd_id} | ${interface}
| | ${action}= | Policy Action Bypass
-| | VPP IPsec SPD Add Entry | ${node} | ${spd_id} | ${p_hi} | ${action}
-| | ... | inbound=${TRUE} | proto=${ESP_PROTO}
-| | VPP IPsec SPD Add Entry | ${node} | ${spd_id} | ${p_hi} | ${action}
-| | ... | inbound=${FALSE} | proto=${ESP_PROTO}
+| | VPP IPsec Policy Add | ${node} | ${spd_id} | ${p_hi} | ${action}
+| | ... | inbound=${TRUE} | proto=${ESP_PROTO} | is_ipv6=${is_ipv6}
+| | VPP IPsec Policy Add | ${node} | ${spd_id} | ${p_hi} | ${action}
+| | ... | inbound=${FALSE} | proto=${ESP_PROTO} | is_ipv6=${is_ipv6}
| | ${action}= | Policy Action Protect
-| | VPP IPsec SPD Add Entry | ${node} | ${spd_id} | ${p_lo} | ${action}
+| | VPP IPsec Policy Add | ${node} | ${spd_id} | ${p_lo} | ${action}
| | ... | sa_id=${r_sa_id} | laddr_range=${l_ip}
| | ... | raddr_range=${r_ip} | inbound=${TRUE}
-| | VPP IPsec SPD Add Entry | ${node} | ${spd_id} | ${p_lo} | ${action}
+| | VPP IPsec Policy Add | ${node} | ${spd_id} | ${p_lo} | ${action}
| | ... | sa_id=${l_sa_id} | laddr_range=${l_ip}
| | ... | raddr_range=${r_ip} | inbound=${FALSE}