1 from sfa.util.faults import *
2 from sfa.util.method import Method
3 from sfa.util.parameter import Parameter, Mixed
4 from sfa.trust.auth import Auth
5 from sfa.util.record import GeniRecord
6 from sfa.util.genitable import GeniTable
7 from sfa.util.debug import log
8 from sfa.trust.credential import Credential
9 from sfa.util.misc import *
10 from types import StringTypes
12 class remove_peer_object(Method):
14 Remove an peer object from the PLC records of a local aggregate.
15 This method will be called by registry.remove() while removing
16 a record from the local aggreage's PLCDB and sfa table. This
17 method need not be directly called by end-user.
19 @param cred credential string
20 @param record record as stored in the local registry
22 @return 1 if successful, faults otherwise
25 interfaces = ['registry']
28 Parameter(str, "Credential string"),
29 Parameter(dict, "Record dictionary"),
30 Mixed(Parameter(str, "Request hash"),
31 Parameter(None, "Request hash not specified"))
34 returns = Parameter(int, "1 if successful")
36 def call(self, cred, record, request_hash=None, caller_cred=None):
40 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(), record['hrn'], self.name))
41 self.api.auth.authenticateCred(cred, [cred], request_hash)
42 self.api.auth.check(cred, "remove")
44 # Only allow the local interface or record owner to delete peer_records
45 try: self.api.auth.verify_object_permission(record['hrn'])
46 except: self.api.auth.verify_cred_is_me(cred)
49 hrn, type = record['hrn'], record['type']
50 records = table.find({'hrn': hrn, 'type': type })
51 for record in records:
52 if record['peer_authority']:
53 self.remove_plc_record(record)
58 def remove_plc_record(self, record):
61 persons = self.api.plshell.GetPersons(self.api.plauth, {'person_id' : record['pointer']})
66 peer = self.get_peer_name(person['peer_id'])
67 self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'person', person['person_id'], peer)
68 self.api.plshell.DeletePerson(self.api.plauth, person['person_id'])
71 slices=self.api.plshell.GetSlices(self.api.plauth, {'slice_id' : record['pointer']})
76 peer = self.get_peer_name(slice['peer_id'])
77 self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'slice', slice['slice_id'], peer)
78 self.api.plshell.DeleteSlice(self.api.plauth, slice['slice_id'])
79 elif type == "authority":
80 sites=self.api.plshell.GetSites(self.api.plauth, {'site_id' : record['pointer']})
85 peer = self.get_peer_name(site['peer_id'])
86 self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'site', site['site_id'], peer)
87 self.api.plshell.DeleteSite(self.api.plauth, site['site_id'])
90 raise UnknownGeniType(type)
94 def get_peer_name(self, peer_id):
95 peers = self.api.plshell.GetPeers(self.api.plauth, [peer_id], ['peername', 'shortname', 'hrn_root'])
97 raise GeniInvalidArgument, "No such peer"
99 return peer['shortname']