X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FNodes.py;h=8f25e2877abb3b9b94f027e9c9682f21037b22b3;hb=fe81b2c91b436b1882f63023413c7f51b29538ed;hp=99b3ef91c56eaa98dc72ba7f536896496b073218;hpb=25ca2c2fee216af894640248b6d83939f31ca327;p=plcapi.git diff --git a/PLC/Nodes.py b/PLC/Nodes.py index 99b3ef9..8f25e28 100644 --- a/PLC/Nodes.py +++ b/PLC/Nodes.py @@ -5,6 +5,7 @@ # Copyright (C) 2006 The Trustees of Princeton University # # $Id$ +# $URL$ # from types import StringTypes @@ -41,13 +42,14 @@ class Node(Row): primary_key = 'node_id' join_tables = [ 'slice_node', 'peer_node', 'slice_tag', 'node_session', 'node_slice_whitelist', - 'node_tag', 'conf_file_node', 'pcu_node', ] + 'node_tag', 'conf_file_node', 'pcu_node', 'leases', ] fields = { 'node_id': Parameter(int, "Node identifier"), 'node_type': Parameter(str,"Node type",max=20), 'hostname': Parameter(str, "Fully qualified hostname", max = 255), 'site_id': Parameter(int, "Site at which this node is located"), 'boot_state': Parameter(str, "Boot state", max = 20), + 'run_level': Parameter(str, "Run level", max = 20), 'model': Parameter(str, "Make and model of the actual machine", max = 255, nullok = True), 'boot_nonce': Parameter(str, "(Admin only) Random value generated by the node at last boot", max = 128), 'version': Parameter(str, "Apparent Boot CD version", max = 64), @@ -55,6 +57,7 @@ class Node(Row): 'date_created': Parameter(int, "Date and time when node entry was created", ro = True), 'last_updated': Parameter(int, "Date and time when node entry was created", ro = True), 'last_contact': Parameter(int, "Date and time when node last contacted plc", ro = True), + 'verified': Parameter(bool, "Whether the node configuration is verified correct", ro=False), 'key': Parameter(str, "(Admin only) Node key", max = 256), 'session': Parameter(str, "(Admin only) Node session value", max = 256, ro = True), 'interface_ids': Parameter([int], "List of network interfaces that this node has"), @@ -136,14 +139,30 @@ class Node(Row): " where node_id = %d" % (self['node_id']) ) self.sync(commit) + def update_tags(self, tags): + from PLC.Shell import Shell + from PLC.NodeTags import NodeTags + from PLC.Methods.AddNodeTag import AddNodeTag + from PLC.Methods.UpdateNodeTag import UpdateNodeTag + shell = Shell() + for (tagname,value) 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__(shell.auth,node['node_id'],tagname,value) + else: + UpdateNodeTag(self.api).__call__(shell.auth,node_tags[0]['node_tag_id'],value) + def associate_interfaces(self, auth, field, value): - """ - Delete interfaces not found in value list (using DeleteInterface) - Add interfaces found in value list (using AddInterface) - Updates interfaces found w/ interface_id in value list (using UpdateInterface) - """ + """ + Delete interfaces not found in value list (using DeleteInterface) + Add interfaces found in value list (using AddInterface) + Updates interfaces found w/ interface_id in value list (using UpdateInterface) + """ - assert 'interface_ids' in self + assert 'interface_ids' in self assert 'node_id' in self assert isinstance(value, list) @@ -245,11 +264,15 @@ class Node(Row): """ assert 'node_id' in self - assert 'interface_ids' in self # we need to clean up InterfaceTags, so handling interfaces as part of join_tables does not work - for interface in Interfaces(self.api,self['interface_ids']): - interface.delete() + # federated nodes don't have interfaces though so for smooth transition from 4.2 to 4.3 + if 'peer_id' in self and self['peer_id']: + pass + else: + assert 'interface_ids' in self + for interface in Interfaces(self.api,self['interface_ids']): + interface.delete() # Clean up miscellaneous join tables for table in self.join_tables: @@ -274,7 +297,8 @@ class Nodes(Table): view = "view_nodes" # as many left joins as requested tags for tagname in self.tag_columns: - view= "%s left join %s using (%s)"%(view,Node.tagvalue_view_name(tagname),Node.primary_key) + view= "%s left join %s using (%s)"%(view,Node.tagvalue_view_name(tagname), + Node.primary_key) sql = "SELECT %s FROM %s WHERE deleted IS False" % \ (", ".join(self.columns.keys()+self.tag_columns.keys()),view)