Ejemplo n.º 1
0
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:
Ejemplo n.º 2
0
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)                    
Ejemplo n.º 3
0
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:
Ejemplo n.º 4
0
 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))
Ejemplo n.º 5
0
 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
Ejemplo n.º 6
0
 def __init__(self, config):
     self.registration_lock = threading.RLock()
     self.services = {}
     self.services_by_host = {}
     self.logger = Logger()