CSIT-536 HC Test: support testing with ODL client 88/5688/10
authorselias <samelias@cisco.com>
Tue, 7 Mar 2017 14:42:02 +0000 (15:42 +0100)
committerTibor Frank <tifrank@cisco.com>
Tue, 21 Mar 2017 12:00:46 +0000 (12:00 +0000)
Reuses existing restconf test cases to test Honeycomb's netconf interface.
When seding the requests to ODL's Honeycomb mountpoint, ODL translates these
requests to netconf RPCs.

Add new tag "honeycomb_odl" that excludes incompatible test cases.

Change-Id: Ie293449da0129b02db85e30aa4f3266928d7d9f6
Signed-off-by: selias <samelias@cisco.com>
49 files changed:
resources/libraries/python/HTTPRequest.py
resources/libraries/python/constants.py
resources/libraries/python/honeycomb/HcAPIKwInterfaces.py
resources/libraries/python/honeycomb/HcPersistence.py
resources/libraries/python/honeycomb/HoneycombSetup.py
resources/libraries/robot/honeycomb/access_control_lists.robot
resources/libraries/robot/honeycomb/honeycomb.robot
resources/templates/honeycomb/add_vpp_to_topology.xml [deleted file]
resources/templates/honeycomb/config_bridge_domain.url
resources/templates/honeycomb/config_classify_table.url
resources/templates/honeycomb/config_lisp.url
resources/templates/honeycomb/config_nat.url
resources/templates/honeycomb/config_network_topology.url
resources/templates/honeycomb/config_nsh.url
resources/templates/honeycomb/config_plugin_acl.url
resources/templates/honeycomb/config_topology.url [deleted file]
resources/templates/honeycomb/config_topology_node.url [deleted file]
resources/templates/honeycomb/config_vpp_interfaces.url
resources/templates/honeycomb/odl_client/mount_honeycomb.xml [new file with mode: 0644]
resources/templates/honeycomb/odl_client/odl_netconf_connector.url [new file with mode: 0644]
resources/templates/honeycomb/oper_bridge_domains.url
resources/templates/honeycomb/oper_classify_table.url
resources/templates/honeycomb/oper_disabled_interfaces.url
resources/templates/honeycomb/oper_lisp.url
resources/templates/honeycomb/oper_nat.url
resources/templates/honeycomb/oper_network_topology.url
resources/templates/honeycomb/oper_nsh.url
resources/templates/honeycomb/oper_vpp_interfaces.url
resources/templates/honeycomb/oper_vpp_version.url
resources/templates/honeycomb/poll_oper_data.url [deleted file]
tests/func/honeycomb/__init__.robot
tests/func/honeycomb/mgmt-cfg-acl-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-int-apihcnc-func.robot
tests/func/honeycomb/mgmt-cfg-int-subint-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-intip4-intip6-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-inttap-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-intvhost-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-l2bd-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-l2fib-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-lisp-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-nsh-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-pbb-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-pluginacl-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-snat44-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-spanrx-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-vxlan-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-cfg-vxlangpe-apihc-apivat-func.robot
tests/func/honeycomb/mgmt-notif-apihcnc-func.robot
tests/func/honeycomb/mgmt-statepersist-apihc-func.robot

index 1f5df52..adf3d16 100644 (file)
@@ -22,6 +22,7 @@ from enum import IntEnum, unique
 
 from robot.api.deco import keyword
 from robot.api import logger
+from robot.libraries.BuiltIn import BuiltIn
 
 from requests import request, RequestException, Timeout, TooManyRedirects, \
     HTTPError, ConnectionError
@@ -36,6 +37,7 @@ class HTTPCodes(IntEnum):
     UNAUTHORIZED = 401
     FORBIDDEN = 403
     NOT_FOUND = 404
+    CONFLICT = 409
     INTERNAL_SERVER_ERROR = 500
     SERVICE_UNAVAILABLE = 503
 
@@ -167,8 +169,23 @@ class HTTPRequest(object):
         5. there is any other unexpected HTTP request exception.
         """
         timeout = kwargs["timeout"]
+
+        if BuiltIn().get_variable_value("${use_odl_client}"):
+            # TODO: node["honeycomb"]["odl_port"]
+            port = 8181
+            odl_url_part = "/network-topology:network-topology/topology/" \
+                           "topology-netconf/node/vpp/yang-ext:mount"
+        else:
+            port = node["honeycomb"]["port"]
+            odl_url_part = ""
+
+        try:
+            path = path.format(odl_url_part=odl_url_part)
+        except KeyError:
+            pass
+
         url = HTTPRequest.create_full_url(node['host'],
-                                          node['honeycomb']['port'],
+                                          port,
                                           path)
         try:
             auth = HTTPBasicAuth(node['honeycomb']['user'],
@@ -254,7 +271,8 @@ class HTTPRequest(object):
 
     @staticmethod
     @keyword(name="HTTP Post")
-    def post(node, path, headers=None, payload=None, json=None, timeout=10):
+    def post(node, path, headers=None, payload=None, json=None, timeout=10,
+             enable_logging=True):
         """Sends a POST request and returns the response and status code.
 
         :param node: Honeycomb node.
