Add Control Plane Density test plan.
This patch add a control plane test plan for density testing. Change-Id: I3f4eca325fc4c1e919115ad103358fae2b3ed136
This commit is contained in:
parent
c0bbb74138
commit
30b4a3b20f
@ -0,0 +1,62 @@
|
||||
{% set flavor_name = flavor_name or "m1.tiny" %}
|
||||
{% set image_name = image_name or "^(cirros.*uec|TestVM)$" %}
|
||||
{
|
||||
"NovaDensityPlugin.boot_attach_and_list_with_secgroups": [
|
||||
{
|
||||
"args": {
|
||||
"flavor": {
|
||||
"name": "{{flavor_name}}"
|
||||
},
|
||||
"image": {
|
||||
"name": "{{image_name}}"
|
||||
},
|
||||
"security_group_count": 10,
|
||||
"rules_per_security_group": 10,
|
||||
"boot_server_kwargs": { "auto_assign_nic" : true },
|
||||
"create_volume_kwargs": {},
|
||||
"volume_size": 1
|
||||
},
|
||||
"runner": {
|
||||
"type": "constant",
|
||||
"times": {{ 10 * compute }},
|
||||
"concurrency": {{concurrency}}
|
||||
},
|
||||
"context": {
|
||||
"users": {
|
||||
"tenants": 10,
|
||||
"users_per_tenant": 10
|
||||
},
|
||||
"quotas": {
|
||||
"neutron": {
|
||||
"network": -1,
|
||||
"security_group": -1,
|
||||
"security_group_rule": -1,
|
||||
"port": -1,
|
||||
"subnet": -1,
|
||||
"router": -1
|
||||
},
|
||||
"nova": {
|
||||
"instances": -1,
|
||||
"cores": -1,
|
||||
"ram": -1,
|
||||
"floating_ips": -1,
|
||||
"security_groups": -1,
|
||||
"security_group_rules": -1
|
||||
},
|
||||
"cinder": {
|
||||
"volumes": -1,
|
||||
"gigabytes": -1,
|
||||
"snapshots": -1
|
||||
}
|
||||
},
|
||||
"network": {
|
||||
"start_cidr": "{{ "100.1.0.0/25" if gre_enabled else "1.0.0.0/25" }}",
|
||||
"networks_per_tenant": 10
|
||||
}
|
||||
},
|
||||
"sla": {
|
||||
"failure_rate": { "max": 0 }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
@ -0,0 +1,173 @@
|
||||
# Copyright 2016: Mirantis Inc.
|
||||
# All Rights Reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from rally import consts
|
||||
from rally.plugins.openstack import scenario
|
||||
from rally.plugins.openstack.scenarios.cinder import utils as cinder_utils
|
||||
from rally.plugins.openstack.scenarios.nova import utils
|
||||
from rally.task import types
|
||||
from rally.task import validation
|
||||
|
||||
|
||||
class NovaDensityPlugin(utils.NovaScenario, cinder_utils.CinderScenario):
|
||||
"""boot_attach_and_list_with_secgroups"""
|
||||
@types.convert(image={"type": "glance_image"},
|
||||
flavor={"type": "nova_flavor"})
|
||||
@validation.image_valid_on_flavor("flavor", "image")
|
||||
@validation.required_parameters("security_group_count",
|
||||
"rules_per_security_group")
|
||||
@validation.required_contexts("network")
|
||||
@validation.required_services(consts.Service.NOVA)
|
||||
@validation.required_openstack(users=True)
|
||||
@scenario.configure(context={"cleanup": ["cinder", "nova"]})
|
||||
def boot_attach_and_list_with_secgroups(
|
||||
self, image, flavor,
|
||||
volume_size,
|
||||
security_group_count,
|
||||
rules_per_security_group,
|
||||
do_delete=False,
|
||||
detailed=True,
|
||||
boot_server_kwargs=None,
|
||||
create_volume_kwargs=None
|
||||
):
|
||||
|
||||
if boot_server_kwargs is None:
|
||||
boot_server_kwargs = {}
|
||||
if create_volume_kwargs is None:
|
||||
create_volume_kwargs = {}
|
||||
|
||||
security_groups = self._create_security_groups(
|
||||
security_group_count)
|
||||
self._create_rules_for_security_group(security_groups,
|
||||
rules_per_security_group)
|
||||
|
||||
secgroups_names = [sg.name for sg in security_groups]
|
||||
"""boot server"""
|
||||
server = self._boot_server(image, flavor,
|
||||
security_groups=secgroups_names,
|
||||
**boot_server_kwargs)
|
||||
|
||||
volume = self._create_volume(volume_size, **create_volume_kwargs)
|
||||
self._attach_volume(server, volume)
|
||||
|
||||
self._list_security_groups()
|
||||
self._list_servers(detailed)
|
||||
|
||||
if do_delete:
|
||||
self._detach_volume(server, volume)
|
||||
self._delete_server(server)
|
||||
self._delete_volume(volume)
|
||||
self._delete_security_groups(security_groups)
|
||||
|
||||
"""boot_and_list_with_secgroups"""
|
||||
@types.convert(image={"type": "glance_image"},
|
||||
flavor={"type": "nova_flavor"})
|
||||
@validation.image_valid_on_flavor("flavor", "image")
|
||||
@validation.required_parameters("security_group_count",
|
||||
"rules_per_security_group")
|
||||
@validation.required_contexts("network")
|
||||
@validation.required_services(consts.Service.NOVA)
|
||||
@validation.required_openstack(users=True)
|
||||
@scenario.configure(context={"cleanup": ["nova"]})
|
||||
def boot_and_list_with_secgroups(
|
||||
self, image, flavor,
|
||||
security_group_count,
|
||||
rules_per_security_group,
|
||||
do_delete=False,
|
||||
detailed=True,
|
||||
boot_server_kwargs=None
|
||||
):
|
||||
|
||||
if boot_server_kwargs is None:
|
||||
boot_server_kwargs = {}
|
||||
|
||||
security_groups = self._create_security_groups(
|
||||
security_group_count)
|
||||
self._create_rules_for_security_group(security_groups,
|
||||
rules_per_security_group)
|
||||
|
||||
secgroups_names = [sg.name for sg in security_groups]
|
||||
"""boot server"""
|
||||
server = self._boot_server(image, flavor,
|
||||
security_groups=secgroups_names,
|
||||
**boot_server_kwargs)
|
||||
|
||||
self._list_security_groups()
|
||||
self._list_servers(detailed)
|
||||
|
||||
if do_delete:
|
||||
self._delete_server(server)
|
||||
self._delete_security_groups(security_groups)
|
||||
|
||||
"""boot_attach_and_list"""
|
||||
@types.convert(image={"type": "glance_image"},
|
||||
flavor={"type": "nova_flavor"})
|
||||
@validation.image_valid_on_flavor("flavor", "image")
|
||||
@validation.required_services(consts.Service.NOVA)
|
||||
@validation.required_openstack(users=True)
|
||||
@scenario.configure(context={"cleanup": ["cinder", "nova"]})
|
||||
def boot_attach_and_list(
|
||||
self, image, flavor,
|
||||
volume_size,
|
||||
do_delete=False,
|
||||
detailed=True,
|
||||
boot_server_kwargs=None,
|
||||
create_volume_kwargs=None
|
||||
):
|
||||
|
||||
if boot_server_kwargs is None:
|
||||
boot_server_kwargs = {}
|
||||
if create_volume_kwargs is None:
|
||||
create_volume_kwargs = {}
|
||||
|
||||
"""boot server"""
|
||||
server = self._boot_server(image, flavor,
|
||||
**boot_server_kwargs)
|
||||
|
||||
volume = self._create_volume(volume_size, **create_volume_kwargs)
|
||||
self._attach_volume(server, volume)
|
||||
|
||||
self._list_servers(detailed)
|
||||
|
||||
if do_delete:
|
||||
self._detach_volume(server, volume)
|
||||
self._delete_server(server)
|
||||
self._delete_volume(volume)
|
||||
|
||||
"""boot_and_list"""
|
||||
@types.convert(image={"type": "glance_image"},
|
||||
flavor={"type": "nova_flavor"})
|
||||
@validation.image_valid_on_flavor("flavor", "image")
|
||||
@validation.required_services(consts.Service.NOVA)
|
||||
@validation.required_openstack(users=True)
|
||||
@scenario.configure(context={"cleanup": ["nova"]})
|
||||
def boot_and_list(
|
||||
self, image, flavor,
|
||||
do_delete=False,
|
||||
detailed=True,
|
||||
boot_server_kwargs=None
|
||||
):
|
||||
|
||||
if boot_server_kwargs is None:
|
||||
boot_server_kwargs = {}
|
||||
|
||||
"""boot server"""
|
||||
server = self._boot_server(image, flavor,
|
||||
**boot_server_kwargs)
|
||||
|
||||
self._list_servers(detailed)
|
||||
|
||||
if do_delete:
|
||||
self._delete_server(server)
|
187
doc/source/test_plans/controlplane_density/plan.rst
Normal file
187
doc/source/test_plans/controlplane_density/plan.rst
Normal file
@ -0,0 +1,187 @@
|
||||
.. _controlplane_density:
|
||||
|
||||
=======================================
|
||||
OpenStack Control Plane Density testing
|
||||
=======================================
|
||||
|
||||
:status: **ready**
|
||||
:version: 1
|
||||
|
||||
:Abstract:
|
||||
|
||||
This document describes a test plan for measuring OpenStack control plane
|
||||
performance under with large number of items in terms of ability to handle
|
||||
specific amount of objects like VMs, networks, subnets etc.
|
||||
|
||||
|
||||
Test Plan
|
||||
=========
|
||||
|
||||
Test Environment
|
||||
----------------
|
||||
|
||||
This section describes the setup for OpenStack testing.
|
||||
In these tests basic multi-node setup with OpenStack services comprises 6
|
||||
physical nodes:
|
||||
* Three nodes for a compute node. This node simulates activity which is
|
||||
typical for OpenStack compute components.
|
||||
* Three nodes for a controller nodes. These node simulate activity which
|
||||
is typical for OpenStack control plane services, including running three
|
||||
MySQL instances managed by Galera cluster and memcached cluster for
|
||||
Keystone caching.
|
||||
|
||||
Preparation
|
||||
^^^^^^^^^^^
|
||||
|
||||
**Single node installation**
|
||||
|
||||
For single node installation the one can use DevStack_ tool that is targeted
|
||||
at developers and CI systems to use upstream code. It makes many choices that
|
||||
are not appropriate for production systems, but for the all-in-one purposes
|
||||
this can fit ok.
|
||||
|
||||
|
||||
**Multi node installation**
|
||||
|
||||
Multi node environment installation depends much on the chosen set of OpenStack
|
||||
deployment tools.
|
||||
|
||||
|
||||
Environment description
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The environment description includes hardware specification of servers,
|
||||
network parameters, operation system and OpenStack deployment characteristics.
|
||||
|
||||
.. table:: Amount of servers each role
|
||||
|
||||
+------------+--------------+
|
||||
|Role |Servers count |
|
||||
+============+==============+
|
||||
|rally |1 |
|
||||
+------------+--------------+
|
||||
|controller |3 |
|
||||
+------------+--------------+
|
||||
|compute |176 |
|
||||
+------------+--------------+
|
||||
|compute-osd |20 |
|
||||
+------------+--------------+
|
||||
|osd |0 |
|
||||
+------------+--------------+
|
||||
|
||||
Hardware configuration of each server
|
||||
-------------------------------------
|
||||
All servers have same configuration describing in table below
|
||||
|
||||
.. table:: Description of servers hardware
|
||||
|
||||
+-------+----------------+-------------------------------+
|
||||
|server |vendor,model |HP,DL380 Gen9 |
|
||||
+-------+----------------+-------------------------------+
|
||||
|CPU |vendor,model |Intel,E5-2680 v3 |
|
||||
| +----------------+-------------------------------+
|
||||
| |processor_count |2 |
|
||||
| +----------------+-------------------------------+
|
||||
| |core_count |12 |
|
||||
| +----------------+-------------------------------+
|
||||
| |frequency_MHz |2500 |
|
||||
+-------+----------------+-------------------------------+
|
||||
|RAM |vendor,model |HP,752369-081 |
|
||||
| +----------------+-------------------------------+
|
||||
| |amount_MB |262144 |
|
||||
+-------+----------------+-------------------------------+
|
||||
|NETWORK|interface_name |p1p1 |
|
||||
| +----------------+-------------------------------+
|
||||
| |vendor,model |Intel,X710 Dual Port |
|
||||
| +----------------+-------------------------------+
|
||||
| |bandwidth |10G |
|
||||
+-------+----------------+-------------------------------+
|
||||
|STORAGE|dev_name |/dev/sda |
|
||||
| +----------------+-------------------------------+
|
||||
| |vendor,model | | raid10 - HP P840 |
|
||||
| | | | 12 disks EH0600JEDHE |
|
||||
| +----------------+-------------------------------+
|
||||
| |SSD/HDD |HDD |
|
||||
| +----------------+-------------------------------+
|
||||
| |size | 3,6TB |
|
||||
+-------+----------------+-------------------------------+
|
||||
|
||||
Test Case 1: perform baseline Rally scenarios
|
||||
---------------------------------------------
|
||||
|
||||
Description
|
||||
^^^^^^^^^^^
|
||||
|
||||
1. Create work directory on server. In future we will call it as WORK_DIR
|
||||
2. Create directory "plugins" in WORK_DIR and copy to the directory
|
||||
:download:`nova_density.py <configs/nova_density.py>` plugin.
|
||||
3. Create directory "scenarios" in WORK_DIR and copy to the directory
|
||||
:download:`boot_attach_and_list_with_secgroups.json <configs/boot_attach_and_list_with_secgroups.json>`
|
||||
scenario.
|
||||
4. Create `deployment.json` file in WORK_DIR and fill it with OpenStack
|
||||
environment info. Example of how it may look like is presented below:
|
||||
|
||||
.. code:: json
|
||||
|
||||
{
|
||||
"admin": {
|
||||
"password": "password",
|
||||
"tenant_name": "tenant",
|
||||
"username": "user"
|
||||
},
|
||||
"auth_url": "http://1.2.3.4:5000/v2.0",
|
||||
"region_name": "RegionOne",
|
||||
"type": "ExistingCloud",
|
||||
"endpoint_type": "internal",
|
||||
"admin_port": 35357,
|
||||
"https_insecure": true
|
||||
}
|
||||
|
||||
5. Create `job-params.yaml` file in WORK_DIR and fill it with scenarios info.
|
||||
Example of how it may look like is presented below:
|
||||
|
||||
.. code:: yaml
|
||||
|
||||
---
|
||||
concurrency: 5
|
||||
compute: 196
|
||||
start_cidr: "1.0.0.0/16"
|
||||
current_path: "/home/rally/rally-scenarios/heat/"
|
||||
floating_ip_amount: 800
|
||||
floating_net: "admin_floating_net"
|
||||
vlan_amount: 1025
|
||||
gre_enabled: false
|
||||
http_server_with_glance_images: "1.2.3.4"
|
||||
|
||||
6. Perform tests:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
${WORK_DIR:?}
|
||||
DEPLOYMENT_NAME="$(uuidgen)"
|
||||
DEPLOYMENT_CONFIG="${WORK_DIR}/deployment.json"
|
||||
PLUGIN_PATH="${WORK_DIR}/plugins/nova_scale.py"
|
||||
JOB_PARAMS_CONFIG="${WORK_DIR}/job-params.yaml"
|
||||
rally deployment create --filename $(DEPLOYMENT_CONFIG) --name $(DEPLOYMENT_NAME)
|
||||
SCENARIOS="boot_attach_and_list_with_secgroups.json"
|
||||
for scenario in SCENARIOS; do
|
||||
rally --plugin-paths ${PLUGINS_PATH} task start --tag ${scenario} --task-args-file ${JOB_PARAMS_CONFIG} ${WORK_DR}/scenarios/${scenario}
|
||||
done
|
||||
task_list="$(rally task list --uuids-only)"
|
||||
rally task report --tasks ${task_list} --out=${WORK_DIR}/rally_report.html
|
||||
|
||||
List of performance metrics
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Foe each component under test define atomic actions made in terms of this test
|
||||
case. Define what time does it take to perform this specific action (minimum,
|
||||
maximum, mean and percentiles across all attempts to perform this action).
|
||||
|
||||
For example, in case of Cinder testing final measurement for volume creation
|
||||
may look like:
|
||||
|
||||
+---------------+----------------+--------------------+-------------------+-------------+-------------+
|
||||
| Operation | Mean | 90%ile | 50%ile | Max | Min |
|
||||
+===============+================+====================+===================+=============+=============+
|
||||
| create_volume | <mean_numbers> | <90%ile_numbers> | <50%ile_numbers> | <max_value> | <min_value> |
|
||||
+---------------+----------------+--------------------+-------------------+-------------+-------------+
|
@ -23,4 +23,4 @@ Test Plans
|
||||
1000_nodes/plan
|
||||
reliability/plan
|
||||
control_plane/plan
|
||||
|
||||
controlplane_density/plan
|
||||
|
Loading…
Reference in New Issue
Block a user