diff --git a/heat/common/service_utils.py b/heat/common/service_utils.py index 070af1eb2..b5cf00485 100644 --- a/heat/common/service_utils.py +++ b/heat/common/service_utils.py @@ -13,8 +13,12 @@ # See the License for the specific language governing permissions and # limitations under the License. +import uuid + from oslo_utils import timeutils +from heat.rpc import listener_client + SERVICE_KEYS = ( SERVICE_ID, SERVICE_HOST, @@ -70,3 +74,12 @@ def format_service(service): SERVICE_STATUS: status } return result + + +def engine_alive(context, engine_id): + return listener_client.EngineListenerClient( + engine_id).is_alive(context) + + +def generate_engine_id(): + return str(uuid.uuid4()) diff --git a/heat/engine/service.py b/heat/engine/service.py index 9d418aeee..50a596ed7 100644 --- a/heat/engine/service.py +++ b/heat/engine/service.py @@ -360,7 +360,7 @@ class EngineService(service.Service): self.manage_thread_grp.add_thread(create_watch_tasks) def start(self): - self.engine_id = stack_lock.StackLock.generate_engine_id() + self.engine_id = service_utils.generate_engine_id() if self.thread_group_mgr is None: self.thread_group_mgr = ThreadGroupManager() self.listener = EngineListener(self.host, self.engine_id, @@ -1145,7 +1145,7 @@ class EngineService(service.Service): self.thread_group_mgr.send(current_stack.id, cancel_message) # Another active engine has the lock - elif stack_lock.StackLock.engine_alive(cnxt, engine_id): + elif service_utils.engine_alive(cnxt, engine_id): cancel_result = self._remote_call( cnxt, engine_id, self.listener.SEND, stack_identity=stack_identity, message=cancel_message) @@ -1375,7 +1375,7 @@ class EngineService(service.Service): self.thread_group_mgr.stop(stack.id) # Another active engine has the lock - elif stack_lock.StackLock.engine_alive(cnxt, acquire_result): + elif service_utils.engine_alive(cnxt, acquire_result): stop_result = self._remote_call( cnxt, acquire_result, self.listener.STOP_STACK, stack_identity=stack_identity) diff --git a/heat/engine/stack_lock.py b/heat/engine/stack_lock.py index c1c972710..2f00018a8 100644 --- a/heat/engine/stack_lock.py +++ b/heat/engine/stack_lock.py @@ -12,7 +12,6 @@ # under the License. import contextlib -import uuid from oslo_log import log as logging from oslo_utils import excutils @@ -20,9 +19,10 @@ from oslo_utils import excutils from heat.common import exception from heat.common.i18n import _LI from heat.common.i18n import _LW +from heat.common import service_utils from heat.objects import stack as stack_object from heat.objects import stack_lock as stack_lock_object -from heat.rpc import listener_client + LOG = logging.getLogger(__name__) @@ -34,15 +34,6 @@ class StackLock(object): self.engine_id = engine_id self.listener = None - @staticmethod - def engine_alive(context, engine_id): - return listener_client.EngineListenerClient( - engine_id).is_alive(context) - - @staticmethod - def generate_engine_id(): - return str(uuid.uuid4()) - def get_engine_id(self): return stack_lock_object.StackLock.get_engine_id(self.stack_id) @@ -72,7 +63,7 @@ class StackLock(object): tenant_safe=False, show_deleted=True) if (lock_engine_id == self.engine_id or - self.engine_alive(self.context, lock_engine_id)): + service_utils.engine_alive(self.context, lock_engine_id)): LOG.debug("Lock on stack %(stack)s is owned by engine " "%(engine)s" % {'stack': self.stack_id, 'engine': lock_engine_id}) diff --git a/heat/tests/engine/service/test_service_engine.py b/heat/tests/engine/service/test_service_engine.py index d5f421a29..786bf38be 100644 --- a/heat/tests/engine/service/test_service_engine.py +++ b/heat/tests/engine/service/test_service_engine.py @@ -222,7 +222,7 @@ class ServiceEngineTest(common.HeatTestCase): return_value=mock.Mock()) @mock.patch('heat.common.messaging.get_rpc_client', return_value=mock.Mock()) - @mock.patch('heat.engine.stack_lock.StackLock.generate_engine_id', + @mock.patch('heat.common.service_utils.generate_engine_id', return_value='sample-uuid') @mock.patch('heat.engine.service.ThreadGroupManager', return_value=mock.Mock()) @@ -259,7 +259,7 @@ class ServiceEngineTest(common.HeatTestCase): return_value=mock.Mock()) @mock.patch('heat.common.messaging.get_rpc_client', return_value=mock.Mock()) - @mock.patch('heat.engine.stack_lock.StackLock.generate_engine_id', + @mock.patch('heat.common.service_utils.generate_engine_id', return_value=mock.Mock()) @mock.patch('heat.engine.service.ThreadGroupManager', return_value=mock.Mock()) @@ -389,7 +389,7 @@ class ServiceEngineTest(common.HeatTestCase): return_value=mock.Mock()) @mock.patch('heat.common.messaging.get_rpc_client', return_value=mock.Mock()) - @mock.patch('heat.engine.stack_lock.StackLock.generate_engine_id', + @mock.patch('heat.common.service_utils.generate_engine_id', return_value=mock.Mock()) @mock.patch('heat.engine.service.ThreadGroupManager', return_value=mock.Mock()) diff --git a/heat/tests/engine/service/test_stack_delete.py b/heat/tests/engine/service/test_stack_delete.py index 6bafbbc1b..88d2a5449 100644 --- a/heat/tests/engine/service/test_stack_delete.py +++ b/heat/tests/engine/service/test_stack_delete.py @@ -14,6 +14,7 @@ import mock from oslo_messaging.rpc import dispatcher from heat.common import exception +from heat.common import service_utils from heat.engine import service from heat.engine import stack as parser from heat.engine import stack_lock @@ -124,7 +125,7 @@ class StackDeleteTest(common.HeatTestCase): @mock.patch.object(parser.Stack, 'load') @mock.patch.object(stack_lock.StackLock, 'try_acquire') - @mock.patch.object(stack_lock.StackLock, 'engine_alive') + @mock.patch.object(service_utils, 'engine_alive') def test_stack_delete_other_engine_active_lock_failed(self, mock_alive, mock_try, mock_load): OTHER_ENGINE = "other-engine-fake-uuid" @@ -157,7 +158,7 @@ class StackDeleteTest(common.HeatTestCase): @mock.patch.object(parser.Stack, 'load') @mock.patch.object(stack_lock.StackLock, 'try_acquire') - @mock.patch.object(stack_lock.StackLock, 'engine_alive') + @mock.patch.object(service_utils, 'engine_alive') @mock.patch.object(stack_lock.StackLock, 'acquire') def test_stack_delete_other_engine_active_lock_succeeded( self, mock_acquire, mock_alive, mock_try, mock_load): @@ -191,7 +192,7 @@ class StackDeleteTest(common.HeatTestCase): @mock.patch.object(parser.Stack, 'load') @mock.patch.object(stack_lock.StackLock, 'try_acquire') - @mock.patch.object(stack_lock.StackLock, 'engine_alive') + @mock.patch.object(service_utils, 'engine_alive') @mock.patch.object(stack_lock.StackLock, 'acquire') def test_stack_delete_other_dead_engine_active_lock( self, mock_acquire, mock_alive, mock_try, mock_load): diff --git a/heat/tests/engine/service/test_stack_update.py b/heat/tests/engine/service/test_stack_update.py index 0199f9360..9bade28b4 100644 --- a/heat/tests/engine/service/test_stack_update.py +++ b/heat/tests/engine/service/test_stack_update.py @@ -20,6 +20,7 @@ import six from heat.common import exception from heat.common import messaging +from heat.common import service_utils from heat.common import template_format from heat.engine.clients.os import glance from heat.engine.clients.os import nova @@ -438,7 +439,7 @@ class ServiceStackUpdateTest(common.HeatTestCase): self.patchobject(stack.Stack, 'load', return_value=stk) self.patchobject(stack_lock.StackLock, 'try_acquire', return_value=str(uuid.uuid4())) - self.patchobject(stack_lock.StackLock, 'engine_alive', + self.patchobject(service_utils, 'engine_alive', return_value=True) self.man.listener = mock.Mock() self.man.listener.SEND = 'send' diff --git a/heat/tests/test_stack_lock.py b/heat/tests/test_stack_lock.py index c627ce4a5..ecdb2eb50 100644 --- a/heat/tests/test_stack_lock.py +++ b/heat/tests/test_stack_lock.py @@ -14,6 +14,7 @@ import mock from heat.common import exception +from heat.common import service_utils from heat.engine import stack_lock from heat.objects import stack as stack_object from heat.objects import stack_lock as stack_lock_object @@ -26,7 +27,7 @@ class StackLockTest(common.HeatTestCase): super(StackLockTest, self).setUp() self.context = utils.dummy_context() self.stack_id = "aae01f2d-52ae-47ac-8a0d-3fde3d220fea" - self.engine_id = stack_lock.StackLock.generate_engine_id() + self.engine_id = service_utils.generate_engine_id() stack = mock.MagicMock() stack.id = self.stack_id stack.name = "test_stack" @@ -74,7 +75,7 @@ class StackLockTest(common.HeatTestCase): slock = stack_lock.StackLock(self.context, self.stack_id, self.engine_id) - self.patchobject(slock, 'engine_alive', return_value=False) + self.patchobject(service_utils, 'engine_alive', return_value=False) slock.acquire() mock_create.assert_called_once_with(self.stack_id, self.engine_id) @@ -88,7 +89,7 @@ class StackLockTest(common.HeatTestCase): slock = stack_lock.StackLock(self.context, self.stack_id, self.engine_id) - self.patchobject(slock, 'engine_alive', return_value=True) + self.patchobject(service_utils, 'engine_alive', return_value=True) self.assertRaises(exception.ActionInProgress, slock.acquire) self.mock_get_by_id.assert_called_once_with( self.context, @@ -108,7 +109,7 @@ class StackLockTest(common.HeatTestCase): slock = stack_lock.StackLock(self.context, self.stack_id, self.engine_id) - self.patchobject(slock, 'engine_alive', return_value=False) + self.patchobject(service_utils, 'engine_alive', return_value=False) self.assertRaises(exception.ActionInProgress, slock.acquire) self.mock_get_by_id.assert_called_once_with( self.context, @@ -130,7 +131,7 @@ class StackLockTest(common.HeatTestCase): slock = stack_lock.StackLock(self.context, self.stack_id, self.engine_id) - self.patchobject(slock, 'engine_alive', return_value=False) + self.patchobject(service_utils, 'engine_alive', return_value=False) slock.acquire() mock_create.assert_has_calls( @@ -148,7 +149,7 @@ class StackLockTest(common.HeatTestCase): slock = stack_lock.StackLock(self.context, self.stack_id, self.engine_id) - self.patchobject(slock, 'engine_alive', return_value=False) + self.patchobject(service_utils, 'engine_alive', return_value=False) self.assertRaises(exception.ActionInProgress, slock.acquire) self.mock_get_by_id.assert_called_with( self.context,