updated the geniwrapper up calls to use PLC.Geni.GeniSync
authorTony Mack <tmack@cs.princeton.edu>
Wed, 15 Apr 2009 03:04:06 +0000 (03:04 +0000)
committerTony Mack <tmack@cs.princeton.edu>
Wed, 15 Apr 2009 03:04:06 +0000 (03:04 +0000)
PLC/Geni.py [new file with mode: 0644]
PLC/Methods/AddNode.py
PLC/Methods/AddPersonToSite.py
PLC/Methods/AddSite.py
PLC/Methods/AddSlice.py

diff --git a/PLC/Geni.py b/PLC/Geni.py
new file mode 100644 (file)
index 0000000..b5425cb
--- /dev/null
@@ -0,0 +1,96 @@
+from types import StringTypes
+import traceback
+
+class GeniSync:
+
+    def __init__(self):
+        try:
+            from geni import gimport
+            from geni.util.api import GeniAPI
+            from geni.util.debug import log
+            self.log = log
+            self.gimport = gimport
+            geniapi = GeniAPI()
+            self.plcapi = geniapi.plshell
+            self.auth = geniapi.plauth
+        except:
+            traceback.print_exc(file = self.log)
+             
+        if self.gimport.level1_auth:    
+            self.authority = self.gimport.level1_auth
+        else:
+            self.authority = self.gimport.root_auth 
+
+    def get_login_base(site_id):
+        sites = self.plcapi.GetSites(self.auth, [site_id], ['login_base'])
+        login_base = sites    
+
+    def do_update(self, object, type, login_bases = None):
+        try:
+            # determine this objects site and login_base
+            if not login_bases:
+                login_bases = []
+                site_ids = []
+                
+                # get the site_ids   
+                if object.has_key('site_id') and object['site_id']:
+                    site_ids.append(object['site_id'])
+                elif object.has_key('site_ids') and object['site_ids']:
+                    site_ids.extend(object['site_ids'])
+                else:
+                    raise Exception
+
+                # get the login bases
+                for site_id in site_ids:
+                    login_bases.append(self.get_login_base(site_id))
+                        
+            if isinstance(login_bases, StringTypes):
+                login_bases = [login_bases]
+
+            for login_base in login_bases:
+                login_base = self.gimport.cleanup_string(login_base)
+                parent_hrn = self.authority + "." + login_base
+                if type in ['person']:
+                    self.gimport.import_person(parent_hrn, object)
+                elif type in ['slice']:
+                    self.gimport.import_slice(parent_hrn, object)
+                elif type in ['node']:
+                    self.gimport.import_node(parent_hrn, object)
+                elif type in ['site']:
+                    self.gimport.import_site(self.authority, object)
+        except Exception, e:
+            id = None
+            keys = ['name', 'hostname', 'email', 'login_base']
+            for key in keys:
+                if object.has_key(key):
+                    id = object[key]
+            traceback.print_exc(file = self.log)
+            print >> self.log, "Error importing %s record for %s into geni db: %s" % \
+                  (type, id, e.message)
+
+    def do_delete(self, object, type, login_base = None):
+        pass     
+
+    def update_site(self, site, login_base = None):
+        self.do_update(site, 'site', login_base)
+
+    def update_node(self, node, login_base = None):
+        self.do_update(node, 'node', login_base)
+     
+    def update_slice(self, slice, login_base = None):
+        self.do_update(slice, 'slice', login_base)
+    
+    def update_person(self, person, login_base = None):
+        self.do_update(person, 'person', login_base) 
+
+    def delete_site(self, site):
+        self.do_delete(site, 'site', login_base)
+
+    def delete_node(self, node):
+        self.do_delete(node, 'node', login_base)
+       
+    def delete_slice(self, slice):
+        self.do_delete(slice, 'slice', login_base)
+
+    def delete_person(self, person):
+        self.do_delete(person, 'person', login_base)
index 89e4049..5cc5a88 100644 (file)
@@ -5,6 +5,7 @@ from PLC.Nodes import Node, Nodes
 from PLC.NodeGroups import NodeGroup, NodeGroups
 from PLC.Sites import Site, Sites
 from PLC.Auth import Auth
