def testReconnect(self):
        disconnectDeferred = defer.Deferred()
        reconnectDeferred = defer.Deferred()

        def connected(_):
            self.failUnless(a.planet is not None)
            self.assertEqual(len(self.vishnu.adminHeaven.avatars), 1)

            def _disconnected(_):
                disconnectDeferred.callback(None)

            def _connected(_):
                map(a.disconnect, ids)
                reconnectDeferred.callback(None)

            ids = []
            ids.append(a.connect('disconnected', _disconnected))
            ids.append(a.connect('connected', _connected))
            a.clientFactory.disconnect()
            return disconnectDeferred

        def disconnected(_):
            return reconnectDeferred

        def reconnected(_):
            # yay
            a.shutdown()

        a = admin.AdminModel()
        d = a.connectToManager(self.connectionInfo, writeConnection=False)
        d.addCallback(connected)
        d.addCallback(disconnected)
        d.addCallback(reconnected)
        return d
    def testConnectSuccess(self):
        def connected(_):
            self.failUnless(a.planet is not None)
            self.assertEqual(len(self.vishnu.adminHeaven.avatars), 1)
            a.shutdown()

        a = admin.AdminModel()
        d = a.connectToManager(self.connectionInfo, writeConnection=False)
        d.addCallback(connected)
        return d
Exemple #3
0
    def connect(self, options):
        # code from main.py in this directory

        def _connectedCb(model):
            self.model = model
            self.debug('Connected to manager.')
            planet = model.planet
            components = planet.get('atmosphere').get('components')
            for c in components:
                ctype = c.get('type')
                # check if this component is a bouncer
                if 'bouncer' in ctype:
                    if c.get('name') == self.options.bouncer:
                        self.check_bouncer(c, ctype)

        def _connectedEb(failure):
            reactor.stop()
            if failure.check(errors.ConnectionFailedError):
                return self.unknown('Unable to connect to manager.')
            if failure.check(errors.ConnectionRefusedError):
                return self.critical('Manager refused connection.')

        connection = connections.parsePBConnectionInfoRecent(
            options.manager, options.transport == 'ssl')

        # platform-3/trunk compatibility stuff
        try:
            # platform-3
            self.adminModel = admin.AdminModel(connection.authenticator)
            self.debug('code is platform-3')
            d = self.adminModel.connectToHost(connection.host, \
                connection.port, not connection.use_ssl)
        except TypeError:
            # trunk
            self.adminModel = admin.AdminModel()
            self.debug('code is trunk')
            d = self.adminModel.connectToManager(connection)
        except:
            self.debug('error connecting with manager')

        d.addCallback(_connectedCb)
        d.addErrback(_connectedEb)
Exemple #4
0
    def __init__(self):
        log.init()

        self.medium = admin.AdminModel()

        i = connection.PBConnectionInfo(
            "127.0.0.1", 7531, True,
            pb.Authenticator(username='******', password='******'))
        d = self.medium.connectToManager(i)
        d.addCallback(self.connected)
        d.addErrback(twistedlog.err)
Exemple #5
0
    def connect(self, options):
        connection = connections.parsePBConnectionInfoRecent(options.manager,
           use_ssl=options.transport == 'ssl')

        # platform-3/trunk compatibility stuff to guard against
        # gratuitous changes
        try:
            # platform-3
            self.medium = admin.AdminModel(connection.authenticator)
            self.debug("code is platform-3")
        except TypeError:
            # trunk
            self.medium = admin.AdminModel()
            self.debug("code is trunk")

        if hasattr(self.medium, 'connectToHost'):
            # platform-3
            d = self.medium.connectToHost(connection.host,
                connection.port, not connection.use_ssl)
        else:
            d = self.medium.connectToManager(connection)

        d.addCallback(self._connectedCb)
        d.addErrback(self._connectedEb)
