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
7 can_update = ['run_level']
9 class ReportRunlevel(Method):
13 roles = ['node', 'admin']
16 Mixed(BootAuth(), SessionAuth(), Auth()),
17 {'run_level': Node.fields['run_level'],
19 Mixed(Node.fields['node_id'],
20 Node.fields['hostname'])
23 returns = Parameter(int, '1 if successful')
25 def call(self, auth, report_fields, node_id_or_hostname=None):
27 if not isinstance(self.caller, Node):
29 if 'admin' not in self.caller['roles']:
30 raise PLCPermissionDenied("Not allowed to update node run_level")
32 nodes = Nodes(self.api, [node_id_or_hostname])
34 raise PLCInvalidArgument("No such node")
39 # avoid logging this even too often
40 # avoid logging occurrences where run_level does not change
42 if 'run_level' in node: former_level=node['run_level']
44 node.update_last_contact()
45 for field in can_update:
46 if field in report_fields:
47 node.update({field : report_fields[field]})
49 node.sync(commit=True)
51 # skip logging in this case
52 if former_level and 'run_level' in node and node['run_level'] == former_level:
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 list(report_fields.items()) if k not in ['run_level'] ] )