X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FMethods%2FUpdateSite.py;h=86ae121ad9cde49dd1d5a0452916550b4c03ee99;hb=19d4a01ccf66af9e00914351b3eacd5fc880f988;hp=e734f6098fd9aca656ccbdbc45382f66ff1f60e4;hpb=ed7fa1ebf97ec2f88f18f8fa538e46c6ae9525c4;p=plcapi.git diff --git a/PLC/Methods/UpdateSite.py b/PLC/Methods/UpdateSite.py index e734f60..86ae121 100644 --- a/PLC/Methods/UpdateSite.py +++ b/PLC/Methods/UpdateSite.py @@ -2,37 +2,37 @@ from PLC.Faults import * from PLC.Method import Method from PLC.Parameter import Parameter, Mixed from PLC.Sites import Site, Sites -from PLC.Auth import PasswordAuth +from PLC.Auth import Auth +from PLC.TagTypes import TagTypes +from PLC.SiteTags import SiteTags +from PLC.Methods.AddSiteTag import AddSiteTag +from PLC.Methods.UpdateSiteTag import UpdateSiteTag + +related_fields = Site.related_fields.keys() can_update = lambda (field, value): field in \ - ['name', 'abbreviated_name', + ['name', 'abbreviated_name', 'login_base', 'is_public', 'latitude', 'longitude', 'url', - 'max_slices', 'max_slivers'] + 'max_slices', 'max_slivers', 'enabled', 'ext_consortium_id'] + \ + related_fields class UpdateSite(Method): """ Updates a site. Only the fields specified in update_fields are updated, all other fields are left untouched. - To remove a value without setting a new one in its place (for - example, to remove an address from the node), specify -1 for int - and double fields and 'null' for string fields. hostname and - boot_state cannot be unset. - - PIs can only update sites they are a member of. Only admins can - update max_slices. + PIs can only update sites they are a member of. Only admins can + update max_slices, max_slivers, and login_base. Returns 1 if successful, faults otherwise. """ roles = ['admin', 'pi'] - site_fields = dict(filter(can_update, Site.fields.items())) - for field in site_fields.values(): - field.optional = True + site_fields = dict(filter(can_update, Site.fields.items() + Site.related_fields.items())) accepts = [ - PasswordAuth(), + Auth(), Mixed(Site.fields['site_id'], Site.fields['login_base']), site_fields @@ -47,8 +47,10 @@ class UpdateSite(Method): sites = Sites(self.api, [site_id_or_login_base]) if not sites: raise PLCInvalidArgument, "No such site" + site = sites[0] - site = sites.values()[0] + if site['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local site" # Authenticated function assert self.caller is not None @@ -59,10 +61,39 @@ class UpdateSite(Method): if site['site_id'] not in self.caller['site_ids']: raise PLCPermissionDenied, "Not allowed to modify specified site" - if 'max_slices' or 'max_slivers' in site_fields: - raise PLCInvalidArgument, "Only admins can update max_slices and max_slivers" + # Remove admin only fields + for key in 'max_slices', 'max_slivers', 'login_base': + if key in site_fields: + del site_fields[key] + + # Make requested associations + for field in related_fields: + if field in site_fields: + site.associate(auth, field, site_fields[field]) + site_fields.pop(field) site.update(site_fields) - site.sync() - - return 1 + site.update_last_updated(False) + site.sync() + + # Logging variables + self.event_objects = {'Site': [site['site_id']]} + self.message = 'Site %d updated: %s' % \ + (site['site_id'], ", ".join(site_fields.keys())) + + # Update Site HRN if login_base changed + if 'login_base' in site_fields: + root_auth = self.api.config.PLC_HRN_ROOT + tagname = 'hrn' + tagvalue = '.'.join([root_auth, site['login_base']]) + # check if the tagtype instance exists + tag_types = TagTypes(self.api,{'tagname':tagname}) + if tag_types: + site_tags=SiteTags(self.api,{'tagname':tagname,'site_id':site['site_id']}) + if not site_tags: + AddSiteTag(self.api).__call__(auth,int(site['site_id']),tagname,tagvalue) + else: + UpdateSiteTag(self.api).__call__(auth,site_tags[0]['site_tag_id'],tagvalue) + + + return 1