summaryrefslogtreecommitdiffstats
path: root/openstack
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2012-09-27 21:13:24 +0000
committerGerrit Code Review <review@openstack.org>2012-09-27 21:13:24 +0000
commitdf3906827b34cd6ede4e0d76da4b7af36728bc9d (patch)
tree68821b37acad7042cd5a6954b79cd7ae69b90336 /openstack
parent83b4cce116ec2f196c916ed238884a935e69235a (diff)
parentde0c187307a6b98a2e75630c70a73d08b9992c66 (diff)
downloadoslo-df3906827b34cd6ede4e0d76da4b7af36728bc9d.tar.gz
oslo-df3906827b34cd6ede4e0d76da4b7af36728bc9d.tar.xz
oslo-df3906827b34cd6ede4e0d76da4b7af36728bc9d.zip
Merge "Add the rpc service and delete manager"
Diffstat (limited to 'openstack')
-rw-r--r--openstack/common/manager.py68
-rw-r--r--openstack/common/rpc/service.py69
-rw-r--r--openstack/common/service.py34
3 files changed, 78 insertions, 93 deletions
diff --git a/openstack/common/manager.py b/openstack/common/manager.py
deleted file mode 100644
index 647fa93..0000000
--- a/openstack/common/manager.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# 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.
-
-"""Base Manager class.
-
-Managers are responsible for a certain aspect of the system. It is a logical
-grouping of code relating to a portion of the system. In general other
-components should be using the manager to make changes to the components that
-it is responsible for.
-
-For example, other components that need to deal with volumes in some way,
-should do so by calling methods on the VolumeManager instead of directly
-changing fields in the database. This allows us to keep all of the code
-relating to volumes in the same place.
-
-We have adopted a basic strategy of Smart managers and dumb data, which means
-rather than attaching methods to data objects, components should call manager
-methods that act on the data.
-
-Methods on managers that can be executed locally should be called directly.
-
-Managers should be responsible for most of the db access, and
-non-implementation specific data. Anything implementation specific that can't
-be generalized should be done by the Driver.
-
-In general, we prefer to have one manager with multiple drivers for different
-implementations, but sometimes it makes sense to have multiple managers. You
-can think of it this way: Abstract different overall strategies at the manager
-level(FlatNetwork vs VlanNetwork), and different implementations at the driver
-level(LinuxNetDriver vs CiscoNetDriver).
-
-Managers will often provide methods for initial setup of a host or periodic
-tasks to a wrapping service.
-
-This module provides Manager, a base class for managers.
-
-"""
-
-from openstack.common import periodic_task
-
-
-class Manager(periodic_task.PeriodicTasks):
-
- def __init__(self, host):
- self.host = host
-
- def init_host(self):
- """Handle initialization if this is a standalone service.
-
- Child classes should override this method.
-
- """
- pass
diff --git a/openstack/common/rpc/service.py b/openstack/common/rpc/service.py
new file mode 100644
index 0000000..0c0255c
--- /dev/null
+++ b/openstack/common/rpc/service.py
@@ -0,0 +1,69 @@
+# 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.
+# Copyright 2011 Red Hat, Inc.
+#
+# 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.
+
+from openstack.common.gettextutils import _
+from openstack.common import log as logging
+from openstack.common import rpc
+from openstack.common import service
+
+
+LOG = logging.getLogger(__name__)
+
+
+class Service(service.Service):
+ """Service object for binaries running on hosts.
+
+ A service enables rpc by listening to queues based on topic and host."""
+ def __init__(self, host, topic, manager=None):
+ super(Service, self).__init__()
+ self.host = host
+ self.topic = topic
+ if manager is None:
+ self.manager = self
+ else:
+ self.manager = manager
+
+ def start(self):
+ super(Service, self).start()
+
+ self.conn = rpc.create_connection(new=True)
+ LOG.debug(_("Creating Consumer connection for Service %s") %
+ self.topic)
+
+ rpc_dispatcher = rpc.dispatcher.RpcDispatcher([self.manager])
+
+ # Share this same connection for these Consumers
+ self.conn.create_consumer(self.topic, rpc_dispatcher, fanout=False)
+
+ node_topic = '%s.%s' % (self.topic, self.host)
+ self.conn.create_consumer(node_topic, rpc_dispatcher, fanout=False)
+
+ self.conn.create_consumer(self.topic, rpc_dispatcher, fanout=True)
+
+ # Consume from all consumers in a thread
+ self.conn.consume_in_thread()
+
+ def stop(self):
+ # Try to shut the connection down, but if we get any sort of
+ # errors, go ahead and ignore them.. as we're shutting down anyway
+ try:
+ self.conn.close()
+ except Exception:
+ pass
+ super(Service, self).stop()
diff --git a/openstack/common/service.py b/openstack/common/service.py
index 01c38a4..69b0f9b 100644
--- a/openstack/common/service.py
+++ b/openstack/common/service.py
@@ -33,6 +33,10 @@ from openstack.common import log as logging
from openstack.common import threadgroup
from openstack.common.gettextutils import _
+try:
+ from openstack.common import rpc
+except ImportError:
+ rpc = None
LOG = logging.getLogger(__name__)
@@ -121,6 +125,8 @@ class ServiceLauncher(Launcher):
status = exc.code
finally:
self.stop()
+ if rpc:
+ rpc.cleanup()
return status
@@ -289,35 +295,13 @@ class ProcessLauncher(object):
class Service(object):
- """Service object for binaries running on hosts.
+ """Service object for binaries running on hosts."""
- A service takes a manager and periodically runs tasks on the manager."""
-
- def __init__(self, host, manager,
- periodic_interval=None,
- periodic_fuzzy_delay=None):
- self.host = host
- self.manager = manager
- self.periodic_interval = periodic_interval
- self.periodic_fuzzy_delay = periodic_fuzzy_delay
+ def __init__(self):
self.tg = threadgroup.ThreadGroup('service')
- self.periodic_args = []
- self.periodic_kwargs = {}
def start(self):
- if self.manager:
- self.manager.init_host()
-
- if self.periodic_interval and self.manager:
- if self.periodic_fuzzy_delay:
- initial_delay = random.randint(0, self.periodic_fuzzy_delay)
- else:
- initial_delay = 0
- self.tg.add_timer(self.periodic_interval,
- self.manager.run_periodic_tasks,
- initial_delay,
- *self.periodic_args,
- **self.periodic_kwargs)
+ pass
def stop(self):
self.tg.stop()