From aa5f09efe1aaeb31820c30e7258ef8d09008ba94 Mon Sep 17 00:00:00 2001 From: Mark Huang Date: Tue, 10 Oct 2006 20:24:06 +0000 Subject: [PATCH] interface to network_types table --- PLC/Methods/AddNetworkType.py | 28 ++++++++++++ PLC/Methods/DeleteNetworkType.py | 31 ++++++++++++++ PLC/Methods/GetNetworkTypes.py | 21 +++++++++ PLC/NetworkTypes.py | 73 ++++++++++++++++++++++++++++++++ 4 files changed, 153 insertions(+) create mode 100644 PLC/Methods/AddNetworkType.py create mode 100644 PLC/Methods/DeleteNetworkType.py create mode 100644 PLC/Methods/GetNetworkTypes.py create mode 100644 PLC/NetworkTypes.py diff --git a/PLC/Methods/AddNetworkType.py b/PLC/Methods/AddNetworkType.py new file mode 100644 index 00000000..eb2e7808 --- /dev/null +++ b/PLC/Methods/AddNetworkType.py @@ -0,0 +1,28 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NetworkTypes import NetworkType, NetworkTypes +from PLC.Auth import PasswordAuth + +class AddNetworkType(Method): + """ + Adds a new network type. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + PasswordAuth(), + NetworkType.fields['type'] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, name): + network_type = NetworkType(self.api) + network_type['type'] = name + network_type.sync() + + return 1 diff --git a/PLC/Methods/DeleteNetworkType.py b/PLC/Methods/DeleteNetworkType.py new file mode 100644 index 00000000..f96d2a55 --- /dev/null +++ b/PLC/Methods/DeleteNetworkType.py @@ -0,0 +1,31 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NetworkTypes import NetworkType, NetworkTypes +from PLC.Auth import PasswordAuth + +class DeleteNetworkType(Method): + """ + Deletes a network type. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + PasswordAuth(), + NetworkType.fields['type'] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, name): + network_types = NetworkTypes(self.api, [name]) + if not network_types: + raise PLCInvalidArgument, "No such network type" + network_type = network_types.values()[0] + + network_type.delete() + + return 1 diff --git a/PLC/Methods/GetNetworkTypes.py b/PLC/Methods/GetNetworkTypes.py new file mode 100644 index 00000000..55af009c --- /dev/null +++ b/PLC/Methods/GetNetworkTypes.py @@ -0,0 +1,21 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NetworkTypes import NetworkType, NetworkTypes +from PLC.Auth import PasswordAuth + +class GetNetworkTypes(Method): + """ + Returns a list of all valid network types. + """ + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + PasswordAuth() + ] + + returns = [NetworkType.fields['type']] + + def call(self, auth): + return [network_type['type'] for network_type in NetworkTypes(self.api).values()] diff --git a/PLC/NetworkTypes.py b/PLC/NetworkTypes.py new file mode 100644 index 00000000..609b16eb --- /dev/null +++ b/PLC/NetworkTypes.py @@ -0,0 +1,73 @@ +# +# Functions for interacting with the network_types table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: NetworkTypes.py,v 1.2 2006/10/06 18:19:41 mlhuang Exp $ +# + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Table import Row, Table + +class NetworkType(Row): + """ + Representation of a row in the network_types table. To use, + instantiate with a dict of values. + """ + + table_name = 'network_types' + primary_key = 'type' + fields = { + 'type': Parameter(str, "Network type", max = 20), + } + + def __init__(self, api, fields = {}): + Row.__init__(self, fields) + self.api = api + + def validate_type(self, name): + # Remove leading and trailing spaces + name = name.strip() + + # Make sure name is not blank after we removed the spaces + if not name: + raise PLCInvalidArgument, "Network type must be specified" + + # Make sure network type does not alredy exist + conflicts = NetworkTypes(self.api, [name]) + if conflicts: + raise PLCInvalidArgument, "Network type name already in use" + + return name + + def delete(self, commit = True): + assert 'type' in self + + # Clean up miscellaneous join tables + for table in ['nodenetworks', 'network_types']: + self.api.db.do("DELETE FROM " + table + \ + " WHERE type = %(type)s", + self) + + if commit: + self.api.db.commit() + +class NetworkTypes(Table): + """ + Representation of the network_types table in the database. + """ + + def __init__(self, api, names = None): + sql = "SELECT %s FROM network_types" % \ + ", ".join(NetworkType.fields) + + if names: + # Separate the list into integers and strings + sql += " WHERE type IN (%s)" % ", ".join(api.db.quote(names)) + + rows = api.db.selectall(sql) + + for row in rows: + self[row['type']] = NetworkType(api, row) -- 2.47.0