Bug 8086: Add an analogue of netconf cluster CRUD 10/54110/14
authorVratko Polak <vrpolak@cisco.com>
Tue, 4 Apr 2017 13:05:39 +0000 (15:05 +0200)
committerLuis Gomez <ecelgp@gmail.com>
Thu, 6 Apr 2017 19:33:21 +0000 (19:33 +0000)
Change-Id: Ib2317fcd44b0bad104211f38c2672ece02a7724a
Signed-off-by: Vratko Polak <vrpolak@cisco.com>
csit/libraries/ClusterManagement.robot
csit/libraries/NetconfKeywords.robot
csit/libraries/NexusKeywords.robot
csit/suites/netconf/clustering/CRUD.robot
csit/suites/netconf/clustering/bug8086.robot [new file with mode: 0644]
csit/testplans/netconf-clustering.txt
csit/variables/netconf/device/bug8086/data.xml [new file with mode: 0644]
csit/variables/netconf/device/bug8086/location.uri [new file with mode: 0644]

index f6490eaf378f2de01d821d63d423f2cfe2873d20..a3f83ce7420cabc2f8ad95da8c35b330a61d5747 100644 (file)
@@ -544,6 +544,7 @@ With_Ssh_To_List_Or_All_Run_Keyword
     ...    Beware that in order to avoid "got positional argument after named arguments", first two arguments in the call should not be named.
     BuiltIn.Comment    This keyword is experimental and there is high risk of being replaced by another approach.
     # TODO: For_Index_From_List_Or_All_Run_Keyword applied to With_Ssh_To_Member_Run_Keyword?
+    # TODO: Imagine another keyword, using ScalarClosures and adding member index as first argument for each call. Worth it?
     ${index_list} =    List_Indices_Or_All    given_list=${member_index_list}
     : FOR    ${member_index}    IN    @{index_list}
     \    ${member_ip} =    Resolve_IP_Address_For_Member    ${member_index}
index 07ef35201fe32eb394d0cf7fb6fdb6e11197e8ee..efbc46917b00aa388e8068a9391a801a0ac7a8bd 100644 (file)
@@ -42,10 +42,12 @@ Setup_NetconfKeywords
 
 Configure_Device_In_Netconf
     [Arguments]    ${device_name}    ${device_type}=default    ${device_port}=${FIRST_TESTTOOL_PORT}    ${device_address}=${TOOLS_SYSTEM_IP}    ${device_user}=admin    ${device_password}=topsecret
-    ...    ${session}=default
+    ...    ${session}=default    ${schema_directory}=/tmp/schema
     [Documentation]    Tell Netconf about the specified device so it can add it into its configuration.
