Netconf RPC test 13/61013/12
authorAtul Gosain <atul.gosain@gmail.com>
Tue, 1 Aug 2017 21:40:16 +0000 (14:40 -0700)
committerLuis Gomez <ecelgp@gmail.com>
Tue, 22 Aug 2017 20:59:17 +0000 (20:59 +0000)
Integration tests in support for the RPC provided for netconf node
addition(with encrypted password).
https://git.opendaylight.org/gerrit/#/c/60621/

Change-Id: Ie2d05f038807acd6e6d2d09b7800d05314f12c82
Signed-off-by: Atul Gosain <atul.gosain@gmail.com>
csit/libraries/NetconfKeywords.robot
csit/libraries/TemplatedRequests.robot
csit/suites/netconf/CRUD/CRUD-RPC.robot [new file with mode: 0644]
csit/variables/netconf/device/rpc-device/delete_location.uri [new file with mode: 0644]
csit/variables/netconf/device/rpc-device/location.uri [new file with mode: 0644]
csit/variables/netconf/device/rpc-device/post_data.xml [new file with mode: 0644]

index d80d52e14f4c919e8e254d36bfcd157fb647e7fe..e1642feb728fe3cb76eb6d1d8b3a3f04b5d339e7 100644 (file)
@@ -43,12 +43,13 @@ 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    ${schema_directory}=/tmp/schema    ${http_timeout}=${EMPTY}
+    ...    ${session}=default    ${schema_directory}=/tmp/schema    ${http_timeout}=${EMPTY}    ${http_method}=put
     [Documentation]    Tell Netconf about the specified device so it can add it into its configuration.
     ${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}    http_timeout=${http_timeout}
