SXP: Add RPC redirecting tests
[integration/test.git] / csit / libraries / Sxp.py
index 6cd5d52e37ce830ef3c2c85a189588a9a4c81b70..4aaf3b094f86c25a85ec6356351daf94163d699a 100644 (file)
@@ -414,11 +414,13 @@ def parse_connections(connections_json):
 
     """
     data = json.loads(connections_json)
-    connections = data['output']['connections']
-    output = []
-    for connection in connections.values():
-        output += connection
-    return output
+    output = data['output']
+    result = []
+    if output:
+        connections = output['connections']
+        for connection in connections.values():
+            result += connection
+    return result
 
 
 def find_connection(connections_json, version, mode, ip, port, state):
@@ -441,7 +443,7 @@ def find_connection(connections_json, version, mode, ip, port, state):
     """
     for connection in parse_connections(connections_json):
         if (connection['peer-address'] == ip and connection['tcp-port'] == int(port) and (
-                        mode.strip() == 'any' or connection['mode'] == mode) and connection['version'] == version):
+                mode.strip() == 'any' or connection['mode'] == mode) and connection['version'] == version):
             if state == 'none':
                 return True
             elif connection['state'] == state:
@@ -531,30 +533,6 @@ def find_binding_legacy(prefix_groups_json, sgt, prefix, source_, action):
     return found
 
 
-def add_entry_xml(sgt, prefix, ip, domain_name):
-    """Generate xml for Add Bindings request
-
-    :param sgt: Source Group Tag
-    :type sgt: str
-    :param prefix: Ipv4/6 prefix
-    :type prefix: str
-    :param ip: Ipv4 address of node
-    :type ip: str
-    :param domain_name: Name of Domain
-    :type domain_name: str
-    :returns: String containing xml data for request
-
-    """
-    templ = Template('''<input>
-  <requested-node xmlns="urn:opendaylight:sxp:controller">$ip</requested-node>
-  $domain
-  <sgt xmlns="urn:opendaylight:sxp:controller">$sgt</sgt>
-  <ip-prefix xmlns="urn:opendaylight:sxp:controller">$prefix</ip-prefix>
-</input>''')
-    data = templ.substitute({'sgt': sgt, 'prefix': prefix, 'ip': ip, 'domain': get_domain_name(domain_name)})
-    return data
-
-
 def add_connection_xml(version, mode, ip, port, node, password_, domain_name, bindings_timeout=0, security_mode=''):
     """Generate xml for Add Connection request
 
@@ -596,6 +574,9 @@ def add_connection_xml(version, mode, ip, port, node, password_, domain_name, bi
             <keep-alive-time>30</keep-alive-time>
             <reconciliation-time>$timeout</reconciliation-time>
             <delete-hold-down-time>$timeout</delete-hold-down-time>
+            <hold-time>90</hold-time>
+            <hold-time-max>180</hold-time-max>
+            <hold-time-min>90</hold-time-min>
          </connection-timers>
       </connection>
    </connections>
@@ -632,66 +613,6 @@ def delete_connections_xml(address, port, node, domain_name):
     return data
 
 
-def update_binding_xml(sgt0, prefix0, sgt1, prefix1, ip, domain_name):
-    """Generate xml for Update Binding request
-
-    :param sgt0: Original Source Group Tag
-    :type sgt0: str
-    :param prefix0: Original Ipv4/6 prefix
-    :type prefix0: str
-    :param sgt1: New Source Group Tag
-    :type sgt1: str
-    :param prefix1: New Ipv4/6 prefix
-    :type prefix1: str
-    :param ip: Ipv4 address of node
-    :type ip: str
-    :param domain_name: Name of Domain
-    :type domain_name: str
-    :returns: String containing xml data for request
-
-    """
-    templ = Template('''<input>
-  <requested-node xmlns="urn:opendaylight:sxp:controller">$ip</requested-node>
-  $domain
-  <original-binding xmlns="urn:opendaylight:sxp:controller">
-    <sgt>$sgt0</sgt>
-    <ip-prefix>$prefix0</ip-prefix>
-  </original-binding>
-  <new-binding xmlns="urn:opendaylight:sxp:controller">
-    <sgt>$sgt1</sgt>
-    <ip-prefix>$prefix1</ip-prefix>
-  </new-binding>
-</input>''')
-    data = templ.substitute(
-        {'sgt0': sgt0, 'sgt1': sgt1, 'prefix0': prefix0, 'prefix1': prefix1, 'ip': ip,
-         'domain': get_domain_name(domain_name)})
-    return data
-
-
-def delete_binding_xml(sgt, prefix, ip, domain_name):
-    """Generate xml for Delete Binding request
-
-    :param sgt: Source Group Tag
-    :type sgt: str
-    :param prefix: Ipv4/6 prefix
-    :type prefix: str
-    :param ip: Ipv4 address of node
-    :type ip: str
-    :param domain_name: Name of Domain
-    :type domain_name: str
-    :returns: String containing xml data for request
-
-    """
-    templ = Template('''<input>
-  <requested-node xmlns="urn:opendaylight:sxp:controller">$ip</requested-node>
-  <sgt xmlns="urn:opendaylight:sxp:controller">$sgt</sgt>
-  <ip-prefix xmlns="urn:opendaylight:sxp:controller">$prefix</ip-prefix>
-  $domain
-</input>''')
-    data = templ.substitute({'sgt': sgt, 'prefix': prefix, 'ip': ip, 'domain': get_domain_name(domain_name)})
-    return data
-
-
 def add_peer_group_xml(name, peers, ip):
     """Generate xml for Add PeerGroups request
 
