X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fmethods%2Fremove.py;h=384b1cfb07867699e6bae41e5acfe26ad642ec15;hb=11d02cbfd5e91784119bb9377fceb4fa6adae621;hp=32f1f186d23a4865816b13caa04b8e70618fcd17;hpb=c62bdd73cb70da27fb8fb1333f4cb1c2ce7e6e4c;p=sfa.git diff --git a/sfa/methods/remove.py b/sfa/methods/remove.py index 32f1f186..384b1cfb 100644 --- a/sfa/methods/remove.py +++ b/sfa/methods/remove.py @@ -2,14 +2,11 @@ ### $URL$ from sfa.util.faults import * +from sfa.util.namespace import * from sfa.util.method import Method from sfa.util.parameter import Parameter, Mixed -from sfa.trust.auth import Auth -from sfa.util.record import GeniRecord -from sfa.util.genitable import GeniTable from sfa.util.debug import log from sfa.trust.credential import Credential -from sfa.server.registry import Registries class remove(Method): """ @@ -18,7 +15,7 @@ class remove(Method): @param cred credential string @param type record type - @param hrn human readable name of record to remove + @param xrn human readable name of record to remove (hrn or urn) @return 1 if successful, faults otherwise """ @@ -28,58 +25,34 @@ class remove(Method): accepts = [ Parameter(str, "Credential string"), Parameter(str, "Record type"), - Parameter(str, "Human readable name (hrn) of record to be removed") + Parameter(str, "Human readable name of slice to instantiate (hrn or urn)"), + Mixed(Parameter(str, "Human readable name of the original caller"), + Parameter(None, "Origin hrn not specified")) ] returns = Parameter(int, "1 if successful") - def call(self, cred, type, hrn, caller_cred=None): - if caller_cred==None: - caller_cred=cred + def call(self, cred, type, xrn, origin_hrn=None): + user_cred = Credential(string=cred) + + # convert xrn to hrn + if type: + hrn = urn_to_hrn(xrn)[0] + else: + hrn, type = urn_to_hrn(xrn) + #log the call - self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, Credential(string=caller_cred).get_gid_caller().get_hrn(), hrn, self.name)) + if not origin_hrn: + origin_hrn = user_cred.get_gid_caller().get_hrn() + self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, origin_hrn, hrn, self.name)) + # validate the cred self.api.auth.check(cred, "remove") self.api.auth.verify_object_permission(hrn) - table = GeniTable() - filter = {'hrn': hrn} - if type not in ['all', '*']: - filter['type'] = type - records = table.find(filter) - if not records: - raise RecordNotFound(hrn) - record = records[0] - type = record['type'] - - credential = self.api.getCredential() - registries = Registries(self.api) - - # Try to remove the object from the PLCDB of federated agg. - # This is attempted before removing the object from the local agg's PLCDB and sfa table - if hrn.startswith(self.api.hrn) and type in ['user', 'slice', 'authority']: - for registry in registries: - if registry not in [self.api.hrn]: - result=registries[registry].remove_peer_object(credential, record) - if type == "user": - persons = self.api.plshell.GetPersons(self.api.plauth, record['pointer']) - # only delete this person if he has site ids. if he doesnt, it probably means - # he was just removed from a site, not actually deleted - if persons and persons[0]['site_ids']: - self.api.plshell.DeletePerson(self.api.plauth, record['pointer']) - elif type == "slice": - if self.api.plshell.GetSlices(self.api.plauth, record['pointer']): - self.api.plshell.DeleteSlice(self.api.plauth, record['pointer']) - elif type == "node": - if self.api.plshell.GetNodes(self.api.plauth, record['pointer']): - self.api.plshell.DeleteNode(self.api.plauth, record['pointer']) - elif type == "authority": - if self.api.plshell.GetSites(self.api.plauth, record['pointer']): - self.api.plshell.DeleteSite(self.api.plauth, record['pointer']) - else: - raise UnknownGeniType(type) - - table.remove(record) - - # forward the call after replacing the root hrn - - return 1 + + # send the call to the right manager + manager_base = 'sfa.managers' + mgr_type = self.api.config.SFA_REGISTRY_TYPE + manager_module = manager_base + ".registry_manager_%s" % mgr_type + manager = __import__(manager_module, fromlist=[manager_base]) + return manager.remove(self.api, xrn, type, origin_hrn)