Merge from trunk
[plcapi.git] / trunk / PLC / Methods / BootGetNodeDetails.py
diff --git a/trunk/PLC/Methods/BootGetNodeDetails.py b/trunk/PLC/Methods/BootGetNodeDetails.py
new file mode 100644 (file)
index 0000000..2f5056d
--- /dev/null
@@ -0,0 +1,55 @@
+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
+