diff --git a/ccnode/ccnode.py b/ccnode/ccnode.py index 51d4918ad6f08d8275a5856591397b5a65d9f5ee..7e37f9592429d1cb34e6d7ed1f5b64cfd3096397 100644 --- a/ccnode/ccnode.py +++ b/ccnode/ccnode.py @@ -46,3 +46,9 @@ class CCNode(object): return False else: return True + + def get_manager(self): + return self.manager + + def get_server(self): + return self.server \ No newline at end of file diff --git a/ccnode/handlers.py b/ccnode/handlers.py index b3a2d70a3c5bdd98c7f292a89a6d63d6235cb7a0..c079754cf7b143f91cd783bff19eff420372f023 100644 --- a/ccnode/handlers.py +++ b/ccnode/handlers.py @@ -7,6 +7,8 @@ from logging import debug, info from fnmatch import fnmatchcase from exceptions import FeatureNotImplemented from common import LocalHost +from threading import Timer +from sjrpc.core import RpcError _MOD_KVM = True try: @@ -115,6 +117,10 @@ class NodeHandler(RpcHandler): self.VM_TAG_GLOB = { 'disk*' : self._tag_map_helper(self._helper_vm_disk), } + + # populate the server with running VMs + self._register_vm = [] + self._register_timer = Timer(5.0, self._register) def __getitem__(self, name): ''' @@ -213,6 +219,38 @@ class NodeHandler(RpcHandler): result = None return result + def _register(self): + try: + vm_current = self._host_handle.vm_list() + + for vm in vm_current: + if vm not in self._register_vm: + try: + self._connection.get_server().call('register', vm, 'vm') + except RpcError as e: + if e.exception == '#FIXME': + self._register_vm.append(vm) + else: + raise e + else: + self._register_vm.append(vm) + + for vm in self._register_vm: + if vm not in vm_current: + try: + self._connection.get_server().call('unregister', vm) + except RpcError as e: + if e.exception == '#FIXME': + vm_current.pop(vm) + else: + raise e + else: + vm_current.pop(vm) + except Exception as e: + raise e + finally: + self._register_timer = Timer(1.0, self._register) + @pure def node_tags(self, tags=None): '''