Skip to content
Snippets Groups Projects
ccnode.py 3.32 KiB
Newer Older
Thibault VINCENT's avatar
Thibault VINCENT committed
# -*- coding: utf-8 -*-
Benziane Chakib's avatar
Benziane Chakib committed
import logging
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()
        self._is_hv = hypervisor # hugly
        self._is_xen = force_xen # hugly
        self._exec_cmd = exec_cmd # hugly
        self._handler = None
Thibault VINCENT's avatar
Thibault VINCENT committed
        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):
Benziane Chakib's avatar
Benziane Chakib committed
    def authentify(self, login, password):
        logging.debug('Authenticating user `%s` on connection `%i`' % (login,
                                                        id(self._server)))
Benziane Chakib's avatar
Benziane Chakib committed
        try:
Thibault VINCENT's avatar
Thibault VINCENT committed
            role = self._server.authentify(login, password)
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)
            if role == 'hv':
                self._handler = handlers.NodeHandler(self,
                                                     self._is_hv,
                                                     self._exec_cmd,
                                                     self._is_xen)
            elif role == 'host':
                self._handler = handlers.NodeHandler(self,
                                                     False,
                                                     self._exec_cmd,
                                                     self._is_xen)
            else:
                logging.warning('Bad role affected by server: %s' % role)
Thibault VINCENT's avatar
Thibault VINCENT committed
                raise Exception()
            
            self._manager.all_connections().pop().set_handler(self._handler)
            self._scheduler_rearm()
            return True
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:
            if not self._scheduler_stopped.is_set():
                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