Smoke test for Openstack Telemetry Plugin
Change-Id: Ic13e373353a5202e354fdd8856f469f127558e24
This commit is contained in:
parent
038cfb9cd8
commit
dcdeafdc21
@ -616,7 +616,7 @@ class PluginHelper(object):
|
|||||||
version = self.nailgun_client.get_api_version()
|
version = self.nailgun_client.get_api_version()
|
||||||
return version.get('release')
|
return version.get('release')
|
||||||
|
|
||||||
def check_pacemaker_resource(self, resource_name, role):
|
def check_pacemaker_resource(self, resource_name, role, is_ha=True):
|
||||||
"""Check that the pacemaker resource is started on nodes with given
|
"""Check that the pacemaker resource is started on nodes with given
|
||||||
role.
|
role.
|
||||||
:param resource_name: the name of the pacemaker resource
|
:param resource_name: the name of the pacemaker resource
|
||||||
@ -625,23 +625,33 @@ class PluginHelper(object):
|
|||||||
:type role: str
|
:type role: str
|
||||||
:returns: None
|
:returns: None
|
||||||
"""
|
"""
|
||||||
cluster_id = self.cluster_id
|
|
||||||
n_ctrls = self.fuel_web.get_nailgun_cluster_nodes_by_roles(
|
n_ctrls = self.fuel_web.get_nailgun_cluster_nodes_by_roles(
|
||||||
cluster_id, [role])
|
self.cluster_id, [role])
|
||||||
d_ctrls = self.fuel_web.get_devops_nodes_by_nailgun_nodes(n_ctrls)
|
d_ctrls = self.fuel_web.get_devops_nodes_by_nailgun_nodes(n_ctrls)
|
||||||
pcm_nodes = ' '.join(self.fuel_web.get_pcm_nodes(
|
pcm_nodes = ' '.join(self.fuel_web.get_pcm_nodes(
|
||||||
d_ctrls[0].name, pure=True)['Online'])
|
d_ctrls[0].name, pure=True)['Online'])
|
||||||
logger.info("pacemaker nodes are {0}".format(pcm_nodes))
|
logger.info("pacemaker nodes are {0}".format(pcm_nodes))
|
||||||
resource_nodes = self.fuel_web.get_pacemaker_resource_location(
|
resource_nodes = self.fuel_web.get_pacemaker_resource_location(
|
||||||
d_ctrls[0].name, resource_name)
|
d_ctrls[0].name, "{}".format(resource_name))
|
||||||
|
if is_ha:
|
||||||
for resource_node in resource_nodes:
|
for resource_node in resource_nodes:
|
||||||
logger.info("Check resource [{0}] on node {1}".format(
|
logger.info("Check resource [{0}] on node {1}".format(
|
||||||
resource_name, resource_node.name))
|
resource_name, resource_node.name))
|
||||||
config = self.fuel_web.get_pacemaker_config(resource_node.name)
|
config = self.fuel_web.get_pacemaker_config(resource_node.name)
|
||||||
asserts.assert_not_equal(
|
asserts.assert_not_equal(
|
||||||
re.search(
|
re.search(
|
||||||
"Clone Set: clone_{0} \[{0}\]\s+Started: \[ {1} \]".format(
|
"Clone Set: clone_{0} \[{0}\]\s+Started: \[ {1} \]".
|
||||||
resource_name, pcm_nodes), config), None,
|
format(resource_name, pcm_nodes), config), None,
|
||||||
|
'Resource [{0}] is not properly configured'.format(
|
||||||
|
resource_name))
|
||||||
|
else:
|
||||||
|
asserts.assert_true(len(resource_nodes), 1)
|
||||||
|
config = self.fuel_web.get_pacemaker_config(resource_nodes[0].name)
|
||||||
|
logger.info("Check resource [{0}] on node {1}".format(
|
||||||
|
resource_name, resource_nodes[0].name))
|
||||||
|
asserts.assert_not_equal(
|
||||||
|
re.search("{0}\s+\(ocf::fuel:{1}\):\s+Started".format(
|
||||||
|
resource_name, resource_name.split("_")[1]), config), None,
|
||||||
'Resource [{0}] is not properly configured'.format(
|
'Resource [{0}] is not properly configured'.format(
|
||||||
resource_name))
|
resource_name))
|
||||||
|
|
||||||
|
0
stacklight_tests/openstack_telemetry/__init__.py
Normal file
0
stacklight_tests/openstack_telemetry/__init__.py
Normal file
99
stacklight_tests/openstack_telemetry/api.py
Normal file
99
stacklight_tests/openstack_telemetry/api.py
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
# Copyright 2016 Mirantis, Inc.
|
||||||
|
#
|
||||||
|
# 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 fuelweb_test.helpers import checkers as fuelweb_checkers
|
||||||
|
from fuelweb_test import logger
|
||||||
|
|
||||||
|
from stacklight_tests import base_test
|
||||||
|
from stacklight_tests.helpers import checkers
|
||||||
|
from stacklight_tests.helpers import helpers
|
||||||
|
from stacklight_tests.influxdb_grafana.api import InfluxdbPluginApi
|
||||||
|
from stacklight_tests.openstack_telemetry import plugin_settings
|
||||||
|
|
||||||
|
|
||||||
|
class OpenstackTelemeteryPluginApi(base_test.PluginApi):
|
||||||
|
def __init__(self):
|
||||||
|
super(OpenstackTelemeteryPluginApi, self).__init__()
|
||||||
|
|
||||||
|
def get_plugin_settings(self):
|
||||||
|
return plugin_settings
|
||||||
|
|
||||||
|
def prepare_plugin(self):
|
||||||
|
self.helpers.prepare_plugin(self.settings.plugin_path)
|
||||||
|
|
||||||
|
def activate_plugin(self, options=None):
|
||||||
|
if options is None:
|
||||||
|
options = self.settings.default_options
|
||||||
|
self.helpers.activate_plugin(
|
||||||
|
self.settings.name, self.settings.version, options)
|
||||||
|
|
||||||
|
def check_plugin_online(self):
|
||||||
|
non_ha_pcmk_resources = ['p_ceilometer-agent-central',
|
||||||
|
'p_aodh-evaluator']
|
||||||
|
ha_pcmk_resources = ['telemetry-collector-heka']
|
||||||
|
controller_services = ['ceilometer-agent-notification',
|
||||||
|
'ceilometer-api', 'aodh-api']
|
||||||
|
compute_services = ['ceilometer-polling']
|
||||||
|
controller_ips = [
|
||||||
|
controller['ip'] for controller in
|
||||||
|
self.fuel_web.get_nailgun_cluster_nodes_by_roles(
|
||||||
|
self.helpers.cluster_id, ['controller'])]
|
||||||
|
compute_ips = [
|
||||||
|
compute['ip'] for compute in
|
||||||
|
self.fuel_web.get_nailgun_cluster_nodes_by_roles(
|
||||||
|
self.helpers.cluster_id, ['compute'])]
|
||||||
|
logger.info("Check {} pacemaker resources".format(
|
||||||
|
non_ha_pcmk_resources))
|
||||||
|
for resource in non_ha_pcmk_resources:
|
||||||
|
self.helpers.check_pacemaker_resource(
|
||||||
|
resource, "controller", is_ha=False)
|
||||||
|
logger.info("Check {} pacemaker resources".format(ha_pcmk_resources))
|
||||||
|
for resource in ha_pcmk_resources:
|
||||||
|
self.helpers.check_pacemaker_resource(resource, "controller")
|
||||||
|
logger.info("Check {} services on {}".format(
|
||||||
|
controller_services, controller_ips))
|
||||||
|
for ip in controller_ips:
|
||||||
|
for service in controller_services:
|
||||||
|
fuelweb_checkers.verify_service(
|
||||||
|
ip, service, ignore_count_of_proccesses=True)
|
||||||
|
logger.info(
|
||||||
|
"Check {} services on {}".format(compute_services, compute_ips))
|
||||||
|
for ip in compute_ips:
|
||||||
|
for service in compute_services:
|
||||||
|
fuelweb_checkers.verify_service(
|
||||||
|
ip, service, ignore_count_of_proccesses=True)
|
||||||
|
logger.info("Check Ceilometer API")
|
||||||
|
keystone_access = self.helpers.os_conn.keystone_access
|
||||||
|
endpoint = keystone_access.service_catalog.url_for(
|
||||||
|
service_type='metering', service_name='ceilometer',
|
||||||
|
interface='internal')
|
||||||
|
if not endpoint:
|
||||||
|
raise helpers.NotFound("Cannot find ceilometer endpoint")
|
||||||
|
headers = {
|
||||||
|
'X-Auth-Token': keystone_access.auth_token,
|
||||||
|
'content-type': 'application/json'
|
||||||
|
}
|
||||||
|
checkers.check_http_get_response("{}/v2/capabilities".format(endpoint),
|
||||||
|
headers=headers)
|
||||||
|
logger.info("Check Ceilometer database in InfluxDB")
|
||||||
|
InfluxdbPluginApi().do_influxdb_query(
|
||||||
|
"show measurements", db="ceilometer")
|
||||||
|
|
||||||
|
def uninstall_plugin(self):
|
||||||
|
return self.helpers.uninstall_plugin(self.settings.name,
|
||||||
|
self.settings.version)
|
||||||
|
|
||||||
|
def check_uninstall_failure(self):
|
||||||
|
return self.helpers.check_plugin_cannot_be_uninstalled(
|
||||||
|
self.settings.name, self.settings.version)
|
22
stacklight_tests/openstack_telemetry/plugin_settings.py
Normal file
22
stacklight_tests/openstack_telemetry/plugin_settings.py
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# Copyright 2016 Mirantis, Inc.
|
||||||
|
#
|
||||||
|
# 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 stacklight_tests.helpers import helpers
|
||||||
|
from stacklight_tests import settings
|
||||||
|
|
||||||
|
name = 'telemetry'
|
||||||
|
plugin_path = settings.OPENSTACK_TELEMETRY_PLUGIN_PATH
|
||||||
|
version = helpers.get_plugin_version(plugin_path)
|
||||||
|
default_options = {}
|
||||||
|
toolchain_options = default_options
|
@ -65,6 +65,7 @@ def import_tests():
|
|||||||
from stacklight_tests.toolchain import test_ldap_plugins # noqa
|
from stacklight_tests.toolchain import test_ldap_plugins # noqa
|
||||||
from stacklight_tests.toolchain import test_network_templates # noqa
|
from stacklight_tests.toolchain import test_network_templates # noqa
|
||||||
from stacklight_tests.toolchain import test_neutron # noqa
|
from stacklight_tests.toolchain import test_neutron # noqa
|
||||||
|
from stacklight_tests.toolchain import test_openstack_telemetry # noqa
|
||||||
from stacklight_tests.toolchain import test_post_install # noqa
|
from stacklight_tests.toolchain import test_post_install # noqa
|
||||||
from stacklight_tests.toolchain import test_reduced_footprint # noqa
|
from stacklight_tests.toolchain import test_reduced_footprint # noqa
|
||||||
from stacklight_tests.toolchain import test_smoke_bvt # noqa
|
from stacklight_tests.toolchain import test_smoke_bvt # noqa
|
||||||
|
@ -12,6 +12,10 @@ KAFKA_PLUGIN_PATH = os.environ.get('KAFKA_PLUGIN_PATH')
|
|||||||
# Ceilometer plugins
|
# Ceilometer plugins
|
||||||
CEILOMETER_REDIS_PLUGIN_PATH = os.environ.get('CEILOMETER_REDIS_PLUGIN_PATH')
|
CEILOMETER_REDIS_PLUGIN_PATH = os.environ.get('CEILOMETER_REDIS_PLUGIN_PATH')
|
||||||
|
|
||||||
|
# Openstack telemetery plugin
|
||||||
|
OPENSTACK_TELEMETRY_PLUGIN_PATH = os.environ.get(
|
||||||
|
'OPENSTACK_TELEMETRY_PLUGIN_PATH')
|
||||||
|
|
||||||
# Detach plugins
|
# Detach plugins
|
||||||
DETACH_DATABASE_PLUGIN_PATH = os.environ.get('DETACH_DATABASE_PLUGIN_PATH')
|
DETACH_DATABASE_PLUGIN_PATH = os.environ.get('DETACH_DATABASE_PLUGIN_PATH')
|
||||||
DETACH_RABBITMQ_PLUGIN_PATH = os.environ.get('DETACH_RABBITMQ_PLUGIN_PATH')
|
DETACH_RABBITMQ_PLUGIN_PATH = os.environ.get('DETACH_RABBITMQ_PLUGIN_PATH')
|
||||||
|
@ -30,6 +30,7 @@ from stacklight_tests.influxdb_grafana import api as influx_api
|
|||||||
from stacklight_tests.lma_collector import api as collector_api
|
from stacklight_tests.lma_collector import api as collector_api
|
||||||
from stacklight_tests.lma_infrastructure_alerting import (
|
from stacklight_tests.lma_infrastructure_alerting import (
|
||||||
api as infrastructure_alerting_api)
|
api as infrastructure_alerting_api)
|
||||||
|
from stacklight_tests.openstack_telemetry import api as telemetry_api
|
||||||
from stacklight_tests.toolchain import toolchain_settings
|
from stacklight_tests.toolchain import toolchain_settings
|
||||||
|
|
||||||
|
|
||||||
@ -47,6 +48,7 @@ class ToolchainApi(object):
|
|||||||
self.LMA_COLLECTOR = collector_api.LMACollectorPluginApi()
|
self.LMA_COLLECTOR = collector_api.LMACollectorPluginApi()
|
||||||
self.LMA_INFRASTRUCTURE_ALERTING = (
|
self.LMA_INFRASTRUCTURE_ALERTING = (
|
||||||
infrastructure_alerting_api.InfraAlertingPluginApi())
|
infrastructure_alerting_api.InfraAlertingPluginApi())
|
||||||
|
self.OPENSTACK_TELEMETRY = telemetry_api.OpenstackTelemeteryPluginApi()
|
||||||
self._plugins = {
|
self._plugins = {
|
||||||
self.ELASTICSEARCH_KIBANA,
|
self.ELASTICSEARCH_KIBANA,
|
||||||
self.INFLUXDB_GRAFANA,
|
self.INFLUXDB_GRAFANA,
|
||||||
@ -66,6 +68,9 @@ class ToolchainApi(object):
|
|||||||
"""Enable a plugin."""
|
"""Enable a plugin."""
|
||||||
self._disabled_plugins.remove(plugin)
|
self._disabled_plugins.remove(plugin)
|
||||||
|
|
||||||
|
def add_plugin(self, plugin):
|
||||||
|
self._plugins.add(plugin)
|
||||||
|
|
||||||
def call_plugin_method(self, plugin, f):
|
def call_plugin_method(self, plugin, f):
|
||||||
"""Call a method on a plugin but only if it's enabled."""
|
"""Call a method on a plugin but only if it's enabled."""
|
||||||
if plugin in self.plugins:
|
if plugin in self.plugins:
|
||||||
|
63
stacklight_tests/toolchain/test_openstack_telemetry.py
Normal file
63
stacklight_tests/toolchain/test_openstack_telemetry.py
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
# Copyright 2016 Mirantis, Inc.
|
||||||
|
#
|
||||||
|
# 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 fuelweb_test.helpers.decorators import log_snapshot_after_test
|
||||||
|
from proboscis import test
|
||||||
|
|
||||||
|
from stacklight_tests.toolchain import api
|
||||||
|
|
||||||
|
|
||||||
|
@test(groups=["openstack_telemetry"])
|
||||||
|
class TestOpenstackTelemetry(api.ToolchainApi):
|
||||||
|
"""Class for testing the Openstack Telemetry Plugin."""
|
||||||
|
|
||||||
|
@test(depends_on_groups=['prepare_slaves_5'],
|
||||||
|
groups=["deploy_openstack_telemetry", "deploy",
|
||||||
|
"openstack_telemetry", "smoke"])
|
||||||
|
@log_snapshot_after_test
|
||||||
|
def deploy_openstack_telemetry(self):
|
||||||
|
"""Deploy an environment with Openstack-Telemetry plugin
|
||||||
|
with Elasticsearch and InfluxDB backends.
|
||||||
|
|
||||||
|
1. Upload the Openstack-Telemetry, Elasticsearch-Kibana and
|
||||||
|
InfluxDB-Grafana plugins to the master node
|
||||||
|
2. Install the plugins
|
||||||
|
3. Create the cluster
|
||||||
|
4. Add 3 nodes with controller roles
|
||||||
|
5. Add 1 node with compute and cinder roles
|
||||||
|
6. Add 1 node with elasticsearch_kibana and influxdb_grafana roles
|
||||||
|
7. Deploy the cluster
|
||||||
|
8. Check that plugins are running
|
||||||
|
9. Run OSTF
|
||||||
|
|
||||||
|
Duration 90m
|
||||||
|
"""
|
||||||
|
self.check_run("deploy_openstack_telemetry")
|
||||||
|
self.env.revert_snapshot("ready_with_5_slaves")
|
||||||
|
self.add_plugin(self.OPENSTACK_TELEMETRY)
|
||||||
|
self.disable_plugin(self.LMA_COLLECTOR)
|
||||||
|
self.disable_plugin(self.LMA_INFRASTRUCTURE_ALERTING)
|
||||||
|
self.prepare_plugins()
|
||||||
|
self.helpers.create_cluster(name=self.__class__.__name__)
|
||||||
|
self.activate_plugins()
|
||||||
|
roles = ["elasticsearch_kibana", "influxdb_grafana"]
|
||||||
|
self.helpers.deploy_cluster(
|
||||||
|
{'slave-01': ['controller'],
|
||||||
|
'slave-02': ['controller'],
|
||||||
|
'slave-03': ['controller'],
|
||||||
|
'slave-04': ['compute', 'cinder'],
|
||||||
|
'slave-05': roles})
|
||||||
|
self.check_plugins_online()
|
||||||
|
self.helpers.run_ostf()
|
||||||
|
self.env.make_snapshot("deploy_openstack_telemetry", is_make=True)
|
Loading…
Reference in New Issue
Block a user