@@ -265,18 +283,23 @@ class HTTPRequest(object):
         :param json: JSON formatted string to send in the body of the Request.
         :param timeout: How long to wait for the server to send data before
         giving up, as a float, or a (connect timeout, read timeout) tuple.
+        :param enable_logging: Used to suppress errors when checking ODL
+        state during suite setup and teardown. When True, logging is enabled,
+        otherwise logging is disabled.
         :type node: dict
         :type path: str
         :type headers: dict
         :type payload: dict, bytes, or file-like object
         :type json: str
         :type timeout: float or tuple
+        :type enable_logging: bool
         :return: Status code and content of response.
         :rtype: tuple
         """
-        return HTTPRequest._http_request('POST', node, path, headers=headers,
-                                         data=payload, json=json,
-                                         timeout=timeout)
+        return HTTPRequest._http_request('POST', node, path,
+                                         enable_logging=enable_logging,
+                                         headers=headers, data=payload,
+                                         json=json, timeout=timeout)
 
     @staticmethod
     @keyword(name="HTTP Delete")
index a280b51..4c3a8ff 100644 (file)
@@ -37,3 +37,6 @@ class Constants(object):
 
     # Honeycomb templates location
     RESOURCES_TPL_HC = 'resources/templates/honeycomb'
+
+    # ODL Client Restconf listener port
+    ODL_PORT = 8181
index 3351ebf..b4746e2 100644 (file)
@@ -1544,7 +1544,7 @@ class InterfaceKeywords(object):
         """
 
         interface = intf.replace("/", "%2F")
-        path = "/interface/{0}/pbb-rewrite/".format(interface)
+        path = "/interface/{0}/pbb-rewrite".format(interface)
         status_code, resp = HcUtil. \
             put_honeycomb_data(node, "config_vpp_interfaces", params, path,
                                data_representation=DataRepresentation.JSON)
index c76a276..83d756f 100644 (file)
@@ -102,3 +102,43 @@ class HcPersistence(object):
         for command in commands:
             (_, stdout, _) = ssh.exec_command_sudo(command)
             logger.info(stdout)
+
+
+    @staticmethod
+    def configure_persistence(node, state):
+        """Enable or disable Honeycomb configuration data persistence.
+
+        :param node: Honeycomb node.
+        :param state: Enable or Disable.
+        :type node: dict
+        :type state: str
+        :raises ValueError: If the state argument is incorrect.
+        :raises HoneycombError: If the operation fails.
+        """
+
+        state = state.lower()
+        if state == "enable":
+            state = "true"
+        elif state == "disable":
+            state = "false"
+        else:
+            raise ValueError("Unexpected value of state argument:"
+                             " {0} provided. Must be enable or disable."
+                             .format(state))
+
+        for setting in ("persist-config", "persist-context"):
+            # find the setting, replace entire line with 'setting: state'
+            find = '\\"{setting}\\":'.format(setting=setting)
+            replace = '\\"{setting}\\": \\"{state}\\",'.format(
+                setting=setting, state=state)
+
+            argument = '"/{0}/c\\ {1}"'.format(find, replace)
+            path = "{0}/config/honeycomb.json".format(Const.REMOTE_HC_DIR)
+            command = "sed -i {0} {1}".format(argument, path)
+
+            ssh = SSH()
+            ssh.connect(node)
+            (ret_code, _, stderr) = ssh.exec_command_sudo(command)
+            if ret_code != 0:
+                raise HoneycombError("Failed to modify configuration on "
+                                     "node {0}, {1}".format(node, stderr))
index 239ac10..117b3e5 100644 (file)
@@ -103,6 +103,36 @@ class HoneycombSetup(object):
             raise HoneycombError('Node(s) {0} failed to stop Honeycomb.'.
                                  format(errors))
 
