remove simplejson dependency
[plcapi.git] / PLC / Methods / ReportRunlevel.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, BootAuth, SessionAuth
5 from PLC.Nodes import Node, Nodes
6
7 can_update = ['run_level']
8
9 class ReportRunlevel(Method):
10     """
11         report runlevel
12     """
13     roles = ['node', 'admin']
14
15     accepts = [
16         Mixed(BootAuth(), SessionAuth(), Auth()),
17         {'run_level': Node.fields['run_level'],
18          },
19         Mixed(Node.fields['node_id'],
20               Node.fields['hostname'])
21         ]
22
23     returns = Parameter(int, '1 if successful')
24
25     def call(self, auth, report_fields, node_id_or_hostname=None):
26
27         if not isinstance(self.caller, Node):
28             # check admin
29             if 'admin' not in self.caller['roles']:
30                 raise PLCPermissionDenied, "Not allowed to update node run_level"
31
32             nodes = Nodes(self.api, [node_id_or_hostname])
33             if not nodes:
34                 raise PLCInvalidArgument, "No such node"
35         else:
36             nodes  = [self.caller]
37
38         node = nodes[0]
39         # avoid logging this even too often
40         # avoid logging occurrences where run_level does not change
41         former_level=None
42         if 'run_level' in node: former_level=node['run_level']
43
44         node.update_last_contact()
45         for field in can_update:
46             if field in report_fields:
47                 node.update({field : report_fields[field]})
48
49         node.sync(commit=True)
50
51         # skip logging in this case
52         if former_level and 'run_level' in node and node['run_level'] == former_level:
53             pass
54         else:
55             # handle the 'run_level' key
56             message="run level " + node['hostname'] + ":"
57             if 'run_level' in report_fields:
58                 message += str(former_level) + "->" + report_fields['run_level']
59             message += ", ".join(  [ k + "->" + v for (k,v) in report_fields.items() if k not in ['run_level'] ] )
60
61         return 1