Improve Elasticsearch scenario

1. Use NovaScenario parent for Elasticserch scenario and use
_boot_server method for creating server instead of client method.

2. Add server_boot_kwargs args for custom server boot, for example for
defining custom nic.

3. Add action to check server indexed.

4. Add variability flag - search elasticsearch by id or name.

5. Add additional_query arg for better and clarified query results.

Change-Id: Ic889def63bb6e8f535ac9e1aeed9b4f19e6f8823
This commit is contained in:
Peter Razumovsky 2018-09-10 19:53:33 +04:00
parent 430cf06d3f
commit a596a89457
3 changed files with 71 additions and 29 deletions

View File

@ -18,12 +18,13 @@ import requests
from rally.common import cfg
from rally.common import logging
from rally.common import utils as commonutils
from rally.task import atomic
from rally.task import types
from rally.task import utils
from rally.task import validation
from rally_openstack import consts
from rally_openstack import scenario
from rally_openstack.scenarios.nova import utils as nova_utils
CONF = cfg.CONF
LOG = logging.getLogger(__name__)
@ -38,7 +39,7 @@ LOG = logging.getLogger(__name__)
@scenario.configure(context={"cleanup@openstack": ["nova"]},
name="ElasticsearchLogging.log_instance",
platform="openstack")
class ElasticsearchLogInstanceName(scenario.OpenStackScenario):
class ElasticsearchLogInstanceName(nova_utils.NovaScenario):
"""Test logging instance in conjunction with Elasticsearch system.
Let OpenStack platform already has logging agent (for example, Filebeat),
@ -48,27 +49,20 @@ class ElasticsearchLogInstanceName(scenario.OpenStackScenario):
becomes available, checks it's name in Elasticsearch indices by querying.
"""
def _create_server(self, image, flavor, seed):
server = self.clients("nova").servers.create(seed, image, flavor)
LOG.info("Server %s create started" % seed)
self.sleep_between(CONF.openstack.nova_server_boot_prepoll_delay)
utils.wait_for_status(
server,
ready_statuses=["ACTIVE"],
update_resource=utils.get_from_manager(),
timeout=CONF.openstack.nova_server_boot_timeout,
check_interval=CONF.openstack.nova_server_boot_poll_interval
)
LOG.info("Server %s is active" % seed)
@atomic.action_timer("elasticsearch.check_server_log_indexed")
def _check_server_name(self, server_id, logging_vip, elasticsearch_port,
sleep_time, retries_total, additional_query=None):
request_data = {
"query": {
"bool": {
"must": [{"match_phrase": {"Payload": server_id}}]
}
}
}
if additional_query:
request_data["query"]["bool"].update(additional_query)
def _check_server_name(self, name, logging_vip, elasticsearch_port,
sleep_time, retries_total):
request_data = {"query": {
"bool": {"must": [{"match_phrase": {"Payload": name}}],
"should": [{"range": {"Timestamp": {"gte": "now-2m",
"lte": "now"}}}],
"minimum_should_match": 1}}}
LOG.info("Check server name %s in elasticsearch" % name)
LOG.info("Check server ID %s in elasticsearch" % server_id)
i = 0
while i < retries_total:
LOG.debug("Attempt number %s" % (i + 1))
@ -87,20 +81,31 @@ class ElasticsearchLogInstanceName(scenario.OpenStackScenario):
self.assertGreater(result["hits"]["total"], 0)
break
def run(self, image, flavor, logging_vip, elasticsearch_port,
sleep_time=5, retries_total=30):
def run(self, image, flavor, logging_vip, elasticsearch_port, sleep_time=5,
retries_total=30, boot_server_kwargs=None, force_delete=False,
query_by_name=False, additional_query=None):
"""Create nova instance and check it indexed in elasticsearch.
:param image: image for server
:param flavor: flavor for server
:param logging_vip: logging system IP to check server name in
elasticsearch index
:param boot_server_kwargs: special server kwargs for boot
:param force_delete: force delete server or not
:param elasticsearch_port: elasticsearch port to use for check server
:param additional_query: map of additional arguments for scenario
elasticsearch query to check nova info in els index.
:param query_by_name: query nova server by name if True otherwise by id
:param sleep_time: sleep time in seconds between elasticsearch request
:param retries_total: total number of retries to check server name in
elasticsearch
"""
seed = self.generate_random_name()
self._create_server(image, flavor, seed)
self._check_server_name(seed, logging_vip, elasticsearch_port,
sleep_time, retries_total)
server = self._boot_server(image, flavor, **(boot_server_kwargs or {}))
if query_by_name:
server_id = server.name
else:
server_id = server.id
self._check_server_name(server_id, logging_vip, elasticsearch_port,
sleep_time, retries_total,
additional_query=additional_query)
self._delete_server(server, force=force_delete)

View File

@ -13,7 +13,32 @@
"logging_vip": "10.0.0.5",
"elasticsearch_port": 5601,
"sleep_time": 5,
"retries_total": 30
"retries_total": 30,
"additional_query": {
"must_not": [
{
"match_phrase": {
"Payload": "GET"
}
},
{
"match_phrase": {
"http_method": "GET"
}
}
],
"should": [
{
"range": {
"Timestamp": {
"gte": "now-2m",
"lte": "now"
}
}
}
],
"minimum_should_match": 1
}
},
"runner": {
"type": "constant",

View File

@ -12,6 +12,18 @@
elasticsearch_port: 5601
sleep_time: 5
retries_total: 30
additional_query:
must_not:
- match_phrase:
Payload: GET
- match_phrase:
http_method: GET
should:
- range:
Timestamp:
gte: now-2m
lte: now
minimum_should_match: 1
runner:
type: "constant"
times: 10