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
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
sites. Admins and nodes may retrieve details about all accounts.
"""
- roles = ['admin', 'pi', 'user', 'tech', 'node']
+ roles = ['admin', 'pi', 'user', 'tech']
accepts = [
Auth(),
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()
+++ /dev/null
-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
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
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.
'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:
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)
+
+
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
'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.
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):
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)