First draft for leases
[plcapi.git] / PLC / Methods / DeleteLeases.py
1 # $Id$
2 # $URL$
3 from PLC.Faults import *
4 from PLC.Method import Method
5 from PLC.Parameter import Parameter, Mixed
6 from PLC.Auth import Auth
7 from PLC.Leases import Lease, Leases
8 from PLC.Slices import Slice, Slices
9
10 class DeleteLeases(Method):
11     """
12     Deletes a lease.
13
14     Users may only delete leases attached to their slices. 
15     PIs may delete any of the leases for slices at their sites, or any
16     slices of which they are members. Admins may delete any lease.
17
18     Returns 1 if successful, faults otherwise.
19     """
20
21     roles = ['admin', 'pi', 'tech', 'user']
22
23     accepts = [
24         Auth(),
25         Mixed(Lease.fields['lease_id'],[ Lease.fields['lease_id']]),
26         ]
27
28     returns = Parameter(int, '1 if successful')
29
30
31     def call(self, auth, lease_ids):
32         # Get associated lease details
33         leases = Leases(self.api, lease_ids)
34         if len(leases) != len(lease_ids):
35             raise PLCInvalidArgument, "Could not find all leases %r"%lease_ids
36
37         # fetch related slices
38         slices = Slices(self.api, [ lease['slice_id'] for lease in leases],['slice_id','person_ids'])
39         # create hash on slice_id
40         slice_map = dict ( [ (slice['slice_id'],slice) for slice in slices ] )
41
42         lease_ids=[lease['lease_id'] for lease in leases]
43         for lease in leases:
44             if 'admin' not in self.caller['roles']:
45                 slice=slice_map[lease['slice_id']]
46                 # check slices only once
47                 if not slice.has_key('verified'):
48                     if self.caller['person_id'] in slice['person_ids']:
49                         pass
50                     elif 'pi' not in self.caller['roles']:
51                         raise PLCPermissionDenied, "Not a member of slice %r"%slice['name']
52                     elif slice['site_id'] not in self.caller['site_ids']:
53                         raise PLCPermissionDenied, "Slice %r not associated with any of your sites"%slice['name']
54                 slice['verified']=True
55
56             lease.delete()
57         
58         # Logging variables
59         self.event_objects = {'Lease': lease_ids }
60         self.message = 'Leases %r deleted' % lease_ids
61
62         return 1