*** empty log message ***
authorTony Mack <tmack@cs.princeton.edu>
Fri, 6 Oct 2006 18:02:36 +0000 (18:02 +0000)
committerTony Mack <tmack@cs.princeton.edu>
Fri, 6 Oct 2006 18:02:36 +0000 (18:02 +0000)
PLC/Methods/AddNode.py [new file with mode: 0644]
PLC/Methods/AdmDeleteNodeGroup.py
PLC/Methods/__init__.py

diff --git a/PLC/Methods/AddNode.py b/PLC/Methods/AddNode.py
new file mode 100644 (file)
index 0000000..5179464
--- /dev/null
@@ -0,0 +1,66 @@
+from PLC.Faults import *
+from PLC.Method import Method
+from PLC.Parameter import Parameter, Mixed
+from PLC.Nodes import Node, Nodes
+from PLC.NodeGroups import NodeGroup, NodeGroups
+from PLC.Sites import Site, Sites
+from PLC.Auth import PasswordAuth
+
+class AddNode(Method):
+    """
+    Adds a new node. Any values specified in optional_vals are used,
+    otherwise defaults are used.
+
+    PIs and techs may only add nodes to their own sites. ins may
+    add nodes to any site.
+
+    Returns the new node_id (> 0) if successful, faults otherwise.
+    """
+
+    roles = ['admin', 'pi', 'tech']
+
+    can_update = lambda (field, value): field in \
+                 ['model', 'version']
+    update_fields = dict(filter(can_update, Node.fields.items()))
+
+    accepts = [
+        PasswordAuth(),
+        Mixed(Site.fields['site_id'],
+              Site.fields['login_base']),
+        Node.fields['hostname'],
+        Node.fields['boot_state'],
+        update_fields
+        ]
+
+    returns = Parameter(int, 'New node_id (> 0) if successful')
+
+    def call(self, auth, site_id_or_login_base, hostname, boot_state, optional_vals = {}):
+        if filter(lambda field: field not in self.update_fields, optional_vals):
+            raise PLCInvalidArgument, "Invalid fields specified"
+
+        # Get site information
+        sites = Sites(self.api, [site_id_or_login_base])
+        if not sites:
+            raise PLCInvalidArgument, "No such site"
+
+        site = sites.values()[0]
+
+        # 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.
+        if 'admin' not in self.caller['roles']:
+            if site['site_id'] not in self.caller['site_ids']:
+                assert self.caller['person_id'] not in site['person_ids']
+                raise PLCPermissionDenied, "Not allowed to add nodes to specified site"
+            else:
+                assert self.caller['person_id'] in site['person_ids']
+
+        node = Node(self.api, optional_vals)
+        node['hostname'] = hostname
+        node['boot_state'] = boot_state
+        node['site_id'] = site['site_id']
+        node.sync()
+
+        return node['node_id']
index a255088..3f91005 100644 (file)
@@ -8,7 +8,7 @@ class AdmDeleteNodeGroup(Method):
     """
     Delete an existing Node Group.
 
-    Admins my delete any node group
+    Admins may delete any node group
 
     Returns 1 if successful, faults otherwise.
     """
index 24adea6..9ca0644 100644 (file)
@@ -1 +1 @@
-methods = 'AddAttribute AddSliceAttribute AddSlice AdmAddNodeGroup AdmAddNodeNetwork AdmAddNode AdmAddNodeToNodeGroup AdmAddPerson AdmAddPersonToSite AdmAddSite AdmAuthCheck AdmDeleteNodeGroup AdmDeleteNodeNetwork AdmDeleteNode AdmDeletePerson AdmDeleteSite AdmGetAllNodeNetworkBandwidthLimits AdmGetAllNodeNetworks AdmGetAllRoles AdmGetNodeGroupNodes AdmGetNodeGroups AdmGetNodes AdmGetPersonRoles AdmGetPersonSites AdmGetPersons AdmGetSiteNodes AdmGetSitePersons AdmGetSites AdmGrantRoleToPerson AdmIsPersonInRole AdmRemoveNodeFromNodeGroup AdmRemovePersonFromSite AdmRevokeRoleFromPerson AdmSetPersonEnabled AdmSetPersonPrimarySite AdmUpdateNodeGroup AdmUpdateNodeNetwork AdmUpdateNode AdmUpdatePerson AdmUpdateSite DeleteAttribute DeleteSliceAttribute DeleteSlice GetAttributes GetSliceAttributes GetSlices UpdateAttribute UpdateSliceAttribute UpdateSlice  system.listMethods  system.methodHelp  system.methodSignature  system.multicall'.split()
+methods = 'AddAttribute AddNodeGroup AddNodeNetwork AddNode AddNodeToNodeGroup AddPerson AddPersonToSite AddSite AddSliceAttribute AddSlice AdmAddNodeGroup AdmAddNodeNetwork AdmAddNode AdmAddNodeToNodeGroup AdmAddPerson AdmAddPersonToSite AdmAddSite AdmAuthCheck AdmDeleteNodeGroup AdmDeleteNodeNetwork AdmDeleteNode AdmDeletePerson AdmDeleteSite AdmGetAllNodeNetworkBandwidthLimits AdmGetAllNodeNetworks AdmGetAllRoles AdmGetNodeGroupNodes AdmGetNodeGroups AdmGetNodes AdmGetPersonAddresses AdmGetPersonRoles AdmGetPersonSites AdmGetPersons AdmGetSiteNodes AdmGetSitePersons AdmGetSites AdmGrantRoleToPerson AdmIsPersonInRole AdmRemoveNodeFromNodeGroup AdmRemovePersonFromSite AdmRevokeRoleFromPerson AdmSetPersonEnabled AdmSetPersonPrimarySite AdmUpdateNodeGroup AdmUpdateNodeNetwork AdmUpdateNode AdmUpdatePerson AdmUpdateSite AuthCheck DeleteAttribute DeleteNodeGroup DeleteNodeNetwork DeleteNode DeletePerson DeleteSite DeleteSliceAttribute DeleteSlice GetAllNodeNetworkBandwidthLimits GetAllNodeNetworks GetAllRoles GetAttributes GetNodeGroupNodes GetNodeGroups GetNodes GetPersonAddresses GetPersonRoles GetPersonSites GetPersons GetSiteNodes GetSitePersons GetSites GetSliceAttributes GetSlices GrantRoleToPerson IsPersonInRole RemoveNodeFromNodeGroup RemovePersonFromSite RevokeRoleFromPerson SetPersonEnabled SetPersonPrimarySite UpdateAttribute UpdateNodeGroup UpdateNodeNetwork UpdateNode UpdatePerson UpdateSite UpdateSliceAttribute UpdateSlice  system.listMethods  system.methodHelp  system.methodSignature  system.multicall'.split()