diff --git a/stacklight_tests/openstack_telemetry/api.py b/stacklight_tests/openstack_telemetry/api.py index 3c58fd0..cebe3ce 100644 --- a/stacklight_tests/openstack_telemetry/api.py +++ b/stacklight_tests/openstack_telemetry/api.py @@ -32,27 +32,29 @@ class OpenstackTelemeteryPluginApi(base_test.PluginApi): @property def ceilometer_client(self): if self._ceilometer is None: - keystone_access = self.helpers.os_conn.keystone + keystone_access = self.helpers.os_conn.keystone_access endpoint = keystone_access.service_catalog.url_for( - service_type='metering', - service_name='ceilometer', - endpoint_type='internalURL' - ) + service_type='metering', service_name='ceilometer', + interface='internal') if not endpoint: raise self.helpers.NotFound( "Cannot find Ceilometer endpoint") aodh_endpoint = keystone_access.service_catalog.url_for( - service_type='alarming', - service_name='aodh', - endpoint_type='internalURL' - ) + service_type='alarming', service_name='aodh', + interface='internal') if not aodh_endpoint: raise self.helpers.NotFound( "Cannot find AODH (alarm) endpoint") + auth_url = keystone_access.service_catalog.url_for( + service_type='identity', service_name='keystone', + interface='internal') + if not auth_url: + raise self.helpers.NotFound( + "Cannot find Keystone endpoint") self._ceilometer = ceilometerclient.v2.Client( aodh_endpoint=aodh_endpoint, - auth_url=keystone_access.auth_url, + auth_url=auth_url, endpoint=endpoint, token=lambda: keystone_access.auth_token) return self._ceilometer @@ -130,63 +132,105 @@ class OpenstackTelemeteryPluginApi(base_test.PluginApi): self.settings.name, self.settings.version) def check_ceilometer_sample_functionality(self): - fail_msg = 'Failed to get sample list.' - msg = 'getting samples list' + logger.info("Start checking Ceilometer Samples API") + + fail_msg = "Failed to get sample list." + msg = "getting samples list" self.helpers.verify(60, self.ceilometer_client.new_samples.list, 1, fail_msg, msg, limit=10) - fail_msg = 'Failed to get statistic of metric.' - msg = 'getting statistic of metric' + fail_msg = "Failed to get statistic of metric." + msg = "getting statistic of metric" an_hour_ago = (datetime.datetime.now() - datetime.timedelta(hours=1)).isoformat() - query = [{'field': 'timestamp', 'op': 'gt', 'value': an_hour_ago}] + query = [{"field": "timestamp", "op": "gt", "value": an_hour_ago}] self.helpers.verify(600, self.ceilometer_client.statistics.list, 2, - fail_msg, msg, meter_name='image', q=query) + fail_msg, msg, meter_name="image", q=query) def check_ceilometer_alarm_functionality(self): - fail_msg = 'Failed to create alarm.' - msg = 'creating alarm' - alarm = self.helpers.verify(60, self.create_alarm, 1, fail_msg, msg, - meter_name='image', - threshold=0.9, - name='ceilometer-fake-alarm', - period=600, - statistic='avg', - comparison_operator='lt') + logger.info("Start checking Ceilometer AODH(Alarms) API") - fail_msg = 'Failed to get alarm.' - msg = 'getting alarm' + fail_msg = "Failed to create alarm." + msg = "creating alarm" + alarm = self.helpers.verify(60, self.create_alarm, 1, fail_msg, msg, + meter_name="image", + threshold=0.9, + name="ceilometer-fake-alarm", + period=600, + statistic="avg", + comparison_operator="lt") + + fail_msg = "Failed to get alarm." + msg = "getting alarm" self.helpers.verify(60, self.ceilometer_client.alarms.get, 2, fail_msg, msg, alarm_id=alarm.alarm_id) - fail_msg = 'Failed while waiting for alarm state to become "ok".' - msg = 'waiting for alarm state to become "ok"' + fail_msg = "Failed while waiting for alarm state to become 'ok'." + msg = "waiting for alarm state to become 'ok'" self.helpers.verify(1000, self.check_alarm_state, 3, - fail_msg, msg, alarm_id=alarm.alarm_id, state='ok') + fail_msg, msg, alarm_id=alarm.alarm_id, state="ok") - fail_msg = 'Failed to update alarm.' - msg = 'updating alarm' + fail_msg = "Failed to update alarm." + msg = "updating alarm" self.helpers.verify(60, self.ceilometer_client.alarms.update, 4, fail_msg, msg, alarm_id=alarm.alarm_id, threshold=1.1) - fail_msg = 'Failed while waiting for alarm state to become "alarm".' - msg = 'waiting for alarm state to become "alarm"' + fail_msg = "Failed while waiting for alarm state to become 'alarm'." + msg = "waiting for alarm state to become 'alarm'" self.helpers.verify(1000, self.check_alarm_state, 5, fail_msg, msg, alarm_id=alarm.alarm_id, - state='alarm') + state="alarm") - fail_msg = 'Failed to get alarm history.' - msg = 'getting alarm history' + fail_msg = "Failed to get alarm history." + msg = "getting alarm history" self.helpers.verify(60, self.ceilometer_client.alarms.get_history, 6, fail_msg, msg, alarm_id=alarm.alarm_id) - fail_msg = 'Failed to delete alarm.' - msg = 'deleting alarm' + fail_msg = "Failed to delete alarm." + msg = "deleting alarm" self.helpers.verify(60, self.ceilometer_client.alarms.delete, 7, fail_msg, msg, alarm_id=alarm.alarm_id) + def check_ceilometer_event_functionality(self): + logger.info("Start checking Ceilometer Events API") + + fail_msg = "Failed to get event list." + msg = "getting event list" + events_list = self.helpers.verify( + 600, self.ceilometer_client.events.list, 1, fail_msg, msg, + limit=10 + ) + event_type = events_list[0].event_type + message_id = events_list[0].message_id + traits = events_list[0].traits + + fail_msg = ("Failed to find '{event_type}' event type in certain " + "'{message_id}' event.".format(event_type=event_type, + message_id=message_id)) + msg = ("searching '{event_type}' event type in certain " + "'{message_id}' event.".format(event_type=event_type, + message_id=message_id)) + self.helpers.verify(60, self.ceilometer_client.events.get, 2, fail_msg, + msg, message_id=message_id) + + fail_msg = "Failed to get event types list." + msg = "getting event types list" + self.helpers.verify(60, self.ceilometer_client.event_types.list, 3, + fail_msg, msg) + + fail_msg = "Failed to get trait list." + msg = "getting trait list" + self.helpers.verify(60, self.ceilometer_client.traits.list, 4, + fail_msg, msg, event_type=event_type, + trait_name=traits[0]["name"]) + + fail_msg = "Failed to check event traits description." + msg = "checking event traits description" + self.helpers.verify(60, self.ceilometer_client.trait_descriptions.list, + 5, fail_msg, msg, event_type=event_type) + def create_alarm(self, **kwargs): for alarm in self.ceilometer_client.alarms.list(): if alarm.name == kwargs['name']: diff --git a/stacklight_tests/toolchain/test_openstack_telemetry.py b/stacklight_tests/toolchain/test_openstack_telemetry.py index 53e0980..403ec1b 100644 --- a/stacklight_tests/toolchain/test_openstack_telemetry.py +++ b/stacklight_tests/toolchain/test_openstack_telemetry.py @@ -22,9 +22,35 @@ from stacklight_tests.toolchain import api 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"]) + def _deploy_telemetry_plugin(self, caller, snapshot="ready_with_5_slaves", + advanced_options=None, additional_tests=None): + self.check_run(caller) + self.env.revert_snapshot(snapshot) + 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() + if advanced_options: + self.OPENSTACK_TELEMETRY.activate_plugin(options=advanced_options) + 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() + if additional_tests: + for ostf_test in additional_tests: + ostf_test() + self.env.make_snapshot(caller, is_make=True) + + @test(depends_on_groups=["prepare_slaves_5"], + groups=["deploy_openstack_telemetry", "deploy", "smoke", + "openstack_telemetry"]) @log_snapshot_after_test def deploy_openstack_telemetry(self): """Deploy an environment with Openstack-Telemetry plugin @@ -43,31 +69,9 @@ class TestOpenstackTelemetry(api.ToolchainApi): 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) + self._deploy_telemetry_plugin("deploy_openstack_telemetry") - -@test(groups=["openstack_telemetry"]) -class TestOpenstackTelemetryFunctional(api.ToolchainApi): - """Class for functional testing the Openstack Telemetry Plugin.""" - - @test(depends_on_groups=['deploy_openstack_telemetry'], + @test(depends_on_groups=["deploy_openstack_telemetry"], groups=["openstack_telemetry_default_functional", "functional"]) def openstack_telemetry_default_functional(self): """Deploy an environment with Openstack-Telemetry plugin with @@ -80,7 +84,53 @@ class TestOpenstackTelemetryFunctional(api.ToolchainApi): Duration 90m """ - self.check_run("openstack_telemetry_default_functional") - self.env.revert_snapshot("deploy_openstack_telemetry") - self.OPENSTACK_TELEMETRY.check_ceilometer_sample_functionality() - self.OPENSTACK_TELEMETRY.check_ceilometer_alarm_functionality() + additional_tests = ( + self.OPENSTACK_TELEMETRY.check_ceilometer_sample_functionality, + self.OPENSTACK_TELEMETRY.check_ceilometer_alarm_functionality + ) + + self._deploy_telemetry_plugin("openstack_telemetry_default_functional", + snapshot="deploy_openstack_telemetry", + additional_tests=additional_tests + ) + + @test(depends_on_groups=["prepare_slaves_5"], + groups=["openstack_telemetry_event_functional", + "deploy_openstack_telemetry", "functional"]) + @log_snapshot_after_test + def openstack_telemetry_event_functional(self): + """Deploy an environment with Openstack-Telemetry plugin with + enabled Ceilometer Event API and check its functionality + + 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 role + 5. Add 1 nodes with compute and cinder roles + 6. Add 1 nodes with elasticsearch_kibana and influxdb_grafana roles + 7. Enable Ceilometer Event API + 8. Deploy the cluster + 9. Check that plugins are running + 10. Run OSTF + 11. Check Ceilometer Sample API + 12. Check Ceilometer Alarm API + 13. Check Ceilometer Events API + + Duration 90m + """ + additional_tests = ( + self.OPENSTACK_TELEMETRY.check_ceilometer_sample_functionality, + self.OPENSTACK_TELEMETRY.check_ceilometer_alarm_functionality, + self.OPENSTACK_TELEMETRY.check_ceilometer_event_functionality, + ) + + options = { + "advanced_settings/value": True, + "event_api/value": True, + } + + self._deploy_telemetry_plugin("openstack_telemetry_event_functional", + additional_tests=additional_tests, + advanced_options=options + )