--- /dev/null
+from PLC.Method import Method
+from PLC.Parameter import Parameter, Mixed
+from PLC.Auth import BootAuth
+from PLC.Nodes import Node, Nodes
+from PLC.NodeNetworks import NodeNetwork, NodeNetworks
+from PLC.Sessions import Session, Sessions
+
+class BootGetNodeDetails(Method):
+ """
+ Returns a set of details about the calling node, including a new
+ node session value.
+ """
+
+ roles = ['node']
+
+ accepts = [BootAuth()]
+
+ returns = {
+ 'hostname': Node.fields['hostname'],
+ 'boot_state': Node.fields['boot_state'],
+ 'model': Node.fields['model'],
+ 'networks': [NodeNetwork.fields],
+ 'session': Session.fields['session_id'],
+ }
+
+ def call(self, auth):
+ details = {
+ 'hostname': self.caller['hostname'],
+ 'boot_state': self.caller['boot_state'],
+ # XXX Boot Manager cannot unmarshal None
+ 'model': self.caller['model'] or "",
+ }
+
+ # Generate a new session value
+ session = Session(self.api)
+ session.sync(commit = False)
+ session.add_node(self.caller, commit = True)
+
+ details['session'] = session['session_id']
+
+ if self.caller['nodenetwork_ids']:
+ details['networks'] = NodeNetworks(self.api, self.caller['nodenetwork_ids'])
+ # XXX Boot Manager cannot unmarshal None
+ for network in details['networks']:
+ for field in network:
+ if network[field] is None:
+ if isinstance(network[field], (int, long)):
+ network[field] = -1
+ else:
+ network[field] = ""
+
+ self.messge = "Node request boot_state (%s) and networks" % \
+ (details['boot_state'])
+ return details
+