1*** Settings ***
2Documentation           Test setting VLAN and its configuration.
3
4
5Resource                        ../lib/rest_client.robot
6Resource                        ../lib/ipmi_client.robot
7Resource                        ../lib/utils.robot
8Resource                        ../lib/common_utils.robot
9Resource                        ../lib/openbmc_ffdc.robot
10Resource                        ../lib/ipmi_client.robot
11Resource                        ../lib/bmc_network_utils.robot
12Resource                        ../lib/state_manager.robot
13Library                         ../lib/utilities.py
14Library                         ../lib/ipmi_utils.py
15Library                         ../lib/var_funcs.py
16Library                         ../lib/func_args.py
17Library                         Collections
18
19Suite Teardown                  Suite Teardown Execution
20
21Force Tags                      VLAN_Network
22
23*** Variables ***
24
25${vlan_id}                      ${53}
26@{vlan_ids}                     ${35}  ${55}
27${invalid_vlan_id}              abc
28${vlan_resource}                ${NETWORK_MANAGER}action/VLAN
29${network_resource}             xyz.openbmc_project.Network.IP.Protocol.IPv4
30${static_network_resource}      xyz.openbmc_project.Network.IP.AddressOrigin.Static
31${ip}                           10.6.6.10
32@{ip_addresses}                 10.5.5.10  10.4.5.7
33${netmask}                      ${24}
34${gateway}                      0.0.0.0
35${initial_vlan_config}          @{EMPTY}
36
37
38*** Test Cases ***
39
40Add VLAN Via REST And Verify
41    [Documentation]  Add VLAN via REST and verify it via REST and IPMI.
42    [Tags]  Add_VLAN_Via_REST_And_Verify
43    [Setup]  Test Setup Execution
44    [Teardown]  Delete VLANs  [${vlan_id}]
45
46    Create VLAN  ${vlan_id}
47    Verify Existence Of VLAN  ${vlan_id}
48
49    ${lan_config}=  Get LAN Print Dict
50    Valid Value  lan_config['802.1q VLAN ID']  ["${vlan_id}"]
51
52
53Add Invalid VLAN Via REST And Verify
54    [Documentation]  Add Invalid VLAN via REST and verify.
55    [Tags]  Add_Invalid_VLAN_Via_REST_And_Verify
56
57    Create VLAN  ${invalid_vlan_id}  expected_result=error
58
59
60Delete VLAN Via REST
61    [Documentation]  Delete VLAN via REST and verify it via REST and IPMI.
62    [Tags]  Delete_VLAN_Via_REST
63    [Setup]  Run Keywords  Test Setup Execution  AND  Create VLAN  ${vlan_id}
64
65    Verify Existence Of VLAN  ${vlan_id}
66    Delete VLANs  [${vlan_id}]
67    Verify Existence Of VLAN  ${vlan_id}  expected_result=error
68
69    ${lan_config}=  Get LAN Print Dict
70    Valid Value  lan_config['802.1q VLAN ID']  ["Disabled"]
71
72
73Configure Network Settings On VLAN Via REST
74    [Documentation]  Configure IP on VLAN and verify it via REST and IPMI.
75    [Tags]  Configure_Network_Settings_On_VLAN_Via_REST
76    [Setup]  Run Keywords  Test Setup Execution  AND  Create VLAN  ${vlan_id}
77    [Teardown]  Delete VLANs  [${vlan_id}]
78
79    Configure Network Settings On VLAN  ${vlan_id}  ${ip}  ${netmask}
80    Get VLAN URI For IP  ${vlan_id}  ${ip}
81
82    ${lan_config}=  Get LAN Print Dict
83    Valid Value  lan_config['IP Address']  ["${ip}"]
84
85
86Delete IP On VLAN Via REST
87    [Documentation]  Delete IP on VLAN and verify it via REST and IPMI.
88    [Tags]  Delete_IP_On_VLAN_Via_REST
89    [Setup]  Run Keywords  Test Setup Execution  AND  Create VLAN  ${vlan_id}
90    [Teardown]  Delete VLANs  [${vlan_id}]
91
92    Configure Network Settings On VLAN  ${vlan_id}  ${ip}  ${netmask}
93    ${lan_config}=  Get LAN Print Dict
94    Valid Value  lan_config['IP Address']  ["${ip}"]
95
96    ${vlan_ip_uri}=  Get VLAN URI For IP  ${vlan_id}  ${ip}
97    Delete IP And Object  ${ip}  ${vlan_ip_uri}
98
99    Get VLAN URI For IP  ${vlan_id}  ${ip}  expected_result=error
100
101    ${lan_config}=  Get LAN Print Dict
102    Should Not Match  ${lan_config['IP Address']}  ${ip}
103
104
105Delete VLAN When IP Is Configured Via REST
106    [Documentation]  Delete IP on VLAN and verify using IPMI.
107    [Tags]  Delete_VLAN_When_IP_Is_Configured_Via_REST
108    [Setup]  Run Keywords  Test Setup Execution  AND  Create VLAN  ${vlan_id}
109    [Teardown]  Delete VLANs  [${vlan_id}]
110
111    Configure Network Settings On VLAN  ${vlan_id}  ${ip}  ${netmask}
112    ${lan_config}=  Get LAN Print Dict
113    Valid Value  lan_config['IP Address']  ["${ip}"]
114    Delete VLANs  [${vlan_id}]
115
116    Verify Existence Of VLAN  ${vlan_id}  expected_result=error
117
118    ${lan_config}=  Get LAN Print Dict
119    Valid Value  lan_config['802.1q VLAN ID']  ["Disabled"]
120
121
122Configure VLAN And Check Persistency On Reboot
123    [Documentation]  Create VLAN ID & IP , reboot and verify.
124    [Tags]  Configure_VLAN_And_Check_Persistency_On_Reboot
125    [Setup]  Test Setup Execution
126    [Teardown]  Delete VLANs  [${vlan_id}]
127
128    Create VLAN  ${vlan_id}
129    Configure Network Settings On VLAN  ${vlan_id}  ${ip}  ${netmask}
130    ${lan_config}=  Get LAN Print Dict
131    Valid Value  lan_config['IP Address']  ["${ip}"]
132    Valid Value  lan_config['802.1q VLAN ID']  ["${vlan_id}"]
133
134    Initiate BMC Reboot
135
136    Verify Existence Of VLAN  ${vlan_id}
137    Get VLAN URI For IP  ${vlan_id}  ${ip}
138
139    ${lan_config}=  Get LAN Print Dict
140    Valid Value  lan_config['IP Address']  ["${ip}"]
141    Valid Value  lan_config['802.1q VLAN ID']  ["${vlan_id}"]
142
143
144Add Multiple VLANs Via REST And Verify
145    [Documentation]  Add multiple VLANs via REST and verify them via CLI.
146    [Tags]  Add_Multiple_VLANs_Via_REST_And_Verify
147    [Setup]  Test Setup Execution
148    [Teardown]  Delete VLANs  ${vlan_ids}
149
150    FOR  ${vlan_id}  IN   @{vlan_ids}
151        Create VLAN  ${vlan_id}
152        Verify Existence Of VLAN  ${vlan_id}
153    END
154
155    ${lan_config}=  Get LAN Print Dict
156    ${vlan_id_ipmi}=  Convert To Integer  ${lan_config["802.1q VLAN ID"]}
157    Valid List  vlan_ids  required_values=[${vlan_id_ipmi}]
158
159Delete Multiple IPs On VLAN And Verify
160    [Documentation]  Delete multiple IPs on VLAN and verify each via REST and IPMI.
161    [Tags]  Delete_Multiple_IPs_On_VLAN_And_Verify
162    [Setup]  Run Keywords  Test Setup Execution  AND  Create VLAN  ${vlan_id}
163    [Teardown]  Delete VLANs  [${vlan_id}]
164
165    FOR  ${ip}  IN  @{ip_addresses}
166        Configure Network Settings On VLAN  ${vlan_id}  ${ip}  ${netmask}
167        ${vlan_ip_uri}=  Get VLAN URI For IP  ${vlan_id}  ${ip}
168        Delete IP And Object  ${ip}  ${vlan_ip_uri}
169
170        Get VLAN URI For IP  ${vlan_id}  ${ip}  expected_result=error
171
172        ${lan_config}=  Get LAN Print Dict
173        Should Not Match  ${lan_config['IP Address']}  ${ip}
174    END
175
176Delete Multiple VLANs Via REST
177    [Documentation]  Delete multiple VLANs via REST and verify each via REST and IPMI.
178    [Tags]  Delete_Multiple_VLANs_Via_REST
179    [Setup]  Test Setup Execution
180
181    FOR  ${vlan_id}  IN   @{vlan_ids}
182        Create VLAN  ${vlan_id}
183    END
184
185    Delete VLANs  ${vlan_ids}
186
187    ${lan_config}=  Get LAN Print Dict
188    Valid Value  lan_config['802.1q VLAN ID']  ["Disabled"]
189
190Configure Multiple IPs On VLAN Via REST
191    [Documentation]  Configure Multiple IPs on VLAN and verify each via REST.
192    [Tags]  Configure_Multiple_IPs_On_VLAN_Via_REST
193    [Setup]  Run Keywords  Test Setup Execution  AND  Create VLAN  ${vlan_id}
194    [Teardown]  Delete VLANs  [${vlan_id}]
195
196    FOR  ${ip}  IN  @{ip_addresses}
197        Configure Network Settings On VLAN  ${vlan_id}  ${ip}  ${netmask}
198    END
199
200    ${lan_config}=  Get LAN Print Dict
201    Valid Value  lan_config['IP Address']  ["${ip_addresses[0]}"]
202
203
204Create And Delete VLAN And IP On It Multiple Times With BMC Reboot
205    [Documentation]  Create and delete VLAN and IP on it multiple times with BMC reboot.
206    [Tags]  Create_And_Delete_VLAN_And_IP_On_It_Multiple_Times_With_BMC_Reboot
207    [Setup]  Test Setup Execution
208
209    FOR  ${i}  IN RANGE   ${5}
210      Create VLAN  ${vlan_id}
211      Verify Existence Of VLAN  ${vlan_id}
212      Configure Network Settings On VLAN  ${vlan_id}  ${ip}  ${netmask}
213      ${vlan_ip_uri}=  Get VLAN URI For IP  ${vlan_id}  ${ip}
214      Delete IP And Object  ${ip}  ${vlan_ip_uri}
215      Get VLAN URI For IP  ${vlan_id}  ${ip}  expected_result=error
216      Delete VLANs  [${vlan_id}]
217      Verify Existence Of VLAN  ${vlan_id}  expected_result=error
218      Initiate BMC Reboot
219      Sleep  ${NETWORK_TIMEOUT}s
220      Wait For Host To Ping  ${OPENBMC_HOST}  ${NETWORK_TIMEOUT}
221      Verify Existence Of VLAN  ${vlan_id}  expected_result=error
222    END
223
224    ${lan_config}=  Get LAN Print Dict
225    Valid Value  lan_config['802.1q VLAN ID']  ["Disabled"]
226
227
228*** Keywords ***
229
230
231Test Setup Execution
232    [Documentation]  Check and delete all previously created VLAN if any.
233
234    Printn
235    ${lan_config}=  Get LAN Print Dict
236    Return From Keyword If  '${lan_config['802.1q VLAN ID']}' == 'Disabled'
237
238    # Get all VLAN ID on interface eth0.
239    ${vlan_ids}=  Get VLAN IDs
240
241    ${initial_vlan_config}=  Create List
242    Set Suite Variable  ${initial_vlan_config}
243
244    FOR  ${vlan_id}  IN  @{vlan_ids}
245        ${vlan_records}=  Read Properties
246        ...  ${NETWORK_MANAGER}eth0_${vlan_id}${/}enumerate  quiet=1
247        ${vlan_record}=  Filter Struct
248        ...  ${vlan_records}  [('Origin', '${static_network_resource}')]
249
250        ${id}=  Convert To Integer  ${vlan_id}
251        Set Initial VLAN Config  ${vlan_record}  ${id}
252    END
253    Rprint Vars  initial_vlan_config
254
255    Delete VLANs  ${vlan_ids}
256
257
258Set Initial VLAN Config
259    [Documentation]  Set suite level list of Initial VLAN Config.
260    [Arguments]  ${vlan_record}  ${id}
261
262    # Description of argument(s):
263    # vlan_record  Dictionary of IP configuration information of a VLAN.
264    # Example:
265    #  /xyz/openbmc_project/network/eth0_55/ipv4/5fb2cfe6": {
266    #  "Address": "x.x.x.x",
267    #  "Gateway": "",
268    #  "Origin": "xyz.openbmc_project.Network.IP.AddressOrigin.Static",
269    #  "PrefixLength": 16,
270    #  "Type": "xyz.openbmc_project.Network.IP.Protocol.IPv4"}
271    #
272    # id  The VLAN ID corresponding to the IP Configuration records contained
273    #     in the variable "vlan_record".
274
275    ${uris}=  Get Dictionary Keys  ${vlan_record}
276
277    FOR  ${uri}  IN  @{uris}
278        Append To List  ${initial_vlan_config}  ${id}  ${vlan_record['${uri}']['Address']}
279        ...  ${vlan_record['${uri}']['PrefixLength']}
280    END
281
282    Run Keyword If  @{uris} == @{EMPTY}
283    ...  Append To List  ${initial_vlan_config}  ${id}  ${EMPTY}  ${EMPTY}
284
285
286Suite Teardown Execution
287    [Documentation]  Restore VLAN configuration.
288
289    ${length}=  Get Length  ${initial_vlan_config}
290    Return From Keyword If  ${length} == ${0}
291
292    ${previous_id}=  Set Variable  ${EMPTY}
293    FOR  ${index}  IN RANGE  0  ${length}  3
294
295        Run Keyword If  '${initial_vlan_config[${index+1}]}' == '${EMPTY}'
296        ...  Create VLAN  ${initial_vlan_config[${index}]}
297        ...  ELSE IF  '${previous_id}' == '${initial_vlan_config[${index}]}'
298        ...  Configure Network Settings On VLAN  ${initial_vlan_config[${index}]}
299        ...  ${initial_vlan_config[${index+1}]}  ${initial_vlan_config[${index+2}]}
300        ...  ELSE  Run Keywords  Create VLAN  ${initial_vlan_config[${index}]}  AND
301        ...  Configure Network Settings On VLAN  ${initial_vlan_config[${index}]}
302        ...  ${initial_vlan_config[${index+1}]}  ${initial_vlan_config[${index+2}]}
303
304        ${previous_id}=  Set Variable  ${initial_vlan_config[${index}]}
305    END
306
307
308Delete VLANs
309    [Documentation]  Delete one or more VLANs.
310    [Arguments]  ${ids}  ${interface}=eth0
311
312    # Description of argument(s):
313    # ids                           A list of VLAN IDs (e.g. ['53'] or ['53', '35', '12']). Note that the
314    #                               caller may simply pass a list variable or he/she may specify a
315    #                               python-like list specification (see examples below).
316    # interface                     The physical interface for the VLAN (e.g. 'eth0').
317
318    # Example calls:
319    # Delete VLANs  ${vlan_ids}
320    # Delete Vlans  [53, 35]
321
322    # Allow for python-like list specifications (e.g. ids=['53']).
323    ${vlan_ids}=  Source To Object  ${ids}
324
325    FOR  ${id}  IN  @{vlan_ids}
326        OpenBMC Delete Request  ${NETWORK_MANAGER}${interface}_${id}
327    END
328    Run Key U  Sleep \ ${NETWORK_TIMEOUT}s
329
330
331Get VLAN IDs
332    [Documentation]  Return all VLAN IDs.
333
334    ${vlan_ids}  ${stderr}  ${rc}=  BMC Execute Command
335    ...  /sbin/ip addr | grep @eth0 | cut -f1 -d@ | cut -f2 -d.
336    ${vlan_ids}=  Split String  ${vlan_ids}
337
338    [Return]  @{vlan_ids}
339
340
341Get VLAN URI For IP
342    [Documentation]  Get and return the URI for a VLAN IP.
343    [Arguments]  ${vlan_id}  ${vlan_ip}  ${expected_result}=valid
344
345    # Description of argument(s):
346    # vlan_id  The VLAN ID (e.g. '53').
347    # vlan_ip  The VLAN IP (e.g. 'x.x.x.x').
348
349    ${vlan_records}=  Read Properties
350    ...  ${NETWORK_MANAGER}eth0_${vlan_id}${/}enumerate  quiet=1
351    ${vlan_record}=  Filter Struct  ${vlan_records}  [('Address', '${vlan_ip}')]
352    ${num_vlan_records}=  Get Length  ${vlan_record}
353    ${status}=  Run Keyword And Return Status  Should Be True  ${num_vlan_records} > 0
354    ...  msg=Could not find a uri for vlan "${vlan_id}" with IP "${vlan_ip}".
355
356    Run Keyword If  '${expected_result}' == 'valid'
357    ...      Should Be Equal  ${status}  ${True}
358    ...      msg=VLAN IP URI doesn't exist!.
359    ...  ELSE
360    ...      Should Be Equal  ${status}  ${False}
361    ...      msg=VLAN IP URI exists!.
362    ${uris}=  Get Dictionary Keys  ${vlan_record}
363    Return From Keyword If  @{uris} == @{EMPTY}
364
365    [Return]  ${uris[${0}]}
366
367
368Verify Existence Of VLAN
369    [Documentation]  Verify VLAN ID exists.
370    [Arguments]  ${id}  ${interface}=eth0  ${expected_result}=valid
371
372    # Description of argument(s):
373    # id  The VLAN ID (e.g. id:'53').
374    # interface        Physical Interface on which the VLAN is defined.
375    # expected_result  Expected status to check existence or non-existence of VLAN.
376
377    ${vlan_ids}=  Get VLAN IDs
378    ${cli_status}=  Run Keyword And Return Status
379    ...  Valid List  vlan_ids  required_values=['${id}']
380
381    ${network_records}=  Read Properties  ${NETWORK_MANAGER}
382    ${rest_status}=  Run Keyword And Return Status  Valid List  network_records
383    ...  required_values=['${NETWORK_MANAGER}${interface}_${id}']
384
385    Should Be Equal  ${rest_status}  ${cli_status}
386    ...  msg=REST and CLI Output are not the same.
387    Run Keyword If  '${expected_result}' == 'valid'
388    ...      Should Be Equal  ${rest_status}  ${True}
389    ...      msg=VLAN ID doesn't exist!.
390    ...  ELSE
391    ...      Should Be Equal  ${rest_status}  ${False}
392    ...      msg=VLAN ID exists!.
393