aboutsummaryrefslogtreecommitdiffstats
path: root/hdv/redfish/docs/readme.md
blob: 211391327c9ebb7ed43193fd3b7bd368c7d5b617 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
##############################################################################
# Copyright (c) 2020 China Mobile Co.,Ltd and others.
#
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################

This is a prototype of hardware validation implementation in redfish interface for a certain hardware vendor.
which originally is contributed by China Mobile.
>>> Usage:
usage: hdv.py [-h] [--version] [--config CONFIG] [--file_type FILE_TYPE]
              [--case_yaml CASE_YAML] [--depends_yaml DEPENDS_YAML]
              [--case_excel CASE_EXCEL]

hdv tool by redfish, it works in two mode

optional arguments:
  -h, --help            show this help message and exit
  --version             show tool version
  --config CONFIG       given global config.yaml file
  --file_type FILE_TYPE
                        config file type, [yaml|excel]
  --case_yaml CASE_YAML
                        case yaml file, uesd if file_type = yaml
  --depends_yaml DEPENDS_YAML
                        depends yaml file,uesd if file_type = yaml
  --case_excel CASE_EXCEL
                        excel case file used if file_type = excel
example:
#default case 
1>python .\hdv.py 
following config used
  - ./conf/config.yaml 
  - file_type=excel
  - ./conf/cases.xlsx
# use file_type=yaml
2>python .\hdv.py --file_type=yaml		

example1. default conf/config.yaml, file_type=excel, cases.xlsx used
python .\hdv.py
example2. use yaml file type config, default conf/cases.yaml conf/depends.yaml used 
python .\hdv.py --file_type=yaml 
example3. user input config file 
python .\hdv.py --file_type=yaml --case_yaml=./conf-new/cases.yaml --depends_yaml=./conf-new/depends.yaml		
						
>>> tools directory:

./redfish
├─conf   # config directory
├─docs   # readme
├─logs   # hdv.log would be generated here.

$ ls -lR .
$ ls redfish/*.py
redfish/__init__.py  
redfish/excel_2_yaml.py   #tool script to convert excel cases.xlsx sheets content to yaml format cases.yaml and depends.yaml
redfish/hdv_redfish.py    #the code implementation by parsing config.yaml and cases.xlsx or cases.yaml and depends.yaml
redfish/log_utils.py      #log utils
redfish/errors.py         #error code definition for the tool during parse.
redfish/hdv.py            #hdv portal
redfish/http_handler.py   #http_handler
redfish/yaml_utils.py	  #yaml utils for test.

$ ls redfish/conf
config.yaml  #global config yaml where define BMC settings, static value, and some position definition in the cases.xlsx excel
cases.xlsx   #two sheet defined (cases and depend_id), input case file if file_type=excel, default way.
             #sheet cases - define all test case redfish url, expected value, etc
			 #sheet dependent_id - define all dependent_id url which is used to get parent resource id for the url in the cases.
cases.yaml   #test cases yaml file,where the same set test case with cases.xlsx, it is used if file_type=yaml
depends.yaml #depends.yaml where the same content with sheet dependent_id, it is used if file_type=yaml
report.yaml  #final test report, it is used if file_type=yaml

$ ls redfish/docs
readme.md   #readme

$ ls redfish/logs
hdv.log     # test log file

>>> Principle
The hdv tool gets the global config from conf/config.yaml, e.g bmc settings, and 
global variable definitions, and some excel column position used in case file_type=excel
User can select eiter file_type yaml or excel as the configure file type, 
default type is excel at present. However the principle is similar.

If file_type is excel, it will parse two sheets of excel workbook, cases and dependent_id. 
The dependent_id sheet is used to define how to get the parents before checking a final redfish url, 
thinking about checking a port should get the adapter at first.
The cases sheet is the test cases template, where the variable will be replaced 
by global static value from config yaml or dependent_id

By running a final redfish url request, it will get response result from the test server.
Then tool will compare the response value with expected value defined in <expected_result> column of cases sheet to decide if the case status.

test report of each case <details,case_status>  will write back to the same excel in the last two columns.

Meanwhile, yaml file_type is supported also, it processes similarly as excel, except
- reading depends.yaml to get the dependent_id
- reading cases.yaml to run the test case
- report.yaml will be created as the final report.
cases.xlsx will not be used anymore in yaml case.

Besides, excel_2_yaml.py script can be used to convert the cases.xlsx to yaml file accordingly. 
If you want to update the cases content, you can update the excel at first, then convert by the script.

>>> FAQ:
1. how to customize expected result?
you need put a json format value in it, the hierachy should be exactly the same with actual returned value, 
as the comparing implementation relies on it.
 => a simple example: '{"AssetTag": "CM_cc@1234"}'
 => a complex example: 
'{    "count": 2,    "Manufacturer": "Intel(R) Corporation",    "MaxSpeedMHz":
    2300,    "Model": "Intel(R) Xeon(R) Gold 5218N CPU @ 2.30GHz",    "ProcessorArchitecture":
    ["x86", "IA-64", "ARM", "MIPS", "OEM"],    "Socket": [1, 2],    "Status": {        "Health":
    "OK",        "State": "Enabled"    },    "TotalCores": 16,    "TotalThreads":
    32}'
 
in the above data, a specific "count" attribute defined to check components quantity returned, e.g How many cpus expected.
generally it can be a subset attributes definition, comparing with actual return value
also it can support list of all expected value for list of objects. 
example: "Socket:[1,2]", expecting return "Socket:1" and "Socket:2" from returned response

>>>Perspective:
- there are differences between vendors's implementation, or even versions for the same vendor.
- define more test case or update existing case in the cases.yaml and depends.yaml or cases.xlsx file to support much more checks.
- more implementation could be contributed from community so that it can grow bigger to support more types and checkpoints test case.
	
#https://gerrit.opnfv.org/gerrit/admin/repos/cirv