c97f20a1bfbce30964943d1c30f1dc00be9283fb
[plcapi.git] / PLC / Methods / DeleteNode.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.Nodes import Node, Nodes
8 from PLC.SFA import SFA
9
10 class DeleteNode(Method):
11     """
12     Mark an existing node as deleted.
13
14     PIs and techs may only delete nodes at their own sites. ins may
15     delete nodes at any site.
16
17     Returns 1 if successful, faults otherwise.
18     """
19
20     roles = ['admin', 'pi', 'tech']
21
22     accepts = [
23         Auth(),
24         Mixed(Node.fields['node_id'],
25               Node.fields['hostname'])
26         ]
27
28     returns = Parameter(int, '1 if successful')
29
30     def call(self, auth, node_id_or_hostname):
31         # Get account information
32         nodes = Nodes(self.api, [node_id_or_hostname])
33         if not nodes:
34             raise PLCInvalidArgument, "No such node"
35         node = nodes[0]
36
37         if node['peer_id'] is not None:
38             raise PLCInvalidArgument, "Not a local node"
39
40         # If we are not an admin, make sure that the caller is a
41         # member of the site at which the node is located.
42         if 'admin' not in self.caller['roles']:
43             # Authenticated function
44             assert self.caller is not None
45
46             if node['site_id'] not in self.caller['site_ids']:
47                 raise PLCPermissionDenied, "Not allowed to delete nodes from specified site"
48
49         node_id=node['node_id']
50         site_id=node['site_id']
51         node.delete()
52
53         # Logging variables
54         # it's not much use to attach to the node as it's going to vanish...
55         self.event_objects = {'Node': [node_id], 'Site': [site_id] }
56         self.message = "Node %d deleted" % node['node_id']
57
58         sfa = SFA()
59         sfa.delete_record(node, 'node')       
60
61         return 1