diff --git a/almanach/collector/service.py b/almanach/collector/service.py index 58c4f19..16cc180 100644 --- a/almanach/collector/service.py +++ b/almanach/collector/service.py @@ -32,19 +32,24 @@ class CollectorService(service.ServiceBase): super(CollectorService, self).__init__() self.listeners = listeners self.thread_pool_size = thread_pool_size + self.started = False def start(self): LOG.info('Starting collector listeners...') for listener in self.listeners: listener.start(override_pool_size=self.thread_pool_size) + self.started = True def wait(self): LOG.info('Waiting...') def stop(self): - LOG.info('Graceful shutdown of the collector service...') - for listener in self.listeners: - listener.stop() + if self.started: + LOG.info('Graceful shutdown of the collector service...') + for listener in self.listeners: + listener.stop() + else: + LOG.info('Shutdown collector (not started successfully)') def reset(self): pass diff --git a/almanach/tests/unit/collector/test_service.py b/almanach/tests/unit/collector/test_service.py index 8e37876..a4cf120 100644 --- a/almanach/tests/unit/collector/test_service.py +++ b/almanach/tests/unit/collector/test_service.py @@ -14,42 +14,36 @@ import mock -from almanach.collector.handlers import instance_handler -from almanach.collector.handlers import volume_handler -from almanach.collector.handlers import volume_type_handler -from almanach.collector import notification +import oslo_messaging + from almanach.collector import service from almanach.tests.unit import base -class TestServiceFactory(base.BaseTestCase): +class TestService(base.BaseTestCase): def setUp(self): - super(TestServiceFactory, self).setUp() - self.core_factory = mock.Mock() - self.factory = service.ServiceFactory(self.config, self.core_factory) + super(TestService, self).setUp() + self.listener = mock.Mock() + self.listeners = [self.listener] + self.service = service.CollectorService(self.listeners, self.config.collector.thread_pool_size) - def test_get_service(self): - self.assertIsInstance(self.factory.get_service(), - service.CollectorService) + def test_start_when_listener_started_successfully(self): + self.service.start() + self.listeners[0].start.assert_called_once_with(override_pool_size=self.config.collector.thread_pool_size) + self.assertTrue(self.service.started) - self.core_factory.get_instance_controller.assert_called_once() - self.core_factory.get_volume_controller.assert_called_once() - self.core_factory.get_volume_type_controller.assert_called_once() + def test_start_when_listener_failed_to_start(self): + self.listener.start.side_effect = oslo_messaging.exceptions.MessagingException('Some Error') + self.assertRaises(oslo_messaging.exceptions.MessagingException, self.service.start) + self.assertFalse(self.service.started) - def test_get_instance_handler(self): - self.assertIsInstance(self.factory.get_instance_handler(), - instance_handler.InstanceHandler) + def test_stop_when_service_started_successfully(self): + self.service.started = True + self.service.stop() + self.listener.stop.assert_called_once() - def test_get_volume_handler(self): - self.assertIsInstance(self.factory.get_volume_handler(), - volume_handler.VolumeHandler) - - def test_get_volume_type_handler(self): - self.assertIsInstance(self.factory.get_volume_type_handler(), - volume_type_handler.VolumeTypeHandler) - - def test_get_on_delete_filters(self): - self.assertIsInstance(self.factory.get_on_delete_filters(), - notification.NotificationFilter) + def test_stop_when_service_failed_to_start(self): + self.service.stop() + self.listener.stop.assert_not_called() diff --git a/almanach/tests/unit/collector/test_service_factory.py b/almanach/tests/unit/collector/test_service_factory.py new file mode 100644 index 0000000..7947142 --- /dev/null +++ b/almanach/tests/unit/collector/test_service_factory.py @@ -0,0 +1,55 @@ +# Copyright 2017 Internap. +# +# 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 mock + +from almanach.collector.handlers import instance_handler +from almanach.collector.handlers import volume_handler +from almanach.collector.handlers import volume_type_handler +from almanach.collector import notification +from almanach.collector import service + +from almanach.tests.unit import base + + +class TestServiceFactory(base.BaseTestCase): + + def setUp(self): + super(TestServiceFactory, self).setUp() + self.core_factory = mock.Mock() + self.factory = service.ServiceFactory(self.config, self.core_factory) + + def test_get_service(self): + self.assertIsInstance(self.factory.get_service(), + service.CollectorService) + + self.core_factory.get_instance_controller.assert_called_once() + self.core_factory.get_volume_controller.assert_called_once() + self.core_factory.get_volume_type_controller.assert_called_once() + + def test_get_instance_handler(self): + self.assertIsInstance(self.factory.get_instance_handler(), + instance_handler.InstanceHandler) + + def test_get_volume_handler(self): + self.assertIsInstance(self.factory.get_volume_handler(), + volume_handler.VolumeHandler) + + def test_get_volume_type_handler(self): + self.assertIsInstance(self.factory.get_volume_type_handler(), + volume_type_handler.VolumeTypeHandler) + + def test_get_on_delete_filters(self): + self.assertIsInstance(self.factory.get_on_delete_filters(), + notification.NotificationFilter)