6cba6a680b94b9ea25351b02aafb4b2c1a69030c
[plcapi.git] / PLC / Methods / DeleteNodeNetwork.py
1 from PLC.Faults import *
2 from PLC.Method import Method
3 from PLC.Parameter import Parameter, Mixed
4 from PLC.Auth import Auth
5 from PLC.Nodes import Node, Nodes
6 from PLC.NodeNetworks import NodeNetwork, NodeNetworks
7
8 class DeleteNodeNetwork(Method):
9     """
10     Deletes an existing node network interface.
11
12     Admins may delete any node network. PIs and techs may only delete
13     node network interfaces associated with nodes at their sites.
14
15     Returns 1 if successful, faults otherwise.
16     """
17
18     roles = ['admin', 'pi', 'tech']
19
20     accepts = [
21         Auth(),
22         NodeNetwork.fields['nodenetwork_id']
23         ]
24
25     returns = Parameter(int, '1 if successful')
26
27
28     def call(self, auth, nodenetwork_id):
29
30         # Get node network information
31         nodenetworks = NodeNetworks(self.api, [nodenetwork_id])
32         if not nodenetworks:
33             raise PLCInvalidArgument, "No such node network"
34         nodenetwork = nodenetworks[0]
35         
36         # Get node information
37         nodes = Nodes(self.api, [nodenetwork['node_id']])
38         if not nodes:
39                 raise PLCInvalidArgument, "No such node"
40         node = nodes[0]
41
42         # Authenticated functino
43         assert self.caller is not None
44
45         # If we are not an admin, make sure that the caller is a
46         # member of the site at which the node is located.
47         if 'admin' not in self.caller['roles']:
48             if node['site_id'] not in self.caller['site_ids']:
49                 raise PLCPermissionDenied, "Not allowed to delete this node network"
50
51         nodenetwork.delete()
52
53         # Logging variables
54         self.object_ids = [nodenetwork['nodenetwork_id']]
55         self.message = "Node network %d deleted" % nodenetwork['nodenetwork_id']
56
57         return 1