X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FNodes.py;h=87f0d1c91fa623cd45fa2627c05d119e7f6219cd;hb=a74854dd38cb742b8fdc0d0cda7fff738a95312c;hp=03907c7aa81d8c084e87f5d5098fc558ca64c461;hpb=214a47e350bfec53d7c361ddd555023cc02fcf53;p=plcapi.git diff --git a/PLC/Nodes.py b/PLC/Nodes.py index 03907c7..87f0d1c 100644 --- a/PLC/Nodes.py +++ b/PLC/Nodes.py @@ -4,7 +4,7 @@ # Mark Huang # Copyright (C) 2006 The Trustees of Princeton University # -# $Id: Nodes.py,v 1.32 2007/04/03 19:14:45 tmack Exp $ +# $Id$ # from types import StringTypes @@ -38,7 +38,8 @@ class Node(Row): table_name = 'nodes' primary_key = 'node_id' - join_tables = ['nodegroup_node', 'conf_file_node', 'nodenetworks', 'pcu_node', 'slice_node', 'slice_attribute', 'node_session', 'peer_node'] + # Thierry -- we use delete on nodenetworks so the related NodeNetworkSettings get deleted too + join_tables = ['nodegroup_node', 'conf_file_node', 'pcu_node', 'slice_node', 'slice_attribute', 'node_session', 'peer_node','node_slice_whitelist'] fields = { 'node_id': Parameter(int, "Node identifier"), 'hostname': Parameter(str, "Fully qualified hostname", max = 255), @@ -58,6 +59,7 @@ class Node(Row): 'conf_file_ids': Parameter([int], "List of configuration files specific to this node"), # 'root_person_ids': Parameter([int], "(Admin only) List of people who have root access to this node"), 'slice_ids': Parameter([int], "List of slices on this node"), + 'slice_ids_whitelist': Parameter([int], "List of slices allowed on this node"), 'pcu_ids': Parameter([int], "List of PCUs that control this node"), 'ports': Parameter([int], "List of PCU ports that this node is connected to"), 'peer_id': Parameter(int, "Peer to which this node belongs", nullok = True), @@ -108,13 +110,31 @@ class Node(Row): self.api.db.do("UPDATE %s SET last_contact = CURRENT_TIMESTAMP " % (self.table_name) + \ " where node_id = %d" % ( self['node_id']) ) self.sync(commit) - + + + def update_last_updated(self, commit = True): + """ + Update last_updated field with current time + """ + + assert 'node_id' in self + assert self.table_name + + self.api.db.do("UPDATE %s SET last_updated = CURRENT_TIMESTAMP " % (self.table_name) + \ + " where node_id = %d" % (self['node_id']) ) + self.sync(commit) + def delete(self, commit = True): """ Delete existing node. """ assert 'node_id' in self + assert 'nodenetwork_ids' in self + + # we need to clean up NodeNetworkSettings, so handling nodenetworks as part of join_tables does not work + for nodenetwork in NodeNetworks(self.api,self['nodenetwork_ids']): + nodenetwork.delete() # Clean up miscellaneous join tables for table in self.join_tables: @@ -144,9 +164,17 @@ class Nodes(Table): ints = filter(lambda x: isinstance(x, (int, long)), node_filter) strs = filter(lambda x: isinstance(x, StringTypes), node_filter) node_filter = Filter(Node.fields, {'node_id': ints, 'hostname': strs}) - sql += " AND (%s)" % node_filter.sql(api, "OR") + sql += " AND (%s) %s" % node_filter.sql(api, "OR") elif isinstance(node_filter, dict): node_filter = Filter(Node.fields, node_filter) - sql += " AND (%s)" % node_filter.sql(api, "AND") + sql += " AND (%s) %s" % node_filter.sql(api, "AND") + elif isinstance (node_filter, StringTypes): + node_filter = Filter(Node.fields, {'hostname':[node_filter]}) + sql += " AND (%s) %s" % node_filter.sql(api, "AND") + elif isinstance (node_filter, int): + node_filter = Filter(Node.fields, {'node_id':[node_filter]}) + sql += " AND (%s) %s" % node_filter.sql(api, "AND") + else: + raise PLCInvalidArgument, "Wrong node filter %r"%node_filter self.selectall(sql)