summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--openstack/common/service.py73
-rw-r--r--tests/unit/test_service.py40
2 files changed, 113 insertions, 0 deletions
diff --git a/openstack/common/service.py b/openstack/common/service.py
index a0a8e5a..9c712c6 100644
--- a/openstack/common/service.py
+++ b/openstack/common/service.py
@@ -19,6 +19,64 @@
"""Generic Node base class for all workers that run on hosts."""
+import sys
+import eventlet
+import greenlet
+
+
+class Launcher(object):
+ """Launch one or more services and wait for them to complete."""
+
+ def __init__(self):
+ """Initialize the service launcher.
+
+ :returns: None
+
+ """
+ self._services = []
+
+ @staticmethod
+ def run_service(service):
+ """Start and wait for a service to finish.
+
+ :param service: service to run and wait for.
+ :returns: None
+
+ """
+ service.start()
+ service.wait()
+
+ def launch_service(self, service):
+ """Load and start the given service.
+
+ :param service: The service you would like to start.
+ :returns: None
+
+ """
+ gt = eventlet.spawn(self.run_service, service)
+ self._services.append(gt)
+
+ def stop(self):
+ """Stop all services which are currently running.
+
+ :returns: None
+
+ """
+ for service in self._services:
+ service.kill()
+
+ def wait(self):
+ """Waits until all services have been stopped, and then returns.
+
+ :returns: None
+
+ """
+ for service in self._services:
+ try:
+ service.wait()
+ except greenlet.GreenletExit:
+ pass
+
class Service(object):
"""Service object for binaries running on hosts.
@@ -28,3 +86,18 @@ class Service(object):
def __init__(self, host, manager, *args, **kwargs):
self.host = host
self.manager = manager
+
+ def start(self):
+ if self.manager:
+ self.manager.init_host()
+
+ def stop(self):
+ pass
+
+ def wait(self):
+ pass
+
+
+def launcher(service):
+ l = Launcher()
+ l.launch_service(service)
diff --git a/tests/unit/test_service.py b/tests/unit/test_service.py
new file mode 100644
index 0000000..fa79fa8
--- /dev/null
+++ b/tests/unit/test_service.py
@@ -0,0 +1,40 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2010 United States Government as represented by the
+# Administrator of the National Aeronautics and Space Administration.
+# All Rights Reserved.
+#
+# 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.
+
+"""
+Unit Tests for remote procedure calls using queue
+"""
+from eventlet import greenthread
+
+from openstack.common import cfg
+from openstack.common import service
+from openstack.common import manager
+from tests import utils
+
+
+class ExtendedService(service.Service):
+ def test_method(self):
+ return 'service'
+
+
+class ServiceManagerTestCase(utils.BaseTestCase):
+ """Test cases for Services"""
+ def test_override_manager_method(self):
+ serv = ExtendedService('test', None)
+ serv.start()
+ self.assertEqual(serv.test_method(), 'service')