aboutsummaryrefslogtreecommitdiffstats
path: root/docs/testing/user/userguide/opnfv_yardstick_tc019.rst
blob: 8d79e011a9fed5ace6690141b02f64b08f2fc4be (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
130
131
132
133
134
135
136
137
138
139
.. This work is licensed under a Creative Commons Attribution 4.0 International
.. License.
.. http://creativecommons.org/licenses/by/4.0
.. (c) OPNFV, Huawei Technologies Co.,Ltd and others.

*************************************
Yardstick Test Case Description TC019
*************************************

+-----------------------------------------------------------------------------+
|Control Node Openstack Service High Availability                             |
|                                                                             |
+--------------+--------------------------------------------------------------+
|test case id  | OPNFV_YARDSTICK_TC019_HA: Control node Openstack service down|
|              |                                                              |
+--------------+--------------------------------------------------------------+
|test purpose  | This test case will verify the high availability of the      |
|              | service provided by OpenStack (like nova-api, neutro-server) |
|              | on control node.                                             |
|              |                                                              |
+--------------+--------------------------------------------------------------+
|test method   | This test case kills the processes of a specific Openstack   |
|              | service on a selected control node, then checks whether the  |
|              | request of the related Openstack command is OK and the       |
|              | killed processes are recovered.                              |
|              |                                                              |
+--------------+--------------------------------------------------------------+
|attackers     | In this test case, an attacker called "kill-process" is      |
|              | needed. This attacker includes three parameters:             |
|              | 1) fault_type: which is used for finding the attacker's      |
|              | scripts. It should be always set to "kill-process" in this   |
|              | test case.                                                   |
|              | 2) process_name: which is the process name of the specified  |
|              | OpenStack service. If there are multiple processes use the   |
|              | same name on the host, all of them are killed by this        |
|              | attacker.                                                    |
|              | 3) host: which is the name of a control node being attacked. |
|              |                                                              |
|              | e.g.                                                         |
|              | -fault_type: "kill-process"                                  |
|              | -process_name: "nova-api"                                    |
|              | -host: node1                                                 |
|              |                                                              |
+--------------+--------------------------------------------------------------+
|monitors      | In this test case, two kinds of monitor are needed:          |
|              | 1. the "openstack-cmd" monitor constantly request a specific |
|              |    Openstack command, which needs two parameters:            |
|              | 1) monitor_type: which is used for finding the monitor class |
|              | and related scritps. It should be always set to              |
|              | "openstack-cmd" for this monitor.                            |
|              | 2) command_name: which is the command name used for request  |
|              |                                                              |
|              | 2. the "process" monitor check whether a process is running  |
|              |    on a specific node, which needs three parameters:         |
|              | 1) monitor_type: which used for finding the monitor class    |
|              | and related scritps. It should be always set to "process"    |
|              | for this monitor.                                            |
|              | 2) process_name: which is the process name for monitor       |
|              | 3) host: which is the name of the node runing the process    |
|              |                                                              |
|              | e.g.                                                         |
|              | monitor1:                                                    |
|              | -monitor_type: "openstack-cmd"                               |
|              | -command_name: "openstack server list"                       |
|              | monitor2:                                                    |
|              | -monitor_type: "process"                                     |
|              | -process_name: "nova-api"                                    |
|              | -host: node1                                                 |
|              |                                                              |
+--------------+--------------------------------------------------------------+
|metrics       | In this test case, there are two metrics:                    |
|              | 1)service_outage_time: which indicates the maximum outage    |
|              | time (seconds) of the specified Openstack command request.   |
|              | 2)process_recover_time: which indicates the maximun time     |
|              | (seconds) from the process being killed to recovered         |
|              |                                                              |
+--------------+--------------------------------------------------------------+
|test tool     | Developed by the project. Please see folder:                 |
|              | "yardstick/benchmark/scenarios/availability/ha_tools"        |
|              |                                                              |
+--------------+--------------------------------------------------------------+
|references    | ETSI NFV REL001                                              |
|              |                                                              |
+--------------+--------------------------------------------------------------+
|configuration | This test case needs two configuration files:                |
|              | 1) test case file: opnfv_yardstick_tc019.yaml                |
|              | -Attackers: see above "attackers" discription                |
|              | -waiting_time: which is the time (seconds) from the process  |
|              | being killed to stoping monitors the monitors                |
|              | -Monitors: see above "monitors" discription                  |
|              | -SLA: see above "metrics" discription                        |
|              |                                                              |
|              | 2)POD file: pod.yaml                                         |
|              | The POD configuration should record on pod.yaml first.       |
|              | the "host" item in this test case will use the node name in  |
|              | the pod.yaml.                                                |
|              |                                                              |
+--------------+--------------------------------------------------------------+
|test sequence | description and expected result                              |
|              |                                                              |
+--------------+--------------------------------------------------------------+
|step 1        | start monitors:                                              |
|              | each monitor will run with independently process             |
|              |                                                              |
|              | Result: The monitor info will be collected.                  |
|              |                                                              |
+--------------+--------------------------------------------------------------+
|step 2        | do attacker: connect the host through SSH, and then execute  |
|              | the kill process script with param value specified by        |
|              | "process_name"                                               |
|              |                                                              |
|              | Result: Process will be killed.                              |
|              |                                                              |
+--------------+--------------------------------------------------------------+
|step 3        | stop monitors after a period of time specified by            |
|              | "waiting_time"                                               |
|              |                                                              |
|              | Result: The monitor info will be aggregated.                 |
|              |                                                              |
+--------------+--------------------------------------------------------------+
|step 4        | verify the SLA                                               |
|              |                                                              |
|              | Result: The test case is passed or not.                      |
|              |                                                              |
+--------------+--------------------------------------------------------------+
|post-action   | It is the action when the test cases exist. It will check    |
|              | the status of the specified process on the host, and restart |
|              | the process if it is not running for next test cases.        |
|              |                                                              |
|              | Notice: This post-action uses 'lsb_release' command to check |
|              | the host linux distribution and determine the OpenStack      |
|              | service name to restart the process. Lack of 'lsb_release'   |
|              | on the host may cause failure to restart the process.        |
|              |                                                              |
+--------------+--------------------------------------------------------------+
|test verdict  | Fails only if SLA is not passed, or if there is a test case  |
|              | execution problem.                                           |
|              |                                                              |
+--------------+--------------------------------------------------------------+
class="cm">/* * Clear chip_select and data_in flags. */ eeprom->register_read(eeprom); eeprom->reg_data_in = 0; eeprom->reg_chip_select = 0; eeprom->register_write(eeprom); /* * kick a pulse. */ eeprom_93cx6_pulse_high(eeprom); eeprom_93cx6_pulse_low(eeprom); } static void eeprom_93cx6_write_bits(struct eeprom_93cx6 *eeprom, const u16 data, const u16 count) { unsigned int i; eeprom->register_read(eeprom); /* * Clear data flags. */ eeprom->reg_data_in = 0; eeprom->reg_data_out = 0; eeprom->drive_data = 1; /* * Start writing all bits. */ for (i = count; i > 0; i--) { /* * Check if this bit needs to be set. */ eeprom->reg_data_in = !!(data & (1 << (i - 1))); /* * Write the bit to the eeprom register. */ eeprom->register_write(eeprom); /* * Kick a pulse. */ eeprom_93cx6_pulse_high(eeprom); eeprom_93cx6_pulse_low(eeprom); } eeprom->reg_data_in = 0; eeprom->register_write(eeprom); } static void eeprom_93cx6_read_bits(struct eeprom_93cx6 *eeprom, u16 *data, const u16 count) { unsigned int i; u16 buf = 0; eeprom->register_read(eeprom); /* * Clear data flags. */ eeprom->reg_data_in = 0; eeprom->reg_data_out = 0; eeprom->drive_data = 0; /* * Start reading all bits. */ for (i = count; i > 0; i--) { eeprom_93cx6_pulse_high(eeprom); eeprom->register_read(eeprom); /* * Clear data_in flag. */ eeprom->reg_data_in = 0; /* * Read if the bit has been set. */ if (eeprom->reg_data_out) buf |= (1 << (i - 1)); eeprom_93cx6_pulse_low(eeprom); } *data = buf; } /** * eeprom_93cx6_read - Read a word from eeprom * @eeprom: Pointer to eeprom structure * @word: Word index from where we should start reading * @data: target pointer where the information will have to be stored * * This function will read the eeprom data as host-endian word * into the given data pointer. */ void eeprom_93cx6_read(struct eeprom_93cx6 *eeprom, const u8 word, u16 *data) { u16 command; /* * Initialize the eeprom register */ eeprom_93cx6_startup(eeprom); /* * Select the read opcode and the word to be read. */ command = (PCI_EEPROM_READ_OPCODE << eeprom->width) | word; eeprom_93cx6_write_bits(eeprom, command, PCI_EEPROM_WIDTH_OPCODE + eeprom->width); /* * Read the requested 16 bits. */ eeprom_93cx6_read_bits(eeprom, data, 16); /* * Cleanup eeprom register. */ eeprom_93cx6_cleanup(eeprom); } EXPORT_SYMBOL_GPL(eeprom_93cx6_read); /** * eeprom_93cx6_multiread - Read multiple words from eeprom * @eeprom: Pointer to eeprom structure * @word: Word index from where we should start reading * @data: target pointer where the information will have to be stored * @words: Number of words that should be read. * * This function will read all requested words from the eeprom, * this is done by calling eeprom_93cx6_read() multiple times. * But with the additional change that while the eeprom_93cx6_read * will return host ordered bytes, this method will return little * endian words. */ void eeprom_93cx6_multiread(struct eeprom_93cx6 *eeprom, const u8 word, __le16 *data, const u16 words) { unsigned int i; u16 tmp; for (i = 0; i < words; i++) { tmp = 0; eeprom_93cx6_read(eeprom, word + i, &tmp); data[i] = cpu_to_le16(tmp); } } EXPORT_SYMBOL_GPL(eeprom_93cx6_multiread); /** * eeprom_93cx6_readb - Read a byte from eeprom * @eeprom: Pointer to eeprom structure * @word: Byte index from where we should start reading * @data: target pointer where the information will have to be stored * * This function will read a byte of the eeprom data * into the given data pointer. */ void eeprom_93cx6_readb(struct eeprom_93cx6 *eeprom, const u8 byte, u8 *data) { u16 command; u16 tmp; /* * Initialize the eeprom register */ eeprom_93cx6_startup(eeprom); /* * Select the read opcode and the byte to be read. */ command = (PCI_EEPROM_READ_OPCODE << (eeprom->width + 1)) | byte; eeprom_93cx6_write_bits(eeprom, command, PCI_EEPROM_WIDTH_OPCODE + eeprom->width + 1); /* * Read the requested 8 bits. */ eeprom_93cx6_read_bits(eeprom, &tmp, 8); *data = tmp & 0xff; /* * Cleanup eeprom register. */ eeprom_93cx6_cleanup(eeprom); } EXPORT_SYMBOL_GPL(eeprom_93cx6_readb); /** * eeprom_93cx6_multireadb - Read multiple bytes from eeprom * @eeprom: Pointer to eeprom structure * @byte: Index from where we should start reading * @data: target pointer where the information will have to be stored * @words: Number of bytes that should be read. * * This function will read all requested bytes from the eeprom, * this is done by calling eeprom_93cx6_readb() multiple times. */ void eeprom_93cx6_multireadb(struct eeprom_93cx6 *eeprom, const u8 byte, u8 *data, const u16 bytes) { unsigned int i; for (i = 0; i < bytes; i++) eeprom_93cx6_readb(eeprom, byte + i, &data[i]); } EXPORT_SYMBOL_GPL(eeprom_93cx6_multireadb); /** * eeprom_93cx6_wren - set the write enable state * @eeprom: Pointer to eeprom structure * @enable: true to enable writes, otherwise disable writes * * Set the EEPROM write enable state to either allow or deny * writes depending on the @enable value. */ void eeprom_93cx6_wren(struct eeprom_93cx6 *eeprom, bool enable) { u16 command; /* start the command */ eeprom_93cx6_startup(eeprom); /* create command to enable/disable */ command = enable ? PCI_EEPROM_EWEN_OPCODE : PCI_EEPROM_EWDS_OPCODE; command <<= (eeprom->width - 2); eeprom_93cx6_write_bits(eeprom, command, PCI_EEPROM_WIDTH_OPCODE + eeprom->width); eeprom_93cx6_cleanup(eeprom); } EXPORT_SYMBOL_GPL(eeprom_93cx6_wren); /** * eeprom_93cx6_write - write data to the EEPROM * @eeprom: Pointer to eeprom structure * @addr: Address to write data to. * @data: The data to write to address @addr. * * Write the @data to the specified @addr in the EEPROM and * waiting for the device to finish writing. * * Note, since we do not expect large number of write operations * we delay in between parts of the operation to avoid using excessive * amounts of CPU time busy waiting. */ void eeprom_93cx6_write(struct eeprom_93cx6 *eeprom, u8 addr, u16 data) { int timeout = 100; u16 command; /* start the command */ eeprom_93cx6_startup(eeprom); command = PCI_EEPROM_WRITE_OPCODE << eeprom->width; command |= addr; /* send write command */ eeprom_93cx6_write_bits(eeprom, command, PCI_EEPROM_WIDTH_OPCODE + eeprom->width); /* send data */ eeprom_93cx6_write_bits(eeprom, data, 16); /* get ready to check for busy */ eeprom->drive_data = 0; eeprom->reg_chip_select = 1; eeprom->register_write(eeprom); /* wait at-least 250ns to get DO to be the busy signal */ usleep_range(1000, 2000); /* wait for DO to go high to signify finish */ while (true) { eeprom->register_read(eeprom); if (eeprom->reg_data_out) break; usleep_range(1000, 2000); if (--timeout <= 0) { printk(KERN_ERR "%s: timeout\n", __func__); break; } } eeprom_93cx6_cleanup(eeprom); } EXPORT_SYMBOL_GPL(eeprom_93cx6_write);