From 6c2142fff679b12bf9489631052186b364ef10c5 Mon Sep 17 00:00:00 2001
From: tjuyinkanglin <14_ykl@tongji.edu.cn>
Date: Thu, 10 Aug 2017 23:48:01 +0800
Subject: Add test case file, document and related scripts of yardstick
 tc058(HA_TC015)

JIRA: YARDSTICK-780

Change-Id: I4406776cb6b91265a0d2674b5dd200ca7d13ef14
Signed-off-by: tjuyinkanglin <14_ykl@tongji.edu.cn>
---
 .../user/userguide/opnfv_yardstick_tc058.rst       | 148 +++++++++++++++++++++
 tests/opnfv/test_cases/opnfv_yardstick_tc058.yaml  | 111 ++++++++++++++++
 .../ha_tools/nova/get_server_floatingip.bash       |  23 ++++
 .../availability/ha_tools/nova/list_servers.bash   |  22 +++
 .../scenarios/availability/operation_conf.yaml     |   6 +-
 5 files changed, 309 insertions(+), 1 deletion(-)
 create mode 100644 docs/testing/user/userguide/opnfv_yardstick_tc058.rst
 create mode 100644 tests/opnfv/test_cases/opnfv_yardstick_tc058.yaml
 create mode 100644 yardstick/benchmark/scenarios/availability/ha_tools/nova/get_server_floatingip.bash
 create mode 100644 yardstick/benchmark/scenarios/availability/ha_tools/nova/list_servers.bash

