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