X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=csit%2Flibraries%2FSxp.py;h=93a51b85f408c1256cf86767f5321a9745678233;hb=17e802a3ed58bb640da1346fd639709803d6b49d;hp=9701cbc794e64d7630653152cebc68dbf7611320;hpb=a4a5368a03a623669f91e2f4900d66c4dc8b5d5c;p=integration%2Ftest.git
diff --git a/csit/libraries/Sxp.py b/csit/libraries/Sxp.py
index 9701cbc794..93a51b85f4 100644
--- a/csit/libraries/Sxp.py
+++ b/csit/libraries/Sxp.py
@@ -4,15 +4,40 @@ from string import Template
def mod(num, base):
+ """Gets modulo of number
+
+ :param num: Number to be used
+ :type num: string
+ :param base: Base used
+ :type base: string
+ :returns: Int representing modulo of specified numbers.
+
+ """
return int(num) % int(base)
def get_ip_from_number(n):
+ """Generate string representing Ipv4 from specified number that is added number 2130706432
+
+ :param n: Number to be converted
+ :type n: int
+ :returns: String containing Ipv4.
+
+ """
ip = IPAddress(2130706432 + n)
return str(ip)
def lower_version(ver1, ver2):
+ """Generate xml containing SGT mach data
+
+ :param ver1: Version of SXP protocol for compare
+ :type ver1: string
+ :param ver2: Version of SXP protocol for compare
+ :type ver2: string
+ :returns: String containing lower from those two specified versions.
+
+ """
v1 = int(ver1[-1:])
v2 = int(ver2[-1:])
if v1 <= v2:
@@ -21,17 +46,279 @@ def lower_version(ver1, ver2):
return ver2
-def parse_connections(input):
- data = json.loads(input)
+def get_filter_entry(seq, entry_type, sgt="", esgt="", acl="", eacl="", pl="", epl=""):
+ """Generate xml containing FilterEntry data
+
+ :param seq: Sequence of entry
+ :type seq: string
+ :param entry_type: Type of entry (permit/deny)
+ :type entry_type: string
+ :param sgt: SGT matches to be added to entry
+ :type sgt: string
+ :param esgt: SGT ranges match to be added to entry
+ :type esgt: string
+ :param acl: ACL matches to be added to entry
+ :type acl: string
+ :param eacl: EACL matches to be added to entry
+ :type eacl: string
+ :param pl: PrefixList matches to be added to entry
+ :type pl: string
+ :param epl: ExtendedPrefixList matches to be added to entry
+ :type epl: string
+ :returns: String containing xml data for request
+
+ """
+ entries = ""
+ # Generate XML request containing combination of Matches of different types
+ if sgt:
+ args = sgt.split(',')
+ entries += add_sgt_matches_xml(args)
+ elif esgt:
+ args = esgt.split(',')
+ entries += add_sgt_range_xml(args[0], args[1])
+ if pl:
+ entries += add_pl_entry_xml(pl)
+ elif epl:
+ args = epl.split(',')
+ entries += add_epl_entry_xml(args[0], args[1], args[2])
+ if acl:
+ args = acl.split(',')
+ entries += add_acl_entry_xml(args[0], args[1])
+ elif eacl:
+ args = eacl.split(',')
+ entries += add_eacl_entry_xml(args[0], args[1], args[2], args[3])
+ # Wrap entries in ACL/PrefixList according to specified values
+ if pl or epl:
+ return add_pl_entry_default_xml(seq, entry_type, entries)
+ return add_acl_entry_default_xml(seq, entry_type, entries)
+
+
+def add_peers(*args):
+ """Generate xml containing Peer mach data
+
+ :param args: Peers data
+ :type args: dict
+ :returns: String containing xml data for request
+
+ """
+ templ = Template('''
+
+ $ip
+ ''')
+ peers = ""
+ for count, value in enumerate(args):
+ peers += templ.substitute({'ip': value})
+ return peers
+
+
+def add_sgt_matches_xml(sgt_entries):
+ """Generate xml containing SGT mach data
+
+ :param sgt_entries: SGT matches
+ :type sgt_entries: string
+ :returns: String containing xml data for request
+
+ """
+ templ = Template('''
+ $sgt''')
+ matches = ""
+ for sgt in sgt_entries:
+ matches += templ.substitute({'sgt': sgt})
+ return matches
+
+
+def add_sgt_range_xml(start, end):
+ """Generate xml containing SGT RangeMach data
+
+ :param start: Start range of SGT
+ :type start: string
+ :param end: End range of SGT
+ :type end: string
+ :returns: String containing xml data for request
+
+ """
+ templ = Template('''
+ $start
+ $end''')
+ match = templ.substitute({'start': start, 'end': end})
+ return match
+
+
+def add_acl_entry_default_xml(seq, entry_type, acl_entries):
+ """Generate xml containing AccessList data
+
+ :param seq: Sequence of PrefixList entry
+ :type seq: string
+ :param entry_type: Entry type (permit/deny)
+ :type entry_type: string
+ :param acl_entries: XML data containing AccessList entries
+ :type acl_entries: string
+ :returns: String containing xml data for request
+
+ """
+ templ = Template('''
+
+ $entry_type
+ $seq$acl_entries
+ ''')
+ matches = templ.substitute(
+ {'seq': seq, 'entry_type': entry_type, 'acl_entries': acl_entries})
+ return matches
+
+
+def add_acl_entry_xml(ip, mask):
+ """Generate xml containing AccessList data
+
+ :param ip: Ipv4/6 address
+ :type ip: string
+ :param mask: Ipv4/6 wildcard mask
+ :type mask: string
+ :returns: String containing xml data for request
+
+ """
+ templ = Template('''
+
+ $ip
+ $mask
+ ''')
+ return templ.substitute({'ip': ip, 'mask': mask})
+
+
+def add_eacl_entry_xml(ip, mask, amask, wmask):
+ """Generate xml containing ExtendedAccessList data
+
+ :param ip: Ipv4/6 address
+ :type ip: string
+ :param mask: Ipv4/6 wildcard mask
+ :type mask: string
+ :param amask: Ipv4/6 address mask
+ :type amask: string
+ :param wmask: Ipv4/6 address wildcard mask
+ :type wmask: string
+ :returns: String containing xml data for request
+
+ """
+ templ = Template('''
+
+ $ip
+ $mask
+
+ $amask
+ $wmask
+
+ ''')
+ return templ.substitute({'ip': ip, 'mask': mask, 'amask': amask, 'wmask': wmask})
+
+
+def add_pl_entry_default_xml(seq, entry_type, pl_entries):
+ """Generate xml containing PrefixList data
+
+ :param seq: Sequence of PrefixList entry
+ :type seq: string
+ :param entry_type: Entry type (permit/deny)
+ :type entry_type: string
+ :param pl_entries: XML data containing PrefixList entries
+ :type pl_entries: string
+ :returns: String containing xml data for request
+
+ """
+ templ = Template('''
+
+ $entry_type
+ $seq$pl_entries
+ ''')
+ return templ.substitute({'seq': seq, 'entry_type': entry_type, 'pl_entries': pl_entries})
+
+
+def add_pl_entry_xml(prefix):
+ """Generate xml containing PrefixList data
+
+ :param prefix: Ipv4/6 prefix
+ :type prefix: string
+ :returns: String containing xml data for request
+
+ """
+ templ = Template('''
+
+ $prefix
+ ''')
+ return templ.substitute({'prefix': prefix})
+
+
+def add_epl_entry_xml(prefix, op, mask):
+ """Generate xml containing Extended PrefixList data
+
+ :param prefix: Ipv4/6 prefix
+ :type prefix: string
+ :param op: PrefixList option (ge/le/eq)
+ :type op: string
+ :param mask: Ipv4/6 Mask
+ :type mask: string
+ :returns: String containing xml data for request
+
+ """
+ templ = Template('''
+
+ $prefix
+
+ $op
+ $mask
+
+ ''')
+ return templ.substitute({'prefix': prefix, 'mask': mask, 'op': op})
+
+
+def parse_peer_groups(groups_json):
+ """Parse JSON string into Array of PeerGroups
+
+ :param groups_json: JSON containing PeerGroups
+ :type groups_json: string
+ :returns: Array containing PeerGroups.
+
+ """
+ data = json.loads(groups_json)
+ groups = data['output']
+ output = []
+ for group in groups.values():
+ output += group
+ return output
+
+
+def parse_connections(connections_json):
+ """Parse JSON string into Array of Connections
+
+ :param connections_json: JSON containing Connections
+ :type connections_json: string
+ :returns: Array containing Connections.
+
+ """
+ data = json.loads(connections_json)
connections = data['output']['connections']
output = []
- for list in connections.values():
- output = output + list
+ for connection in connections.values():
+ output += connection
return output
-def find_connection(input, version, mode, ip, port, state):
- for connection in parse_connections(input):
+def find_connection(connections_json, version, mode, ip, port, state):
+ """Test if Connection with specified values is contained in JSON
+
+ :param connections_json: JSON containing Connections
+ :type connections_json: string
+ :param version: Version of SXP protocol (version1/2/3/4)
+ :type version: string
+ :param mode: Mode of SXP peer (speaker/listener/both)
+ :type mode: string
+ :param ip: Ipv4/6 address of remote peer
+ :type ip: string
+ :param port: Port on with remote peer listens
+ :type port: string
+ :param state: State of connection (on/off/pendingOn/deleteHoldDown)
+ :type state: string
+ :returns: True if Connection with specified params was found, otherwise False.
+
+ """
+ for connection in parse_connections(connections_json):
if (connection['peer-address'] == ip and connection['tcp-port'] == int(port) and connection['mode'] == mode and
connection['version'] == version):
if state == 'none':
@@ -41,8 +328,17 @@ def find_connection(input, version, mode, ip, port, state):
return False
-def parse_prefix_groups(input, source_):
- data = json.loads(input)
+def parse_prefix_groups(prefix_groups_json, source_):
+ """Parse JSON string into Array of PrefixGroups
+
+ :param prefix_groups_json: JSON containing PrefixGroups
+ :type prefix_groups_json: string
+ :param source_: Source of PrefixGroups (sxp/local)
+ :type source_: string
+ :returns: Array containing PrefixGroups.
+
+ """
+ data = json.loads(prefix_groups_json)
bindings = data['sxp-node:master-database']
output = []
for binding in bindings.values():
@@ -53,9 +349,24 @@ def parse_prefix_groups(input, source_):
return output
-def find_binding(input, sgt, prefix, source_, action):
+def find_binding(prefix_groups_json, sgt, prefix, source_, action):
+ """Test if Binding with specified values is contained in JSON
+
+ :param prefix_groups_json: JSON containing Bindings and PrefixGroups
+ :type prefix_groups_json: string
+ :param sgt: Source Group Tag
+ :type sgt: string
+ :param prefix: Ipv4/6 prefix
+ :type prefix: string
+ :param source_: Source of binding (local/sxp)
+ :type source_: string
+ :param action: Action for binding (add/delete)
+ :type action: string
+ :returns: True if Binding with specified params was found, otherwise False.
+
+ """
found = False
- for prefixgroup in parse_prefix_groups(input, source_):
+ for prefixgroup in parse_prefix_groups(prefix_groups_json, source_):
if prefixgroup['sgt'] == int(sgt):
for binding in prefixgroup['binding']:
if binding['ip-prefix'] == prefix and binding['action'] == action:
@@ -63,10 +374,29 @@ def find_binding(input, sgt, prefix, source_, action):
return found
-def find_binding_with_peer_sequence(input, sgt, prefix, source_, action, node_id, peer_seq):
+def find_binding_with_peer_sequence(prefix_groups_json, sgt, prefix, source_, action, node_id, peer_seq):
+ """Test if Binding with specified values is contained in JSON
+
+ :param prefix_groups_json: JSON containing Bindings and PrefixGroups
+ :type prefix_groups_json: string
+ :param sgt: Source Group Tag
+ :type sgt: string
+ :param prefix: Ipv4/6 prefix
+ :type prefix: string
+ :param source_: Source of binding (local/sxp)
+ :type source_: string
+ :param action: Action for binding (add/delete)
+ :type action: string
+ :param node_id: NodeId of from where Binding came from
+ :type node_id: string
+ :param peer_seq: Hop of specified NodeId from where Binding came from
+ :type peer_seq: string
+ :returns: True if Binding with specified params was found, otherwise False.
+
+ """
correct_sequence = False
found_source = False
- for prefixgroup in parse_prefix_groups(input, source_):
+ for prefixgroup in parse_prefix_groups(prefix_groups_json, source_):
if prefixgroup['sgt'] == int(sgt):
for binding in prefixgroup['binding']:
if binding['ip-prefix'] == prefix and binding['action'] == action:
@@ -80,6 +410,17 @@ def find_binding_with_peer_sequence(input, sgt, prefix, source_, action, node_id
def add_entry_xml(sgt, prefix, ip):
+ """Generate xml for Add Bindings request
+
+ :param sgt: Source Group Tag
+ :type sgt: string
+ :param prefix: Ipv4/6 prefix
+ :type prefix: string
+ :param ip: Ipv4 address of node
+ :type ip: string
+ :returns: String containing xml data for request
+
+ """
templ = Template('''
$ip
$sgt
@@ -89,9 +430,26 @@ def add_entry_xml(sgt, prefix, ip):
return data
-def add_connection_xml(version, mode, ip, port, ip_, password_):
+def add_connection_xml(version, mode, ip, port, node, password_):
+ """Generate xml for Add Connection request
+
+ :param version: Version of SXP protocol (version1/2/3/4)
+ :type version: string
+ :param mode: Mode of SXP peer (speaker/listener/both)
+ :type mode: string
+ :param ip: Ipv4/6 address of remote peer
+ :type ip: string
+ :param port: Port on with remote peer listens
+ :type port: string
+ :param node: Ipv4 address of node
+ :type node: string
+ :param password_: Password type (none/default)
+ :type password_: string
+ :returns: String containing xml data for request
+
+ """
templ = Template('''
- $ip_
+ $node
$ip
@@ -110,11 +468,22 @@ def add_connection_xml(version, mode, ip, port, ip_, password_):
''')
data = templ.substitute(
- {'ip': ip, 'port': port, 'mode': mode, 'version': version, 'ip_': ip_, 'password_': password_})
+ {'ip': ip, 'port': port, 'mode': mode, 'version': version, 'node': node, 'password_': password_})
return data
def delete_connections_xml(address, port, node):
+ """Generate xml for Delete Connection request
+
+ :param address: Ipv4/6 address of remote peer
+ :type address: string
+ :param port: Port on with remote peer listens
+ :type port: string
+ :param node: Ipv4 address of node
+ :type node: string
+ :returns: String containing xml data for request
+
+ """
templ = Template('''
$node
$address
@@ -125,6 +494,21 @@ def delete_connections_xml(address, port, node):
def update_binding_xml(sgt0, prefix0, sgt1, prefix1, ip):
+ """Generate xml for Update Binding request
+
+ :param sgt0: Original Source Group Tag
+ :type sgt0: string
+ :param prefix0: Original Ipv4/6 prefix
+ :type prefix0: string
+ :param sgt1: New Source Group Tag
+ :type sgt1: string
+ :param prefix1: New Ipv4/6 prefix
+ :type prefix1: string
+ :param ip: Ipv4 address of node
+ :type ip: string
+ :returns: String containing xml data for request
+
+ """
templ = Template('''
$ip
@@ -142,6 +526,17 @@ def update_binding_xml(sgt0, prefix0, sgt1, prefix1, ip):
def delete_binding_xml(sgt, prefix, ip):
+ """Generate xml for Delete Binding request
+
+ :param sgt: Source Group Tag
+ :type sgt: string
+ :param prefix: Ipv4/6 prefix
+ :type prefix: string
+ :param ip: Ipv4 address of node
+ :type ip: string
+ :returns: String containing xml data for request
+
+ """
templ = Template('''
$ip
$sgt
@@ -151,7 +546,119 @@ def delete_binding_xml(sgt, prefix, ip):
return data
+def add_peer_group_xml(name, peers, ip):
+ """Generate xml for Add PeerGroups request
+
+ :param name: Name of PeerGroup
+ :type name: string
+ :param peers: XML formatted peers that will be added to group
+ :type peers: string
+ :param ip: Ipv4 address of node
+ :type ip: string
+ :returns: String containing xml data for request
+
+ """
+ templ = Template('''
+ $ip
+
+ $name
+ $peers
+
+''')
+ data = templ.substitute({'name': name, 'peers': peers, 'ip': ip})
+ return data
+
+
+def delete_peer_group_xml(name, ip):
+ """Generate xml for Delete PeerGroup request
+
+ :param name: Name of PeerGroup
+ :type name: string
+ :param ip: Ipv4 address of node
+ :type ip: string
+ :returns: String containing xml data for request
+
+ """
+ templ = Template('''
+ $ip
+ $name
+''')
+ data = templ.substitute({'name': name, 'ip': ip})
+ return data
+
+
+def get_peer_groups_from_node_xml(ip):
+ """Generate xml for Get PeerGroups request
+
+ :param ip: Ipv4 address of node
+ :type ip: string
+ :returns: String containing xml data for request
+
+ """
+ templ = Template('''
+ $ip
+''')
+ data = templ.substitute({'ip': ip})
+ return data
+
+
+def add_filter_xml(group, filter_type, entries, ip):
+ """Generate xml for Add Filter request
+
+ :param group: Name of group containing filter
+ :type group: string
+ :param filter_type: Type of filter
+ :type filter_type: string
+ :param entries: XML formatted entries that will be added in filter
+ :type entries: string
+ :param ip: Ipv4 address of node
+ :type ip: string
+ :returns: String containing xml data for request
+
+
+ """
+ templ = Template('''
+ $ip
+ $group
+
+ $filter_type$entries
+
+''')
+ data = templ.substitute(
+ {'group': group, 'filter_type': filter_type, 'ip': ip, 'entries': entries})
+ return data
+
+
+def delete_filter_xml(group, filter_type, ip):
+ """Generate xml for Delete Filter request
+
+ :param group: Name of group containing filter
+ :type group: string
+ :param filter_type: Type of filter
+ :type filter_type: string
+ :param ip: Ipv4 address of node
+ :type ip: string
+ :returns: String containing xml data for request
+
+ """
+ templ = Template('''
+ $ip
+ $group
+ $filter_type
+''')
+ data = templ.substitute(
+ {'group': group, 'filter_type': filter_type, 'ip': ip})
+ return data
+
+
def get_connections_from_node_xml(ip):
+ """Generate xml for Get Connections request
+
+ :param ip: Ipv4 address of node
+ :type ip: string
+ :returns: String containing xml data for request
+
+ """
templ = Template('''
$ip
''')
@@ -160,6 +667,13 @@ def get_connections_from_node_xml(ip):
def get_bindings_from_node_xml(ip):
+ """Generate xml for Get Bindings request
+
+ :param ip: Ipv4 address of node
+ :type ip: string
+ :returns: String containing xml data for request
+
+ """
templ = Template('''
$ip
''')