class Bridge(object): WELL_KNOWN_NAME = "busrpc.Bridge" def __init__(self, config): self.registration_lock = threading.RLock() self.services = {} self.services_by_host = {} self.logger = Logger() def register_service(self, hostname, server, service): try: try: self.registration_lock.acquire() if not self.services.has_key(service): self.services[service] = [] self.services[service].append((hostname, server)) if not self.services_by_host.has_key(hostname): self.services_by_host[hostname] = [] self.services_by_host[hostname].append((server, service)) finally: self.registration_lock.release() except Exception, e: self.logger.log_exc() return False else:
class QpidTransport(Transport): def __init__(self, host='localhost', port=5672, user='******', password='******', vhost='development'): self.logger = Logger() self.nethostname = socket.gethostname() self.host = host self.port = port self.user = user self.password = password self.vhost = vhost self.credentials = {"LOGIN":user, "PASSWORD":password} self.channels = {} self.client = qpid.client.Client(host, port, qpid.spec.load("file:///usr/share/amqp/amqp.0-9.xml", "file:///usr/share/amqp/amqp-errata.0-9.xml"), vhost=vhost) self.exchange_name = "busrpc" self.connected = False self.queue_name = None self.incoming_queue = None def clone(self): retval = QpidTransport(self.host, self.port, self.user, self.password, self.vhost) retval.connect() return retval def connect(self): if self.connected: return tries = 10 wait_time = 0.25 while self.connected == False: try: self.client.start(self.credentials) self.queue_name = self.declare_queue() qpid_util.declare_exchange(self, exchange_name=self.exchange_name, create=True, exchange_type="topic", auto_remove=False) qpid_util.bind_queue(self, queue_name=self.queue_name, exchange_name=self.exchange_name, routing_key_name=self.queue_name) self.incoming_queue = qpid_util.register_consumer(self, queue_name=self.queue_name, ack=True) self.connected = True except qpid.peer.Closed, e: tries = tries - 1 if tries == 0: raise e else: self.logger.info("connect: Trying again...") time.sleep(wait_time) wait_time = wait_time + 0.25 self.client = qpid.client.Client(self.host, self.port, qpid.spec.load("file:///usr/share/amqp/amqp.0-9.xml", "file:///usr/share/amqp/amqp-errata.0-9.xml"), vhost=self.vhost)
class RPCDispatcher(object): def __init__(self, config, register_with_bridge = True, server_host = None, is_bridge_server=None): self.logger = Logger() if is_bridge_server == None: self.is_bridge_server=not register_with_bridge else: self.is_bridge_server = is_bridge_server self.instances = {} self.hostname = socket.gethostname() if (server_host == None): self.server_host = config.server_host else: self.server_host = server_host self.name = config.server_name certdir = config.get_value('busrpc.crypto.certdir') pwd = config.get_value('busrpc.crypto.password') if not self.is_bridge_server: self.transport = busrpc.qpid_transport.QpidServerTransport(self.hostname + "!" + self.name, host=self.server_host) else: self.transport = busrpc.qpid_transport.QpidServerTransport(self.name, host=self.server_host) self.transport.callback = self.dispatch self.register_with_bridge = register_with_bridge self.runner_thread = None self.instance_method_cache = {} self.cert_mgr = CertManager(certdir, self.hostname) self.client_transport = self.transport.clone() if register_with_bridge: self.bridge = busrpc.rpc.lookup_service('bridge', self.client_transport, cert_mgr=self.cert_mgr) else: self.bridge = None for name in config.instances.iterkeys(): instance = config.instances[name] self.add_instance(name, _create_instance(config, instance)) def start(self): self.transport.start() while not self.transport.is_stopped: time.sleep(1) def stop(self): self.unregister_all() self.transport.stop() def register(self, namespace): if self.register_with_bridge: try: self.bridge.register_service(self.hostname, self.name, namespace) return True except Exception, e: self.logger.log_exc() return False else:
def __init__(self, config, register_with_bridge = True, server_host = None, is_bridge_server=None): self.logger = Logger() if is_bridge_server == None: self.is_bridge_server=not register_with_bridge else: self.is_bridge_server = is_bridge_server self.instances = {} self.hostname = socket.gethostname() if (server_host == None): self.server_host = config.server_host else: self.server_host = server_host self.name = config.server_name certdir = config.get_value('busrpc.crypto.certdir') pwd = config.get_value('busrpc.crypto.password') if not self.is_bridge_server: self.transport = busrpc.qpid_transport.QpidServerTransport(self.hostname + "!" + self.name, host=self.server_host) else: self.transport = busrpc.qpid_transport.QpidServerTransport(self.name, host=self.server_host) self.transport.callback = self.dispatch self.register_with_bridge = register_with_bridge self.runner_thread = None self.instance_method_cache = {} self.cert_mgr = CertManager(certdir, self.hostname) self.client_transport = self.transport.clone() if register_with_bridge: self.bridge = busrpc.rpc.lookup_service('bridge', self.client_transport, cert_mgr=self.cert_mgr) else: self.bridge = None for name in config.instances.iterkeys(): instance = config.instances[name] self.add_instance(name, _create_instance(config, instance))
def __init__(self, host='localhost', port=5672, user='******', password='******', vhost='development'): self.logger = Logger() self.nethostname = socket.gethostname() self.host = host self.port = port self.user = user self.password = password self.vhost = vhost self.credentials = {"LOGIN":user, "PASSWORD":password} self.channels = {} self.client = qpid.client.Client(host, port, qpid.spec.load("file:///usr/share/amqp/amqp.0-9.xml", "file:///usr/share/amqp/amqp-errata.0-9.xml"), vhost=vhost) self.exchange_name = "busrpc" self.connected = False self.queue_name = None self.incoming_queue = None
def __init__(self, config): self.registration_lock = threading.RLock() self.services = {} self.services_by_host = {} self.logger = Logger()