+    @staticmethod
+    def restart_honeycomb_and_vpp_on_duts(*nodes):
+        """Restart the Honeycomb service on specified DUT nodes.
+
+        Use the keyword "Check Honeycomb Startup State" to check when Honeycomb
+        is fully restarted.
+        :param nodes: List of nodes to restart Honeycomb on.
+        :type nodes: list
+        :raises HoneycombError: If Honeycomb failed to restart.
+        """
+        logger.console("\nRestarting Honeycomb service ...")
+
+        cmd = "sudo service honeycomb restart && sudo service vpp restart"
+        errors = []
+
+        for node in nodes:
+            if node['type'] == NodeType.DUT:
+                ssh = SSH()
+                ssh.connect(node)
+                (ret_code, _, _) = ssh.exec_command_sudo(cmd)
+                if int(ret_code) != 0:
+                    errors.append(node['host'])
+                else:
+                    logger.info("Restart of Honeycomb and VPP on node {0} is "
+                                "in progress ...".format(node['host']))
+        if errors:
+            raise HoneycombError('Node(s) {0} failed to restart Honeycomb'
+                                 ' and/or VPP.'.
+                                 format(errors))
+
     @staticmethod
     def check_honeycomb_startup_state(*nodes):
         """Check state of Honeycomb service during startup on specified nodes.
@@ -372,3 +402,111 @@ class HoneycombSetup(object):
             if ret_code != 0:
                 raise HoneycombError("Failed to copy JVPP libraries on "
                                      "node {0}, {1}".format(node, stderr))
+
+    @staticmethod
+    def find_odl_client(node):
+        """Check if there is a karaf directory in home.
+
+        :param node: Honeycomb node.
+        :type node: dict
+        :returns: True if ODL client is present on node, else False.
+        :rtype: bool
+        """
+
+        ssh = SSH()
+        ssh.connect(node)
+        (ret_code, stdout, _) = ssh.exec_command_sudo(
+            "ls ~ | grep karaf")
+
+        logger.debug(stdout)
+        return not bool(ret_code)
+
+    @staticmethod
+    def start_odl_client(node):
+        """Start ODL client on the specified node.
+
+        karaf should be located in home directory, and VPP and Honeycomb should
+        already be running, otherwise the start will fail.
+        :param node: Nodes to start ODL client on.
+        :type node: dict
+        :raises HoneycombError: If Honeycomb fails to start.
+        """
+
+        logger.console("\nStarting ODL client ...")
+
+        cmd = "~/*karaf*/bin/start"
+
+        ssh = SSH()
+        ssh.connect(node)
+        (ret_code, _, _) = ssh.exec_command_sudo(cmd)
+        if int(ret_code) != 0:
+            raise HoneycombError('Node {0} failed to start ODL.'.
+                                 format(node['host']))
+        else:
+            logger.info("Starting the ODL client on node {0} is "
+                        "in progress ...".format(node['host']))
+
+    @staticmethod
+    def check_odl_startup_state(node):
+        """Check the status of ODL client startup.
+
+        :param node: Honeycomb node.
+        :param node: dict
+        :returns: True when ODL is started.
+        :rtype: bool
+        :raises HoneycombError: When the response is not code 200: OK.
+        """
+
+        path = HcUtil.read_path_from_url_file(
+            "odl_client/odl_netconf_connector")
+        expected_status_codes = (HTTPCodes.UNAUTHORIZED,
+                                 HTTPCodes.FORBIDDEN,
+                                 HTTPCodes.NOT_FOUND,
+                                 HTTPCodes.SERVICE_UNAVAILABLE,
+                                 HTTPCodes.INTERNAL_SERVER_ERROR)
+
+        status_code, _ = HTTPRequest.get(node, path, timeout=10,
+                                         enable_logging=False)
+        if status_code == HTTPCodes.OK:
+            logger.info("ODL client on node {0} is up and running".
+                        format(node['host']))
+        elif status_code in expected_status_codes:
+            if status_code == HTTPCodes.UNAUTHORIZED:
+                logger.info('Unauthorized. If this triggers keyword '
+                            'timeout, verify username and password.')
+            raise HoneycombError('ODL client on node {0} running but '
+                                 'not yet ready.'.format(node['host']),
+                                 enable_logging=False)
+        else:
+            raise HoneycombError('Unexpected return code: {0}.'.
+                                 format(status_code))
+        return True
+
+    @staticmethod
+    def mount_honeycomb_on_odl(node):
+        """Tell ODL client to mount Honeycomb instance over netconf.
+
+        :param node: Honeycomb node.
+        :type node: dict
+        :raises HoneycombError: When the response is not code 200: OK.
+        """
+
+        path = HcUtil.read_path_from_url_file(
+            "odl_client/odl_netconf_connector")
+
+        url_file = "{0}/{1}".format(Const.RESOURCES_TPL_HC,
+                                    "odl_client/mount_honeycomb.xml")
+
+        with open(url_file) as template:
+            data = template.read()
+
+        status_code, _ = HTTPRequest.post(
+            node, path, headers={"Content-Type": "application/xml"},
+            payload=data, timeout=10, enable_logging=False)
+
+        if status_code == HTTPCodes.OK:
+            logger.info("ODL mount point configured successfully.")
+        elif status_code == HTTPCodes.CONFLICT:
+            logger.warn("ODL mount point was already configured.")
+        else:
+            raise HoneycombError('Mount point configuration not successful')
index d45c1f8..a62ea0f 100644 (file)
 | | ... | \| ACL table from Honeycomb should not exist \| ${nodes['DUT1']} \
 | | ... | \| table0 \|
 | | [Arguments] | ${node} | ${table_name}
-| | Run keyword and expect error | ValueError: No JSON object could be decoded
+| | Run keyword and expect error | *
 | | ... | Get classify table oper data | ${node} | ${table_name}
 
 | ACL table from VAT should not exist
index 7d807f8..919c6f5 100644 (file)
@@ -37,7 +37,7 @@
 | | ...
 | | [Arguments] | @{duts}
 | | Start honeycomb on DUTs | @{duts}
-| | Wait until keyword succeeds | 4min | 15sec
+| | Wait until keyword succeeds | 4min | 20sec
 | | ... | Check honeycomb startup state | @{duts}
 
 | Stop honeycomb service on DUTs
@@ -59,7 +59,7 @@
 | | ...
 | | [Arguments] | @{duts}
 | | Stop honeycomb on DUTs | @{duts}
-| | Wait until keyword succeeds | 30sec | 5sec
+| | Wait until keyword succeeds | 60sec | 10sec
 | | ... | Check honeycomb shutdown state | @{duts}
 
 | Clear persisted Honeycomb configuration
 | | Setup DUT | ${node}
 | | Setup Honeycomb service on DUTs | ${node}
 
+| Restart Honeycomb and VPP
+| | [Documentation] | Restarts Honeycomb service and wait until it starts up.
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - information about a DUT node. Type: dictionary
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Restart Honeycomb and VPP \| ${nodes['DUT1']} \|
+| | [Arguments] | ${node}
+| | Log | Performing clean restart of Honeycomb and VPP. | console=True
+| | Restart Honeycomb and VPP on DUTs | ${node}
+| | Wait until keyword succeeds | 4min | 20sec
+| | ... | Check honeycomb startup state | ${node}
+
 | Archive Honeycomb log file
 | | [Documentation] | Copy honeycomb.log file from Honeycomb node\
 | | ... | to test executor.
 | | ...
 | | ... | \| Archive Honeycomb log file \| ${nudes['DUT1']} \|
 | | [Arguments] | ${node}
-| | Archive Honeycomb log | ${node}
\ No newline at end of file
+| | Archive Honeycomb log | ${node}
+
+| Find ODL client on node
+| | [Arguments] | ${node}
+| | ${odl_present}= | Find ODL Client | ${node}
+| | Return from keyword | ${odl_present}
+
+| Start ODL client on node
+| | [Arguments] | ${node}
+| | Start ODL client | ${node}
+| | Wait until keyword succeeds | 4min | 20sec
+| | ... | Mount Honeycomb on ODL | ${node}
+| | Wait until keyword succeeds | 2min | 10sec
+| | ... | Check ODL startup state | ${node}
+| | Wait until keyword succeeds | 2min | 10sec
+| | ... | Check honeycomb startup state | ${node}
diff --git a/resources/templates/honeycomb/add_vpp_to_topology.xml b/resources/templates/honeycomb/add_vpp_to_topology.xml
deleted file mode 100644 (file)
index 46a84f2..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<node xmlns="urn:TBD:params:xml:ns:yang:network-topology">
-    <node-id>{vpp_host}</node-id>
-    <host xmlns="urn:opendaylight:netconf-node-topology">{vpp_ip}</host>
-    <port xmlns="urn:opendaylight:netconf-node-topology">{vpp_port}</port>
-    <username xmlns="urn:opendaylight:netconf-node-topology">{user}</username>
-    <password xmlns="urn:opendaylight:netconf-node-topology">{passwd}</password>
-    <tcp-only xmlns="urn:opendaylight:netconf-node-topology">false</tcp-only>
-    <keepalive-delay xmlns="urn:opendaylight:netconf-node-topology">0</keepalive-delay>
-</node>
\ No newline at end of file
index 03d8f24..8e37a50 100644 (file)
@@ -1 +1 @@
-/restconf/config/v3po:vpp/bridge-domains
\ No newline at end of file
+/restconf/config{odl_url_part}/v3po:vpp/bridge-domains
\ No newline at end of file
index 986b117..042055f 100644 (file)
@@ -1 +1 @@
-/restconf/config/vpp-classifier:vpp-classifier
\ No newline at end of file
+/restconf/config{odl_url_part}/vpp-classifier:vpp-classifier
\ No newline at end of file
index 69e3d51..16652af 100644 (file)
@@ -1 +1 @@
-/restconf/config/lisp:lisp
\ No newline at end of file
+/restconf/config{odl_url_part}/lisp:lisp
\ No newline at end of file
index e323aed..5471493 100644 (file)
@@ -1 +1 @@
-/restconf/config/ietf-nat:nat-config
\ No newline at end of file
+/restconf/config{odl_url_part}/ietf-nat:nat-config
\ No newline at end of file
index fe1b931..4232361 100644 (file)
@@ -1 +1 @@
-/restconf/config/network-topology:network-topology
\ No newline at end of file
+/restconf/config{odl_url_part}/network-topology:network-topology
\ No newline at end of file
index ad14e95..647c461 100644 (file)
@@ -1 +1 @@
-/restconf/config/vpp-nsh:vpp-nsh
\ No newline at end of file
+/restconf/config{odl_url_part}/vpp-nsh:vpp-nsh
\ No newline at end of file
index 79a9670..19a49f2 100644 (file)
@@ -1 +1 @@
-/restconf/config/ietf-access-control-list:access-lists
\ No newline at end of file
+/restconf/config{odl_url_part}/ietf-access-control-list:access-lists
\ No newline at end of file
diff --git a/resources/templates/honeycomb/config_topology.url b/resources/templates/honeycomb/config_topology.url
deleted file mode 100644 (file)
index e76f47c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/restconf/config/network-topology:network-topology/topology/topology-netconf
\ No newline at end of file
diff --git a/resources/templates/honeycomb/config_topology_node.url b/resources/templates/honeycomb/config_topology_node.url
deleted file mode 100644 (file)
index 89b7aa8..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/restconf/config/network-topology:network-topology/topology/topology-netconf/node
\ No newline at end of file
index 3789f5e..03ddc4f 100644 (file)
@@ -1 +1 @@
-/restconf/config/ietf-interfaces:interfaces
\ No newline at end of file
+/restconf/config{odl_url_part}/ietf-interfaces:interfaces
\ No newline at end of file
diff --git a/resources/templates/honeycomb/odl_client/mount_honeycomb.xml b/resources/templates/honeycomb/odl_client/mount_honeycomb.xml
new file mode 100644 (file)
index 0000000..97f43e1
--- /dev/null
@@ -0,0 +1,33 @@
+<module xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
+  <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:connector:netconf">prefix:sal-netconf-connector</type>
+  <name>vpp</name>
+  <address xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:connector:netconf">127.0.0.1</address>
+  <port xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:connector:netconf">2831</port>
+  <username xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:connector:netconf">admin</username>
+  <password xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:connector:netconf">admin</password>
+  <tcp-only xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:connector:netconf">false</tcp-only>
+  <event-executor xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:connector:netconf">
+    <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:netty">prefix:netty-event-executor</type>
+    <name>global-event-executor</name>
+  </event-executor>
+  <binding-registry xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:connector:netconf">
+    <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">prefix:binding-broker-osgi-registry</type>
+    <name>binding-osgi-broker</name>
+  </binding-registry>
+  <dom-registry xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:connector:netconf">
+    <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">prefix:dom-broker-osgi-registry</type>
+    <name>dom-broker</name>
+  </dom-registry>
+  <client-dispatcher xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:connector:netconf">
+    <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:config:netconf">prefix:netconf-client-dispatcher</type>
+    <name>global-netconf-dispatcher</name>
+  </client-dispatcher>
+  <processing-executor xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:connector:netconf">
+    <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:threadpool">prefix:threadpool</type>
+    <name>global-netconf-processing-executor</name>
+  </processing-executor>
+  <keepalive-executor xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:connector:netconf">
+    <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:threadpool">prefix:scheduled-threadpool</type>
+    <name>global-netconf-ssh-scheduled-executor</name>
+  </keepalive-executor>
+</module>
\ No newline at end of file
diff --git a/resources/templates/honeycomb/odl_client/odl_netconf_connector.url b/resources/templates/honeycomb/odl_client/odl_netconf_connector.url
new file mode 100644 (file)
index 0000000..4d7e7d0
--- /dev/null
@@ -0,0 +1 @@
+/restconf/config/network-topology:network-topology/topology/topology-netconf/node/controller-config/yang-ext:mount/config:modules
\ No newline at end of file
index 7c85843..f0fedb4 100644 (file)
@@ -1 +1 @@
-/restconf/operational/v3po:vpp-state/bridge-domains
\ No newline at end of file
+/restconf/operational{odl_url_part}/v3po:vpp-state/bridge-domains
\ No newline at end of file
index f9fd294..a7a0c7e 100644 (file)
@@ -1 +1 @@
-/restconf/operational/vpp-classifier:vpp-classifier-state
\ No newline at end of file
+/restconf/operational{odl_url_part}/vpp-classifier:vpp-classifier-state
\ No newline at end of file
index d885c20..276830d 100644 (file)
@@ -1 +1 @@
-/restconf/operational/v3po-context:disabled-interfaces
\ No newline at end of file
+/restconf/operational{odl_url_part}/v3po-context:disabled-interfaces
\ No newline at end of file
index 850d317..95d19c0 100644 (file)
@@ -1 +1 @@
-/restconf/operational/lisp:lisp-state
\ No newline at end of file
+/restconf/operational{odl_url_part}/lisp:lisp-state
\ No newline at end of file
index 1445f40..a0101bb 100644 (file)
@@ -1 +1 @@
-/restconf/operational/ietf-nat:nat-state
\ No newline at end of file
+/restconf/operational{odl_url_part}/ietf-nat:nat-state
\ No newline at end of file
index e165d3f..14e74ee 100644 (file)
@@ -1 +1 @@
-/restconf/operational/network-topology:network-topology
\ No newline at end of file
+/restconf/operational{odl_url_part}/network-topology:network-topology
\ No newline at end of file
index 5be706d..1b511b3 100644 (file)
@@ -1 +1 @@
-/restconf/operational/vpp-nsh:vpp-nsh-state
\ No newline at end of file
+/restconf/operational{odl_url_part}/vpp-nsh:vpp-nsh-state
\ No newline at end of file
index de6f950..cae9e41 100644 (file)
@@ -1 +1 @@
-/restconf/operational/ietf-interfaces:interfaces-state
\ No newline at end of file
+/restconf/operational{odl_url_part}/ietf-interfaces:interfaces-state
\ No newline at end of file
index 59759be..fbb8820 100644 (file)
@@ -1 +1 @@
-/restconf/operational/v3po:vpp-state/version
\ No newline at end of file
+/restconf/operational{odl_url_part}/v3po:vpp-state/version
\ No newline at end of file
diff --git a/resources/templates/honeycomb/poll_oper_data.url b/resources/templates/honeycomb/poll_oper_data.url
deleted file mode 100644 (file)
index 2fe0438..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/restconf/operations/v3po:vpp-poll-oper-data
\ No newline at end of file
index 1b129d9..9057cef 100644 (file)
 | Resource | resources/libraries/robot/default.robot
 | Resource | resources/libraries/robot/honeycomb/honeycomb.robot
 | Suite Setup | Run Keywords | Setup All DUTs Before Test | AND
-| ... | Clear Persisted Honeycomb Configuration | ${node} | AND
-| ... | Copy Java Libraries | ${node} | AND
-| ... | Configure Unsecured Access | ${node} | AND
-| ... | Enable Module Features | ${node} | AND
-| ... | Configure Log Level | ${node} | TRACE | AND
-| ... | Setup Honeycomb Service On DUTs | ${node} | AND
+| ... | Configure Honeycomb for testing | ${node} | AND
 | ... | Set Global Variable | ${node}
-| Suite Teardown | Run keywords
-| ... | Stop Honeycomb Service On DUTs | ${node} | AND
+| Suite Teardown
 | ... | Archive Honeycomb log file | ${node}
+
+*** Keywords ***
+| Configure Honeycomb for testing
+| | [Arguments] | ${node}
+| | Copy Java Libraries | ${node}
+| | Configure Unsecured Access | ${node}
+| | Enable Module Features | ${node}
+| | Configure Log Level | ${node} | TRACE
+| | Configure Persistence | ${node} | disable
+| | Clear Persisted Honeycomb Configuration | ${node}
+| | Setup Honeycomb Service On DUTs | ${node}
+| | ${use_odl_client}= | Find ODL client on node | ${node}
+| | Set Global Variable | ${use_odl_client}
+| | Run Keyword If | ${use_odl_client}
+| | ... | Start ODL Client on node | ${node}
index fdfc281..b50a48f 100644 (file)
 | Variables | resources/test_data/honeycomb/acl.py
 | Suite Teardown | Run keywords
 | ... | Run Keyword If Any Tests Failed
-| ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| ... | Restart Honeycomb and VPP | ${node}
 | ... | AND | Clear all ACL settings | ${node}
 | Documentation | *Honeycomb access control lists test suite.*
-| Force Tags | Honeycomb_sanity
+| Force Tags | honeycomb_sanity | honeycomb_odl
 
 *** Test Cases ***
 | TC01: Honeycomb can create ACL classify table
index 45a80a4..8f5796a 100644 (file)
@@ -23,7 +23,7 @@
 | ... | REST API.*
 | Force Tags | honeycomb_sanity
 | Suite Teardown
-| ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| ... | Restart Honeycomb and VPP | ${node}
 
 *** Variables ***
 | ${interface}= | ${node['interfaces']['port1']['name']}
index f050a4d..ca1ff99 100644 (file)
@@ -19,8 +19,8 @@
 | Resource | resources/libraries/robot/honeycomb/interfaces.robot
 | Variables | resources/test_data/honeycomb/sub_interfaces.py
 | Suite Teardown
-| ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
-| Force Tags | honeycomb_sanity
+| ... | Restart Honeycomb and VPP | ${node}
+| Force Tags | honeycomb_sanity | honeycomb_odl
 | Documentation | *Honeycomb sub-interface management test suite.*
 
 *** Variables ***
index 6bc6023..fc5069f 100644 (file)
 | Resource | resources/libraries/robot/honeycomb/honeycomb.robot
 | Resource | resources/libraries/robot/testing_path.robot
 | Resource | resources/libraries/robot/ipv6.robot
-| Force Tags | honeycomb_sanity
+| Force Tags | honeycomb_sanity | honeycomb_odl
 | Suite Setup | Vpp nodes ra suppress link layer | ${nodes}
 | Suite Teardown
-| | ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| | ... | Restart Honeycomb and VPP | ${node}
 | Documentation | *Honeycomb interface management test suite.*
 
 *** Test Cases ***
index 05ca9dc..29eb0af 100644 (file)
@@ -26,9 +26,9 @@
 | Resource | resources/libraries/robot/honeycomb/honeycomb.robot
 | Resource | resources/libraries/robot/honeycomb/interfaces.robot
 | Resource | resources/libraries/robot/honeycomb/tap.robot
-| Force Tags | honeycomb_sanity
+| Force Tags | honeycomb_sanity | honeycomb_odl
 | Suite Teardown | Run Keyword If Any Tests Failed
-| ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| ... | Restart Honeycomb and VPP | ${node}
 | Documentation | *Honeycomb TAP management test suite.*
 
 *** Test Cases ***
index 1f5719a..1e37918 100644 (file)
@@ -26,9 +26,9 @@
 | Resource | resources/libraries/robot/default.robot
 | Resource | resources/libraries/robot/honeycomb/honeycomb.robot
 | Resource | resources/libraries/robot/honeycomb/vhost_user.robot
-| Force Tags | honeycomb_sanity
+| Force Tags | honeycomb_sanity | honeycomb_odl
 | Suite Teardown | Run Keyword If Any Tests Failed
-| ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| ... | Restart Honeycomb and VPP | ${node}
 | Documentation | *Honeycomb vhost-user interface management test suite.*
 
 *** Test Cases ***
index 05440ba..dca6a60 100644 (file)
@@ -30,9 +30,9 @@
 | Resource | resources/libraries/robot/honeycomb/bridge_domain.robot
 | Suite Teardown | Run keywords
 | ... | Run Keyword If Any Tests Failed
-| ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| ... | Restart Honeycomb and VPP | ${node}
 | ... | AND | Honeycomb removes all bridge domains | ${node} | @{interfaces}
-| Force Tags | honeycomb_sanity
+| Force Tags | honeycomb_sanity | honeycomb_odl
 | Documentation | *Honeycomb bridge domain management test suite.*
 
 *** Test Cases ***
index 25891dd..ef6a50c 100644 (file)
 | ... | Set test interface down
 | Suite Teardown | Run keywords
 | ... | Run Keyword If Any Tests Failed
-| ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| ... | Restart Honeycomb and VPP | ${node}
 | ... | AND
 | ... | Honeycomb removes all bridge domains
 | ... | ${node} | ${interface} | ${interface2}
-| Force tags | honeycomb_sanity
+| Force tags | honeycomb_sanity | honeycomb_odl
 
 *** Variables ***
 # Interface to run tests on.
index 2356e8b..aeb4782 100644 (file)
@@ -26,8 +26,8 @@
 | Variables | resources/test_data/honeycomb/lisp.py
 | Documentation | *Honeycomb Lisp test suite.*
 | Suite Teardown | Run Keyword If Any Tests Failed
-| ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
-| Force Tags | honeycomb_sanity
+| ... | Restart Honeycomb and VPP | ${node}
+| Force Tags | honeycomb_sanity | honeycomb_odl
 
 *** Test Cases ***
 | TC01: Honeycomb enables Lisp feature
index aade075..3f4b087 100644 (file)
@@ -23,9 +23,9 @@
 | Variables | resources/test_data/honeycomb/vxlan_gpe.py
 | Documentation | *Honeycomb NSH test suite.*
 | Suite Teardown | Run Keyword If Any Tests Failed
-| ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| ... | Restart Honeycomb and VPP | ${node}
 # disabled pending NSH version 17.04
-#| Force Tags | honeycomb_sanity
+#| Force Tags | honeycomb_sanity | honeycomb_odl
 
 *** Test Cases ***
 | TC01: Honeycomb can configure NSH entry
index 6ae76e0..e4353e8 100644 (file)
@@ -21,8 +21,8 @@
 | Variables | resources/test_data/honeycomb/pbb/pbb.py
 | Documentation | *Honeycomb provider backbone bridge test suite.*
 | Suite Teardown | Run Keyword If Any Tests Failed
-| ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
-| Force Tags | honeycomb_sanity
+| ... | Restart Honeycomb and VPP | ${node}
+| Force Tags | honeycomb_sanity | honeycomb_odl
 
 *** Test Cases ***
 # TODO: add verifications once operational data or VPP dump is available.
index cbc89ec..6a53cfd 100644 (file)
@@ -48,9 +48,9 @@
 | ... | AND | Clear plugin-acl settings | ${node} | ${dut_to_tg_if1}
 | Suite Setup | Vpp All ra suppress link layer | ${nodes}
 | Suite Teardown
-| ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| ... | Restart Honeycomb and VPP | ${node}
 | Documentation | *Honeycomb access control lists test suite for ACL plugin.*
-| Force Tags | Honeycomb_sanity
+| Force Tags | honeycomb_sanity | honeycomb_odl
 
 *** Test Cases ***
 | TC01: ACL MAC filtering through plugin-acl node - bridged
index 0b45c55..f15a632 100644 (file)
@@ -21,8 +21,8 @@
 | Variables | resources/test_data/honeycomb/nat.py | ${node} | ${interface}
 | Documentation | *Honeycomb NAT test suite.*
 | Suite Teardown | Run Keyword If Any Tests Failed
-| ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
-| Force Tags | honeycomb_sanity
+| ... | Restart Honeycomb and VPP | ${node}
+| Force Tags | honeycomb_sanity | honeycomb_odl
 
 *** Test Cases ***
 | TC01: Honeycomb configures NAT entry
index 8beea9a..46bfc1a 100644 (file)
@@ -20,7 +20,7 @@
 # | Force Tags | honeycomb_sanity
 | Suite Setup | Add Interface local0 To Topology | ${node}
 | Suite Teardown | Run Keyword If Any Tests Failed
-| | ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| | ... | Restart Honeycomb and VPP | ${node}
 | Documentation | *Honeycomb port mirroring test suite.*
 
 *** Variables ***
index 1838f46..f4cec27 100644 (file)
@@ -32,9 +32,9 @@
 | Resource | resources/libraries/robot/honeycomb/vxlan.robot
 # import additional VxLAN settings from resource file
 | Variables | resources/test_data/honeycomb/vxlan.py
-| Force Tags | honeycomb_sanity
+| Force Tags | honeycomb_sanity | honeycomb_odl
 | Suite Teardown | Run Keyword If Any Tests Failed
-| ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| ... | Restart Honeycomb and VPP | ${node}
 | Documentation | *Honeycomb VxLAN management test suite.*
 
 *** Test Cases ***
index 78635ac..7902396 100644 (file)
@@ -39,9 +39,9 @@
 # Import additional VxLAN GPE settings from resource file
 | Variables | resources/test_data/honeycomb/vxlan_gpe.py
 | Documentation | *Honeycomb VxLAN-GPE management test suite.*
-| Force Tags | honeycomb_sanity
+| Force Tags | honeycomb_sanity | honeycomb_odl
 | Suite Setup
-| ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| ... | Restart Honeycomb and VPP | ${node}
 
 *** Test Cases ***
 | TC01: Honeycomb creates VxLAN GPE tunnel
index 2b6802c..a1bd916 100644 (file)
@@ -30,9 +30,9 @@
 | ... | Honeycomb creates TAP interface
 | ... | ${node} | ${tap_interface} | ${tap_settings}
 | Documentation | *Honeycomb notifications test suite.*
-| Force Tags | honeycomb_sanity
+| Force Tags | honeycomb_sanity | honeycomb_odl
 | Suite Teardown | Run Keyword If Any Tests Failed
-| ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| ... | Restart Honeycomb and VPP | ${node}
 
 *** Test Cases ***
 | TC01: Honeycomb sends notification on interface state change
index 2c0067e..8aebe74 100644 (file)
 *** Settings ***
 | Resource | resources/libraries/robot/default.robot
 | Resource | resources/libraries/robot/honeycomb/persistence.robot
-| Suite Setup | Restart Honeycomb And VPP And Clear Persisted Configuration
-| ... | ${node}
+| Suite Setup | Run Keywords
+| ... | Restart Honeycomb And VPP And Clear Persisted Configuration | ${node}
+| ... | AND | Configure Persistence | ${node} | enable
+| Suite Teardown | Configure Persistence | ${node} | disable
 | Force Tags | honeycomb_sanity
 | Documentation | *Honeycomb configuration persistence test suite.*