Exemple #6
0
    def connectToManager(self, connection):
        """
        Connect to a manager.

        @type  connection: L{flumotion.common.connection.PBConnectionInfo}

        @rtype: L{defer.Deferred} firing L{flumotion.admin.admin.AdminModel}
        """
        from flumotion.twisted import pb as fpb
        if not connection.authenticator:
            connection.authenticator = fpb.Authenticator(
                username=connection.username,
                password=connection.password,
                address=connection.host)
        # platform-3/trunk compatibility stuff to guard against
        # gratuitous changes
        try:
            # platform-3
            adminMedium = admin.AdminModel(connection.authenticator)
            self.debug("code is platform-3")
        except TypeError:
            # trunk
            adminMedium = admin.AdminModel()
            self.debug("code is trunk")

        if hasattr(adminMedium, 'connectToHost'):
            # platform-3
            d = adminMedium.connectToHost(connection.host, connection.port,
                                          not connection.use_ssl)
        else:
            d = adminMedium.connectToManager(connection)

        d.addCallback(self._connectToManagerCb, adminMedium)
        d.addErrback(self._connectToManagerEb)

        return d
    def testConnectFailure(self):
        def connected(_):
            self.fail('should not have connected')

        def failure(f):
            # ok!
            a.shutdown()

        a = admin.AdminModel()
        # create a connectionInfo that will not succeed
        i = connection.PBConnectionInfo(
            self.connectionInfo.host, self.connectionInfo.port,
            self.connectionInfo.use_ssl,
            pb.Authenticator(username='******', password='******'))
        d = a.connectToManager(i, writeConnection=False)
        d.addCallbacks(connected, failure)
        return d
Exemple #8
0
class MultiAdminModel(log.Loggable):
    logCategory = 'multiadmin'

    def __init__(self):
        self.admins = watched.WatchedDict()  # {managerId: AdminModel}

        self._listeners = []
        self._reconnectHandlerIds = {}  # managerId => [disconnect, id..]
        self._startSet = startset.StartSet(self.admins.has_key,
                                           errors.AlreadyConnectingError,
                                           errors.AlreadyConnectedError)

    # Listener implementation

    def emit(self, signal_name, *args, **kwargs):
        self.debug('emit %r %r %r' % (signal_name, args, kwargs))
        assert signal_name != 'handler'
        for c in self._listeners:
            if getattr(c, 'model_handler', None):
                c.model_handler(c, signal_name, *args, **kwargs)
            elif getattr(c, 'model_%s' % signal_name):
                getattr(c, 'model_%s' % signal_name)(*args, **kwargs)
            else:
                s = 'No model_%s in %r and no model_handler' % (signal_name, c)
                raise NotImplementedError(s)

    def addListener(self, obj):
        assert not obj in self._listeners
        self._listeners.append(obj)

    def removeListener(self, obj):
        self._listeners.remove(obj)

    def _managerConnected(self, admin):
        if admin.managerId not in self._reconnectHandlerIds:
            # the first time a manager is connected to, start listening
            # for reconnections; intertwingled with removeManager()
            ids = []
            ids.append(admin.connect('connected', self._managerConnected))
            ids.append(admin.connect('disconnected',
                                     self._managerDisconnected))
            self._reconnectHandlerIds[admin.managerId] = admin, ids

        adminplanet = admin.planet
        self.info('Connected to manager %s (planet %s)', admin.managerId,
                  adminplanet.get('name'))
        assert admin.managerId not in self.admins
        self.admins[admin.managerId] = admin
        self.emit('addPlanet', admin, adminplanet)

    def _managerDisconnected(self, admin):
        if admin.managerId in self.admins:
            self.emit('removePlanet', admin, admin.planet)
            del self.admins[admin.managerId]
        else:
            self.warning('Could not find admin model %r', admin)

    def addManager(self,
                   connectionInfo,
                   tenacious=False,
                   writeConnection=True):
        i = connectionInfo
        managerId = str(i)

        # This dance of deferreds is here so as to make sure that
        # removeManager can cancel a pending connection.

        # can raise errors.AlreadyConnectingError or
        # errors.AlreadyConnectedError
        try:
            startD = self._startSet.createStart(managerId)
        except Exception, e:
            return defer.fail(e)

        a = admin.AdminModel()
        connectD = a.connectToManager(i,
                                      tenacious,
                                      writeConnection=writeConnection)
        assert a.managerId == managerId

        def connect_callback(_):
            self._startSet.avatarStarted(managerId)

        def connect_errback(failure):
            self._startSet.avatarStopped(managerId, lambda _: failure)

        connectD.addCallbacks(connect_callback, connect_errback)

        def start_callback(_):
            self._managerConnected(a)

        def start_errback(failure):
            a.shutdown()
            return failure

        startD.addCallbacks(start_callback, start_errback)

        return startD
 def testConstructor(self):
     model = admin.AdminModel()