@@ -898,7 +819,8 @@ def get_bindings_from_node_xml(ip, binding_range, domain_name):
     return data
 
 
-def add_node_xml(node_id, port, password, version, node_ip=None, expansion=0, bindings_timeout=0, keystores=None):
+def add_node_xml(node_id, port, password, version, node_ip=None, expansion=0, bindings_timeout=0, keystores=None,
+                 retry_open_timer=1):
     """Generate xml for Add Node request
 
     :param node_id: Ipv4 address formatted node id
@@ -944,7 +866,7 @@ def add_node_xml(node_id, port, password, version, node_ip=None, expansion=0, bi
     templ = Template('''<input xmlns="urn:opendaylight:sxp:controller">
     <node-id>$id</node-id>
     <timers>
-        <retry-open-time>1</retry-open-time>
+        <retry-open-time>$retry_open_timer</retry-open-time>
         <hold-time-min-acceptable>120</hold-time-min-acceptable>
         <delete-hold-down-time>$timeout</delete-hold-down-time>
         <hold-time-min>90</hold-time-min>
@@ -962,11 +884,11 @@ def add_node_xml(node_id, port, password, version, node_ip=None, expansion=0, bi
     <version>$version</version>
     <description>ODL SXP Controller</description>
     <source-ip>$ip</source-ip>
-    <master-database></master-database>
 </input>''')
     data = templ.substitute(
         {'ip': node_ip or node_id, 'id': node_id, 'port': port, 'password': password,
-         'version': version, 'expansion': expansion, 'timeout': bindings_timeout, 'tls': tls})
+         'version': version, 'expansion': expansion, 'timeout': bindings_timeout, 'tls': tls,
+         'retry_open_timer': retry_open_timer})
     return data
 
 
@@ -985,21 +907,82 @@ def delete_node_xml(node_id):
     return data
 
 
-def add_domain_xml(node_id, name):
-    """Generate xml for Add Domain request
+def add_domain_xml_fluorine(node_id, name, sgt, prefixes, origin):
+    """Generate xml for Add Domain request (Fluorine version: bindings with origin)
 
     :param node_id: Id of node
     :type node_id: str
     :param name: Name of Domain
     :type name: str
+    :param sgt: Security group
+    :type sgt: int
+    :param prefixes: List of ip-prefixes
+    :type prefixes: str
+    :param origin: Origin of added bindings
+    :type origin: str
     :returns: String containing xml data for request
 
     """
