get caller's hrn from the credentials gid_origin_caller object
[sfa.git] / sfa / methods / remove_peer_object.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 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
11
12 class remove_peer_object(Method):
13     """
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.
18     
19     @param cred credential string
20     @param record record as stored in the local registry
21
22     @return 1 if successful, faults otherwise 
23     """
24
25     interfaces = ['registry']
26     
27     accepts = [
28         Parameter(str, "Credential string"),
29         Parameter(dict, "Record dictionary"),
30         Mixed(Parameter(str, "Request hash"),
31               Parameter(None, "Request hash not specified"))
32         ]
33
34     returns = Parameter(int, "1 if successful")
35     
36     def call(self, cred, record, request_hash=None):
37         user_cred = Credential(string=cred)
38
39         #log the call
40         gid_origin_caller = user_cred.get_gid_origin_caller()
41         origin_hrn = gid_origin_caller.get_hrn()
42         self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, origin_hrn, hrn, self.name))
43
44         self.api.auth.authenticateCred(cred, [cred], request_hash) 
45         self.api.auth.check(cred, "remove")
46
47         # Only allow the local interface or record owner to delete peer_records 
48         try: self.api.auth.verify_object_permission(record['hrn'])
49         except: self.api.auth.verify_cred_is_me(cred)
50         
51         table = GeniTable()
52         hrn, type = record['hrn'], record['type']
53         records = table.find({'hrn': hrn, 'type': type })
54         for record in records:
55           if record['peer_authority']:
56             self.remove_plc_record(record)
57             table.remove(record)
58             
59         return 1
60
61     def remove_plc_record(self, record):
62         type = record['type']        
63         if type == "user":
64             persons = self.api.plshell.GetPersons(self.api.plauth, {'person_id' : record['pointer']})
65             if not persons:
66                 return 1
67             person = persons[0]
68             if person['peer_id']:
69                 peer = self.get_peer_name(person['peer_id']) 
70                 self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'person', person['person_id'], peer)
71             self.api.plshell.DeletePerson(self.api.plauth, person['person_id'])
72            
73         elif type == "slice":
74             slices=self.api.plshell.GetSlices(self.api.plauth, {'slice_id' : record['pointer']})
75             if not slices:
76                 return 1
77             slice=slices[0]
78             if slice['peer_id']:
79                 peer = self.get_peer_name(slice['peer_id']) 
80                 self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'slice', slice['slice_id'], peer)
81             self.api.plshell.DeleteSlice(self.api.plauth, slice['slice_id'])
82         elif type == "authority":
83             sites=self.api.plshell.GetSites(self.api.plauth, {'site_id' : record['pointer']})
84             if not sites:
85                 return 1
86             site=sites[0]
87             if site['peer_id']:
88                 peer = self.get_peer_name(site['peer_id']) 
89                 self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'site', site['site_id'], peer)
90             self.api.plshell.DeleteSite(self.api.plauth, site['site_id'])
91            
92         else:
93             raise UnknownGeniType(type)
94
95         return 1
96
97     def get_peer_name(self, peer_id):
98         peers = self.api.plshell.GetPeers(self.api.plauth, [peer_id], ['peername', 'shortname', 'hrn_root'])
99         if not peers:
100             raise GeniInvalidArgument, "No such peer"
101         peer = peers[0]
102         return peer['shortname'] 
103
104
105