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