X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FInterfaces.py;h=bd933cd4b44e09bc8311672c7104160ac04ba012;hb=c6009814e9fd3b53be36ac5f8c32058ba7465f13;hp=18016a63f10f3b275a6974d363ec5653d7bfb801;hpb=d910a6190fec258ddbf0e26d01539839ac3fdc76;p=plcapi.git diff --git a/PLC/Interfaces.py b/PLC/Interfaces.py index 18016a6..bd933cd 100644 --- a/PLC/Interfaces.py +++ b/PLC/Interfaces.py @@ -5,6 +5,7 @@ # Copyright (C) 2006 The Trustees of Princeton University # # $Id$ +# $URL$ # from types import StringTypes @@ -48,7 +49,7 @@ class Interface(Row): table_name = 'interfaces' primary_key = 'interface_id' - join_tables = ['interface_setting'] + join_tables = ['interface_tag'] fields = { 'interface_id': Parameter(int, "Node interface identifier"), 'method': Parameter(str, "Addressing method (e.g., 'static' or 'dhcp')"), @@ -65,9 +66,12 @@ class Interface(Row): 'hostname': Parameter(str, "(Optional) Hostname", nullok = True), 'node_id': Parameter(int, "Node associated with this interface"), 'is_primary': Parameter(bool, "Is the primary interface for this node"), - 'setting_ids' : Parameter([int], "List of interface settings"), + 'interface_tag_ids' : Parameter([int], "List of interface settings"), } + view_tags_name = "view_interface_tags" + tags = {} + def validate_method(self, method): network_methods = [row['method'] for row in NetworkMethods(self.api)] if method not in network_methods: @@ -214,18 +218,34 @@ class Interfaces(Table): def __init__(self, api, interface_filter = None, columns = None): Table.__init__(self, api, Interface, columns) - sql = "SELECT %s FROM view_interfaces WHERE True" % \ - ", ".join(self.columns) + # the view that we're selecting upon: start with view_nodes + view = "view_interfaces" + # as many left joins as requested tags + for tagname in self.tag_columns: + view= "%s left join %s using (%s)"%(view,Interface.tagvalue_view_name(tagname), + Interface.primary_key) + + sql = "SELECT %s FROM %s WHERE True" % \ + (", ".join(self.columns.keys()+self.tag_columns.keys()),view) if interface_filter is not None: if isinstance(interface_filter, (list, tuple, set)): - interface_filter = Filter(Interface.fields, {'interface_id': interface_filter}) + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), interface_filter) + strs = filter(lambda x: isinstance(x, StringTypes), interface_filter) + interface_filter = Filter(Interface.fields, {'interface_id': ints, 'ip': strs}) + sql += " AND (%s) %s" % interface_filter.sql(api, "OR") elif isinstance(interface_filter, dict): - interface_filter = Filter(Interface.fields, interface_filter) + allowed_fields=dict(Interface.fields.items()+Interface.tags.items()) + interface_filter = Filter(allowed_fields, interface_filter) + sql += " AND (%s) %s" % interface_filter.sql(api) elif isinstance(interface_filter, int): interface_filter = Filter(Interface.fields, {'interface_id': [interface_filter]}) + sql += " AND (%s) %s" % interface_filter.sql(api) + elif isinstance (interface_filter, StringTypes): + interface_filter = Filter(Interface.fields, {'ip':[interface_filter]}) + sql += " AND (%s) %s" % interface_filter.sql(api, "AND") else: - raise PLCInvalidArgument, "Wrong node network filter %r"%interface_filter - sql += " AND (%s) %s" % interface_filter.sql(api) + raise PLCInvalidArgument, "Wrong interface filter %r"%interface_filter self.selectall(sql)