+from PLC.Geni import GeniSync
 
 can_update = lambda (field, value): field in \
              ['hostname', 'boot_state', 'model', 'version']
@@ -63,18 +64,8 @@ class AddNode(Method):
                               'Node': [node['node_id']]}       
         self.message = "Node %s created" % node['node_id']
 
-        try:
-            from geni import gimport
-            if gimport.level1_auth:
-                authority = gimport.level1_auth
-            else:
-                authority = gimport.root_auth
-            login_base = gimport.cleanup_string(site['login_base'])
-            parent_hrn = authority + "." + login_base
-            gimport.import_node(parent_hrn, node)
-        except ImportError, e:
-            print e.message
-        except Exception, e:
-            print "Error importing node record into geni db: %s" % e.message
+        # sync with the geni db
+        geni = GeniSync()
+        geni.do_update(node, 'node', site['login_base'])
 
         return node['node_id']
index 85a426e..9dfebad 100644 (file)
@@ -4,6 +4,7 @@ from PLC.Parameter import Parameter, Mixed
 from PLC.Persons import Person, Persons
 from PLC.Sites import Site, Sites
 from PLC.Auth import Auth
+from PLC.Geni import GeniSync
 
 class AddPersonToSite(Method):
     """
@@ -54,19 +55,9 @@ class AddPersonToSite(Method):
         self.message = 'Person %d added to site %d' % \
                        (person['person_id'], site['site_id'])
 
+
            # Sync with geni db
-        try:
-            from geni import gimport
-            if gimport.level1_auth:
-                authority = gimport.level1_auth
-            else:
-                authority = gimport.root_auth
-            login_base = gimport.cleanup_string(site['login_base'])
-            parent_hrn = authority + "." + login_base
-            gimport.import_person(parent_hrn, person)
-        except ImportError, e:
-            print e.message
-        except Exception, e:
-            print "Error importing person record into geni db: %s" % e.message
+        geni = GeniSync()
+        geni.do_update(person, 'person', site['login_base'])
 
         return 1
index a77b2f3..837598d 100644 (file)
@@ -3,6 +3,8 @@ from PLC.Method import Method
 from PLC.Parameter import Parameter, Mixed
 from PLC.Sites import Site, Sites
 from PLC.Auth import Auth
+from PLC.Geni import GeniSync
+from PLC.Debug import log
 
 can_update = lambda (field, value): field in \
              ['name', 'abbreviated_name', 'login_base',
@@ -39,16 +41,7 @@ class AddSite(Method):
         self.message = 'Site %d created' % site['site_id']
 
         # Sync with geni db
-        try:
-            from geni import gimport
-            if gimport.level1_auth:
-                authority = gimport.level1_auth
-            else:
-                authority = gimport.root_auth
-            gimport.import_site(authority, site)
-        except ImportError, e:
-            print e.message
-        except Exception, e:
-            print "Error importing site person record into geni db: %s" % e.message
+        geni = GeniSync()
+        geni.do_update(site, 'site', site['login_base'])
     
         return site['site_id']
index 58ffb12..ead41c4 100644 (file)
@@ -6,6 +6,7 @@ from PLC.Parameter import Parameter, Mixed
 from PLC.Slices import Slice, Slices
 from PLC.Auth import Auth
 from PLC.Sites import Site, Sites
+from PLC.Geni import GeniSync
 
 can_update = lambda (field, value): field in \
              ['name', 'instantiation', 'url', 'description', 'max_nodes']
@@ -77,18 +78,8 @@ class AddSlice(Method):
 
         self.event_objects = {'Slice': [slice['slice_id']]}
        
-        try:
-            from geni import gimport
-            if gimport.level1_auth:
-                authority = gimport.level1_auth
-            else:
-                authority = gimport.root_auth
-            login_base = gimport.cleanup_string(site['login_base'])
-            parent_hrn = authority + "." + login_base
-            gimport.import_slice(parent_hrn, slice)
-        except ImportError, e:
-            print e.message
-        except Exception, e:
-            print "Error importing slice record into geni db: %s" % e.message
+        # sync with geni db
+        geni = GeniSync()
+        geni.do_update(slice, 'slice', login_base)
 
         return slice['slice_id']