zaqar/tests/functional/wsgi/v1_1/test_health.py
Fei Long Wang 13df51be82 feat(v1.1): Implement new /health endpoint for v1.1
The new /health endpoint of v1.1 is different from the /health
of v1.0. In v1.1 /health endpoint we will return a set of KPI
(Key Performance Indicator) of the target Marconi server. The
API response will be like below:

{
    "mongo_pool_1": {
        "message_volume": {
            "claimed": 0,
            "total": 0,
            "free": 0
        },
        "storage_reachable": true,
        "operation_status": {
            "create_queue": {
                "seconds": 0.0021300315856933594,
                "ref": null,
                "succeeded": true
            },
            "post_messages": {
                "seconds": 0.033502817153930664,
                "ref": null,
                "succeeded": true
            },
            "list_messages": {
                "seconds": 0.000013113021850585938,
                "ref": null,
                "succeeded": true
            },
            "claim_messages": {
                "seconds": 0.0013759136199951172,
                "ref": "3f515f37-58a0-4c81-8214-3e92979b82e7",
                "succeeded": false
            },
            "delete_queue": {
                "seconds": 0.0030739307403564453,
                "ref": null,
                "succeeded": true
            }
        }
    },
    "mongo_pool_2": {
        "message_volume": {
            "claimed": 0,
            "total": 0,
            "free": 0
        },
        "storage_reachable": true,
        "operation_status": {
            "create_queue": {
                "seconds": 0.0011799335479736328,
                "ref": null,
                "succeeded": true
            },
            "post_messages": {
                "seconds": 0.024316072463989258,
                "ref": null,
                "succeeded": true
            },
            "list_messages": {
                "seconds": 0.000008106231689453125,
                "ref": null,
                "succeeded": true
            },
            "claim_messages": {
                "seconds": 0.000576019287109375,
                "ref": "68629fda-b4ce-4cf9-978a-df0df8df36a7",
                "succeeded": false
            },
            "delete_queue": {
                "seconds": 0.003300905227661133,
                "ref": null,
                "succeeded": true
            }
        }
    },
    "catalog_reachable": true
}

docImpact
Implements: blueprint detailed-health

Change-Id: I6b281132e2fef8ce65ce54b9d6be297571f8b170
2014-08-19 18:16:59 +12:00

90 lines
3.1 KiB
Python

# Copyright (c) 2014 Catalyst IT Ltd
#
# 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.
import ddt
from zaqar.tests.functional import base
from zaqar.tests.functional import helpers
@ddt.ddt
class TestHealth(base.V1_1FunctionalTestBase):
server_class = base.ZaqarAdminServer
def setUp(self):
super(TestHealth, self).setUp()
self.base_url = ("{url}/{version}".format(
url=self.cfg.zaqar.url,
version="v1.1"
))
self.cfg.zaqar.version = "v1.1"
self.client.set_base_url(self.base_url)
@ddt.data(
{
'name': "pool_1",
'weight': 10,
'uri': "sqlite:///:memory:"
}
)
def test_health_with_pool(self, params):
# FIXME(flwang): Please use mongodb after the sqlalchemy is disabled
# as pool node and the mongodb is working on gate successfully.
doc = helpers.create_pool_body(
weight=params.get('weight', 10),
uri=params.get('uri', "sqlite:///:memory:")
)
pool_name = params.get('name', "pool_1")
self.addCleanup(self.client.delete, url='/pools/' + pool_name)
result = self.client.put('/pools/' + pool_name, data=doc)
self.assertEqual(result.status_code, 201)
queue_name = 'fake_queue'
self.addCleanup(self.client.delete, url='/queues/' + queue_name)
result = self.client.put('/queues/' + queue_name)
self.assertEqual(result.status_code, 201)
sample_messages = {'messages': [
{'body': 239, 'ttl': 999},
{'body': {'key': 'value'}, 'ttl': 888}
]}
result = self.client.post('/queues/%s/messages' % queue_name,
data=sample_messages)
self.assertEqual(result.status_code, 201)
claim_metadata = {'ttl': 100, 'grace': 300}
result = self.client.post('/queues/%s/claims' % queue_name,
data=claim_metadata)
self.assertEqual(result.status_code, 201)
response = self.client.get('/health')
self.assertEqual(response.status_code, 200)
health = response.json()
self.assertEqual(health['catalog_reachable'], True)
self.assertEqual(health[pool_name]['storage_reachable'], True)
op_status = health[pool_name]['operation_status']
for op in op_status.keys():
self.assertTrue(op_status[op]['succeeded'])
message_volume = health[pool_name]['message_volume']
self.assertEqual(message_volume['claimed'], 2)
self.assertEqual(message_volume['free'], 0)
self.assertEqual(message_volume['total'], 2)