diff --git a/docs/testing/user/userguide/opnfv_yardstick_tc058.rst b/docs/testing/user/userguide/opnfv_yardstick_tc058.rst
new file mode 100644
index 000000000..fb9a4c2d1
--- /dev/null
+++ b/docs/testing/user/userguide/opnfv_yardstick_tc058.rst
@@ -0,0 +1,148 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International
+.. License.
+.. http://creativecommons.org/licenses/by/4.0
+.. (c) OPNFV, Yin Kanglin and others.
+.. 14_ykl@tongji.edu.cn
+
+*************************************
+Yardstick Test Case Description TC058
+*************************************
+
++-----------------------------------------------------------------------------+
+|OpenStack Controller Virtual Router Service High Availability                |
++==============+==============================================================+
+|test case id  | OPNFV_YARDSTICK_TC058:OpenStack Controller Virtual Router    |
+|              | Service High Availability                                    |
++--------------+--------------------------------------------------------------+
+|test purpose  | This test case will verify the high availability of virtual  |
+|              | routers(L3 agent) on controller node. When a virtual router  |
+|              | service on a specified controller node is shut down, this    |
+|              | test case will check whether the network of virtual machines |
+|              | will be affected, and whether the attacked virtual router    |
+|              | service will be recovered.                                   |
++--------------+--------------------------------------------------------------+
+|test method   | This test case kills the processes of virtual router service |
+|              | (l3-agent) on a selected controller node(the node holds the  |
+|              | active l3-agent), then checks whether the network routing    |
+|              | of virtual machines is OK and whether the killed service     |
+|              | will be 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 load       |
+|              | balance 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. |
+|              |                                                              |
+|              | In this case, this process name should set to "l3agent" ,    |
+|              | for example                                                  |
+|              | -fault_type: "kill-process"                                  |
+|              | -process_name: "l3agent"                                     |
+|              | -host: node1                                                 |
++--------------+--------------------------------------------------------------+
+|monitors      | In this test case, two kinds of monitor are needed:          |
+|              | 1. the "ip_status" monitor that pings a specific ip to check |
+|              | the connectivity of this ip, which needs two parameters:     |
+|              | 1) monitor_type: which is used for finding the monitor class |
+|              | and related scripts. It should be always set to "ip_status"  |
+|              | for this monitor.                                            |
+|              | 2) ip_address: The ip to be pinged. In this case, ip_address |
+|              | will be either an ip address of external network or an ip    |
+|              | address of a virtual machine.                                |
+|              | 3) host: The node on which ping will be executed, in this    |
+|              | case the host will be a virtual machine.                     |
+|              |                                                              |
+|              | 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 scripts. It should be always set to "process"    |
+|              | for this monitor.                                            |
+|              | 2) process_name: which is the process name for monitor. In   |
+|              | this case, the process-name of monitor2 should be "l3agent"  |
+|              | 3) host: which is the name of the node running the process   |
+|              |                                                              |
+|              | e.g.                                                         |
+|              | monitor1-1:                                                  |
+|              | -monitor_type: "ip_status"                                   |
+|              | -host: 172.16.0.11                                           |
+|              | -ip_address: 172.16.1.11                                     |
+|              | monitor1-2:                                                  |
+|              | -monitor_type: "ip_status"                                   |
+|              | -host: 172.16.0.11                                           |
+|              | -ip_address: 8.8.8.8                                         |
+|              | monitor2:                                                    |
+|              | -monitor_type: "process"                                     |
+|              | -process_name: "l3agent"                                     |
+|              | -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 maximum time     |
+|              | (seconds) from the process being killed to recovered         |
++--------------+--------------------------------------------------------------+
+|test tool     | None. Self-developed.                                        |
++--------------+--------------------------------------------------------------+
+|references    | ETSI NFV REL001                                              |
++--------------+--------------------------------------------------------------+
+|configuration | This test case needs two configuration files:                |
+|              | 1) test case file: opnfv_yardstick_tc058.yaml                |
+|              | -Attackers: see above "attackers" description                |
+|              | -Monitors: see above "monitors" description                  |
+|              | -Steps: the test case execution step, see "test sequence"    |
+|              | description below                                            |
+|              |                                                              |
+|              | 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                              |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|pre-test      | The test case image needs to be installed into Glance        |
+|conditions    | with cachestat included in the image.                        |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|step 1        | Two host VMs are booted, these two hosts are in two different|
+|              | networks, the networks are connected by a virtual router     |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|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 4        | stop monitors after a period of time specified by            |
+|              | "waiting_time"                                               |
+|              |                                                              |
+|              | Result: The monitor info will be aggregated.                 |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|step 5        | 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.        |
+|              | Virtual machines and network created in the test case will   |
+|              | be destoryed.                                                |
+|              |                                                              |
++--------------+------+----------------------------------+--------------------+
+|test verdict  | Fails only if SLA is not passed, or if there is a test case  |
+|              | execution problem.                                           |
++--------------+--------------------------------------------------------------+
diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc058.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc058.yaml
new file mode 100644
index 000000000..e9feb97f5
--- /dev/null
+++ b/tests/opnfv/test_cases/opnfv_yardstick_tc058.yaml
@@ -0,0 +1,111 @@
+##############################################################################
+# Copyright (c) 2017 14_ykl@tongji.edu.cn 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
+##############################################################################
+---
+
+schema: "yardstick:task:0.1"
+description: >
+    Test case for TC058 :OpenStack Controller Virtual Router Service High
+    Availability;
+    This test case is written by scenario-based HA testing framework.
+
+{% set file = file or '/etc/yardstick/pod.yaml' %}
+{% set image = image or 'yardstick-image' %}
+{% set flavor = flavor or 'yardstick-flavor' %}
+{% set attack_host = attack_host or 'node1' %}
+
+scenarios:
+  -
+    type: "GeneralHA"
+    options:
+      attackers:
+        -
+          fault_type: "kill-process"
+          host: {{attack_host}}
+          key: "kill-process"
+          process_name: "neutron-l3-agent"
+
+      monitors:
+        -
+          monitor_type: "process"
+          process_name: "neutron-l3-agent"
+          host: {{attack_host}}
+          key: "monitor-recovery"
+          monitor_time: 20
+          sla:
+            max_recover_time: 20
+
+        -
+          monitor_type: "general-monitor"
+          monitor_key: "ip-status"
+          key: "server-status"
+          monitor_time: 10
+          sla:
+            max_outage_time: 5
+          parameter:
+            ip_address: "$floating_ip"
+
+      operations:
+        -
+          operation_type: "general-operation"
+          key: "get-floatingip"
+          operation_key: "get-floatingip"
+          action_parameter:
+            server_name: "tc058"
+          return_parameter:
+            all: "$floating_ip"
+
+
+      steps:
+        -
+          actionKey: "get-floatingip"
+          actionType: "operation"
+          index: 1
+        -
+          actionKey: "kill-process"
+          actionType: "attacker"
+          index: 2
+
+        -
+          actionKey: "monitor-recovery"
+          actionType: "monitor"
+          index: 3
+
+        -
+          actionKey: "server-status"
+          actionType: "monitor"
+          index: 4
+
+    nodes:
+      {{attack_host}}: {{attack_host}}.LF
+    runner:
+      type: Duration
+      duration: 1
+    sla:
+      outage_time: 5
+      action: monitor
+
+contexts:
+-
+  type: Node
+  name: LF
+  file: {{file}}
+
+-
+  name: demo
+  image: {{image}}
+  flavor: {{flavor}}
+  user: cirros
+
+  servers:
+    tc058:
+      floating_ip: true
+
+  networks:
+    test:
+      cidr: '10.0.1.0/24'
diff --git a/yardstick/benchmark/scenarios/availability/ha_tools/nova/get_server_floatingip.bash b/yardstick/benchmark/scenarios/availability/ha_tools/nova/get_server_floatingip.bash
new file mode 100644
index 000000000..78dd27628
--- /dev/null
+++ b/yardstick/benchmark/scenarios/availability/ha_tools/nova/get_server_floatingip.bash
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+##############################################################################
+# (c) OPNFV, Yin Kanglin and others.
+# 14_ykl@tongji.edu.cn
+# 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
+##############################################################################
+
+# get floating ip of a serer
+# parameter: $1 - server name
+
+set -e
+
+if [ $OS_INSECURE ] && [ "$(echo $OS_INSECURE | tr '[:upper:]' '[:lower:]')" = "true" ]; then
+    SECURE="--insecure"
+else
+    SECURE=""
+fi
+
+openstack ${SECURE} server list -f value | grep $1 | awk '{print $5}'
\ No newline at end of file
diff --git a/yardstick/benchmark/scenarios/availability/ha_tools/nova/list_servers.bash b/yardstick/benchmark/scenarios/availability/ha_tools/nova/list_servers.bash
new file mode 100644
index 000000000..0f67c021e
--- /dev/null
+++ b/yardstick/benchmark/scenarios/availability/ha_tools/nova/list_servers.bash
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+##############################################################################
+# (c) OPNFV, Yin Kanglin and others.
+# 14_ykl@tongji.edu.cn
+# 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
+##############################################################################
+
+# list servers
+
+set -e
+
+if [ $OS_INSECURE ] && [ "$(echo $OS_INSECURE | tr '[:upper:]' '[:lower:]')" = "true" ]; then
+    SECURE="--insecure"
+else
+    SECURE=""
+fi
+
+openstack ${SECURE} server list
\ No newline at end of file
diff --git a/yardstick/benchmark/scenarios/availability/operation_conf.yaml b/yardstick/benchmark/scenarios/availability/operation_conf.yaml
index 1c39385a9..50664d087 100644
--- a/yardstick/benchmark/scenarios/availability/operation_conf.yaml
+++ b/yardstick/benchmark/scenarios/availability/operation_conf.yaml
@@ -25,4 +25,8 @@ swift-download-file:
 
 nova-create-flavor:
   action_script: ha_tools/nova/create_flavor.bash
-  rollback_script: ha_tools/nova/delete_flavor.bash
\ No newline at end of file
+  rollback_script: ha_tools/nova/delete_flavor.bash
+
+get-floatingip:
+  action_script: ha_tools/nova/get_server_floatingip.bash
+  rollback_script: ha_tools/nova/list_servers.bash
-- 
cgit