svn keywords
[plcapi.git] / PLC / Methods / GetNodeGroups.py
index ffd6eb3..6a59556 100644 (file)
@@ -1,34 +1,83 @@
+# $Id$
+# $URL$
 from PLC.Faults import *
 from PLC.Method import Method
 from PLC.Parameter import Parameter, Mixed
-from PLC.Auth import PasswordAuth
+from PLC.Filter import Filter
+from PLC.Auth import Auth
 from PLC.NodeGroups import NodeGroup, NodeGroups
 
-class GetNodeGroups(Method):
+class v43GetNodeGroups(Method):
     """
-    Returns an array of structs containing details about all node
-    groups. If nodegroup_id_or_name_list is specified, only the
-    specified node groups will be queried.
+    Returns an array of structs containing details about node groups.
+    If nodegroup_filter is specified and is an array of node group
+    identifiers or names, or a struct of node group attributes, only
+    node groups matching the filter will be returned. If return_fields
+    is specified, only the specified details will be returned.
     """
 
-    roles = ['admin', 'pi', 'user', 'tech']
+    roles = ['admin', 'pi', 'user', 'tech', 'node', 'anonymous']
 
     accepts = [
-        PasswordAuth(),
-        [Mixed(NodeGroup.fields['nodegroup_id'],
-              NodeGroup.fields['name'])]
+        Auth(),
+        Mixed([Mixed(NodeGroup.fields['nodegroup_id'],
+                     NodeGroup.fields['groupname'])],
+              Filter(NodeGroup.fields)),
+        Parameter([str], "List of fields to return", nullok = True)
         ]
 
     returns = [NodeGroup.fields]
   
-    def call(self, auth, nodegroup_id_or_name_list = None):
-        # Get node group details
-       nodegroups = NodeGroups(self.api, nodegroup_id_or_name_list).values()
+    def call(self, auth, nodegroup_filter = None, return_fields = None):
+       return NodeGroups(self.api, nodegroup_filter, return_fields)
 
-       # Filter out undesired or None fields (XML-RPC cannot marshal
-        # None) and turn each nodegroup into a real dict.
-        valid_return_fields_only = lambda (key, value): value is not None
-        nodegroups = [dict(filter(valid_return_fields_only, nodegroup.items())) \
-                      for nodegroup in nodegroups]
 
+nodegroup_fields = NodeGroup.fields.copy()
+nodegroup_fields['name'] = Parameter(str, "Legacy version of groupname", max = 50),
+
+class v42GetNodeGroups(v43GetNodeGroups):
+    """
+    Legacy wrapper for v42GetNodeGroups.
+    """
+
+    accepts = [
+        Auth(),
+        Mixed([Mixed(NodeGroup.fields['nodegroup_id'],
+                     NodeGroup.fields['groupname'])],
+              Filter(nodegroup_fields)),
+        Parameter([str], "List of fields to return", nullok = True)
+        ]
+
+    returns = [nodegroup_fields]
+  
+    def call(self, auth, nodegroup_filter = None, return_fields = None):
+        # convert name -> groupname in both filters
+        if isinstance(nodegroup_filter, dict):
+            if nodegroup_filter.has_key('name'):
+                groupname = nodegroup_filter.pop('name')
+                if not nodegroup_filter.has_key('groupname'):
+                    nodegroup_filter['groupname']=groupname
+
+        if isinstance(return_fields, list):
+            if 'name' in return_fields:
+                return_fields.remove('name')
+                if 'groupname' not in return_fields:
+                    return_fields.append('groupname')
+
+        nodegroups = NodeGroups(self.api, nodegroup_filter, return_fields)
+        # if groupname is present, then create a name mapping
+        for nodegroup in nodegroups:
+            if nodegroup.has_key('groupname'):
+                nodegroup['name']=nodegroup['groupname']
         return nodegroups
+
+class GetNodeGroups(v42GetNodeGroups):
+    """
+    Returns an array of structs containing details about node groups.
+    If nodegroup_filter is specified and is an array of node group
+    identifiers or names, or a struct of node group attributes, only
+    node groups matching the filter will be returned. If return_fields
+    is specified, only the specified details will be returned.
+    """
+
+    pass