460aa98c7c597e81f5caf88cae4b4b50cce43b62
[sfa.git] / sfa / methods / RemovePeerObject.py
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 SfaRecord
6 from sfa.util.table import SfaTable
7 from sfa.trust.credential import Credential
8 from types import StringTypes
9
10 class RemovePeerObject(Method):
11     """
12     Remove an peer object from the PLC records of a local aggregate. 
13     This method will be called by registry.remove() while removing 
14     a record from the local aggreage's PLCDB and sfa table. This 
15     method need not be directly called by end-user.
16     
17     @param cred credential string
18     @param record record as stored in the local registry
19
20     @return 1 if successful, faults otherwise 
21     """
22
23     interfaces = ['registry']
24     
25     accepts = [
26         Parameter(str, "Credential string"),
27         Parameter(dict, "Record dictionary"),
28         Mixed(Parameter(str, "Human readable name of the original caller"),
29               Parameter(None, "Origin hrn not specified"))
30         ]
31
32     returns = Parameter(int, "1 if successful")
33     
34     def call(self, cred, record, origin_hrn=None):
35         user_cred = Credential(string=cred)
36
37         #log the call
38         if not origin_hrn:
39             origin_hrn = user_cred.get_gid_caller().get_hrn()
40         self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, origin_hrn, record['hrn'], self.name))
41
42         self.api.auth.check(cred, "remove")
43
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)
47         
48         table = SfaTable()
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)
54                 table.remove(record)
55             
56         return 1
57
58     def remove_plc_record(self, record):
59         type = record['type']        
60         if type == "user":
61             persons = self.api.plshell.GetPersons(self.api.plauth, {'person_id' : record['pointer']})
62             if not persons:
63                 return 1
64             person = persons[0]
65             if person['peer_id']:
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'])
69            
70         elif type == "slice":
71             slices=self.api.plshell.GetSlices(self.api.plauth, {'slice_id' : record['pointer']})
72             if not slices:
73                 return 1
74             slice=slices[0]
75             if slice['peer_id']:
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']})
81             if not sites:
82                 return 1
83             site=sites[0]
84             if site['peer_id']:
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'])
88            
89         else:
90             raise UnknownSfaType(type)
91
92         return 1
93
94     def get_peer_name(self, peer_id):
95         peers = self.api.plshell.GetPeers(self.api.plauth, [peer_id], ['peername', 'shortname', 'hrn_root'])
96         if not peers:
97             raise SfaInvalidArgument, "No such peer"
98         peer = peers[0]
99         return peer['shortname'] 
100
101
102