- accept message_filter and return_fields
[plcapi.git] / PLC / Methods / AddNodeNetwork.py
index b8ddba6..6e24bce 100644 (file)
@@ -3,23 +3,24 @@ from PLC.Method import Method
 from PLC.Parameter import Parameter, Mixed
 from PLC.Nodes import Node, Nodes
 from PLC.NodeNetworks import NodeNetwork, NodeNetworks
 from PLC.Parameter import Parameter, Mixed
 from PLC.Nodes import Node, Nodes
 from PLC.NodeNetworks import NodeNetwork, NodeNetworks
-from PLC.Auth import PasswordAuth
+from PLC.Auth import Auth
 
 
-can_update = lambda (field, value): field in \
-             ['ip', 'mac', 'gateway', 'network', 'broadcast', 'netmask',
-              'dns1', 'dns2', 'hostname', 'bwlimit', 'is_primary']
+can_update = lambda (field, value): field not in ['nodenetwork_id', 'node_id']
 
 class AddNodeNetwork(Method):
     """
 
 class AddNodeNetwork(Method):
     """
+
     Adds a new network for a node. Any values specified in
     Adds a new network for a node. Any values specified in
-    nodenetwork_fields are used, otherwise defaults are used. Acceptable
-    values for method are dhcp, static, proxy, tap, and
-    ipmi. Acceptable value for type is ipv4. If type is static, ip,
-    gateway, network, broadcast, netmask, and dns1 must all be
-    specified in nodenetwork_fields. If type is dhcp, these parameters,
-    even if specified, are ignored.
-
-    PIs and techs may only add networks to their own nodes. ins may
+    nodenetwork_fields are used, otherwise defaults are
+    used. Acceptable values for method may be retrieved via
+    GetNetworkMethods. Acceptable values for type may be retrieved via
+    GetNetworkTypes.
+
+    If type is static, ip, gateway, network, broadcast, netmask, and
+    dns1 must all be specified in nodenetwork_fields. If type is dhcp,
+    these parameters, even if specified, are ignored.
+
+    PIs and techs may only add networks to their own nodes. Admins may
     add networks to any node.
 
     Returns the new nodenetwork_id (> 0) if successful, faults otherwise.
     add networks to any node.
 
     Returns the new nodenetwork_id (> 0) if successful, faults otherwise.
@@ -27,23 +28,23 @@ class AddNodeNetwork(Method):
 
     roles = ['admin', 'pi', 'tech']
 
 
     roles = ['admin', 'pi', 'tech']
 
-    update_fields = dict(filter(can_update, NodeNetwork.fields.items()))
+    nodenetwork_fields = dict(filter(can_update, NodeNetwork.fields.items()))
 
     accepts = [
 
     accepts = [
-        PasswordAuth(),
-        Node.fields['node_id'],
-        NodeNetwork.fields['method'],
-        NodeNetwork.fields['type'],
-        update_fields
+        Auth(),
+        Mixed(Node.fields['node_id'],
+              Node.fields['hostname']),
+        nodenetwork_fields
         ]
 
     returns = Parameter(int, 'New nodenetwork_id (> 0) if successful')
 
         ]
 
     returns = Parameter(int, 'New nodenetwork_id (> 0) if successful')
 
-    def call(self, auth, node_id, method, type, nodenetwork_fields = {}):
+    
+    def call(self, auth, node_id_or_hostname, nodenetwork_fields):
         nodenetwork_fields = dict(filter(can_update, nodenetwork_fields.items()))
 
         # Check if node exists
         nodenetwork_fields = dict(filter(can_update, nodenetwork_fields.items()))
 
         # Check if node exists
-        nodes = Nodes(self.api, [node_id]).values()
+        nodes = Nodes(self.api, [node_id_or_hostname])
         if not nodes:
             raise PLCInvalidArgument, "No such node"
        node = nodes[0]
         if not nodes:
             raise PLCInvalidArgument, "No such node"
        node = nodes[0]
@@ -59,9 +60,14 @@ class AddNodeNetwork(Method):
 
         # Add node network
        nodenetwork = NodeNetwork(self.api, nodenetwork_fields)
 
         # Add node network
        nodenetwork = NodeNetwork(self.api, nodenetwork_fields)
-        nodenetwork['node_id'] = node_id
-       nodenetwork['method'] = method
-        nodenetwork['type'] = type
+        nodenetwork['node_id'] = node['node_id']
+       # if this is the first node network, make it primary
+       if not node['nodenetwork_ids']:
+               nodenetwork['is_primary'] = True
         nodenetwork.sync()
         nodenetwork.sync()
+       
+       # Logging variables
+       self.object_ids = [node['node_id'], nodenetwork['nodenetwork_id']]      
+       self.messgage = "Node network %d added" % nodenetwork['nodenetwork_id']
 
         return nodenetwork['nodenetwork_id']
 
         return nodenetwork['nodenetwork_id']