-    templ = Template('''<input>
-  <node-id xmlns="urn:opendaylight:sxp:controller">$id</node-id>
-  <domain-name xmlns="urn:opendaylight:sxp:controller">$name</domain-name>
+    master_database = ''
+    if prefixes != 'None':
+        xml_prefixes = ''
+        for prefix in prefixes.split(','):
+            xml_prefixes += '\n' + '<ip-prefix>' + prefix + '</ip-prefix>'
+        if xml_prefixes:
+            master_database += '''<master-database>
+            <binding>
+                <sgt>$sgt</sgt>
+                $xml_prefixes
+            </binding>
+        </master-database>'''
+            master_database = Template(master_database).substitute(({'sgt': sgt, 'xml_prefixes': xml_prefixes}))
+
+    templ = Template('''<input xmlns="urn:opendaylight:sxp:controller">
+    <node-id>$id</node-id>
+    <domain-name>$name</domain-name>
+    <origin>$origin</origin>
+    $master_database
 </input>''')
-    data = templ.substitute({'name': name, 'id': node_id})
+
+    data = templ.substitute({'name': name, 'id': node_id, 'origin': origin, 'master_database': master_database})
+    return data
+
+
+def add_domain_xml_oxygen(node_id, name, sgt, prefixes):
+    """Generate xml for Add Domain request (Oxygen version: bindings without origin)
+
+    :param node_id: Id of node
+    :type node_id: str
+    :param name: Name of Domain
+    :type name: str
+    :param sgt: Security group
+    :type sgt: int
+    :param prefixes: List of ip-prefixes
+    :type prefixes: str
+    :returns: String containing xml data for request
+
+    """
+    master_database = ''
+    if prefixes != 'None':
+        xml_prefixes = ''
+        for prefix in prefixes.split(','):
+            xml_prefixes += '\n' + '<ip-prefix>' + prefix + '</ip-prefix>'
+        if xml_prefixes:
+            master_database += '''<master-database>
+            <binding>
+                <sgt>$sgt</sgt>
+                $xml_prefixes
+            </binding>
+        </master-database>'''
+            master_database = Template(master_database).substitute(({'sgt': sgt, 'xml_prefixes': xml_prefixes}))
+
+    templ = Template('''<input xmlns="urn:opendaylight:sxp:controller">
+    <node-id>$id</node-id>
+    <domain-name>$name</domain-name>
+    $master_database
+</input>''')
+
+    data = templ.substitute({'name': name, 'id': node_id, 'master_database': master_database})
     return data
 
 
@@ -1013,7 +996,13 @@ def delete_domain_xml(node_id, name):
     :returns: String containing xml data for request
 
     """
-    return add_domain_xml(node_id, name)
+    templ = Template('''<input xmlns="urn:opendaylight:sxp:controller">
+    <node-id>$node_id</node-id>
+    <domain-name>$name</domain-name>
+</input>''')
+
+    data = templ.substitute({'node_id': node_id, 'name': name})
+    return data
 
 
 def get_domain_name(domain_name):
@@ -1030,8 +1019,8 @@ def get_domain_name(domain_name):
         return '<domain-name xmlns="urn:opendaylight:sxp:controller">' + domain_name + '</domain-name>'
 
 
-def add_bindings_xml(node_id, domain, sgt, prefixes):
-    """Generate xml for Add Bindings request
+def add_bindings_xml_fluorine(node_id, domain, sgt, prefixes, origin):
+    """Generate xml for Add Bindings request (Fluorine version with origin type)
 
     :param node_id: Id of node
     :type node_id: str
@@ -1041,21 +1030,55 @@ def add_bindings_xml(node_id, domain, sgt, prefixes):
     :type sgt: int
     :param prefixes: List of ip-prefixes
     :type prefixes: str
+    :param origin: Origin of added bindings
+    :type origin: str
     :returns: String containing xml data for request
 
     """
-    bindings = ''
+    xml_prefixes = ''
     for prefix in prefixes.split(','):
-        bindings += '\n' + '<ip-prefix>' + prefix + '</ip-prefix>'
-    templ = Template('''<input>
-  <node-id xmlns="urn:opendaylight:sxp:controller">$id</node-id>
-  <domain-name xmlns="urn:opendaylight:sxp:controller">$name</domain-name>
-  <binding xmlns="urn:opendaylight:sxp:controller">
-      <sgt>$sgt</sgt>
-      $bindings
-  </binding>
+        xml_prefixes += '\n' + '<ip-prefix>' + prefix + '</ip-prefix>'
+    templ = Template('''<input xmlns="urn:opendaylight:sxp:controller">
+    <node-id>$id</node-id>
+    <domain-name>$name</domain-name>
+    <origin>$origin</origin>
+    <master-database>
+        <binding>
+            <sgt>$sgt</sgt>
+            $xml_prefixes
+        </binding>
+    </master-database>
 </input>''')
-    data = templ.substitute({'name': domain, 'id': node_id, 'sgt': sgt, 'bindings': bindings})
+    data = templ.substitute({'name': domain, 'id': node_id, 'sgt': sgt, 'xml_prefixes': xml_prefixes, 'origin': origin})
+    return data
+
+
+def add_bindings_xml_oxygen(node_id, domain, sgt, prefixes):
+    """Generate xml for Add Bindings request (Oxygen version without origin type)
+
+    :param node_id: Id of node
+    :type node_id: str
+    :param domain: Name of Domain
+    :type domain: str
+    :param sgt: Security group
+    :type sgt: int
+    :param prefixes: List of ip-prefixes
+    :type prefixes: str
+    :returns: String containing xml data for request
+
+    """
+    xml_prefixes = ''
+    for prefix in prefixes.split(','):
+        xml_prefixes += '\n' + '<ip-prefix>' + prefix + '</ip-prefix>'
+    templ = Template('''<input xmlns="urn:opendaylight:sxp:controller">
+    <node-id>$id</node-id>
+    <domain-name>$name</domain-name>
+        <binding>
+            <sgt>$sgt</sgt>
+            $xml_prefixes
+        </binding>
+</input>''')
+    data = templ.substitute({'name': domain, 'id': node_id, 'sgt': sgt, 'xml_prefixes': xml_prefixes})
     return data
 
 
@@ -1068,12 +1091,24 @@ def delete_bindings_xml(node_id, domain, sgt, prefixes):
     :type domain: str
     :param sgt: Security group
     :type sgt: int
-    :param prefixes: List of ip-prefixes
+    :param prefixes: Comma separated list of ip-prefixes
     :type prefixes: str
     :returns: String containing xml data for request
 
     """
-    return add_bindings_xml(node_id, domain, sgt, prefixes)
+    xml_prefixes = ''
+    for prefix in prefixes.split(','):
+        xml_prefixes += '\n' + '<ip-prefix>' + prefix + '</ip-prefix>'
+    templ = Template('''<input xmlns="urn:opendaylight:sxp:controller">
+    <node-id>$id</node-id>
+    <domain-name>$name</domain-name>
+    <binding>
+        <sgt>$sgt</sgt>
+        $xml_prefixes
+    </binding>
+</input>''')
+    data = templ.substitute({'name': domain, 'id': node_id, 'sgt': sgt, 'xml_prefixes': xml_prefixes})
+    return data
 
 
 def prefix_range(start, end):
@@ -1140,3 +1175,104 @@ def route_definitions_xml(routes, old_routes=None):
     ''')
     data = templ.substitute({'routes': routes})
     return data
+
+
+def add_binding_origin_xml(origin, priority):
+    """Generate xml for Add Binding Origin request
+
+    :param origin: Origin type
+    :type origin: str
+    :param priority: Origin priority
+    :type priority: str
+    :returns: String containing xml data for request
+
+    """
+    templ = Template('''<input xmlns="urn:opendaylight:sxp:config:controller">
+    <origin>$origin</origin>
+    <priority>$priority</priority>
+</input>''')
+    data = templ.substitute({'origin': origin, 'priority': priority})
+    return data
+
+
+def update_binding_origin_xml(origin, priority):
+    """Generate xml for Update Binding Origin request
+
+    :param origin: Origin type
+    :type origin: str
+    :param priority: Origin priority
+    :type priority: str
+    :returns: String containing xml data for request
+
+    """
+    templ = Template('''<input xmlns="urn:opendaylight:sxp:config:controller">
+    <origin>$origin</origin>
+    <priority>$priority</priority>
+</input>''')
+    data = templ.substitute({'origin': origin, 'priority': priority})
+    return data
+
+
+def delete_binding_origin_xml(origin):
+    """Generate xml for Delete Binding Origin request
+
+    :param origin: Origin type
+    :type origin: str
+    :returns: String containing xml data for request
+
+    """
+    templ = Template('''<input xmlns="urn:opendaylight:sxp:config:controller">
+    <origin>$origin</origin>
+</input>''')
+    data = templ.substitute({'origin': origin})
+    return data
+
+
+def find_binding_origin(origins_json, origin):
+    """Test if Binding origin of specified value is contained in JSON
+
+    :param origins_json: JSON containing Binding origins
+    :type origins_json: str
+    :param origin: Origin to be found
+    :type origin: str
+    :returns: True if Binding origin of specified origin type was found, otherwise False.
+
+    """
+    for json_origin in parse_binding_origins(origins_json):
+        if json_origin['origin'] == origin:
+            return True
+    return False
+
+
+def find_binding_origin_with_priority(origins_json, origin, priority):
+    """Test if Binding origin of specified value and priority is contained in JSON
+
+    :param origins_json: JSON containing Binding origins
+    :type origins_json: str
+    :param origin: Origin to be found
+    :type origin: str
+    :param priority: desired priority of origin
+    :type priority: str
+    :returns: True if Binding origin of specified origin type with desired priority was found, otherwise False.
+
+    """
+    for json_origin in parse_binding_origins(origins_json):
+        if json_origin['origin'] == origin:
+            if json_origin['priority'] == int(priority):
+                return True
+    return False
+
+
+def parse_binding_origins(origins_json):
+    """Parse JSON string into Array of Binding origins
+
+    :param origins_json: JSON containing Binding origins
+    :type origins_json: str
+    :returns: Array containing Binding origins.
+
+    """
+    output = []
+    for origins in origins_json['binding-origins'].values():
+        for origin in origins:
+            output.append(origin)
+    return output