# Mark Huang <mlhuang@cs.princeton.edu>
# Copyright (C) 2006 The Trustees of Princeton University
#
-# $Id: Nodes.py,v 1.18 2006/11/08 23:13:11 mlhuang Exp $
+# $Id: Nodes.py,v 1.28 2006/12/05 16:45:03 thierry Exp $
#
from types import StringTypes
'slice_ids': Parameter([int], "List of slices 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 at which this node is managed", nullok = True),
}
+ # for Cache
+ class_key = 'hostname'
+ foreign_fields = ['boot_state','model','version']
+ # forget about these ones, they are read-only anyway
+ # handling them causes Cache to re-sync all over again
+ # 'date_created','last_updated'
+ foreign_xrefs = [
+ # in this case, we dont need the 'table' but Cache will look it up, so...
+ {'field' : 'site_id' , 'class' : 'Site' , 'table' : 'unused-on-direct-refs' } ,
+ ]
+
def validate_hostname(self, hostname):
if not valid_hostname(hostname):
raise PLCInvalidArgument, "Invalid hostname"
conflicts = Nodes(self.api, [hostname])
- for node_id, node in conflicts.iteritems():
- if 'node_id' not in self or self['node_id'] != node_id:
+ for node in conflicts:
+ if 'node_id' not in self or self['node_id'] != node['node_id']:
raise PLCInvalidArgument, "Hostname already in use"
return hostname
def validate_boot_state(self, boot_state):
- if boot_state not in BootStates(self.api):
+ boot_states = [row['boot_state'] for row in BootStates(self.api)]
+ if boot_state not in boot_states:
raise PLCInvalidArgument, "Invalid boot state"
return boot_state
+ # timestamps
+ def validate_date_created (self, timestamp):
+ return self.validate_timestamp (timestamp)
+ def validate_last_updated (self, timestamp):
+ return self.validate_timestamp (timestamp)
+
def delete(self, commit = True):
"""
Delete existing node.
self['deleted'] = True
self.sync(commit)
+
class Nodes(Table):
"""
Representation of row(s) from the nodes table in the
database.
"""
- def __init__(self, api, node_filter = None):
- Table.__init__(self, api, Node)
+ def __init__(self, api, node_filter = None, columns = None):
+ Table.__init__(self, api, Node, columns)
sql = "SELECT %s FROM view_nodes WHERE deleted IS False" % \
- ", ".join(Node.fields)
+ ", ".join(self.columns)
if node_filter is not None:
if isinstance(node_filter, (list, tuple, set)):
sql += " AND (%s)" % node_filter.sql(api, "AND")
self.selectall(sql)
+