Merge "Remove required healthcheck import of cassandra"

This commit is contained in:
Jenkins 2017-06-21 05:48:50 +00:00 committed by Gerrit Code Review
commit 87d3e16e19
2 changed files with 48 additions and 15 deletions

View File

@ -1,4 +1,5 @@
# Copyright 2017 FUJITSU LIMITED
# (C) Copyright 2017 Hewlett Packard Enterprise Development LP
#
# 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
@ -14,9 +15,9 @@
import requests
from cassandra import cluster
from oslo_config import cfg
from oslo_log import log
from oslo_utils import importutils
from monasca_api.common.repositories import exceptions
from monasca_api.healthcheck import base
@ -42,11 +43,19 @@ class MetricsDbCheck(base.BaseHealthCheck):
Otherwise unhealthy status is returned with explanation.
"""
def health_check(self):
def __init__(self):
# Try to import cassandra. Not a problem if it can't be imported as long
# as the metrics db is influx
self._cluster = importutils.try_import('cassandra.cluster', None)
metric_driver = CONF.repositories.metrics_driver
db = self._detected_database_type(metric_driver)
self._db = self._detected_database_type(metric_driver)
if self._db == 'cassandra' and self._cluster is None:
# Should not happen, but log if it does somehow
LOG.error("Metrics Database is Cassandra but cassandra.cluster"
"not importable. Unable to do health check")
if db == 'influxdb':
def health_check(self):
if self._db == 'influxdb':
status = self._check_influxdb_status()
else:
status = self._check_cassandra_status()
@ -63,8 +72,7 @@ class MetricsDbCheck(base.BaseHealthCheck):
raise exceptions.UnsupportedDriverException(
'Driver {0} is not supported by Healthcheck'.format(driver))
@staticmethod
def _check_influxdb_status():
def _check_influxdb_status(self):
uri = 'http://{0}:{1}/ping'.format(CONF.influxdb.ip_address,
CONF.influxdb.port)
try:
@ -75,10 +83,11 @@ class MetricsDbCheck(base.BaseHealthCheck):
return resp.ok, 'OK' if resp.ok else 'Error: {0}'.format(
resp.status_code)
@staticmethod
def _check_cassandra_status():
def _check_cassandra_status(self):
if self._cluster is None:
return False, "Cassandra driver not imported"
try:
cassandra = cluster.Cluster(
cassandra = self._cluster.Cluster(
CONF.cassandra.cluster_ip_addresses.split(',')
)
session = cassandra.connect(CONF.cassandra.keyspace)

View File

@ -1,4 +1,5 @@
# Copyright 2017 FUJITSU LIMITED
# (C) Copyright 2017 Hewlett Packard Enterprise Development LP
#
# 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
@ -147,8 +148,8 @@ class TestMetricsDbHealthCheck(base.BaseTestCase):
self.assertTrue(result.healthy)
self.assertEqual('OK', result.message)
@mock.patch('monasca_api.healthcheck.metrics_db_check.cluster.Cluster')
def test_should_fail_cassandra_unavailable(self, cluster):
@mock.patch('monasca_api.healthcheck.metrics_db_check.importutils.try_import')
def test_should_fail_cassandra_unavailable(self, try_import):
messaging_conf = {
'metrics_driver': 'cassandra.metrics_repository:MetricsRepository'
}
@ -159,17 +160,40 @@ class TestMetricsDbHealthCheck(base.BaseTestCase):
self._conf.config(group='repositories', **messaging_conf)
self._conf.config(group='cassandra', **cassandra_conf)
cluster = mock.Mock()
cas_mock = mock.Mock()
cluster.side_effect = cl.NoHostAvailable(message='Host unavailable',
errors='Unavailable')
cluster.return_value = cas_mock
cas_mock.side_effect = cl.NoHostAvailable(message='Host unavailable',
errors='Unavailable')
cluster.Cluster = cas_mock
try_import.return_value = cluster
db_health = tdc.MetricsDbCheck()
result = db_health.health_check()
self.assertFalse(result.healthy)
@mock.patch('monasca_api.healthcheck.metrics_db_check.cluster.Cluster')
@mock.patch('monasca_api.healthcheck.metrics_db_check.importutils.try_import')
def test_should_fail_cassandra_no_driver(self, try_import):
messaging_conf = {
'metrics_driver': 'cassandra.metrics_repository:MetricsRepository'
}
cassandra_conf = {
'cluster_ip_addresses': 'localhost',
'keyspace': 'test'
}
self._conf.config(group='repositories', **messaging_conf)
self._conf.config(group='cassandra', **cassandra_conf)
# Simulate cassandra driver not available
try_import.return_value = None
db_health = tdc.MetricsDbCheck()
db_health.cluster = None
result = db_health.health_check()
self.assertFalse(result.healthy)
@mock.patch('monasca_api.healthcheck.metrics_db_check.importutils.try_import')
def test_should_pass_cassandra_is_available(self, _):
messaging_conf = {
'metrics_driver': 'cassandra.metrics_repository:MetricsRepository'