From: Tony Mack Date: Fri, 21 Sep 2012 19:56:45 +0000 (-0400) Subject: refactored X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=0d1fa8e189d7c1fff9421029474f34463fd09c70;p=plcapi.git refactored --- diff --git a/PLC/Methods/AddRole.py b/PLC/Methods/AddRole.py index d8b65275..f9ea7466 100644 --- a/PLC/Methods/AddRole.py +++ b/PLC/Methods/AddRole.py @@ -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 diff --git a/PLC/Methods/AddSite.py b/PLC/Methods/AddSite.py index e5cfeba4..4cf25441 100644 --- a/PLC/Methods/AddSite.py +++ b/PLC/Methods/AddSite.py @@ -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 diff --git a/PLC/Methods/GetPersons.py b/PLC/Methods/GetPersons.py index 06da9f5b..cb64845c 100644 --- a/PLC/Methods/GetPersons.py +++ b/PLC/Methods/GetPersons.py @@ -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(), diff --git a/PLC/Methods/GetSites.py b/PLC/Methods/GetSites.py index 7095fde2..a6bfff7e 100644 --- a/PLC/Methods/GetSites.py +++ b/PLC/Methods/GetSites.py @@ -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 index d4a067d7..00000000 --- a/PLC/NovaObject.py +++ /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 diff --git a/PLC/NovaTable.py b/PLC/NovaTable.py index d4a067d7..1033512b 100644 --- a/PLC/NovaTable.py +++ b/PLC/NovaTable.py @@ -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 diff --git a/PLC/Roles.py b/PLC/Roles.py index 92cad656..65ab289c 100644 --- a/PLC/Roles.py +++ b/PLC/Roles.py @@ -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) + + diff --git a/PLC/Sites.py b/PLC/Sites.py index b0c3e015..b252a719 100644 --- a/PLC/Sites.py +++ b/PLC/Sites.py @@ -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)