Step 1: Move vm scripts to the right place
[integration/test.git] / test / csit / suites / sfc / SFC_Basic / 070__sfc_rendered_service_paths.robot
1 *** Settings ***
2 Documentation     Test suite for SFC Service Functions, Operates functions from Restconf APIs.
3 Suite Setup       Create Session    session    http://${CONTROLLER}:${RESTCONFPORT}    auth=${AUTH}    headers=${HEADERS}
4 Suite Teardown    Delete All Sessions
5 Library           SSHLibrary
6 Library           Collections
7 Library           OperatingSystem
8 Library           RequestsLibrary
9 Variables         ../../../variables/Variables.py
10 Resource          ../../../libraries/Utils.robot
11
12 *** Variables ***
13 ${SERVICE_FUNCTIONS_URI}    /restconf/config/service-function:service-functions/
14 ${SERVICE_FUNCTIONS_FILE}    ../../../variables/sfc/service-functions.json
15 ${SERVICE_FORWARDERS_URI}    /restconf/config/service-function-forwarder:service-function-forwarders/
16 ${SERVICE_FORWARDERS_FILE}    ../../../variables/sfc/service-function-forwarders.json
17 ${SERVICE_NODES_URI}    /restconf/config/service-node:service-nodes/
18 ${SERVICE_NODES_FILE}    ../../../variables/sfc/service-nodes.json
19 ${SERVICE_CHAINS_URI}    /restconf/config/service-function-chain:service-function-chains/
20 ${SERVICE_CHAINS_FILE}    ../../../variables/sfc/service-function-chains.json
21 ${SERVICE_FUNCTION_PATHS_URI}    /restconf/config/service-function-path:service-function-paths/
22 ${SERVICE_FUNCTION_PATHS_FILE}    ../../../variables/sfc/service-function-paths.json
23
24 ${SERVICE_SCHED_TYPES_URI}    /restconf/config/service-function-scheduler-type:service-function-scheduler-types/
25 ${SERVICE_SCHED_TYPE_URI_BASE}    ${SERVICE_SCHED_TYPES_URI}service-function-scheduler-type/service-function-scheduler-type:
26 ${SERVICE_RANDOM_SCHED_TYPE_URI}    ${SERVICE_SCHED_TYPE_URI_BASE}random
27 ${SERVICE_RANDOM_SCHED_TYPE_FILE}    ../../../variables/sfc/service-random-schedule-type.json
28 ${SERVICE_ROUNDROBIN_SCHED_TYPE_URI}    ${SERVICE_SCHED_TYPE_URI_BASE}round-robin
29 ${SERVICE_ROUNDROBIN_SCHED_TYPE_FILE}    ../../../variables/sfc/service-roundrobin-schedule-type.json
30 ${SERVICE_LOADBALANCE_SCHED_TYPE_URI}    ${SERVICE_SCHED_TYPE_URI_BASE}load-balance
31 ${SERVICE_LOADBALANCE_SCHED_TYPE_FILE}    ../../../variables/sfc/service-loadbalance-schedule-type.json
32 ${SERVICE_SHORTESTPATH_SCHED_TYPE_URI}    ${SERVICE_SCHED_TYPE_URI_BASE}shortest-path
33 ${SERVICE_SHORTESTPATH_SCHED_TYPE_FILE}    ../../../variables/sfc/service-loadbalance-schedule-type.json
34
35 ${RENDERED_SERVICE_PATHS_URI}    /restconf/config/rendered-service-path:rendered-service-paths/
36 ${OPERATIONAL_RSPS_URI}    /restconf/operational/rendered-service-path:rendered-service-paths/
37 ${OPERATIONS_CREATE_RSP_URI}     /restconf/operations/rendered-service-path:create-rendered-path/
38 ${OPERATIONS_DELETE_RSP_URI}     /restconf/operations/rendered-service-path:delete-rendered-path
39 ${CREATE_RSP1_INPUT}    {"input":{"parent-service-function-path":"SFC1-100","name":"SFC1-100-Path-1"}}
40 ${CREATE_RSP2_INPUT}    {"input":{"parent-service-function-path":"SFC1-100","name":"SFC1-100-Path-2"}}
41 ${CREATE_RSP3_INPUT}    {"input":{"parent-service-function-path":"SFC1-100","name":"SFC1-100-Path-3"}}
42 ${CREATE_RSP4_INPUT}    {"input":{"parent-service-function-path":"SFC1-100","name":"SFC1-100-Path-4"}}
43 ${CREATE_RSP5_INPUT}    {"input":{"parent-service-function-path":"SFC1-100","name":"SFC1-100-Path-5"}}
44 ${CREATE_RSP6_INPUT}    {"input":{"parent-service-function-path":"SFC1-100","name":"SFC1-100-Path-6"}}
45 ${CREATE_RSP_FAILURE_INPUT}    {"input":{"parent-service-function-path":"SFC1-empty","name":"SFC1-empty-Path-1"}}
46 ${DELETE_RSP1_INPUT}    {"input":{"name":"SFC1-100-Path-1"}}
47 ${DELETE_RSP2_INPUT}    {"input":{"name":"SFC1-100-Path-2"}}
48 ${DELETE_RSP3_INPUT}    {"input":{"name":"SFC1-100-Path-3"}}
49 ${DELETE_RSP4_INPUT}    {"input":{"name":"SFC1-100-Path-4"}}
50 ${DELETE_RSP5_INPUT}    {"input":{"name":"SFC1-100-Path-5"}}
51 ${DELETE_RSP6_INPUT}    {"input":{"name":"SFC1-100-Path-6"}}
52
53 *** Test Cases ***
54 Basic Environment Setup Tests
55     [Documentation]    Prepare Basic Test Environment
56     Add Elements To URI From File    ${SERVICE_FORWARDERS_URI}    ${SERVICE_FORWARDERS_FILE}
57     Add Elements To URI From File    ${SERVICE_NODES_URI}    ${SERVICE_NODES_FILE}
58     Add Elements To URI From File    ${SERVICE_FUNCTIONS_URI}    ${SERVICE_FUNCTIONS_FILE}
59     Add Elements To URI From File    ${SERVICE_CHAINS_URI}    ${SERVICE_CHAINS_FILE}
60     Add Elements To URI From File    ${SERVICE_FUNCTION_PATHS_URI}    ${SERVICE_FUNCTION_PATHS_FILE}
61
62 Create and Get Rendered Service Path
63     [Documentation]    Create and Get Rendered Service Path Through RESTConf APIs
64     Post Elements To URI As JSON    ${OPERATIONS_CREATE_RSP_URI}    ${CREATE_RSP1_INPUT}
65     ${resp}    RequestsLibrary.Get    session    ${OPERATIONAL_RSPS_URI}
66     Should Be Equal As Strings    ${resp.status_code}    200
67     ${elements}=    Create List    SFC1-100-Path-1    "parent-service-function-path":"SFC1-100"    "hop-number":0    "service-index":255    "hop-number":1    "service-index":254    "hop-number":2    "service-index":253
68     Check For Elements At URI    ${OPERATIONAL_RSPS_URI}    ${elements}
69
70 Create Get Rendered Service Path Failure
71     [Documentation]    Create Rendered Service Path Failure Cases
72     ${resp}    RequestsLibrary.Post    session    ${OPERATIONS_CREATE_RSP_URI}    data=${CREATE_RSP_FAILURE_INPUT}    headers=${headers}
73     Should Be Equal As Strings    ${resp.status_code}    500
74
75 Get Rendered Service Path By Name
76     [Documentation]    Get Rendered Service Path By Name Through RESTConf APIs
77     Post Elements To URI As JSON    ${OPERATIONS_CREATE_RSP_URI}    ${CREATE_RSP1_INPUT}
78     ${resp}    RequestsLibrary.Get    session    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1
79     Should Be Equal As Strings    ${resp.status_code}    200
80     ${elements}=    Create List    SFC1-100-Path-1    "parent-service-function-path":"SFC1-100"    "hop-number":0    "service-index":255    "hop-number":1    "service-index":254    "hop-number":2    "service-index":253
81     Check For Elements At URI    ${OPERATIONAL_RSPS_URI}    ${elements}
82
83 Get Non Existing Rendered Service Path
84     [Documentation]    Get Non Existing Rendered Service Path Through RESTConf APIs
85     Post Elements To URI As JSON    ${OPERATIONS_CREATE_RSP_URI}    ${CREATE_RSP1_INPUT}
86     ${resp}    RequestsLibrary.Get    session    ${OPERATIONAL_RSPS_URI}rendered-service-path/non-existing-rsp
87     Should Be Equal As Strings    ${resp.status_code}    404
88     ${resp}    RequestsLibrary.Get    session    ${OPERATIONAL_RSPS_URI}
89     Should Be Equal As Strings    ${resp.status_code}    200
90     Should Not Contain    ${resp.content}    non-existing-rsp
91
92 Delete one Rendered Service Path By Name
93     [Documentation]    Delete One Rendered Service Path By Name Through RESTConf APIs
94     Post Elements To URI As JSON    ${OPERATIONS_CREATE_RSP_URI}    ${CREATE_RSP1_INPUT}
95     ${resp}    RequestsLibrary.Get    session    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1
96     Should Be Equal As Strings    ${resp.status_code}    200
97     Should Contain    ${resp.content}    SFC1-100-Path-1
98     Post Elements To URI As JSON    ${OPERATIONS_DELETE_RSP_URI}    ${DELETE_RSP1_INPUT}
99     ${resp}    RequestsLibrary.Get    session    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1
100     Should Be Equal As Strings    ${resp.status_code}    404
101     ${resp}    RequestsLibrary.Get    session    ${OPERATIONAL_RSPS_URI}
102     Should Be Equal As Strings    ${resp.status_code}    200
103     Should Not Contain    ${resp.content}    SFC1-100-Path-1
104
105 Delete Non Existing Rendered Service Path By Name
106     [Documentation]    Delete One Rendered Service Path By Name Through RESTConf APIs
107     Post Elements To URI As JSON    ${OPERATIONS_CREATE_RSP_URI}    ${CREATE_RSP1_INPUT}
108     ${resp}    RequestsLibrary.Get    session    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1
109     Should Be Equal As Strings    ${resp.status_code}    200
110     Should Contain    ${resp.content}    SFC1-100-Path-1
111     Post Elements To URI As JSON    ${OPERATIONS_DELETE_RSP_URI}    ${DELETE_RSP2_INPUT}
112     ${resp}    RequestsLibrary.Get    session    ${OPERATIONAL_RSPS_URI}
113     Should Be Equal As Strings    ${resp.status_code}    200
114     Should Not Contain    ${resp.content}    {"rendered-service-paths":{}}
115
116 Get Rendered Service Path Hop
117     [Documentation]    Get Rendered Service Path By Name Through RESTConf APIs
118     Post Elements To URI As JSON    ${OPERATIONS_CREATE_RSP_URI}    ${CREATE_RSP1_INPUT}
119     ${resp}    RequestsLibrary.Get    session    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/0/
120     Should Be Equal As Strings    ${resp.status_code}    200
121     ${elements}=    Create List    "hop-number":0    "service-index":255    "service-function-name":"dpi
122     Check For Elements At URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/0/    ${elements}
123     ${elements}=    Create List    "hop-number":1    "service-index":254    "service-function-name":"napt44
124     Check For Elements At URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/1/    ${elements}
125     ${elements}=    Create List    "hop-number":2    "service-index":253    "service-function-name":"firewall
126     Check For Elements At URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/2/    ${elements}
127     ${resp}    RequestsLibrary.Get    session    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/3/
128     Should Be Equal As Strings    ${resp.status_code}    404
129     Post Elements To URI As JSON    ${OPERATIONS_DELETE_RSP_URI}    ${DELETE_RSP1_INPUT}
130
131 Generate RSPs with Random Schedule Algorithm type
132     [Documentation]    Generate RSPs with Random Schedule Algorithm type Through RESTConf APIs
133     Remove All Elements At URI    ${SERVICE_SCHED_TYPES_URI}
134     Add Elements To URI From File    ${SERVICE_RANDOM_SCHED_TYPE_URI}    ${SERVICE_RANDOM_SCHED_TYPE_FILE}
135     Post Elements To URI As JSON    ${OPERATIONS_CREATE_RSP_URI}    ${CREATE_RSP1_INPUT}
136     ${elements}=    Create List    "hop-number":0    "service-index":255    "service-function-name":"dpi
137     Check For Elements At URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/0/    ${elements}
138     ${elements}=    Create List    "hop-number":1    "service-index":254    "service-function-name":"napt44
139     Check For Elements At URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/1/    ${elements}
140     ${elements}=    Create List    "hop-number":2    "service-index":253    "service-function-name":"firewall
141     Check For Elements At URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/2/    ${elements}
142     Post Elements To URI As JSON    ${OPERATIONS_CREATE_RSP_URI}    ${CREATE_RSP2_INPUT}
143     ${elements}=    Create List    "hop-number":0    "service-index":255    "service-function-name":"dpi
144     Check For Elements At URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-2/rendered-service-path-hop/0/    ${elements}
145     ${elements}=    Create List    "hop-number":1    "service-index":254    "service-function-name":"napt44
146     Check For Elements At URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-2/rendered-service-path-hop/1/    ${elements}
147     ${elements}=    Create List    "hop-number":2    "service-index":253    "service-function-name":"firewall
148     Check For Elements At URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-2/rendered-service-path-hop/2/    ${elements}
149     Post Elements To URI As JSON    ${OPERATIONS_DELETE_RSP_URI}    ${DELETE_RSP1_INPUT}
150     Post Elements To URI As JSON    ${OPERATIONS_DELETE_RSP_URI}    ${DELETE_RSP2_INPUT}
151
152 Generate RSPs with Round Robin Schedule Algorithm type
153     [Documentation]    Generate RSPs with Round Robin Schedule Algorithm type
154     Remove All Elements At URI    ${SERVICE_SCHED_TYPES_URI}
155     Add Elements To URI From File    ${SERVICE_ROUNDROBIN_SCHED_TYPE_URI}    ${SERVICE_ROUNDROBIN_SCHED_TYPE_FILE}
156     Post Elements To URI As JSON    ${OPERATIONS_CREATE_RSP_URI}    ${CREATE_RSP1_INPUT}
157     Post Elements To URI As JSON    ${OPERATIONS_CREATE_RSP_URI}    ${CREATE_RSP2_INPUT}
158     Post Elements To URI As JSON    ${OPERATIONS_CREATE_RSP_URI}    ${CREATE_RSP3_INPUT}
159     Post Elements To URI As JSON    ${OPERATIONS_CREATE_RSP_URI}    ${CREATE_RSP4_INPUT}
160     Post Elements To URI As JSON    ${OPERATIONS_CREATE_RSP_URI}    ${CREATE_RSP5_INPUT}
161     Post Elements To URI As JSON    ${OPERATIONS_CREATE_RSP_URI}    ${CREATE_RSP6_INPUT}
162     ${path1_hop0}   Get JSON Elements From URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/0/
163     ${path1_hop1}   Get JSON Elements From URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/1/
164     ${path1_hop2}   Get JSON Elements From URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/2/
165     ${path2_hop0}   Get JSON Elements From URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-2/rendered-service-path-hop/0/
166     ${path2_hop1}   Get JSON Elements From URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-2/rendered-service-path-hop/1/
167     ${path2_hop2}   Get JSON Elements From URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-2/rendered-service-path-hop/2/
168     ${path3_hop0}   Get JSON Elements From URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-3/rendered-service-path-hop/0/
169     ${path3_hop1}   Get JSON Elements From URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-3/rendered-service-path-hop/1/
170     ${path3_hop2}   Get JSON Elements From URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-3/rendered-service-path-hop/2/
171     ${path4_hop0}   Get JSON Elements From URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-4/rendered-service-path-hop/0/
172     ${path4_hop1}   Get JSON Elements From URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-4/rendered-service-path-hop/1/
173     ${path4_hop2}   Get JSON Elements From URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-4/rendered-service-path-hop/2/
174     ${path5_hop0}   Get JSON Elements From URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-5/rendered-service-path-hop/0/
175     ${path5_hop1}   Get JSON Elements From URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-5/rendered-service-path-hop/1/
176     ${path5_hop2}   Get JSON Elements From URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-5/rendered-service-path-hop/2/
177     ${path6_hop0}   Get JSON Elements From URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-6/rendered-service-path-hop/0/
178     ${path6_hop1}   Get JSON Elements From URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-6/rendered-service-path-hop/1/
179     ${path6_hop2}   Get JSON Elements From URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-6/rendered-service-path-hop/2/
180     Should Be Equal     ${path1_hop0}    ${path4_hop0}
181     Should Not Be Equal     ${path1_hop0}    ${path2_hop0}
182     Should Be Equal     ${path1_hop1}    ${path4_hop1}
183     Should Not Be Equal     ${path1_hop1}    ${path2_hop1}
184     Should Be Equal     ${path1_hop2}    ${path4_hop2}
185     Should Not Be Equal     ${path1_hop2}    ${path2_hop2}
186     Should Be Equal     ${path2_hop0}    ${path5_hop0}
187     Should Not Be Equal     ${path2_hop0}    ${path3_hop0}
188     Should Be Equal     ${path2_hop1}    ${path5_hop1}
189     Should Not Be Equal     ${path2_hop1}    ${path3_hop1}
190     Should Be Equal     ${path2_hop2}    ${path5_hop2}
191     Should Not Be Equal     ${path2_hop2}    ${path3_hop2}
192     Should Be Equal     ${path3_hop0}    ${path6_hop0}
193     Should Not Be Equal     ${path3_hop0}    ${path1_hop0}
194     Should Be Equal     ${path3_hop1}    ${path6_hop1}
195     Should Not Be Equal     ${path3_hop1}    ${path1_hop1}
196     Should Be Equal     ${path3_hop2}    ${path6_hop2}
197     Should Not Be Equal     ${path3_hop2}    ${path1_hop2}
198     Post Elements To URI As JSON    ${OPERATIONS_DELETE_RSP_URI}    ${DELETE_RSP1_INPUT}
199     Post Elements To URI As JSON    ${OPERATIONS_DELETE_RSP_URI}    ${DELETE_RSP2_INPUT}
200     Post Elements To URI As JSON    ${OPERATIONS_DELETE_RSP_URI}    ${DELETE_RSP3_INPUT}
201     Post Elements To URI As JSON    ${OPERATIONS_DELETE_RSP_URI}    ${DELETE_RSP4_INPUT}
202     Post Elements To URI As JSON    ${OPERATIONS_DELETE_RSP_URI}    ${DELETE_RSP5_INPUT}
203     Post Elements To URI As JSON    ${OPERATIONS_DELETE_RSP_URI}    ${DELETE_RSP6_INPUT}
204
205 Generate RSPs with Shortest Path Schedule Algorithm type
206     [Documentation]    Generate RSPs with Shortest Path Schedule Algorithm type Through RESTConf APIs
207     Remove All Elements At URI    ${SERVICE_SCHED_TYPES_URI}
208     Add Elements To URI From File    ${SERVICE_SHORTESTPATH_SCHED_TYPE_URI}    ${SERVICE_SHORTESTPATH_SCHED_TYPE_FILE}
209     Post Elements To URI As JSON    ${OPERATIONS_CREATE_RSP_URI}    ${CREATE_RSP1_INPUT}
210     ${elements}=    Create List    "hop-number":0    "service-index":255    "service-function-name":"dpi
211     Check For Elements At URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/0/    ${elements}
212     ${elements}=    Create List    "hop-number":1    "service-index":254    "service-function-name":"napt44
213     Check For Elements At URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/1/    ${elements}
214     ${elements}=    Create List    "hop-number":2    "service-index":253    "service-function-name":"firewall
215     Check For Elements At URI    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/2/    ${elements}
216     ${resp}    RequestsLibrary.Get    session    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/0/
217     Should Be Equal As Strings    ${resp.status_code}    200
218     ${fwd_hop1}    Extract Value From Content    ${resp.content}    service-function-forwarder
219     ${resp}    RequestsLibrary.Get    session    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/1/
220     Should Be Equal As Strings    ${resp.status_code}    200
221     ${fwd_hop2}    Extract Value From Content    ${resp.content}    service-function-forwarder
222     ${resp}    RequestsLibrary.Get    session    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-1/rendered-service-path-hop/2/
223     Should Be Equal As Strings    ${resp.status_code}    200
224     ${fwd_hop3}    Extract Value From Content    ${resp.content}    service-function-forwarder
225     Should Be Equal    ${fwd_hop1}    ${fwd_hop2}
226     Should Be Equal    ${fwd_hop2}    ${fwd_hop3}
227     Post Elements To URI As JSON    ${OPERATIONS_CREATE_RSP_URI}    ${CREATE_RSP2_INPUT}
228     ${resp}    RequestsLibrary.Get    session    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-2/rendered-service-path-hop/0/
229     Should Be Equal As Strings    ${resp.status_code}    200
230     ${fwd_hop1}    Extract Value From Content    ${resp.content}    service-function-forwarder
231     ${resp}    RequestsLibrary.Get    session    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-2/rendered-service-path-hop/1/
232     Should Be Equal As Strings    ${resp.status_code}    200
233     ${fwd_hop2}    Extract Value From Content    ${resp.content}    service-function-forwarder
234     ${resp}    RequestsLibrary.Get    session    ${OPERATIONAL_RSPS_URI}rendered-service-path/SFC1-100-Path-2/rendered-service-path-hop/2/
235     Should Be Equal As Strings    ${resp.status_code}    200
236     ${fwd_hop3}    Extract Value From Content    ${resp.content}    service-function-forwarder
237     Should Be Equal    ${fwd_hop1}    ${fwd_hop2}
238     Should Be Equal    ${fwd_hop2}    ${fwd_hop3}
239     Post Elements To URI As JSON    ${OPERATIONS_DELETE_RSP_URI}    ${DELETE_RSP1_INPUT}
240     Post Elements To URI As JSON    ${OPERATIONS_DELETE_RSP_URI}    ${DELETE_RSP2_INPUT}
241
242 Clean Datastore After Tests
243     [Documentation]    Clean All Items In Datastore After Tests
244     Remove All Elements At URI    ${SERVICE_FUNCTIONS_URI}
245     Remove All Elements At URI    ${SERVICE_FORWARDERS_URI}
246     Remove All Elements At URI    ${SERVICE_NODES_URI}
247     Remove All Elements At URI    ${SERVICE_CHAINS_URI}
248     Remove All Elements At URI    ${SERVICE_SCHED_TYPES_URI}
249     Remove All Elements At URI    ${SERVICE_FUNCTION_PATHS_URI}
250
251 *** Keywords ***
252 Post Elements To URI As JSON
253     [Arguments]   ${uri}   ${data}
254     ${resp}    RequestsLibrary.Post    session    ${uri}    data=${data}    headers=${headers}
255     Should Be Equal As Strings    ${resp.status_code}    200
256
257 Get JSON Elements From URI
258     [Arguments]    ${uri}
259     ${resp}    RequestsLibrary.Get    session    ${uri}
260     ${value}   To Json    ${resp.content}
261     [Return]    ${value}