refactored
authorTony Mack <tmack@paris.CS.Princeton.EDU>
Fri, 21 Sep 2012 19:56:45 +0000 (15:56 -0400)
committerTony Mack <tmack@paris.CS.Princeton.EDU>
Fri, 21 Sep 2012 19:56:45 +0000 (15:56 -0400)
PLC/Methods/AddRole.py
PLC/Methods/AddSite.py
PLC/Methods/GetPersons.py
PLC/Methods/GetSites.py
PLC/NovaObject.py [deleted file]
PLC/NovaTable.py
PLC/Roles.py
PLC/Sites.py

index d8b6527..f9ea746 100644 (file)
@@ -22,5 +22,7 @@ class AddRole(Method):
 
 
     def call(self, auth, name):
-        self.api.client_shell.keystone.roles.create(name=name) 
+        role = Roles(self.api, {'name': name})
+        role.sync(insert=True)
+        #self.api.client_shell.keystone.roles.create(name=name) 
         return 1
index e5cfeba..4cf2544 100644 (file)
@@ -29,5 +29,6 @@ class AddSite(Method):
 
     def call(self, auth, site_fields):
         site_fields = dict(filter(can_update, site_fields.items()))
-        tenant = self.api.client_shell.keystone.tenants.create(**site_fields)
-        return tenant.id
+        site = Site(self.api, site_fields)
+        site.sync() 
+        return site.id
index 06da9f5..cb64845 100644 (file)
@@ -21,7 +21,7 @@ class GetPersons(Method):
     sites. Admins and nodes may retrieve details about all accounts.
     """
 
-    roles = ['admin', 'pi', 'user', 'tech', 'node']
+    roles = ['admin', 'pi', 'user', 'tech']
 
     accepts = [
         Auth(),
index 7095fde..a6bfff7 100644 (file)
@@ -26,5 +26,5 @@ class GetSites(Method):
     returns = [Site.fields]
 
     def call(self, auth, site_filter = None, return_fields = None):
-        sites = Sites(self.api, site_filter, return_fields)
+        sites = Sites(self.api, site_filter)
         return sites.dicts()
diff --git a/PLC/NovaObject.py b/PLC/NovaObject.py
deleted file mode 100644 (file)
index d4a067d..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-from PLC.Logger import logger
-
-class NovaObject:
-
-    @staticmethod
-    def object_to_dict(object, fields):
-        d = {}
-        for field in fields:
-            if hasattr(object, field):
-                d[field] = getattr(object, field)
-        return d   
-
-
-class NovaObjects(list):
-    fields = {}
-
-    def dicts(self):
-        result = []
-        for obj in self:
-            logger.info(str(obj))
-            result.append(NovaObject.object_to_dict(obj, self.fields))
-        return result      
index d4a067d..1033512 100644 (file)
@@ -1,22 +1,45 @@
 from PLC.Logger import logger
 
-class NovaObject:
+class NovaObject(dict):
+    
+    def __init__(self, api, fields = {}, object=None):
+        dict.__init__(self, fields) 
+        self.api = api
+        self.object = object 
+        if object:
+            self.update_fields()
 
-    @staticmethod
-    def object_to_dict(object, fields):
+    def update_fields(self):
+        for field in self.fields:
+            if hasattr(self.object, field):
+                self[field] = getattr(self.object, field)
+
+    def todict(self):
         d = {}
-        for field in fields:
-            if hasattr(object, field):
-                d[field] = getattr(object, field)
-        return d   
+        for field in self.fields:
+            if self.object and hasattr(self.object, field):
+                d[field] = getattr(self.object, field)
+        return d
+
+    def validate(self):
+        # Validate values before committing
+        for key, value in self.iteritems():
+            if value is not None and hasattr(self, 'validate_' + key):
+                validate = getattr(self, 'validate_' + key)
+                self[key] = validate(value) 
+
+    def sync(self, insert=False, validate=True):
+        # Validate all specified fields
+        if validate: self.validate()
 
+    def __getattr__(self, name):
+        return getattr(self.object, name)
 
-class NovaObjects(list):
-    fields = {}
+class NovaTable(list):
 
     def dicts(self):
         result = []
         for obj in self:
-            logger.info(str(obj))
-            result.append(NovaObject.object_to_dict(obj, self.fields))
+            result.append(obj.todict())
         return result      
index 92cad65..65ab289 100644 (file)
@@ -1,9 +1,9 @@
 from types import StringTypes
 from PLC.Faults import *
 from PLC.Parameter import Parameter
-from PLC.NovaObject import NovaObject, NovaObjects
+from PLC.NovaTable import NovaObject, NovaTable
 
-class Role:
+class Role(NovaObject):
     """
     Representation of a row in the roles table. To use,
     instantiate with a dict of values.
@@ -14,9 +14,13 @@ class Role:
         'name': Parameter(str, "Role", max = 100),
         }
 
-class Roles(NovaObjects):
-    fields = Role.fields
+    def sync(self, insert=False, validate=True):
+        NovaObject.sync(self, insert, validate) 
+        if insert == True or id not in self:
+            self.object = self.api.client_shell.keystone.roles.create(**self)
+          
 
+class Roles(NovaTable):
     def __init__(self, api, role_filter={}):
         self.api  = api
         if not role_filter:
@@ -25,10 +29,14 @@ class Roles(NovaObjects):
             roles = [self.api.client_shell.keystone.roles.find(id=role_filter)] 
         elif isinstance(role_filter, (list, tuple, set)):
             roles = self.api.client_shell.keystone.roles.findall()
-            roles = [role for role in roles if role.id in rile_filter]
+            roles = [role for role in roles if role.id in role_filter]
         else:
             raise PLCInvalidArgument, "Wrong role filter %r"%role_filter
 
             #self.append(NovaObject.object_to_dict(role, Role.fields)) 
-        self.extend(roles) 
+        for role in roles:
+            role = Role(self.api, object=role)
+            self.append(role)
+
+    
 
index b0c3e01..b252a71 100644 (file)
@@ -3,11 +3,11 @@ import string
 
 from PLC.Faults import *
 from PLC.Parameter import Parameter, Mixed
-from PLC.NovaObject import NovaObject, NovaObjects
+from PLC.NovaTable import NovaObject, NovaTable
 from PLC.Slices import Slice, Slices
 #from PLC.Persons import Person, Persons
 
-class Site:
+class Site(NovaObject):
     """
     Representation of a row in the sites table. To use, optionally
     instantiate with a dict of values. Update as you would a
@@ -27,7 +27,12 @@ class Site:
         'node_ids': Parameter([int], "List of site node identifiers"),
         }
 
-class Sites(NovaObjects):
+    def sync(self, insert=False, validate=True):
+        NovaObject.sync(self, insert, validate)
+        if insert == True or id not in self:
+            self.object = self.api.client_shell.keystone.tenants.create(**self)
+
+class Sites(NovaTable):
     """
     Representation of row(s) from the sites table in the
     database.
@@ -35,7 +40,6 @@ class Sites(NovaObjects):
 
     def __init__(self, api, site_filter = None, columns = None):
         self.api = api 
-        self.fields = Site.fields
         if not site_filter:
             sites = self.api.client_shell.keystone.tenants.findall()
         elif isinstance(site_filter, StringTypes):
@@ -47,4 +51,7 @@ class Sites(NovaObjects):
             sites = [site for site in sites if site.id in site_filter]
         else:
             raise PLCInvalidArgument, "Wrong site filter %s" % site_filter         
-        self.extend(sites)
+
+        for site in sites:
+            site = Site(self.api, object = site)
+            self.append(site)