Skip to content
Snippets Groups Projects
ccnode.py 2.46 KiB
Newer Older
Thibault VINCENT's avatar
Thibault VINCENT committed
# -*- coding: utf-8 -*-
Benziane Chakib's avatar
Benziane Chakib committed
import logging
from threading import Timer, Lock
from time import sleep
Benziane Chakib's avatar
Benziane Chakib committed
from sjrpc.client import SimpleRpcClient
from sjrpc.utils import ConnectionProxy
from sjrpc.core import RpcError
Benziane Chakib's avatar
Benziane Chakib committed

class CCNode(object):
    '''
    Handle node initialization, connection to server, and authentication
Benziane Chakib's avatar
Benziane Chakib committed
    '''
Thibault VINCENT's avatar
Thibault VINCENT committed
    def __init__(self, server, port, hypervisor, exec_cmd, force_xen=False,
                                                                    cert=None):
Thibault VINCENT's avatar
Thibault VINCENT committed
        self._scheduler_timer = None
        self._scheduler_mutex = Lock()
Thibault VINCENT's avatar
Thibault VINCENT committed
        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)
Benziane Chakib's avatar
Benziane Chakib committed
    def run(self):
Thibault VINCENT's avatar
Thibault VINCENT committed
        self._manager.run()
Benziane Chakib's avatar
Benziane Chakib committed
    def authentify(self, login, password):
        logging.debug('Authenticating user %s' % login)
Benziane Chakib's avatar
Benziane Chakib committed
        try:
Thibault VINCENT's avatar
Thibault VINCENT committed
            role = self._server.authentify(login, password)
            self._scheduler_rearm()
Benziane Chakib's avatar
Benziane Chakib committed
        except RpcError as err:
            if err.exception == 'AuthenticationError':
                logging.warning('Authentication error')
            else:
                logging.warning('Unknown error while authenticating: %s' % err)
            return False
Thibault VINCENT's avatar
Thibault VINCENT committed
        except Exception as err:
            logging.debug('Unhandled exception: `%s`' % err)
Thibault VINCENT's avatar
Thibault VINCENT committed
            if role != 'hv':
                logging.warning('Bad role affected by server: %s' % role)
Thibault VINCENT's avatar
Thibault VINCENT committed
                raise Exception()
                # FIXME this will not cause a server restart, node stays dead
Thibault VINCENT's avatar
Thibault VINCENT committed
    
    def _scheduler_rearm(self):
Thibault VINCENT's avatar
Thibault VINCENT committed
        '''
        '''
        self._scheduler_timer = Timer(5, self._scheduler_run)
Thibault VINCENT's avatar
Thibault VINCENT committed
        self._scheduler_timer.start()
    
    def _scheduler_run(self):
        '''
        '''
        with self._scheduler_mutex:
            self._handler.scheduler_run()
            sleep(0.1)
            self._scheduler_rearm()
    
Thibault VINCENT's avatar
Thibault VINCENT committed
    def get_server(self):
        '''
        '''
        return self._server
    
Thibault VINCENT's avatar
Thibault VINCENT committed
        '''
        '''
        return self._manager
Thibault VINCENT's avatar
Thibault VINCENT committed
    def get_handler(self):
        '''
        '''
        return self._handler