From a9e61a7db5a91c3f2598f642670abafbf8a9b57d Mon Sep 17 00:00:00 2001 From: Atul Gosain Date: Tue, 1 Aug 2017 14:40:16 -0700 Subject: [PATCH] Netconf RPC test 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 --- csit/libraries/NetconfKeywords.robot | 9 +- csit/libraries/TemplatedRequests.robot | 4 +- csit/suites/netconf/CRUD/CRUD-RPC.robot | 245 ++++++++++++++++++ .../device/rpc-device/delete_location.uri | 1 + .../netconf/device/rpc-device/location.uri | 1 + .../netconf/device/rpc-device/post_data.xml | 10 + 6 files changed, 264 insertions(+), 6 deletions(-) create mode 100644 csit/suites/netconf/CRUD/CRUD-RPC.robot create mode 100644 csit/variables/netconf/device/rpc-device/delete_location.uri create mode 100644 csit/variables/netconf/device/rpc-device/location.uri create mode 100644 csit/variables/netconf/device/rpc-device/post_data.xml diff --git a/csit/libraries/NetconfKeywords.robot b/csit/libraries/NetconfKeywords.robot index d80d52e14f..e1642feb72 100644 --- a/csit/libraries/NetconfKeywords.robot +++ b/csit/libraries/NetconfKeywords.robot @@ -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 diff --git a/csit/libraries/TemplatedRequests.robot b/csit/libraries/TemplatedRequests.robot index c5c05bec68..6d4d746bfb 100644 --- a/csit/libraries/TemplatedRequests.robot +++ b/csit/libraries/TemplatedRequests.robot @@ -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 index 0000000000..cfcb364f94 --- /dev/null +++ b/csit/suites/netconf/CRUD/CRUD-RPC.robot @@ -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 + +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 Content + +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 Modified Content + +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 Modified Content + +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 Another Modified Content + +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 Content Modified via JSON + +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} KEEP + BuiltIn.Should_Not_Contain ${data} SMALL + BuiltIn.Should_Not_Contain ${data} Isetta + BuiltIn.Should_Not_Contain ${data} BMW + BuiltIn.Should_Not_Contain ${data} 1953 + BuiltIn.Should_Not_Contain ${data} microcar + BuiltIn.Should_Not_Contain ${data} TOYOTA + BuiltIn.Should_Not_Contain ${data} Camry + BuiltIn.Should_Not_Contain ${data} Toyota + BuiltIn.Should_Not_Contain ${data} 1982 + BuiltIn.Should_Not_Contain ${data} sedan + +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} SMALL + BuiltIn.Should_Contain ${data} Isetta + BuiltIn.Should_Contain ${data} BMW + BuiltIn.Should_Contain ${data} 1953 + BuiltIn.Should_Contain ${data} microcar + BuiltIn.Should_Not_Contain ${data} TOYOTA + BuiltIn.Should_Not_Contain ${data} Camry + BuiltIn.Should_Not_Contain ${data} Toyota + BuiltIn.Should_Not_Contain ${data} 1982 + BuiltIn.Should_Not_Contain ${data} sedan + +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} SMALL + BuiltIn.Should_Contain ${data} Isetta + BuiltIn.Should_Contain ${data} BMW + BuiltIn.Should_Contain ${data} 1953 + BuiltIn.Should_Contain ${data} microcar + BuiltIn.Should_Contain ${data} TOYOTA + BuiltIn.Should_Contain ${data} Camry + BuiltIn.Should_Contain ${data} Toyota + BuiltIn.Should_Contain ${data} 1982 + BuiltIn.Should_Contain ${data} sedan + +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 + +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 index 0000000000..cbacc6993d --- /dev/null +++ b/csit/variables/netconf/device/rpc-device/delete_location.uri @@ -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 index 0000000000..2d154007e0 --- /dev/null +++ b/csit/variables/netconf/device/rpc-device/location.uri @@ -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 index 0000000000..32bf68e94a --- /dev/null +++ b/csit/variables/netconf/device/rpc-device/post_data.xml @@ -0,0 +1,10 @@ + + $DEVICE_NAME + true + $DEVICE_IP + $DEVICE_PORT + $DEVICE_USER + $DEVICE_PASSWORD + false + 0 + -- 2.36.6