+    Run Keyword if    '${http_method}'=='post'    TemplatedRequests.Post_As_Xml_Templated    folder=${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${device_type}    mapping=${mapping}    session=${session}    http_timeout=${http_timeout}
+    ...    ELSE    TemplatedRequests.Put_As_Xml_Templated    folder=${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${device_type}    mapping=${mapping}    session=${session}    http_timeout=${http_timeout}
     Collections.Set_To_Dictionary    ${NetconfKeywords__mounted_device_types}    ${device_name}    ${device_type}
 
 Count_Netconf_Connectors_For_Device
@@ -94,11 +95,11 @@ Wait_Device_Connected
     BuiltIn.Wait_Until_Keyword_Succeeds    ${timeout}    ${period}    Check_Device_Connected    ${device_name}    session=${session}
 
 Remove_Device_From_Netconf
-    [Arguments]    ${device_name}    ${session}=default
+    [Arguments]    ${device_name}    ${session}=default    ${location}=location
     [Documentation]    Tell Netconf to deconfigure the specified device
     ${device_type}=    Collections.Pop_From_Dictionary    ${NetconfKeywords__mounted_device_types}    ${device_name}
     ${template_as_string}=    BuiltIn.Set_Variable    {'DEVICE_NAME': '${device_name}'}
-    TemplatedRequests.Delete_Templated    ${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${device_type}    ${template_as_string}    session=${session}
+    TemplatedRequests.Delete_Templated    ${DIRECTORY_WITH_DEVICE_TEMPLATES}${/}${device_type}    ${template_as_string}    session=${session}    location=${location}
 
 Wait_Device_Fully_Removed
     [Arguments]    ${device_name}    ${timeout}=10s    ${period}=1s    ${session}=default
index c5c05bec68553ae357ecb158a1362bf0c05e4c8f..6d4d746bfbfa8efa07a3ab3e0691d373ee079491 100644 (file)
@@ -210,9 +210,9 @@ Post_As_Xml_Templated
     [Return]    ${response_text}
 
 Delete_Templated
-    [Arguments]    ${folder}    ${mapping}={}    ${session}=default    ${additional_allowed_status_codes}=${NO_STATUS_CODES}    ${http_timeout}=${EMPTY}
+    [Arguments]    ${folder}    ${mapping}={}    ${session}=default    ${additional_allowed_status_codes}=${NO_STATUS_CODES}    ${http_timeout}=${EMPTY}    ${location}=location
     [Documentation]    Resolve URI from folder, issue DELETE request.
-    ${uri} =    Resolve_Text_From_Template_Folder    folder=${folder}    base_name=location    extension=uri    mapping=${mapping}
+    ${uri} =    Resolve_Text_From_Template_Folder    folder=${folder}    base_name=${location}    extension=uri    mapping=${mapping}
     ${response_text} =    Delete_From_Uri    uri=${uri}    session=${session}    additional_allowed_status_codes=${additional_allowed_status_codes}    http_timeout=${http_timeout}
     [Return]    ${response_text}
 
diff --git a/csit/suites/netconf/CRUD/CRUD-RPC.robot b/csit/suites/netconf/CRUD/CRUD-RPC.robot
new file mode 100644 (file)
index 0000000..cfcb364
--- /dev/null
@@ -0,0 +1,245 @@
+*** Settings ***
+Documentation     netconf-connector CRUD test suite.
+...
+...               Copyright (c) 2017 Lumina Networks, 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 using RPC for node addition and see if
+...               they work.
+...
+...               FIXME: Replace the BuiltIn.Should_[Not_]Contain instances in the test cases
+...               that check the car list related data with calls to keywords of a Resource
+...               aimed at getting interesting pieces of data from the XML files and checking
+...               them against expected data sets. See MDSAL/northbound.robot suite for
+...               additional information.
+Suite Setup       Setup_Everything
+Suite Teardown    Teardown_Everything
+Test Setup        SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing
+Library           Collections
+Library           RequestsLibrary
+Library           OperatingSystem
+Library           String
+Library           SSHLibrary    timeout=10s
+Resource          ${CURDIR}/../../../libraries/FailFast.robot
+Resource          ${CURDIR}/../../../libraries/NetconfKeywords.robot
+Resource          ${CURDIR}/../../../libraries/SetupUtils.robot
+Resource          ${CURDIR}/../../../libraries/TemplatedRequests.robot
+Resource          ${CURDIR}/../../../variables/Variables.robot
+
+*** Variables ***
+${directory_with_template_folders}    ${CURDIR}/../../../variables/netconf/CRUD
+${device_name}    netconf-test-device
+${device_type}    full-uri-device
+${device_type_rpc}    rpc-device
+${USE_NETCONF_CONNECTOR}    ${False}
+${delete_location}    delete_location
+
+*** 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_Configured_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}
+
+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=${device_type_rpc}    http_timeout=2    http_method=post
+
+Check_ODL_Has_Netconf_Connector_For_Device
+    [Documentation]    Get the list of configured devices and search for our device there. Fail if not found.
+    [Tags]    critical
+    ${count}    NetconfKeywords.Count_Netconf_Connectors_For_Device    ${device_name}
+    Builtin.Should_Be_Equal_As_Strings    ${count}    1
+
+Wait_For_Device_To_Become_Connected
+    [Documentation]    Wait until the device becomes available through Netconf.
+    NetconfKeywords.Wait_Device_Connected    ${device_name}
+
+Check_Device_Data_Is_Empty
+    [Documentation]    Get the device data and make sure it is empty.
+    Check_Config_Data    <data xmlns="${ODL_NETCONF_NAMESPACE}"></data>
+
+Create_Device_Data_Label_Via_Xml
+    [Documentation]    Send a sample test data label 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}
+
+Check_Device_Data_Label_Is_Created
+    [Documentation]    Get the device data label and make sure it contains the created content.
+    Check_Config_Data    <data xmlns="${ODL_NETCONF_NAMESPACE}"><cont xmlns="urn:opendaylight:test:netconf:crud"><l>Content</l></cont></data>
+
+Modify_Device_Data_Label_Via_Xml
+    [Documentation]    Send a request to change the sample test data label 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}
+
+Check_Device_Data_Label_Is_Modified
+    [Documentation]    Get the device data label and make sure it contains the modified content.
+    Check_Config_Data    <data xmlns="${ODL_NETCONF_NAMESPACE}"><cont xmlns="urn:opendaylight:test:netconf:crud"><l>Modified Content</l></cont></data>
+
+Deconfigure_Device_From_Netconf_Temporarily
+    [Documentation]    Make request to deconfigure the testtool device on Netconf connector.
+    ...    This is the first part of the "configure/deconfigure" cycle of the device
+    ...    The purpose of cycling the device like this is to see that the configuration
+    ...    data was really stored in the device.
+    [Tags]    critical
+    [Setup]    SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing
+    NetconfKeywords.Remove_Device_From_Netconf    ${device_name}    location=${delete_location}
+
+Wait_For_Device_To_Be_Gone
+    [Documentation]    Wait for the device to completely disappear.
+    NetconfKeywords.Wait_Device_Fully_Removed    ${device_name}
+
+Configure_The_Device_Back
+    [Documentation]    Configure the device again.
+    ...    This is the second step of the device configuration.
+    [Tags]    critical
+    NetconfKeywords.Configure_Device_In_Netconf    ${device_name}    device_type=${device_type_rpc}    http_method=post
+
+Wait_For_Device_To_Reconnect
+    [Documentation]    Wait until the device becomes available through Netconf.
+    NetconfKeywords.Wait_Device_Connected    ${device_name}
+
+Check_Modified_Device_Data_Is_Still_There
+    [Documentation]    Get the device data and make sure it contains the created content.
+    BuiltIn.Wait_Until_Keyword_Succeeds    60s    1s    Check_Config_Data    <data xmlns="${ODL_NETCONF_NAMESPACE}"><cont xmlns="urn:opendaylight:test:netconf:crud"><l>Modified Content</l></cont></data>
+
+Modify_Device_Data_Again
+    [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}${/}datamod2    ${template_as_string}
+
+Check_Device_Data_Is_Modified_Again
+    [Documentation]    Get the device data and make sure it contains the created content.
+    Check_Config_Data    <data xmlns="${ODL_NETCONF_NAMESPACE}"><cont xmlns="urn:opendaylight:test:netconf:crud"><l>Another Modified Content</l></cont></data>
+
+Modify_Device_Data_Label_Via_Json
+    [Documentation]    Send a JSON request to change the sample test data label and check that the request went OK.
+    ${template_as_string}=    BuiltIn.Set_Variable    {'DEVICE_NAME': '${device_name}'}
+    TemplatedRequests.Put_As_Json_Templated    ${directory_with_template_folders}${/}datamodjson    ${template_as_string}
+
+Check_Device_Data_Label_Is_Modified_Via_Json
+    [Documentation]    Get the device data label as XML and make sure it matches the content posted as JSON in the previous case.
+    Check_Config_Data    <data xmlns="${ODL_NETCONF_NAMESPACE}"><cont xmlns="urn:opendaylight:test:netconf:crud"><l>Content Modified via JSON</l></cont></data>
+
+Create_Car_List
+    [Documentation]    Send a request to create a list of cars in the sample test data label 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}${/}cars    ${template_as_string}
+
+Check_Car_List_Created
+    [Documentation]    Get the device data label as XML and make sure it matches the content posted as JSON in the previous case.
+    ${data}=    Get_Config_Data
+    BuiltIn.Should_Contain    ${data}    <id>KEEP</id>
+    BuiltIn.Should_Not_Contain    ${data}    <id>SMALL</id>
+    BuiltIn.Should_Not_Contain    ${data}    <model>Isetta</model>
+    BuiltIn.Should_Not_Contain    ${data}    <manufacturer>BMW</manufacturer>
+    BuiltIn.Should_Not_Contain    ${data}    <year>1953</year>
+    BuiltIn.Should_Not_Contain    ${data}    <category>microcar</category>
+    BuiltIn.Should_Not_Contain    ${data}    <id>TOYOTA</id>
+    BuiltIn.Should_Not_Contain    ${data}    <model>Camry</model>
+    BuiltIn.Should_Not_Contain    ${data}    <manufacturer>Toyota</manufacturer>
+    BuiltIn.Should_Not_Contain    ${data}    <year>1982</year>
+    BuiltIn.Should_Not_Contain    ${data}    <category>sedan</category>
+
+Add_Device_Data_Item_1_Via_XML_Post
+    [Documentation]    Send a request to create a data item in the test list 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}${/}item1    ${template_as_string}
+
+Check_Item1_Is_Created
+    [Documentation]    Get the device data as XML and make sure it matches the content posted as JSON in the previous case.
+    ${data}=    Get_Config_Data
+    BuiltIn.Should_Contain    ${data}    <id>SMALL</id>
+    BuiltIn.Should_Contain    ${data}    <model>Isetta</model>
+    BuiltIn.Should_Contain    ${data}    <manufacturer>BMW</manufacturer>
+    BuiltIn.Should_Contain    ${data}    <year>1953</year>
+    BuiltIn.Should_Contain    ${data}    <category>microcar</category>
+    BuiltIn.Should_Not_Contain    ${data}    <id>TOYOTA</id>
+    BuiltIn.Should_Not_Contain    ${data}    <model>Camry</model>
+    BuiltIn.Should_Not_Contain    ${data}    <manufacturer>Toyota</manufacturer>
+    BuiltIn.Should_Not_Contain    ${data}    <year>1982</year>
+    BuiltIn.Should_Not_Contain    ${data}    <category>sedan</category>
+
+Add_Device_Data_Item_2_Via_JSON_Post
+    [Documentation]    Send a JSON 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.Post_As_Json_Templated    ${directory_with_template_folders}${/}item2    ${template_as_string}
+
+Check_Item2_Is_Created
+    [Documentation]    Get the device data as XML and make sure it matches the content posted as JSON in the previous case.
+    ${data}=    Get_Config_Data
+    BuiltIn.Should_Contain    ${data}    <id>SMALL</id>
+    BuiltIn.Should_Contain    ${data}    <model>Isetta</model>
+    BuiltIn.Should_Contain    ${data}    <manufacturer>BMW</manufacturer>
+    BuiltIn.Should_Contain    ${data}    <year>1953</year>
+    BuiltIn.Should_Contain    ${data}    <category>microcar</category>
+    BuiltIn.Should_Contain    ${data}    <id>TOYOTA</id>
+    BuiltIn.Should_Contain    ${data}    <model>Camry</model>
+    BuiltIn.Should_Contain    ${data}    <manufacturer>Toyota</manufacturer>
+    BuiltIn.Should_Contain    ${data}    <year>1982</year>
+    BuiltIn.Should_Contain    ${data}    <category>sedan</category>
+
+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}
+    TemplatedRequests.Delete_Templated    ${directory_with_template_folders}${/}item1    ${template_as_string}
+
+Check_Device_Data_Is_Deleted
+    [Documentation]    Get the device data and make sure it is empty again.
+    Check_Config_Data    <data xmlns="${ODL_NETCONF_NAMESPACE}"></data>
+
+Deconfigure_Device_From_Netconf
+    [Documentation]    Make request to deconfigure the testtool device on Netconf connector.
+    [Tags]    critical
+    [Setup]    SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing
+    NetconfKeywords.Remove_Device_From_Netconf    ${device_name}    location=${delete_location}
+
+Check_Device_Going_To_Be_Gone_After_Deconfiguring
+    [Documentation]    Check that the device is really going to be gone. Fail
+    ...    if found after one minute. This is an expected behavior as the
+    ...    delete request is sent to the config subsystem which then triggers
+    ...    asynchronous destruction of the netconf connector referring to the
+    ...    device and the device's data. This test makes sure this
+    ...    asynchronous operation does not take unreasonable amount of time
+    ...    by making sure that both the netconf connector and the device's
+    ...    data is gone before reporting success.
+    [Tags]    critical
+    NetconfKeywords.Wait_Device_Fully_Removed    ${device_name}
+
+*** Keywords ***
+Setup_Everything
+    [Documentation]    Initialize SetupUtils. Setup everything needed for the test cases.
+    # Setup resources used by the suite.
+    SetupUtils.Setup_Utils_For_Setup_And_Teardown
+    RequestsLibrary.Create_Session    operational    http://${ODL_SYSTEM_IP}:${RESTCONFPORT}${OPERATIONAL_API}    auth=${AUTH}
+    NetconfKeywords.Setup_Netconf_Keywords
+    ${device_type_rpc}=    BuiltIn.Set_Variable_If    """${USE_NETCONF_CONNECTOR}""" == """True"""    default    ${device_type_rpc}
+    BuiltIn.Set_Suite_Variable    ${device_type_rpc}
+
+Teardown_Everything
+    [Documentation]    Teardown the test infrastructure, perform cleanup and release all resources.
+    RequestsLibrary.Delete_All_Sessions
+    BuiltIn.Run_Keyword_And_Ignore_Error    NetconfKeywords.Stop_Testtool
+
+Get_Config_Data
+    [Documentation]    Get and return the config data from the device.
+    ${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}
+    [Return]    ${data}
+
+Check_Config_Data
+    [Arguments]    ${expected}    ${contains}=False
+    ${data}=    Get_Config_Data
+    BuiltIn.Run_Keyword_Unless    ${contains}    BuiltIn.Should_Be_Equal_As_Strings    ${data}    ${expected}
+    BuiltIn.Run_Keyword_If    ${contains}    BuiltIn.Should_Contain    ${data}    ${expected}
diff --git a/csit/variables/netconf/device/rpc-device/delete_location.uri b/csit/variables/netconf/device/rpc-device/delete_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
diff --git a/csit/variables/netconf/device/rpc-device/location.uri b/csit/variables/netconf/device/rpc-device/location.uri
new file mode 100644 (file)
index 0000000..2d15400
--- /dev/null
@@ -0,0 +1 @@
+restconf/operations/netconf-node-topology:add-netconf-node
diff --git a/csit/variables/netconf/device/rpc-device/post_data.xml b/csit/variables/netconf/device/rpc-device/post_data.xml
new file mode 100644 (file)
index 0000000..32bf68e
--- /dev/null
@@ -0,0 +1,10 @@
+<input xmlns="urn:opendaylight:netconf-node-topology">
+   <node-id>$DEVICE_NAME</node-id>
+   <encrypt>true</encrypt>
+   <host>$DEVICE_IP</host>
+   <port>$DEVICE_PORT</port>
+   <username>$DEVICE_USER</username>
+   <password>$DEVICE_PASSWORD</password>
+   <tcp-only>false</tcp-only>
+   <keepalive-delay>0</keepalive-delay>
+ </input>