From 23faa7f8009bf509b16990468761daaf74f02575 Mon Sep 17 00:00:00 2001
From: Thibault VINCENT <thibault.vincent@smartjog.com>
Date: Tue, 25 Jan 2011 11:10:40 +0100
Subject: [PATCH] simple implementation of register/unregister server feature

every second, check that libvirt VM list is coherent with the list of host registered with the server
---
 ccnode/ccnode.py   |  6 ++++++
 ccnode/handlers.py | 38 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 44 insertions(+)

diff --git a/ccnode/ccnode.py b/ccnode/ccnode.py
index 51d4918..7e37f95 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 b3a2d70..c079754 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):
         '''
-- 
GitLab