Commit 71bd770a authored by Thibault VINCENT's avatar Thibault VINCENT
Browse files

wonderful fixes

 - server reconnection
 - vm registering
 - real TTL
 - less contention
 - super cool fixes
 - blah blah ...
parent 95ba3de2
Loading
Loading
Loading
Loading
+9 −8
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ DEFAULT_CONFIGURATION = {
    'detect_hypervisor': 'yes',
    #'ssl_cert': '',
    'command_execution' : 'yes',
    'force_xen' : 'no',
}

MAX_AUTH_TIMEOUT = 10
@@ -84,7 +85,7 @@ def run_node(options):
    def authentication(node):
        timeout = 1
        while node:
            if node.manager.is_running():
            if node.get_manager().is_running():
                logging.debug('Sending authentication request')
                result = node.authentify(options['login'], options['password'])
                if result:
@@ -92,9 +93,8 @@ def run_node(options):
                    return
                else:
                    timeout += 0.1
                    maxtimeout = MAX_AUTH_TIMEOUT
                    if timeout == maxtimeout:
                        timeout = maxtimeout
                    if timeout >= MAX_AUTH_TIMEOUT:
                        timeout = MAX_AUTH_TIMEOUT
                    sleep(exp(timeout))
    
    # start node
@@ -105,22 +105,23 @@ def run_node(options):
        try:
            node = CCNode(options['address'], int(options['port']),
                          options['detect_hypervisor'] == 'yes',
                          options['command_execution'] == 'yes')
                          options['command_execution'] == 'yes',
                          force_xen=(options['force_xen'] == 'yes'))
        except Exception as err:
            logging.critical('Client initialization failure: `%s`' % err)
            logging.critical('Client initialization failure: `%s`:`%s`'
                                                            % (repr(err), err))
            raise err
        
        # start main loop and auth thread
        logging.debug('Starting authentication thread')
        auth_thread = threading.Thread(target=authentication, args=(node,),
                                                                    name="Auth")
                                                                    name='Auth')
        auth_thread.start()
        logging.debug('Starting node main loop')
        node.run()
    
    except Exception as err:
        if auth_thread:
            auth_thread.cancel()
            del auth_thread
            auth_thread = None
        if node:
+1 −1
Original line number Diff line number Diff line
@@ -7,4 +7,4 @@ TODO : rewrite based on older doc

"""

__version__ = '9~dev'
__version__ = '9'
+38 −13
Original line number Diff line number Diff line
@@ -8,24 +8,27 @@ from sjrpc.client import SimpleRpcClient
from sjrpc.utils import ConnectionProxy
from sjrpc.core import RpcError
import handlers

from threading import Timer

class CCNode(object):
    '''
    Handle node initialization, connection to server, and authentication
    '''
    def __init__(self, server, port, hypervisor, exec_cmd, cert=None):
    def __init__(self, server, port, hypervisor, exec_cmd, force_xen=False,
                                                                    cert=None):
        '''
        '''
        self.manager = SimpleRpcClient.from_addr(server, port, enable_ssl=True,
                default_handler=handlers.NodeHandler(self, hypervisor,
                                                                    exec_cmd))
        self.server = ConnectionProxy(self.manager)
        self._scheduler_timer = None
        self._handler = handlers.NodeHandler(self, hypervisor, exec_cmd,
                                                                    force_xen)
        self._manager = SimpleRpcClient.from_addr(server, port, enable_ssl=True,
                                                default_handler=self._handler)
        self._server = ConnectionProxy(self._manager)
    
    def run(self):
        '''
        '''
        self.manager.run()
        self._manager.run()
    
    def authentify(self, login, password):
        '''
@@ -33,22 +36,44 @@ class CCNode(object):
        logging.debug('Authenticating user %s with password <%s>' % (login,
                      password))
        try:
            role = self.server.authentify(login, password)
            role = self._server.authentify(login, password)
            self._scheduler_run()
        except RpcError as err:
            if err.exception == 'AuthenticationError':
                logging.warning('Authentication error')
            else:
                logging.warning('Unknown error while authenticating: %s' % err)
            return False
        except Exception as err:
            logging.debug('Unhandled exception: `%s`' % err)
        else:
            if role != 'hypervisor':
            if role != 'hv':
                logging.warning('Bad role affected by server: %s' % role)
                return False
                raise Exception()
                # FIXME this will not cause a server restart, node stays dead
            else:
                return True
    
    def get_manager(self):
        return self.manager
    def _scheduler_run(self):
        '''
        '''
        self._handler.scheduler_run()
        # reset timer
        del self._scheduler_timer
        self._scheduler_timer = Timer(1, self._scheduler_run)
        self._scheduler_timer.start()

    def get_server(self):
        return self.server
 No newline at end of file
        '''
        '''
        return self._server
    
    def get_manager(self):
        '''
        '''
        return self._manager
    
    def get_handler(self):
        '''
        '''
        return self._handler
 No newline at end of file
+3 −0
Original line number Diff line number Diff line
@@ -30,6 +30,9 @@ class LocalHost(Host):
        'x86_64' : 'x64',
    }
    
    def scheduler_run(self):
        pass
    
    def get_hw_serial(self):
        '''
        '''
+311 −257

File changed.

Preview size limit exceeded, changes collapsed.

Loading