AddNode/UpdateNode/GetNodes should no be 100% tag-friendly
authorThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Sat, 6 Dec 2008 23:15:29 +0000 (23:15 +0000)
committerThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Sat, 6 Dec 2008 23:15:29 +0000 (23:15 +0000)
PLC/Methods/AddNode.py
PLC/Methods/UpdateNode.py

index 178127b..8b5c35e 100644 (file)
@@ -7,6 +7,10 @@ from PLC.Nodes import Node, Nodes
 from PLC.NodeGroups import NodeGroup, NodeGroups
 from PLC.Sites import Site, Sites
 from PLC.Auth import Auth
 from PLC.NodeGroups import NodeGroup, NodeGroups
 from PLC.Sites import Site, Sites
 from PLC.Auth import Auth
+from PLC.TagTypes import TagTypes
+from PLC.NodeTags import NodeTags
+from PLC.Methods.AddNodeTag import AddNodeTag
+from PLC.Methods.UpdateNodeTag import UpdateNodeTag
 
 can_update = ['hostname', 'node_type', 'boot_state', 'model', 'version']
 
 
 can_update = ['hostname', 'node_type', 'boot_state', 'model', 'version']
 
@@ -64,12 +68,18 @@ class AddNode(Method):
         node['site_id'] = site['site_id']
         node.sync()
 
         node['site_id'] = site['site_id']
         node.sync()
 
-        if tags:
-            print 'AddNode: warning, tags not handled yet',
-            for (k,v) in tags.iteritems(): print k
-
        self.event_objects = {'Site': [site['site_id']],
                             'Node': [node['node_id']]} 
        self.message = "Node %s created" % node['node_id']
 
        self.event_objects = {'Site': [site['site_id']],
                             'Node': [node['node_id']]} 
        self.message = "Node %s created" % node['node_id']
 
+        for (tagname,tagvalue) in tags.iteritems():
+            # the tagtype instance is assumed to exist, just check that
+            if not TagTypes(self.api,{'tagname':tagname}):
+                raise PLCInvalidArgument,"No such TagType %s"%tagname
+            node_tags=NodeTags(self.api,{'tagname':tagname,'node_id':node['node_id']})
+            if not node_tags:
+                AddNodeTag(self.api).__call__(auth,node['node_id'],tagname,tagvalue)
+            else:
+                UpdateNodeTag(self.api).__call__(auth,node_tags[0]['node_tag_id'],tagvalue)
+
         return node['node_id']
         return node['node_id']
index a562ac3..34bae4f 100644 (file)
@@ -5,6 +5,10 @@ from PLC.Parameter import Parameter, Mixed
 from PLC.Table import Row
 from PLC.Nodes import Node, Nodes
 from PLC.Auth import Auth
 from PLC.Table import Row
 from PLC.Nodes import Node, Nodes
 from PLC.Auth import Auth
+from PLC.TagTypes import TagTypes
+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()
 
 can_update = ['hostname', 'boot_state', 'model', 'version','key', 'session', 'boot_nonce', 'site_id'] + \
               Node.related_fields.keys()
@@ -69,10 +73,6 @@ class UpdateNode(Method):
         for (k,v) in related.iteritems():
             node.associate(auth, k,v)
 
         for (k,v) in related.iteritems():
             node.associate(auth, k,v)
 
-        if tags:
-            print 'UpdateNode: warning, tags not handled yet',
-            for (k,v) in tags.iteritems(): print k
-
        node.update(native)
        node.update_last_updated(commit=False)
         node.sync(commit=True)
        node.update(native)
        node.update_last_updated(commit=False)
         node.sync(commit=True)
@@ -84,4 +84,14 @@ class UpdateNode(Method):
        if 'boot_state' in node_fields.keys():
                self.message += ' boot_state updated to %s' %  node_fields['boot_state']
 
        if 'boot_state' in node_fields.keys():
                self.message += ' boot_state updated to %s' %  node_fields['boot_state']
 
+        for (tagname,tagvalue) in tags.iteritems():
+            # the tagtype instance is assumed to exist, just check that
+            if not TagTypes(self.api,{'tagname':tagname}):
+                raise PLCInvalidArgument,"No such TagType %s"%tagname
+            node_tags=NodeTags(self.api,{'tagname':tagname,'node_id':node['node_id']})
+            if not node_tags:
+                AddNodeTag(self.api).__call__(auth,node['node_id'],tagname,tagvalue)
+            else:
+                UpdateNodeTag(self.api).__call__(auth,node_tags[0]['node_tag_id'],tagvalue)
+
         return 1
         return 1