*** Settings *** Documentation Access Netconf via Restconf. ... ... Copyright (c) 2015 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 ... ... FIXME: This whole thing needs to be refactored and merged with ... "ConfigViaRestconf.robot" which contains nearly identical (or even completely ... identical) pieces of code. ... ... FIXME: This module (along with "ConfigViaRestconf.robot") uses the deprecated ... "RequestsLibrary.Put" keyword to issue requests to the ODL. Convert these ... statements to use "RequestsLibrary.Put_Request" instead. Similarly for ... "RequestsLibrary.Post" and "RequestsLibrary.Delete". It might be best to do ... this change after the code duplication in these two modules is removed (see ... the previous FIXME). Library RequestsLibrary Library OperatingSystem Resource Utils.robot *** Variables *** @{allowed_status_codes} ${200} ${201} ${204} # List of integers, not strings. Used by both PUT and DELETE. *** Keywords *** FIXME__POLISH_THIS # The following code has a bunch of problems which are very hard to fix in # terms of debugging and review times. Therefore I propose to merge this test # first "as is" and solve the problems of this code in later commits. These # problems were identified so far: # # - Code duplication. The following code is almost identical to what is # present in ConfigViaRestconf.robot. Fixing this means refactoring # ConfigViaRestconf.robot to use this library instead of doing # everything on its own. # - The interface of this code might be too optimized for the needs of # one test suite. Maybe it should be generalized. # - The Teardown_Netconf_Via_Restconf seems to be incomplete. It is # supposed to close the session but (as the code suggests in a # comment), the functionality needed is not implemented. # # Issues identified when trying to make this a library: # # - A better name might be necessary (this actually allows not only # netconf to be accessed but other restconf accessible subsystems as # well). # - The ConfigViaRestconf might need to be merged with this code to avoid # strange name clashes when using both in a suite. Setup_Netconf_Via_Restconf [Documentation] Creates a default requests session to be used by subsequent keywords. # Do not append slash at the end uf URL, Requests would add another, resulting in error. Create_NVR_Session nvr_session ${ODL_SYSTEM_IP} Activate_NVR_Session nvr_session Teardown_Netconf_Via_Restconf [Documentation] Teardown to pair with Setup (otherwise no-op). BuiltIn.Comment TODO: The following line does not seem to be implemented by RequestsLibrary. Look for a workaround. BuiltIn.Comment Delete_Session nvr_session Resolve_URI_From_Template_Folder [Arguments] ${folder} ${mapping_as_string} [Documentation] Read URI template from folder, strip endline, make changes according to mapping, return the result. ${uri_template}= OperatingSystem.Get_File ${folder}${/}config.uri BuiltIn.Log ${uri_template} ${uri_part}= Strip_Endline_And_Apply_Substitutions_From_Mapping ${uri_template} ${mapping_as_string} [Return] ${uri_part} Resolve_Xml_Data_From_Template_Folder [Arguments] ${folder} ${mapping_as_string} [Documentation] Read data template from folder, strip endline, make changes according to mapping, return the result. ${data_template}= OperatingSystem.Get_File ${folder}${/}data.xml BuiltIn.Log ${data_template} ${xml_data}= Strip_Endline_And_Apply_Substitutions_From_Mapping ${data_template} ${mapping_as_string} [Return] ${xml_data} Resolve_Json_Data_From_Template_Folder [Arguments] ${folder} ${mapping_as_string} [Documentation] Read data template from folder, strip endline, make changes according to mapping, return the result. ${data_template}= OperatingSystem.Get_File ${folder}${/}data.json BuiltIn.Log ${data_template} ${json_data}= Strip_Endline_And_Apply_Substitutions_From_Mapping ${data_template} ${mapping_as_string} [Return] ${json_data} Strip_Endline_And_Apply_Substitutions_From_Mapping [Arguments] ${template_as_string} ${mapping_as_string} [Documentation] Strip endline, apply substitutions, Log and return the result. # Robot Framework does not understand dictionaries well, so resort to Evaluate. # Needs python module "string", and since the template string is expected to contain newline, it has to be enclosed in triple quotes. # Using rstrip() removes all trailing whitespace, which is what we want if there is something more than an endline. ${final_text}= BuiltIn.Evaluate string.Template('''${template_as_string}'''.rstrip()).substitute(${mapping_as_string}) modules=string BuiltIn.Log ${final_text} [Return] ${final_text} Post_Xml_Via_Restconf [Arguments] ${uri_part} ${xml_data} [Documentation] Post XML data to given controller-config URI, check reponse text is empty and status_code is 204. BuiltIn.Log ${uri_part} BuiltIn.Log ${xml_data} # As seen in previous two Keywords, Post does not need long specific URI. # But during Lithium development, Post ceased to do merge, so those Keywords do not work anymore. # This Keyword can still be used with specific URI to create a new container and fail if a container was already present. ${response}= RequestsLibrary.Post Request ${NetconfViaRestconf__active_config_session} ${uri_part} data=${xml_data} BuiltIn.Log ${response.text} BuiltIn.Should_Be_Empty ${response.text} BuiltIn.Should_Be_Equal_As_Strings ${response.status_code} 204 Post_Xml_Template_Folder_Via_Restconf [Arguments] ${folder} ${mapping_as_string}={} [Documentation] Resolve URI and data from folder, POST to restconf. ${uri_part}= Resolve_URI_From_Template_Folder ${folder} ${mapping_as_string} ${xml_data}= Resolve_Xml_Data_From_Template_Folder ${folder} ${mapping_as_string} Post_Xml_Via_Restconf ${uri_part} ${xml_data} Post_Json_Via_Restconf [Arguments] ${uri_part} ${json_data} [Documentation] Post JSON data to given controller-config URI, check reponse text is empty and status_code is 204. BuiltIn.Log ${uri_part} BuiltIn.Log ${json_data} # As seen in previous two Keywords, Post does not need long specific URI. # But during Lithium development, Post ceased to do merge, so those Keywords do not work anymore. # This Keyword can still be used with specific URI to create a new container and fail if a container was already present. ${response}= RequestsLibrary.Post ${NetconfViaRestconf__active_config_session} ${uri_part} data=${json_data} headers=${HEADERS_YANG_JSON} BuiltIn.Log ${response.text} BuiltIn.Should_Be_Empty ${response.text} BuiltIn.Should_Be_Equal_As_Strings ${response.status_code} 204 Post_Json_Template_Folder_Via_Restconf [Arguments] ${folder} ${mapping_as_string}={} [Documentation] Resolve URI and data from folder, POST to restconf. ${uri_part}= Resolve_URI_From_Template_Folder ${folder} ${mapping_as_string} ${json_data}= Resolve_Json_Data_From_Template_Folder ${folder} ${mapping_as_string} Post_Json_Via_Restconf ${uri_part} ${json_data} Put_Xml_Via_Restconf [Arguments] ${uri_part} ${xml_data} [Documentation] Put XML data to given controller-config URI, check reponse text is empty and status_code is one of allowed ones. BuiltIn.Log ${uri_part} BuiltIn.Log ${xml_data} ${response}= RequestsLibrary.Put Request ${NetconfViaRestconf__active_config_session} ${uri_part} data=${xml_data} BuiltIn.Log ${response.text} BuiltIn.Log ${response.status_code} BuiltIn.Should_Be_Empty ${response.text} BuiltIn.Should_Contain ${allowed_status_codes} ${response.status_code} Put_Xml_Template_Folder_Via_Restconf [Arguments] ${folder} ${mapping_as_string}={} [Documentation] Resolve URI and data from folder, PUT to controller config. ${uri_part}= Resolve_URI_From_Template_Folder ${folder} ${mapping_as_string} ${xml_data}= Resolve_Xml_Data_From_Template_Folder ${folder} ${mapping_as_string} Put_Xml_Via_Restconf ${uri_part} ${xml_data} Put_Json_Via_Restconf [Arguments] ${uri_part} ${json_data} [Documentation] Put JSON data to given controller-config URI, check reponse text is empty and status_code is one of allowed ones. BuiltIn.Log ${uri_part} BuiltIn.Log ${json_data} ${response}= RequestsLibrary.Put Request ${NetconfViaRestconf__active_config_session} ${uri_part} data=${json_data} headers=${HEADERS_YANG_JSON} BuiltIn.Log ${response.text} BuiltIn.Log ${response.status_code} BuiltIn.Should_Be_Empty ${response.text} BuiltIn.Should_Contain ${allowed_status_codes} ${response.status_code} Put_Json_Template_Folder_Via_Restconf [Arguments] ${folder} ${mapping_as_string}={} [Documentation] Resolve URI and data from folder, PUT to controller config. ${uri_part}= Resolve_URI_From_Template_Folder ${folder} ${mapping_as_string} ${json_data}= Resolve_Json_Data_From_Template_Folder ${folder} ${mapping_as_string} Put_Json_Via_Restconf ${uri_part} ${json_data} Delete_Via_Restconf [Arguments] ${uri_part} [Documentation] Delete resource at controller-config URI, check reponse text is empty and status_code is 204. BuiltIn.Log ${uri_part} ${response}= RequestsLibrary.Delete Request ${NetconfViaRestconf__active_config_session} ${uri_part} BuiltIn.Log ${response.text} BuiltIn.Should_Be_Empty ${response.text} BuiltIn.Should_Contain ${allowed_status_codes} ${response.status_code} Delete_Xml_Template_Folder_Via_Restconf [Arguments] ${folder} ${mapping_as_string}={} [Documentation] Resolve URI from folder, DELETE from controller config. ${uri_part}= Resolve_URI_From_Template_Folder ${folder} ${mapping_as_string} Delete_Via_Restconf ${uri_part} Create_NVR_Session [Arguments] ${name} ${host} [Documentation] Create a Netconf Via Restconf session pointing to the given host with the given name. The new session is NOT made active. RequestsLibrary.Create_Session ${name} http://${host}:${RESTCONFPORT}${CONFIG_API} headers=${HEADERS_XML} auth=${AUTH} RequestsLibrary.Create_Session ${name}_operational http://${host}:${RESTCONFPORT}${OPERATIONAL_API} headers=${HEADERS_XML} auth=${AUTH} Get_Active_NVR_Session [Documentation] Get the name of the currently active NVR session. [Return] ${NetconfViaRestconf__active_config_session} Activate_NVR_Session [Arguments] ${name} [Documentation] Activate the given NVR session. BuiltIn.Set_Suite_Variable ${NetconfViaRestconf__active_config_session} ${name} BuiltIn.Set_Suite_Variable ${NetconfViaRestconf__active_operational_session} ${name}_operational Get_Config_Data_From_URI [Arguments] ${uri} ${headers}=${NONE} ${data}= Utils.Get_Data_From_URI ${NetconfViaRestconf__active_config_session} ${uri} ${headers} [Return] ${data} Get_Operational_Data_From_URI [Arguments] ${uri} ${headers}=${NONE} ${data}= Utils.Get_Data_From_URI ${NetconfViaRestconf__active_operational_session} ${uri} ${headers} [Return] ${data}