-    ${template_as_string}=    BuiltIn.Set_Variable    {'DEVICE_IP': '${device_address}', 'DEVICE_NAME': '${device_name}', 'DEVICE_PORT': '${device_port}', 'DEVICE_USER': '${device_user}', 'DEVICE_PASSWORD': '${device_password}'}
-    TemplatedRequests.Put_As_Xml_Templated    ${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${device_type}    ${template_as_string}    session=${session}
+    ${mapping}=    BuiltIn.Create_dictionary    DEVICE_IP=${device_address}    DEVICE_NAME=${device_name}    DEVICE_PORT=${device_port}    DEVICE_USER=${device_user}    DEVICE_PASSWORD=${device_password}
+    ...    SCHEMA_DIRECTORY=${schema_directory}
+    # TODO: Is it possible to use &{kwargs} as a mapping directly?
+    TemplatedRequests.Put_As_Xml_Templated    folder=${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${device_type}    mapping=${mapping}    session=${session}
     Collections.Set_To_Dictionary    ${NetconfKeywords__mounted_device_types}    ${device_name}    ${device_type}
 
 Count_Netconf_Connectors_For_Device
index a15406b9dbab945d15faeff536e3418d9e718be9..2441000568d95d4a3f6f60a6ffe3d65e54dc5e8c 100644 (file)
@@ -14,6 +14,7 @@ Documentation     Nexus repository access keywords, and supporting Java and Mave
 ...               Currently, Java version detection is incorporated so that Java tools can be run reliably.
 ...               Also, suport for installing and running Maven is added, as that needs the Java detection.
 ...               TODO: Move Java detection and Maven to a separate Resource, or rename this Resource.
+Library           Collections
 Library           OperatingSystem
 Library           SSHLibrary
 Library           String
@@ -21,6 +22,7 @@ Resource          ${CURDIR}/SSHKeywords.robot
 Resource          ${CURDIR}/Utils.robot
 
 *** Variables ***
+&{COMPONENT_MAPPING}    netconf=netconf-impl    bgpcep=pcep-impl    yangtools=yang-data-impl    carpeople=clustering-it-model
 ${JDKVERSION}     None
 ${JAVA_7_HOME_CENTOS}    /usr/lib/jvm/java-1.7.0
 ${JAVA_7_HOME_UBUNTU}    /usr/lib/jvm/java-7-openjdk-amd64
@@ -53,9 +55,11 @@ Initialize_Artifact_Deployment_And_Usage
 NexusKeywords__Get_Items_To_Look_At
     [Arguments]    ${component}
     [Documentation]    Get a list of items that might contain the version number that we are looking for.
-    BuiltIn.Return_From_Keyword_If    '${component}' == 'bgpcep'    pcep-impl
-    BuiltIn.Return_From_Keyword_If    '${component}' == 'yangtools'    yang-data-impl
-    [Return]    ${component}-impl
+    ...
+    ...    &{COMPONENT_MAPPING} is the centralized place to maintain the mapping
+    ...    from a stream independent component nickname to the list of artifact names to search for.
+    Collections.Dictionary_Should_Contain_Key    ${COMPONENT_MAPPING}    ${component}    Component not supported by NexusKeywords version detection: ${component}
+    BuiltIn.Run_Keyword_And_Return    Collections.Get_From_Dictionary    ${COMPONENT_MAPPING}    ${component}
 
 NexusKeywords__Detect_Version_To_Pull
     [Arguments]    ${component}
@@ -75,7 +79,7 @@ NexusKeywords__Detect_Version_To_Pull
     SSHLibrary.Close_Connection
     SSHKeywords.Restore Current SSH Connection From Index    ${current_ssh_connection.index}
     BuiltIn.Log    ${version}
-    BuiltIn.Run_Keyword_If    ${result}!=0    BuiltIn.Fail    Component "${component}" not found, cannot locate test tool
+    BuiltIn.Run_Keyword_If    ${result}!=0    BuiltIn.Fail    Component "${component}": searching for "${itemlist}" found no version, cannot locate test tool.
     ${version}    ${location} =    String.Split_String    ${version}    max_split=1
     [Return]    ${version}    ${location}
 
@@ -89,13 +93,15 @@ Deploy_From_Url
     [Return]    ${filename}
 
 Deploy_Artifact
-    [Arguments]    ${component}    ${artifact}    ${name_prefix}    ${name_suffix}=-executable.jar    ${fallback_url}=${NEXUS_FALLBACK_URL}    ${explicit_url}=${EMPTY}
+    [Arguments]    ${component}    ${artifact}    ${name_prefix}=${artifact}-    ${name_suffix}=-executable.jar    ${fallback_url}=${NEXUS_FALLBACK_URL}    ${explicit_url}=${EMPTY}
     [Documentation]    Deploy the specified artifact from Nexus to the cwd of the machine to which the active SSHLibrary connection points.
+    ...    ${component} is a name part of an artifact present in system/ of ODl installation with the same version as ${artifact} should have.
     ...    Must have ${BUNDLE_URL} variable set to the URL from which the
     ...    tested ODL distribution was downloaded and this place must be
     ...    inside a repository created by a standard distribution
     ...    construction job. If this is detected to ne be the case, fallback URL is used.
     ...    If ${explicit_url} is non-empty, Deploy_From_Utrl is called instead.
+    ...    TODO: Allow deploying to a specific directory, we have SSHKeywords.Execute_Command_At_Cwd_Should_Pass now.
     BuiltIn.Run_Keyword_And_Return_If    """${explicit_url}""" != ""    Deploy_From_Url    ${explicit_url}
     ${urlbase} =    String.Fetch_From_Left    ${BUNDLE_URL}    /org/opendaylight
     # If the BUNDLE_URL points somewhere else (perhaps *patch-test* job in Jenkins),
index 7eb2691d0c312be0974dcd3d225c2e7b3e47cea7..fc3fd9c46940a21f9d8756bc7515d51f9758f807 100644 (file)
@@ -51,7 +51,7 @@ Variables         ${CURDIR}/../../../variables/Variables.py
 ${NODE_CONFIGURER}    node1
 ${NODE_SETTER}    node2
 ${NODE_CHECKER}    node3
-${DEVICE_CHECK_TIMEOUT}    60s
+${DEVICE_CHECK_TIMEOUT}    10s
 ${DEVICE_NAME}    netconf-test-device
 ${directory_with_template_folders}    ${CURDIR}/../../../variables/netconf/CRUD
 ${empty_data}     <data xmlns="${ODL_NETCONF_NAMESPACE}"></data>
diff --git a/csit/suites/netconf/clustering/bug8086.robot b/csit/suites/netconf/clustering/bug8086.robot
new file mode 100644 (file)
index 0000000..feb335d
--- /dev/null
@@ -0,0 +1,213 @@
+*** Settings ***
+Documentation     Simplified netconf clustered CRUD test suite in Bug 8086 setup.
+...
+...               Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
+...
+...               This program and the accompanying materials are made available under the
+...               terms of the Eclipse Public License v1.0 which accompanies this distribution,
+...               and is available at http://www.eclipse.org/legal/epl-v10.html
+...
+...
+...               Perform basic operations (Create, Read, Update and Delete or CRUD) on device
+...               data mounted onto a netconf connector and see if they work.
+...
+...               The suite recognizes 3 nodes, "CONFIGURER" (the node that configures the
+...               device at the beginning and then deconfigures it at the end), "SETTER" (the
+...               node that manipulates the data on the device) and "CHECKER" (the node that
+...               checks the data on the device). The configured device and the results of each
+...               data operation on it is expected to be visible on all nodes so after each
+...               operation three test cases make sure they can see the result on their
+...               respective nodes.
+...
+...               The 3 nodes are configured by placing "node1", "node2" or "node3" into the
+...               ${NODE_CONFIGURER}, ${NODE_SETTER} and ${NODE_CHECKER} to make the node
+...               a "CONFIGURER", "SETTER" and "CHECKER" respectively. The "nodeX" name refers
+...               to the node with its IP address configured with the ${ODL_SYSTEM_X_IP}
+...               variable where the "X" is 1, 2 or 3.
+...
+...               The suite checks the integrity of the presence of the device and the data
+...               seen on the device only for nodes that have at least one of the roles
+...               ("CONFIGURER", "SETTER" and "CHECKER") assigned. A better design would have
+...               a "checker list" of sorts and have only one checking test case that runs
+...               through the check list and performs the test on each node listed. However
+...               this currently has fairly low priority due to Beryllium delivery date so
+...               it was left out.
+Suite Setup       Setup_Everything
+Suite Teardown    Teardown_Everything
+Test Setup        SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing
+Library           RequestsLibrary
+Resource          ${CURDIR}/../../../libraries/NetconfKeywords.robot
+Resource          ${CURDIR}/../../../libraries/NexusKeywords.robot
+Resource          ${CURDIR}/../../../libraries/SetupUtils.robot
+Resource          ${CURDIR}/../../../libraries/TemplatedRequests.robot
+Resource          ${CURDIR}/../../../variables/Variables.robot
+
+*** Variables ***
+${NODE_CONFIGURER}    node1
+${NODE_SETTER}    node2
+${NODE_CHECKER}    node3
+${DEVICE_CHECK_TIMEOUT}    10s
+${DEVICE_NAME}    netconf-test-device
+${directory_with_template_folders}    ${CURDIR}/../../../variables/netconf/CRUD
+${empty_data}     <data xmlns="${ODL_NETCONF_NAMESPACE}"></data>
+${original_data}    <data xmlns="${ODL_NETCONF_NAMESPACE}"><cont xmlns="urn:opendaylight:test:netconf:crud"><l>Content</l></cont></data>
+${modified_data}    <data xmlns="${ODL_NETCONF_NAMESPACE}"><cont xmlns="urn:opendaylight:test:netconf:crud"><l>Modified Content</l></cont></data>
+${SCHEMA_DIRECTORY}    /tmp/schema
+
+*** Test Cases ***
+Start_Testtool
+    [Documentation]    Deploy and start test tool, then wait for all its devices to become online.
+    NetconfKeywords.Install_And_Start_Testtool    device-count=1    schemas=${CURDIR}/../../../variables/netconf/CRUD/schemas
+
+Check_Device_Is_Not_Mounted_At_Beginning
+    [Documentation]    Sanity check making sure our device is not there. Fail if found.
+    [Tags]    critical
+    NetconfKeywords.Check_Device_Has_No_Netconf_Connector    ${DEVICE_NAME}    session=${NODE_CONFIGURER}
+
+Configure_Device_On_Netconf
+    [Documentation]    Make request to configure a testtool device on Netconf connector
+    [Tags]    critical
+    NetconfKeywords.Configure_Device_In_Netconf    ${DEVICE_NAME}    device_type=bug8086    session=${NODE_CONFIGURER}    schema_directory=${SCHEMA_DIRECTORY}
+
+Check_Configurer_Has_Netconf_Connector_For_Device
+    [Documentation]    Get the list of mounts and search for our device there. Fail if not found.
+    [Tags]    critical
+    BuiltIn.Wait_Until_Keyword_Succeeds    ${DEVICE_CHECK_TIMEOUT}    1s    Check_Device_Instance_Count    1    session=${NODE_CONFIGURER}
+
+Wait_For_Device_To_Become_Visible_For_Configurer
+    [Documentation]    Wait until the device becomes visible on configurer node.
+    NetconfKeywords.Wait_Device_Connected    ${DEVICE_NAME}    session=${NODE_CONFIGURER}
+
+Wait_For_Device_To_Become_Visible_For_Checker
+    [Documentation]    Wait until the device becomes visible on checker node.
+    NetconfKeywords.Wait_Device_Connected    ${DEVICE_NAME}    session=${NODE_CHECKER}
+
+Wait_For_Device_To_Become_Visible_For_Setter
+    [Documentation]    Wait until the device becomes visible on setter node.
+    NetconfKeywords.Wait_Device_Connected    ${DEVICE_NAME}    session=${NODE_SETTER}
+
+Check_Device_Data_Is_Seen_As_Empty_On_Configurer
+    [Documentation]    Get the device data as seen by configurer and make sure it is empty.
+    BuiltIn.Wait_Until_Keyword_Succeeds    ${DEVICE_CHECK_TIMEOUT}    1s    Check_Config_Data    ${NODE_CONFIGURER}    ${empty_data}
+
+Check_Device_Data_Is_Seen_As_Empty_On_Checker
+    [Documentation]    Get the device data as seen by checker and make sure it is empty.
+    BuiltIn.Wait_Until_Keyword_Succeeds    ${DEVICE_CHECK_TIMEOUT}    1s    Check_Config_Data    ${NODE_CHECKER}    ${empty_data}
+
+Check_Device_Data_Is_Seen_As_Empty_On_Setter
+    [Documentation]    Get the device data as seen by setter and make sure it is empty.
+    BuiltIn.Wait_Until_Keyword_Succeeds    ${DEVICE_CHECK_TIMEOUT}    1s    Check_Config_Data    ${NODE_SETTER}    ${empty_data}
+
+Create_Device_Data
+    [Documentation]    Send some sample test data into the device and check that the request went OK.
+    ${template_as_string}=    BuiltIn.Set_Variable    {'DEVICE_NAME': '${DEVICE_NAME}'}
+    TemplatedRequests.Post_As_Xml_Templated    ${directory_with_template_folders}${/}dataorig    ${template_as_string}    session=${NODE_SETTER}
+
+Check_New_Device_Data_Is_Visible_On_Setter
+    [Documentation]    Get the device data and make sure it contains the created content.
+    BuiltIn.Wait_Until_Keyword_Succeeds    ${DEVICE_CHECK_TIMEOUT}    1s    Check_Config_Data    ${NODE_SETTER}    ${original_data}
+
+Check_New_Device_Data_Is_Visible_On_Checker
+    [Documentation]    Check that the created device data make their way into the checker node.
+    BuiltIn.Wait_Until_Keyword_Succeeds    ${DEVICE_CHECK_TIMEOUT}    1s    Check_Config_Data    ${NODE_CHECKER}    ${original_data}
+
+Check_New_Device_Data_Is_Visible_On_Configurer
+    [Documentation]    Check that the created device data make their way into the configurer node.
+    BuiltIn.Wait_Until_Keyword_Succeeds    ${DEVICE_CHECK_TIMEOUT}    1s    Check_Config_Data    ${NODE_CONFIGURER}    ${original_data}
+
+Modify_Device_Data
+    [Documentation]    Send a request to change the sample test data and check that the request went OK.
+    ${template_as_string}=    BuiltIn.Set_Variable    {'DEVICE_NAME': '${DEVICE_NAME}'}
+    TemplatedRequests.Put_As_Xml_Templated    ${directory_with_template_folders}${/}datamod1    ${template_as_string}    session=${NODE_SETTER}
+
+Check_Device_Data_Is_Modified
+    [Documentation]    Get the device data and make sure it contains the modified content.
+    Check_Config_Data    ${NODE_SETTER}    ${modified_data}
+
+Check_Modified_Device_Data_Is_Visible_On_Checker
+    [Documentation]    Check that the modified device data make their way into the checker node.
+    BuiltIn.Wait_Until_Keyword_Succeeds    60s    1s    Check_Config_Data    ${NODE_CHECKER}    ${modified_data}
+
+Check_Modified_Device_Data_Is_Visible_On_Configurer
+    [Documentation]    Check that the modified device data make their way into the configurer node.
+    BuiltIn.Wait_Until_Keyword_Succeeds    60s    1s    Check_Config_Data    ${NODE_CONFIGURER}    ${modified_data}
+
+Delete_Device_Data
+    [Documentation]    Send a request to delete the sample test data on the device and check that the request went OK.
+    ${template_as_string}=    BuiltIn.Set_Variable    {'DEVICE_NAME': '${DEVICE_NAME}'}
+    TemplatedRequests.Delete_Templated    ${directory_with_template_folders}${/}datamod1    ${template_as_string}    session=${NODE_SETTER}
+
+Check_Device_Data_Is_Deleted
+    [Documentation]    Get the device data and make sure it is empty again.
+    Check_Config_Data    ${NODE_SETTER}    ${empty_data}
+
+Check_Device_Data_Deletion_Is_Visible_On_Checker
+    [Documentation]    Check that the device data deletion makes its way into the checker node.
+    BuiltIn.Wait_Until_Keyword_Succeeds    60s    1s    Check_Config_Data    ${NODE_CHECKER}    ${empty_data}
+
+Check_Device_Data_Deletion_Is_Visible_On_Configurer
+    [Documentation]    Check that the device data deletion makes its way into the checker node.
+    BuiltIn.Wait_Until_Keyword_Succeeds    60s    1s    Check_Config_Data    ${NODE_CONFIGURER}    ${empty_data}
+
+Deconfigure_Device_In_Netconf
+    [Documentation]    Make request to deconfigure the device on Netconf connector.
+    [Tags]    critical
+    [Setup]    SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing
+    NetconfKeywords.Remove_Device_From_Netconf    ${DEVICE_NAME}    session=${NODE_CONFIGURER}
+
+Check_Device_Deconfigured_On_Configurer
+    [Documentation]    Check that the device is really going to be gone. Fail if still there after one minute.
+    ...    This is an expected behavior as the unmount request is sent to the config subsystem which
+    ...    then triggers asynchronous disconnection of the device which is reflected in the operational
+    ...    data once completed. This test makes sure this asynchronous operation does not take
+    ...    unreasonable amount of time.
+    [Tags]    critical
+    NetconfKeywords.Wait_Device_Fully_Removed    ${DEVICE_NAME}    session=${NODE_CONFIGURER}
+
+Check_Device_Deconfigured_On_Checker
+    [Documentation]    Check that the device is going to be gone from the checker node. Fail if still there after one minute.
+    [Tags]    critical
+    NetconfKeywords.Wait_Device_Fully_Removed    ${DEVICE_NAME}    session=${NODE_CHECKER}
+
+Check_Device_Deconfigured_On_Setter
+    [Documentation]    Check that the device is going to be gone from the setter node. Fail if still there after one minute.
+    [Tags]    critical
+    NetconfKeywords.Wait_Device_Fully_Removed    ${DEVICE_NAME}    session=${NODE_SETTER}
+
+*** Keywords ***
+Setup_Everything
+    [Documentation]    Initialize resources, sreate sessions, on each ODL machine create a directory and copy the car model there.
+    # Setup resources used by the suite.
+    SetupUtils.Setup_Utils_For_Setup_And_Teardown
+    NetconfKeywords.Setup_Netconf_Keywords    create_session_for_templated_requests=False
+    RequestsLibrary.Create_Session    node1    http://${ODL_SYSTEM_1_IP}:${RESTCONFPORT}    headers=${HEADERS_XML}    auth=${AUTH}
+    RequestsLibrary.Create_Session    node2    http://${ODL_SYSTEM_2_IP}:${RESTCONFPORT}    headers=${HEADERS_XML}    auth=${AUTH}
+    RequestsLibrary.Create_Session    node3    http://${ODL_SYSTEM_3_IP}:${RESTCONFPORT}    headers=${HEADERS_XML}    auth=${AUTH}
+    ${index_list} =    ClusterManagement.List_All_Indices
+    ClusterManagement.Safe_With_Ssh_To_List_Or_All_Run_Keyword    ${index_list}    Populate_Schema_Directory_Over_Active_Connection
+
+Teardown_Everything
+    [Documentation]    Teardown the test infrastructure, perform cleanup and release all resources.
+    RequestsLibrary.Delete_All_Sessions
+    NetconfKeywords.Stop_Testtool
+
+Check_Device_Instance_Count
+    [Arguments]    ${expected}    ${session}
+    [Documentation]    Count device instances over ${session} and check the count is ${expected}.
+    ${count}    NetconfKeywords.Count_Netconf_Connectors_For_Device    ${DEVICE_NAME}    session=${session}
+    Builtin.Should_Be_Equal_As_Strings    ${count}    ${expected}
+
+Check_Config_Data
+    [Arguments]    ${node}    ${expected}    ${contains}=False
+    [Documentation]    Get device data from ${node}. Match against ${expected}, strictness given by ${contains}.
+    ${url}=    Builtin.Set_Variable    ${CONFIG_API}/network-topology:network-topology/topology/topology-netconf/node/${DEVICE_NAME}/yang-ext:mount
+    ${data}=    TemplatedRequests.Get_As_Xml_From_Uri    ${url}    session=${node}
+    BuiltIn.Run_Keyword_Unless    ${contains}    BuiltIn.Should_Be_Equal_As_Strings    ${data}    ${expected}
+    BuiltIn.Run_Keyword_If    ${contains}    BuiltIn.Should_Contain    ${data}    ${expected}
+
+Populate_Schema_Directory_Over_Active_Connection
+    [Documentation]    Create ${SCHEMA_DIRECTORY}, unpack car.yang there from temporarily downloaded sources jar.
+    ...    TODO: Make this configurable and move to NexusKeywords.
+    ${filename} =    NexusKeywords.Deploy_Artifact    component=carpeople    artifact=clustering-it-model    name_suffix=-sources.jar
+    ${dir} =    BuiltIn.Set_Variable    '${SCHEMA_DIRECTORY}'
+    SSHKeywords.Execute_Command_Should_Pass    mkdir -p '${SCHEMA_DIRECTORY}' && unzip -j '${filename}' META-INF/yang/car.yang -d '${SCHEMA_DIRECTORY}/' && rm '${filename}'
index 44df26c53115c9ebb52033b797fd8550a4fcc8f7..2555cddcb3bab5c83eaff0c58b0108b7e877f6a9 100644 (file)
@@ -9,6 +9,7 @@
 # Run non intrusive cluster tests first.
 integration/test/csit/suites/netconf/ready/netconfready.robot
 integration/test/csit/suites/netconf/clustering/CRUD.robot
+integration/test/csit/suites/netconf/clustering/bug8086.robot
 
 # Run the intrusive cluster tests after the non-intrusive ones.
 integration/test/csit/suites/test/alter_log_levels.robot
diff --git a/csit/variables/netconf/device/bug8086/data.xml b/csit/variables/netconf/device/bug8086/data.xml
new file mode 100644 (file)
index 0000000..cd62c97
--- /dev/null
@@ -0,0 +1,10 @@
+<node xmlns="urn:TBD:params:xml:ns:yang:network-topology">
+  <node-id>$DEVICE_NAME</node-id>
+  <host xmlns="urn:opendaylight:netconf-node-topology">$DEVICE_IP</host>
+  <port xmlns="urn:opendaylight:netconf-node-topology">$DEVICE_PORT</port>
+  <username xmlns="urn:opendaylight:netconf-node-topology">$DEVICE_USER</username>
+  <password xmlns="urn:opendaylight:netconf-node-topology">$DEVICE_PASSWORD</password>
+  <tcp-only xmlns="urn:opendaylight:netconf-node-topology">false</tcp-only>
+  <keepalive-delay xmlns="urn:opendaylight:netconf-node-topology">0</keepalive-delay>
+  <schema-cache-directory xmlns="urn:opendaylight:netconf-node-topology">$SCHEMA_DIRECTORY</schema-cache-directory>
+</node>
diff --git a/csit/variables/netconf/device/bug8086/location.uri b/csit/variables/netconf/device/bug8086/location.uri
new file mode 100644 (file)
index 0000000..cbacc69
--- /dev/null
@@ -0,0 +1 @@
+restconf/config/network-topology:network-topology/topology/topology-netconf/node/$DEVICE_NAME