svn keywords
[plcapi.git] / PLC / Methods / UpdateNode.py
index 46e63be..04d1036 100644 (file)
@@ -1,4 +1,5 @@
 # $Id$
+# $URL$
 from PLC.Faults import *
 from PLC.Method import Method
 from PLC.Parameter import Parameter, Mixed
@@ -11,8 +12,8 @@ from PLC.NodeTags import NodeTags
 from PLC.Methods.AddNodeTag import AddNodeTag
 from PLC.Methods.UpdateNodeTag import UpdateNodeTag
 
-can_update = ['hostname', 'boot_state', 'model', 'version','key', 'session', 'boot_nonce', 'site_id'] + \
-              Node.related_fields.keys()
+admin_only = [ 'key', 'session', 'boot_nonce', 'site_id']
+can_update = ['hostname', 'node_type', 'boot_state', 'model', 'version'] + admin_only 
 
 class UpdateNode(Method):
     """
@@ -27,13 +28,16 @@ class UpdateNode(Method):
 
     roles = ['admin', 'pi', 'tech']
 
-    node_fields = Row.accepted_fields(can_update,[Node.fields,Node.related_fields,Node.tags])
+    accepted_fields = Row.accepted_fields(can_update,Node.fields)
+    # xxx check the related_fields feature
+    accepted_fields.update(Node.related_fields)
+    accepted_fields.update(Node.tags)
 
     accepts = [
         Auth(),
         Mixed(Node.fields['node_id'],
               Node.fields['hostname']),
-        node_fields
+        accepted_fields
         ]
 
     returns = Parameter(int, '1 if successful')
@@ -43,12 +47,17 @@ class UpdateNode(Method):
         # split provided fields 
         [native,related,tags,rejected] = Row.split_fields(node_fields,[Node.fields,Node.related_fields,Node.tags])
 
+        # type checking
+        native = Row.check_fields (native, self.accepted_fields)
         if rejected:
             raise PLCInvalidArgument, "Cannot update Node column(s) %r"%rejected
 
+        # Authenticated function
+        assert self.caller is not None
+
        # Remove admin only fields
        if 'admin' not in self.caller['roles']:
-            for key in 'key', 'session', 'boot_nonce', 'site_id':
+            for key in admin_only:
                 if native.has_key(key):
                     del native[key]
 
@@ -61,9 +70,6 @@ class UpdateNode(Method):
         if node['peer_id'] is not None:
             raise PLCInvalidArgument, "Not a local node %r"%node_id_or_hostname
 
-        # Authenticated function
-        assert self.caller is not None
-
         # If we are not an admin, make sure that the caller is a
         # member of the site at which the node is located.
         if 'admin' not in self.caller['roles']:
@@ -90,9 +96,12 @@ class UpdateNode(Method):
 
        # Logging variables
        self.event_objects = {'Node': [node['node_id']]}
-       self.message = 'Node %d updated: %s.' % \
-               (node['node_id'], ", ".join(node_fields.keys()))
+        if 'hostname' in node:
+            self.message = 'Node %s updated'%node['hostname']
+        else:
+            self.message = 'Node %d updated'%node['node_id']
+        self.message += " [%s]." % (", ".join(node_fields.keys()),)
        if 'boot_state' in node_fields.keys():
-               self.message += ' boot_state updated to %s' %  node_fields['boot_state']
+               self.message += ' boot_state updated to %s' % node_fields['boot_state']
 
         return 1