1 from sfa.util.faults import UnknownSfaType, SfaInvalidArgument
2 from sfa.util.method import Method
3 from sfa.util.parameter import Parameter, Mixed
4 from sfa.util.table import SfaTable
5 from sfa.trust.credential import Credential
7 class remove_peer_object(Method):
9 Remove a peer object from the PLC records of a local aggregate.
10 This method will be called by registry.remove() while removing
11 a record from the local aggreage's PLCDB and sfa table. This
12 method need not be directly called by end-user.
14 @param cred credential string
15 @param record record as stored in the local registry
17 @return 1 if successful, faults otherwise
20 interfaces = ['registry']
23 Parameter(str, "Credential string"),
24 Parameter(dict, "Record dictionary"),
25 Mixed(Parameter(str, "Human readable name of the original caller"),
26 Parameter(None, "Origin hrn not specified"))
29 returns = Parameter(int, "1 if successful")
31 def call(self, cred, record, origin_hrn=None):
32 user_cred = Credential(string=cred)
36 origin_hrn = user_cred.get_gid_caller().get_hrn()
37 self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, origin_hrn, record['hrn'], self.name))
39 self.api.auth.check(cred, "remove")
41 # Only allow the local interface or record owner to delete peer_records
42 try: self.api.auth.verify_object_permission(record['hrn'])
43 except: self.api.auth.verify_cred_is_me(cred)
46 hrn, type = record['hrn'], record['type']
47 records = table.find({'hrn': hrn, 'type': type })
48 for record in records:
49 if record['peer_authority']:
50 self.remove_plc_record(record)
55 def remove_plc_record(self, record):
58 persons = self.api.driver.GetPersons({'person_id' : record['pointer']})
63 peer = self.get_peer_name(person['peer_id'])
64 self.api.driver.UnBindObjectFromPeer('person', person['person_id'], peer)
65 self.api.driver.DeletePerson(person['person_id'])
68 slices=self.api.driver.GetSlices({'slice_id' : record['pointer']})
73 peer = self.get_peer_name(slice['peer_id'])
74 self.api.driver.UnBindObjectFromPeer('slice', slice['slice_id'], peer)
75 self.api.driver.DeleteSlice(slice['slice_id'])
76 elif type == "authority":
77 sites=self.api.driver.GetSites({'site_id' : record['pointer']})
82 peer = self.get_peer_name(site['peer_id'])
83 self.api.driver.UnBindObjectFromPeer('site', site['site_id'], peer)
84 self.api.driver.DeleteSite(site['site_id'])
87 raise UnknownSfaType(type)
91 def get_peer_name(self, peer_id):
92 peers = self.api.driver.GetPeers([peer_id], ['peername', 'shortname', 'hrn_root'])
94 raise SfaInvalidArgument, "No such peer"
96 return peer['shortname']