1*** Settings ***
2Documentation  Network interface configuration and verification
3               ...  tests.
4
5Resource       ../../lib/bmc_redfish_resource.robot
6Resource       ../../lib/bmc_network_utils.robot
7Resource       ../../lib/openbmc_ffdc.robot
8Library        ../../lib/bmc_network_utils.py
9Library        Collections
10
11Test Setup     Test Setup Execution
12Test Teardown  Test Teardown Execution
13
14*** Variables ***
15${test_hostname}           openbmc
16${test_ipv4_addr}          10.7.7.7
17${test_ipv4_invalid_addr}  0.0.1.a
18${test_subnet_mask}        255.255.0.0
19${test_gateway}            10.7.7.1
20
21*** Test Cases ***
22
23Get IP Address And Verify
24    [Documentation]  Get IP Address And Verify.
25    [Tags]  Get_IP_Address_And_Verify
26
27    : FOR  ${network_configuration}  IN  @{network_configurations}
28    \  Verify IP On BMC  ${network_configuration['Address']}
29
30Get Netmask And Verify
31    [Documentation]  Get Netmask And Verify.
32    [Tags]  Get_Netmask_And_Verify
33
34    : FOR  ${network_configuration}  IN  @{network_configurations}
35    \  Verify Netmask On BMC  ${network_configuration['SubnetMask']}
36
37Get Gateway And Verify
38    [Documentation]  Get gateway and verify it's existence on the BMC.
39    [Tags]  Get_Gateway_And_Verify
40
41    : FOR  ${network_configuration}  IN  @{network_configurations}
42    \  Verify Gateway On BMC  ${network_configuration['Gateway']}
43
44Get MAC Address And Verify
45    [Documentation]  Get MAC address and verify it's existence on the BMC.
46    [Tags]  Get_MAC_Address_And_Verify
47
48    ${resp}=  Redfish.Get  ${REDFISH_NW_ETH0_URI}
49    ${macaddr}=  Get From Dictionary  ${resp.dict}  MACAddress
50    Validate MAC On BMC  ${macaddr}
51
52Verify All Configured IP And Netmask
53    [Documentation]  Verify all configured IP and netmask on BMC.
54    [Tags]  Verify_All_Configured_IP_And_Netmask
55
56    : FOR  ${network_configuration}  IN  @{network_configurations}
57    \  Verify IP And Netmask On BMC  ${network_configuration['Address']}
58    ...  ${network_configuration['SubnetMask']}
59
60Get Hostname And Verify
61    [Documentation]  Get hostname via Redfish and verify.
62    [Tags]  Get_Hostname_And_Verify
63
64    ${hostname}=  Redfish_Utils.Get Attribute  ${REDFISH_NW_PROTOCOL_URI}  HostName
65
66    Validate Hostname On BMC  ${hostname}
67
68Configure Hostname And Verify
69    [Documentation]  Configure hostname via Redfish and verify.
70    [Tags]  Configure_Hostname_And_Verify
71
72    Configure Hostname  ${test_hostname}
73
74    Validate Hostname On BMC  ${test_hostname}
75
76Add Valid IPv4 Address And Verify
77    [Documentation]  Add IPv4 Address via Redfish and verify.
78    [Tags]  Add_Valid_IPv4_Addres_And_Verify
79
80     Add IP Address  ${test_ipv4_addr}  ${test_subnet_mask}  ${test_gateway}
81     Delete IP Address  ${test_ipv4_addr}
82
83Add Invalid IPv4 Address And Verify
84    [Documentation]  Add Invalid IPv4 Address via Redfish and verify.
85    [Tags]  Add_Invalid_IPv4_Addres_And_Verify
86
87    Add IP Address  ${test_ipv4_invalid_addr}  ${test_subnet_mask}
88    ...  ${test_gateway}  valid_status_codes=${HTTP_BAD_REQUEST}
89
90
91*** Keywords ***
92
93Test Setup Execution
94    [Documentation]  Test setup execution.
95
96    Redfish.Login
97
98    @{network_configurations}=  Get Network Configuration
99    Set Test Variable  @{network_configurations}
100
101    # Get BMC IP address and prefix length.
102    ${ip_data}=  Get BMC IP Info
103    Set Test Variable  ${ip_data}
104
105
106Get Network Configuration
107    [Documentation]  Get network configuration.
108
109    # Sample output:
110    #{
111    #  "@odata.context": "/redfish/v1/$metadata#EthernetInterface.EthernetInterface",
112    #  "@odata.id": "/redfish/v1/Managers/bmc/EthernetInterfaces/eth0",
113    #  "@odata.type": "#EthernetInterface.v1_2_0.EthernetInterface",
114    #  "Description": "Management Network Interface",
115    #  "IPv4Addresses": [
116    #    {
117    #      "Address": "169.254.xx.xx",
118    #      "AddressOrigin": "IPv4LinkLocal",
119    #      "Gateway": "0.0.0.0",
120    #      "SubnetMask": "255.255.0.0"
121    #    },
122    #    {
123    #      "Address": "xx.xx.xx.xx",
124    #      "AddressOrigin": "Static",
125    #      "Gateway": "xx.xx.xx.1",
126    #      "SubnetMask": "xx.xx.xx.xx"
127    #    }
128    #  ],
129    #  "Id": "eth0",
130    #  "MACAddress": "xx:xx:xx:xx:xx:xx",
131    #  "Name": "Manager Ethernet Interface",
132    #  "SpeedMbps": 0,
133    #  "VLAN": {
134    #    "VLANEnable": false,
135    #    "VLANId": 0
136    #  }
137
138    ${resp}=  Redfish.Get  ${REDFISH_NW_ETH0_URI}
139    @{network_configurations}=  Get From Dictionary  ${resp.dict}  IPv4Addresses
140    [Return]  @{network_configurations}
141
142
143Verify IP On BMC
144    [Documentation]  Verify IP on BMC.
145    [Arguments]  ${ip}
146
147    # Description of argument(s):
148    # ip  IP address to be verified (e.g. "10.7.7.7").
149
150    # Get IP address details on BMC using IP command.
151    @{ip_data}=  Get BMC IP Info
152    Should Contain Match  ${ip_data}  ${ip}/*
153    ...  msg=IP address does not exist.
154
155Add IP Address
156    [Documentation]  Add IP Address To BMC.
157    [Arguments]  ${ip}  ${subnet_mask}  ${gateway}
158    ...  ${valid_status_codes}=${HTTP_OK}
159
160    # Description of argument(s):
161    # ip                  IP address to be added (e.g. "10.7.7.7").
162    # subnet_mask         Subnet mask for the IP to be added
163    #                     (e.g. "255.255.0.0").
164    # gateway             Gateway for the IP to be added (e.g. "10.7.7.1").
165    # valid_status_codes  Expected return code from patch operation
166    #                     (e.g. "200").  See prolog of rest_request
167    #                     method in redfish_plut.py for details.
168
169    ${empty_dict}=  Create Dictionary
170    ${ip_data}=  Create Dictionary  Address=${ip}
171    ...  AddressOrigin=Static  SubnetMask=${subnet_mask}
172    ...  Gateway=${gateway}
173
174    ${patch_list}=  Create List
175    ${network_configurations}=  Get Network Configuration
176    ${num_entries}=  Get Length  ${network_configurations}
177
178    : FOR  ${INDEX}  IN RANGE  0  ${num_entries}
179    \  Append To List  ${patch_list}  ${empty_dict}
180
181    # We need not check for existance of IP on BMC while adding.
182    Append To List  ${patch_list}  ${ip_data}
183    ${data}=  Create Dictionary  IPv4Addresses=${patch_list}
184
185    Redfish.patch  ${REDFISH_NW_ETH0_URI}  body=&{data}
186    ...  valid_status_codes=[${valid_status_codes}]
187
188    Return From Keyword If  '${valid_status_codes}' != '${HTTP_OK}'
189
190    # Note: Network restart takes around 15-18s after patch request processing.
191    Sleep  ${NETWORK_TIMEOUT}s
192    Wait For Host To Ping  ${OPENBMC_HOST}  ${NETWORK_TIMEOUT}
193
194    Verify IP On BMC  ${ip}
195    Validate Network Config On BMC
196
197
198Delete IP Address
199    [Documentation]  Delete IP Address Of BMC.
200    [Arguments]  ${ip}  ${valid_status_codes}=${HTTP_OK}
201
202    # Description of argument(s):
203    # ip                  IP address to be deleted (e.g. "10.7.7.7").
204    # valid_status_codes  Expected return code from patch operation
205    #                     (e.g. "200").  See prolog of rest_request
206    #                     method in redfish_plut.py for details.
207
208    ${empty_dict}=  Create Dictionary
209    ${patch_list}=  Create List
210
211    @{network_configurations}=  Get Network Configuration
212    : FOR  ${network_configuration}  IN  @{network_configurations}
213    \  Run Keyword If  '${network_configuration['Address']}' == '${ip}'
214       ...  Append To List  ${patch_list}  ${null}
215       ...  ELSE  Append To List  ${patch_list}  ${empty_dict}
216
217    ${ip_found}=  Run Keyword And Return Status  List Should Contain Value
218    ...  ${patch_list}  ${null}  msg=${ip} does not exist on BMC
219    Pass Execution If  ${ip_found} == ${False}  ${ip} does not exist on BMC
220
221    # Run patch command only if given IP is found on BMC
222    ${data}=  Create Dictionary  IPv4Addresses=${patch_list}
223
224    Redfish.patch  ${REDFISH_NW_ETH0_URI}  body=&{data}
225    ...  valid_status_codes=[${valid_status_codes}]
226
227    # Note: Network restart takes around 15-18s after patch request processing
228    Sleep  ${NETWORK_TIMEOUT}s
229    Wait For Host To Ping  ${OPENBMC_HOST}  ${NETWORK_TIMEOUT}
230
231    ${delete_status}=  Run Keyword And Return Status  Verify IP On BMC  ${ip}
232    Run Keyword If  '${valid_status_codes}' == '${HTTP_OK}'
233    ...  Should Be True  ${delete_status} == ${False}
234    ...  ELSE  Should Be True  ${delete_status} == ${True}
235
236    Validate Network Config On BMC
237
238
239Validate Network Config On BMC
240    [Documentation]  Check that network info obtained via redfish matches info
241    ...              obtained via CLI.
242
243    @{network_configurations}=  Get Network Configuration
244    ${ip_data}=  Get BMC IP Info
245    : FOR  ${network_configuration}  IN  @{network_configurations}
246    \  Should Contain Match  ${ip_data}  ${network_configuration['Address']}/*
247    ...  msg=IP address does not exist.
248
249
250Verify Netmask On BMC
251    [Documentation]  Verify netmask on BMC.
252    [Arguments]  ${netmask}
253
254    # Description of the argument(s):
255    # netmask  netmask value to be verified.
256
257    ${prefix_length}=  Netmask Prefix Length  ${netmask}
258
259    Should Contain Match  ${ip_data}  */${prefix_length}
260    ...  msg=Prefix length does not exist.
261
262Verify Gateway On BMC
263    [Documentation]  Verify gateway on BMC.
264    [Arguments]  ${gateway_ip}=0.0.0.0
265
266    # Description of argument(s):
267    # gateway_ip  Gateway IP address.
268
269    ${route_info}=  Get BMC Route Info
270
271    # If gateway IP is empty or 0.0.0.0 it will not have route entry.
272
273    Run Keyword If  '${gateway_ip}' == '0.0.0.0'
274    ...      Pass Execution  Gateway IP is "0.0.0.0".
275    ...  ELSE
276    ...      Should Contain  ${route_info}  ${gateway_ip}
277    ...      msg=Gateway IP address not matching.
278
279Verify IP And Netmask On BMC
280    [Documentation]  Verify IP and netmask on BMC.
281    [Arguments]  ${ip}  ${netmask}
282
283    # Description of the argument(s):
284    # ip       IP address to be verified.
285    # netmask  netmask value to be verified.
286
287    ${prefix_length}=  Netmask Prefix Length  ${netmask}
288    @{ip_data}=  Get BMC IP Info
289
290    ${ip_with_netmask}=  Catenate  ${ip}/${prefix_length}
291    Should Contain  ${ip_data}  ${ip_with_netmask}
292    ...  msg=IP and netmask pair does not exist.
293
294Configure Hostname
295    [Documentation]  Configure hostname on BMC via Redfish.
296    [Arguments]  ${hostname}
297
298    # Description of argument(s):
299    # hostname  A hostname value which is to be configured on BMC.
300
301    ${data}=  Create Dictionary  HostName=${hostname}
302    Redfish.patch  ${REDFISH_NW_PROTOCOL_URI}  body=&{data}
303
304Validate Hostname On BMC
305    [Documentation]  Verify that the hostname read via Redfish is the same as the
306    ...  hostname configured on system.
307    [Arguments]  ${hostname}
308
309    # Description of argument(s):
310    # hostname  A hostname value which is to be compared to the hostname
311    #           configured on system.
312
313    ${sys_hostname}=  Get BMC Hostname
314    Should Be Equal  ${sys_hostname}  ${hostname}
315    ...  ignore_case=True  msg=Hostname does not exist.
316
317Test Teardown Execution
318    [Documentation]  Test teardown execution.
319
320    FFDC On Test Case Fail
321    Redfish.Logout
322