Fix MDSAL nonexistent namespace error being too restrictive
[integration/test.git] / csit / suites / netconf / MDSAL / northbound.robot
1 *** Settings ***
2 Documentation     Metconf MDSAL Northbound test suite.
3 ...
4 ...               Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
5 ...
6 ...               This program and the accompanying materials are made available under the
7 ...               terms of the Eclipse Public License v1.0 which accompanies this distribution,
8 ...               and is available at http://www.eclipse.org/legal/epl-v10.html
9 ...
10 ...
11 ...               The request produced by test cases "Get Config Running", "Get Config Running
12 ...               To Confirm No_Edit Before Commit", "Get Config Running To Confirm Delete
13 ...               After Commit" and "Get Config Candidate To Confirm Discard" all use the same
14 ...               message id ("empty") for their requests. This is possible because the
15 ...               requests produced by this suite are strictly serialized. The RFC 6241 does
16 ...               not state that these IDs are unique, it only requires that each ID used is
17 ...               "XML attribute normalized" if the client wants it to be returned unmodified.
18 ...               The RFC specifically says that "the content of this attribute is not
19 ...               interpreted in any way, it only is stored to be returned with the reply to
20 ...               the request. The reuse of the "empty" string for the 4 test cases was chosen
21 ...               for simplicity.
22 ...
23 ...               TODO: Change the 4 testcases to use unique message IDs.
24 ...
25 ...               TODO: There are many sections with too many "Should_[Not_]Contain" keyword
26 ...               invocations (see Check_Multiple_Modules_Merge_Replace for a particularly bad
27 ...               example). Create a resource that will be able to extract the data from the
28 ...               requests and search for them in the response, then convert to usage of this
29 ...               resource (think "Thou shall not repeat yourself").
30 Suite Setup       Setup_Everything
31 Suite Teardown    Teardown_Everything
32 Test Setup        SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing
33 Library           RequestsLibrary
34 Library           SSHLibrary
35 Resource          ${CURDIR}/../../../libraries/FailFast.robot
36 Resource          ${CURDIR}/../../../libraries/SetupUtils.robot
37 Resource          ${CURDIR}/../../../libraries/SSHKeywords.robot
38 Resource          ${CURDIR}/../../../libraries/Utils.robot
39 Variables         ${CURDIR}/../../../variables/Variables.py
40
41 *** Variables ***
42 ${datadir}        ${CURDIR}/../../../variables/netconf/MDSAL
43 ${dataext}        msg
44 ${ssh_netconf_pid}    -1
45
46 *** Test Cases ***
47 Connect_To_ODL_Netconf
48     [Documentation]    Connect to ODL Netconf and fail if that is not possible.
49     Create_ODL_Netconf_Connection
50     Open_ODL_Netconf_Connection
51
52 Get_Config_Running
53     [Documentation]    Make sure the configuration has only the default elements in it.
54     Check_Test_Objects_Not_Present_In_Config    get-config
55
56 Missing_Message_ID_Attribute
57     [Documentation]    Check that messages with missing "message-ID" attribute are rejected with the correct error (RFC 6241, section 4.1).
58     Perform_Test    missing-attr
59
60 Additional_Attributes_In_Message
61     [Documentation]    Check that additional attributes in messages are returned properly (RFC 6241, sections 4.1 and 4.2).
62     ${reply}=    Load_And_Send_Message    additional-attr
63     BuiltIn.Should_Contain    ${reply}    xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
64     BuiltIn.Should_Contain    ${reply}    message-id="1"
65     BuiltIn.Should_Contain    ${reply}    attribute="something"
66     BuiltIn.Should_Contain    ${reply}    additional="otherthing"
67     BuiltIn.Should_Contain    ${reply}    xmlns:prefix="http://www.example.com/my-schema-example.html"
68
69 Send_Stuff_In_Undefined_Namespace
70     [Documentation]    Try to send something within an undefined namespace and check the reply complains about the nonexistent namespace and element.
71     ${reply}=    Load_And_Send_Message    merge-nonexistent-namespace
72     BuiltIn.Set_Test_Variable    ${bugno}    5125
73     BuiltIn.Should_Not_Contain    ${reply}    java.lang.NullPointerException
74     BuiltIn.Set_Test_Variable    ${bugno}    ${EMPTY}
75     BuiltIn.Should_Contain    ${reply}    urn:this:is:in:a:nonexistent:namespace
76     BuiltIn.Should_Contain    ${reply}    <rpc-error>
77     [Teardown]    BuiltIn.Run_Keyword_If    '${bugno}' != '${EMPTY}'    Utils.Report_Failure_Due_To_Bug    5125
78
79 Edit_Config_First_Batch_Merge
80     [Documentation]    Request a "merge" operation adding an element in candidate configuration and check the reply.
81     Perform_Test    merge-1
82
83 Get_Config_Running_To_Confirm_No_Edit_Before_Commit
84     [Documentation]    Make sure the running configuration is still unchanged as the change was not commited yet.
85     Check_Test_Objects_Not_Present_In_Config    get-config-no-edit-before-commit
86
87 Commit_Edit
88     [Documentation]    Commit the change and check the reply.
89     Perform_Test    commit-edit
90
91 First_Batch_In_Config_Running_To_Confirm_Edit_After_Commit
92     [Documentation]    Check that the change is now in the configuration.
93     ${reply}=    Load_And_Send_Message    get-config-edit-after-commit
94     Check_First_Batch_Data_Present    ${reply}
95
96 Terminate_Connection_Gracefully
97     [Documentation]    Close the session and disconnect.
98     Close_ODL_Netconf_Connection_Gracefully
99
100 Reconnect_To_ODL_Netconf_After_Graceful_Session_End
101     [Documentation]    Reconnect to ODL Netconf and fail if that is not possible.
102     Open_ODL_Netconf_Connection
103
104 First_Batch_In_Config_Running_After_Reconnect
105     [Documentation]    Check that the change is now in the configuration.
106     ${reply}=    Load_And_Send_Message    get-config-edit-after-commit
107     Check_First_Batch_Data_Present    ${reply}
108
109 Edit_Config_Create_Shall_Fail_Now
110     [Documentation]    Request a "create" operation of an element that already exists and check that it fails with the correct error (RFC 6241, section 7.2, operation "create").
111     Perform_Test    create
112
113 Delete_First_Batch
114     [Documentation]    Delete the created element from the candidate configuration and check the reply.
115     Perform_Test    delete
116
117 Get_Config_Running_To_Confirm_No_Delete_Before_Commit
118     [Documentation]    Make sure the element is still present in the running configuration as the delete command was not committed yet.
119     ${reply}=    Load_And_Send_Message    get-config-no-delete-before-commit
120     Check_First_Batch_Data_Present    ${reply}
121
122 Commit_Delete
123     [Documentation]    Commit the deletion of the element and check the reply.
124     Perform_Test    commit-delete
125
126 Get_Config_Running_To_Confirm_Delete_After_Commit
127     [Documentation]    Check that the element is gone.
128     Check_Test_Objects_Not_Present_In_Config    get-config-delete-after-commit
129
130 Commit_No_Transaction
131     [Documentation]    Attempt to perform "commit" when there are no changes in the candidate configuration and check that it returns OK status.
132     Perform_Test    commit-no-transaction
133
134 Edit_Config_Second_Batch_Merge
135     [Documentation]    Create an element to be discarded and check the reply.
136     Perform_Test    merge-2
137
138 Get_And_Check_Config_Candidate_For_Discard
139     [Documentation]    Check that the element to be discarded is present in the candidate configuration.
140     ${reply}=    Load_And_Send_Message    get-config-candidate
141     Check_First_Batch_Data_Not_Present    ${reply}
142     Check_Second_Batch_Data_Present    ${reply}
143
144 Discard_Changes_Using_Discard_Request
145     [Documentation]    Ask the server to discard the candidate and check the reply.
146     Perform_Test    commit-discard
147
148 Get_And_Check_Config_Candidate_To_Confirm_Discard
149     [Documentation]    Check that the element was really discarded.
150     Check_Test_Objects_Not_Present_In_Config    get-config-candidate-discard
151
152 Edit_Config_Multiple_Batch_Merge_Create
153     [Documentation]    Use a create request with the third batch to create the infrastructure.
154     Perform_Test    merge-multiple-create
155
156 Edit_Config_Multiple_Batch_Merge_Third
157     [Documentation]    Use a create request with the third batch to create the infrastructure.
158     Perform_Test    merge-multiple-1
159
160 Edit_Config_Multiple_Batch_Merge_Fourth
161     [Documentation]    Use a merge request with the third batch to create the infrastructure.
162     Perform_Test    merge-multiple-2
163
164 Edit_Config_Multiple_Batch_Merge_Fifth
165     [Documentation]    Add a "name4" subelement to the element and check the reply.
166     Perform_Test    merge-multiple-3
167
168 Commit_Multiple_Merge
169     [Documentation]    Commit the changes and check the reply.
170     Perform_Test    merge-multiple-commit
171
172 Multiple_Batch_Data_In_Running_Config
173     [Documentation]    Check that the 3 subelements are now present in the running configuration.
174     ${reply}=    Load_And_Send_Message    merge-multiple-check
175     Check_Multiple_Batch_Data_Present    ${reply}
176
177 Abort_Connection_To_Simulate_Session_Failure
178     [Documentation]    Simulate session failure by disconnecting without terminating the session.
179     Abort_ODL_Netconf_Connection
180
181 Reconnect_To_ODL_Netconf_After_Session_Failure
182     [Documentation]    Reconnect to ODL Netconf and fail if that is not possible.
183     Open_ODL_Netconf_Connection
184
185 Multiple_Batch_Data_In_Running_Config_After_Session_Failure
186     [Documentation]    Check that the 3 subelements are now present in the running configuration.
187     ${reply}=    Load_And_Send_Message    merge-multiple-check
188     Check_Multiple_Batch_Data_Present    ${reply}
189
190 Edit_Multiple_Merge_Data
191     [Documentation]    Add another subelement named "test" to the element and check the reply.
192     Perform_Test    merge-multiple-edit
193
194 Commit_Multiple_Modules_Merge_Edit
195     [Documentation]    Commit the addition of the "test" subelement and check the reply.
196     Perform_Test    merge-multiple-edit-commit
197
198 Check_Multiple_Modules_Merge_Edit
199     [Documentation]    Check that the "test" subelement exists and has correct value for "port" subelement.
200     ${reply}=    Load_And_Send_Message    merge-multiple-edit-check
201     BuiltIn.Should_Contain    ${reply}    <id>test</id>
202     BuiltIn.Should_Contain    ${reply}    <model>Dixi</model>
203     BuiltIn.Should_Contain    ${reply}    <manufacturer>BMW</manufacturer>
204     BuiltIn.Should_Contain    ${reply}    <year>1928</year>
205
206 Update_Multiple_Modules_Merge
207     [Documentation]    Update the value of the "port" subelement of the "test" subelement and check the reply.
208     Perform_Test    merge-multiple-update
209
210 Commit_Multiple_Modules_Merge_Update
211     [Documentation]    Commit the update and check the reply.
212     Perform_Test    merge-multiple-update-commit
213
214 Check_Multiple_Modules_Merge_Update
215     [Documentation]    Check that the value of the "port" was really updated.
216     ${reply}=    Load_And_Send_Message    merge-multiple-update-check
217     BuiltIn.Should_Contain    ${reply}    <id>test</id>
218     BuiltIn.Should_Contain    ${reply}    <model>Bentley Speed Six</model>
219     BuiltIn.Should_Contain    ${reply}    <manufacturer>Bentley</manufacturer>
220     BuiltIn.Should_Contain    ${reply}    <year>1930</year>
221     BuiltIn.Should_Not_Contain    ${reply}    <model>Dixi</model>
222     BuiltIn.Should_Not_Contain    ${reply}    <manufacturer>BMW</manufacturer>
223     BuiltIn.Should_Not_Contain    ${reply}    <year>1928</year>
224
225 Replace_Multiple_Modules_Merge
226     [Documentation]    Replace the content of the "test" with another completely different and check the reply.
227     Perform_Test    merge-multiple-replace
228
229 Commit_Multiple_Modules_Merge_Replace
230     [Documentation]    Commit the replace and check the reply.
231     Perform_Test    merge-multiple-replace-commit
232
233 Check_Multiple_Modules_Merge_Replace
234     [Documentation]    Check that the new content is there and the old content is gone.
235     ${reply}=    Load_And_Send_Message    merge-multiple-replace-check
236     BuiltIn.Should_Contain    ${reply}    <id>REPLACE</id>
237     BuiltIn.Should_Contain    ${reply}    <manufacturer>FIAT</manufacturer>
238     BuiltIn.Should_Contain    ${reply}    <model>Panda</model>
239     BuiltIn.Should_Contain    ${reply}    <year>2003</year>
240     BuiltIn.Should_Contain    ${reply}    <car-id>REPLACE</car-id>
241     BuiltIn.Should_Not_Contain    ${reply}    <id>TOY001</id>
242     BuiltIn.Should_Not_Contain    ${reply}    <id>CUST001</id>
243     BuiltIn.Should_Not_Contain    ${reply}    <car-id>TOY001</car-id>
244     BuiltIn.Should_Not_Contain    ${reply}    <person-id>CUST001</person-id>
245     BuiltIn.Should_Not_Contain    ${reply}    <id>OLD001</id>
246     BuiltIn.Should_Not_Contain    ${reply}    <id>CUST002</id>
247     BuiltIn.Should_Not_Contain    ${reply}    <car-id>OLD001</car-id>
248     BuiltIn.Should_Not_Contain    ${reply}    <person-id>CUST002</person-id>
249     BuiltIn.Should_Not_Contain    ${reply}    <id>CAROLD</id>
250     BuiltIn.Should_Contain    ${reply}    <id>CUSTOLD</id>
251     BuiltIn.Should_Not_Contain    ${reply}    <car-id>CAROLD</car-id>
252     BuiltIn.Should_Not_Contain    ${reply}    <person-id>CUSTOLD</person-id>
253     BuiltIn.Should_Not_Contain    ${reply}    <id>CARYOUNG</id>
254     BuiltIn.Should_Contain    ${reply}    <id>CUSTYOUNG</id>
255     BuiltIn.Should_Not_Contain    ${reply}    <car-id>CARYOUNG</car-id>
256     BuiltIn.Should_Contain    ${reply}    <person-id>CUSTYOUNG</person-id>
257     BuiltIn.Should_Not_Contain    ${reply}    <id>CARMID</id>
258     BuiltIn.Should_Contain    ${reply}    <id>CUSTMID</id>
259     BuiltIn.Should_Not_Contain    ${reply}    <car-id>CARMID</car-id>
260     BuiltIn.Should_Not_Contain    ${reply}    <person-id>CUSTMID</person-id>
261     BuiltIn.Should_Not_Contain    ${reply}    <id>CAROLD2</id>
262     BuiltIn.Should_Contain    ${reply}    <id>CUSTOLD2</id>
263     BuiltIn.Should_Not_Contain    ${reply}    <car-id>CAROLD2</car-id>
264     BuiltIn.Should_Not_Contain    ${reply}    <person-id>CUSTOLD2</person-id>
265     BuiltIn.Should_Not_Contain    ${reply}    <id>CUSTBAD</id>
266     BuiltIn.Should_Not_Contain    ${reply}    <id>test</id>
267
268 Remove_Test_Data
269     [Documentation]    Remove the testing elements and all their subelements and check the reply.
270     Perform_Test    merge-multiple-remove
271
272 Commit_Test_Data_Removal
273     [Documentation]    Commit the removal and check the reply.
274     Perform_Test    merge-multiple-remove-commit
275
276 Delete_Not_Existing_Element
277     [Documentation]    Attempt to delete the elements again and check that it fails with the correct error.
278     Perform_Test    delete-not-existing
279
280 Commit_Delete_Not_Existing_Module
281     [Documentation]    Attempt to commit and check the reply.
282     Perform_Test    commit-no-transaction
283
284 Remove_Not_Existing_Module
285     [Documentation]    Attempt to remove the "module" element again and check that the operation is "silently ignored".
286     Perform_Test    remove-not-existing
287
288 Commit_Remove_Not_Existing_Module
289     [Documentation]    Attempt to commit and check the reply.
290     Perform_Test    remove-not-existing-commit
291
292 Close_Session
293     [Documentation]    Close the session and check that it was closed properly.
294     Perform_Test    close-session
295
296 *** Keywords ***
297 Get_Data
298     [Arguments]    ${name}
299     [Documentation]    Load the specified data from the data directory and return it.
300     ${data}=    OperatingSystem.Get_File    ${datadir}${/}${name}.${dataext}
301     [Return]    ${data}
302
303 Create_ODL_Netconf_Connection
304     [Arguments]    ${host}=${CONTROLLER}    ${port}=${ODL_NETCONF_PORT}    ${user}=${ODL_NETCONF_USER}    ${password}=${ODL_NETCONF_PASSWORD}
305     [Documentation]    Open a netconf connecion to the given machine.
306     # The "-s netconf" flag (see the "SSHLibrary.Write" line below)    is not
307     # supported by SSHLibrary, therefore we need to use this elaborate and
308     # pretty tricky way to connect to the ODL Netconf port.
309     # TODO: Extract into NetconfKeywords as there are other tests that are
310     #    going to need to use this operation (Netconf Performance and Scaling
311     #    comes to my mind now as one of the things tested is the performance
312     #    of the direct netconf connection.
313     # TODO: Make this keyword return a dictionary object with all the
314     #    data about the prepared connection neatly packaged. Make all
315     #    the other keywords handling the connection accept such an
316     #    object and pull the data out of it rather than relying on
317     #    global variables. This will allow for tracking more Netconf
318     #    connections, increasing utility.
319     ${control}=    SSHLibrary.Open_Connection    ${host}    prompt=${ODL_SYSTEM_PROMPT}    timeout=10s
320     Utils.Flexible_Controller_Login
321     BuiltIn.Set_Suite_Variable    ${ssh_control}    ${control}
322     ${netconf}=    SSHLibrary.Open_Connection    ${host}    prompt=${ODL_SYSTEM_PROMPT}    timeout=10s
323     Utils.Flexible_Controller_Login
324     BuiltIn.Set_Suite_Variable    ${ssh_netconf}    ${netconf}
325     BuiltIn.Set_Suite_Variable    ${ssh_port}    ${port}
326     BuiltIn.Set_Suite_Variable    ${ssh_user}    ${user}
327     BuiltIn.Set_Suite_Variable    ${ssh_password}    ${password}
328
329 Reopen_ODL_Netconf_Connection
330     [Documentation]    Reopen a closed netconf connection.
331     SSHLibrary.Write    sshpass -p ${ssh_password} ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no ${ssh_user}\@127.0.0.1 -p ${ssh_port} -s netconf
332     ${hello}=    SSHLibrary.Read_Until    ${ODL_NETCONF_PROMPT}
333     SSHLibrary.Switch_Connection    ${ssh_control}
334     ${pid}=    SSHLibrary.Execute_Command    ps -A | grep sshpass | cut -b 1-6
335     BuiltIn.Set_Suite_Variable    ${ssh_netconf_pid}    ${pid}
336     SSHLibrary.Switch_Connection    ${ssh_netconf}
337     [Return]    ${hello}
338
339 Open_ODL_Netconf_Connection
340     [Documentation]    Open a prepared netconf connecion.
341     ${hello}=    Reopen_ODL_Netconf_Connection
342     ${hello_message}=    Get_Data    hello
343     Transmit_Message    ${hello_message}
344     [Return]    ${hello}
345
346 Transmit_Message
347     [Arguments]    ${message}
348     [Documentation]    Transmit message to Netconf connection and discard the echo of the message.
349     SSHLibrary.Write    ${message}
350     SSHLibrary.Write    ${ODL_NETCONF_PROMPT}
351     SSHLibrary.Read_Until    ${ODL_NETCONF_PROMPT}
352
353 Send_Message
354     [Arguments]    ${message}
355     [Documentation]    Send message to Netconf connection and get the reply.
356     Transmit_Message    ${message}
357     ${reply}=    SSHLibrary.Read_Until    ${ODL_NETCONF_PROMPT}
358     [Return]    ${reply}
359
360 Prepare_For_Search
361     [Arguments]    ${searched_string}
362     [Documentation]    Prepare the specified string for searching in Netconf connection replies.
363     ...    The string passed to this keyword is coming from a data
364     ...    file which has different end of line conventions than
365     ...    the actual Netconf reply. This keyword patches the string
366     ...    to match what Netconf actually returns.
367     ${result}=    BuiltIn.Evaluate    "\\r\\n".join("""${searched_string}""".split("\\n"))
368     [Return]    ${result}
369
370 Load_And_Send_Message
371     [Arguments]    ${name}
372     [Documentation]    Load a message from the data file set, send it to Netconf and return the reply.
373     ${request}=    Get_Data    ${name}-request
374     ${reply}=    Send_Message    ${request}
375     [Return]    ${reply}
376
377 Load_Expected_Reply
378     [Arguments]    ${name}
379     [Documentation]    Load the expected reply from the data file set and return it.
380     ${expected_reply}=    Get_Data    ${name}-reply
381     ${expected}=    Prepare_For_Search    ${expected_reply}
382     [Return]    ${expected}
383
384 Abort_ODL_Netconf_Connection
385     [Documentation]    Correctly close the Netconf connection and make sure it is really dead.
386     BuiltIn.Return_From_Keyword_If    ${ssh_netconf_pid} == -1
387     ${kill_command}=    BuiltIn.Set_Variable    kill ${ssh_netconf_pid}
388     BuiltIn.Set_Suite_Variable    ${ssh_netconf_pid}    -1
389     SSHLibrary.Switch_Connection    ${ssh_control}
390     SSHLibrary.Write    ${kill_command}
391     SSHLibrary.Read_Until_Prompt
392     SSHLibrary.Switch_Connection    ${ssh_netconf}
393     SSHLibrary.Read_Until_Prompt
394
395 Close_ODL_Netconf_Connection_Gracefully
396     Perform_Test    close-session
397     Abort_ODL_Netconf_Connection
398
399 Setup_Everything
400     [Documentation]    Setup resources and create session for Restconf checking.
401     SetupUtils.Setup_Utils_For_Setup_And_Teardown
402     RequestsLibrary.Create_Session    config    http://${CONTROLLER}:${RESTCONFPORT}${CONFIG_API}    auth=${AUTH}
403
404 Teardown_Everything
405     [Documentation]    Close the Netconf connection and destroy all sessions in the requests library.
406     Abort_ODL_Netconf_Connection
407     RequestsLibrary.Delete_All_Sessions
408
409 Check_First_Batch_Data
410     [Arguments]    ${reply}    ${keyword}
411     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>TOY001</id>
412     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>CUST001</id>
413     BuiltIn.RunKeyword    ${keyword}    ${reply}    <car-id>TOY001</car-id>
414     BuiltIn.RunKeyword    ${keyword}    ${reply}    <person-id>CUST001</person-id>
415
416 Check_First_Batch_Data_Present
417     [Arguments]    ${reply}
418     Check_First_Batch_Data    ${reply}    BuiltIn.Should_Contain
419
420 Check_First_Batch_Data_Not_Present
421     [Arguments]    ${reply}
422     Check_First_Batch_Data    ${reply}    BuiltIn.Should_Not_Contain
423
424 Check_Second_Batch_Data
425     [Arguments]    ${reply}    ${keyword}
426     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>OLD001</id>
427     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>CUST002</id>
428     BuiltIn.RunKeyword    ${keyword}    ${reply}    <car-id>OLD001</car-id>
429     BuiltIn.RunKeyword    ${keyword}    ${reply}    <person-id>CUST002</person-id>
430
431 Check_Second_Batch_Data_Present
432     [Arguments]    ${reply}
433     Check_Second_Batch_Data    ${reply}    BuiltIn.Should_Contain
434
435 Check_Multiple_Batch_Data
436     [Arguments]    ${reply}    ${keyword}
437     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>CAROLD</id>
438     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>CUSTOLD</id>
439     BuiltIn.RunKeyword    ${keyword}    ${reply}    <car-id>CAROLD</car-id>
440     BuiltIn.RunKeyword    ${keyword}    ${reply}    <person-id>CUSTOLD</person-id>
441     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>CARYOUNG</id>
442     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>CUSTYOUNG</id>
443     BuiltIn.RunKeyword    ${keyword}    ${reply}    <car-id>CARYOUNG</car-id>
444     BuiltIn.RunKeyword    ${keyword}    ${reply}    <person-id>CUSTYOUNG</person-id>
445     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>CARMID</id>
446     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>CUSTMID</id>
447     BuiltIn.RunKeyword    ${keyword}    ${reply}    <car-id>CARMID</car-id>
448     BuiltIn.RunKeyword    ${keyword}    ${reply}    <person-id>CUSTMID</person-id>
449     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>CAROLD2</id>
450     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>CUSTOLD2</id>
451     BuiltIn.RunKeyword    ${keyword}    ${reply}    <car-id>CAROLD2</car-id>
452     BuiltIn.RunKeyword    ${keyword}    ${reply}    <person-id>CUSTOLD2</person-id>
453
454 Check_Multiple_Batch_Data_Absent
455     [Arguments]    ${reply}
456     Check_Multiple_Batch_Data    ${reply}    BuiltIn.Should_not_Contain
457
458 Check_Multiple_Batch_Data_Present
459     [Arguments]    ${reply}
460     Check_Multiple_Batch_Data    ${reply}    BuiltIn.Should_Contain
461
462 Check_Auxiliary_Data
463     [Arguments]    ${reply}    ${keyword}
464     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>CUSTBAD</id>
465     BuiltIn.RunKeyword    ${keyword}    ${reply}    <id>test</id>
466
467 Check_Test_Objects_Absent
468     [Arguments]    ${reply}
469     Check_First_Batch_Data_Not_Present    ${reply}
470     Check_Second_Batch_Data    ${reply}    BuiltIn.Should_not_Contain
471     Check_Multiple_Batch_Data_Absent    ${reply}
472     Check_Auxiliary_Data    ${reply}    BuiltIn.Should_not_Contain
473     BuiltIn.Should_not_Contain    ${reply}    <id>test</id>
474
475 Check_Test_Objects_Not_Present_In_Config
476     [Arguments]    ${name}
477     [Documentation]    Use dataset with the specified name to get the configuration and check that none of our test objects are there.
478     ${reply}=    Load_And_Send_Message    ${name}
479     Check_Test_Objects_Absent    ${reply}
480     BuiltIn.Should_not_Contain    ${reply}    <id>REPLACE</id>
481     [Return]    ${reply}
482
483 Perform_Test
484     [Arguments]    ${name}
485     [Documentation]    Load and send the request from the dataset and compare the returned reply to the one stored in the dataset.
486     ${actual}=    Load_And_Send_Message    ${name}
487     ${expected}=    Load_Expected_Reply    ${name}
488     ${newline}=    BuiltIn.Evaluate    "\\r\\n"
489     BuiltIn.Should_Be_Equal    ${newline}${expected}${ODL_NETCONF_PROMPT}    ${actual}
490     [Return]    ${actual}
491
492 Send_And_Check
493     [Arguments]    ${name}    ${expected}
494     ${actual}=    Load_And_Send_Message    ${name}
495     BuiltIn.Should_Be_Equal    ${expected}    ${actual}