Merge remote-tracking branch 'origin/pycurl' into planetlab-4_0-branch
[plcapi.git] / PLC / InitScripts.py
1 #
2 # Functions for interacting with the initscripts table in the database
3 #
4 # Tony Mack <tmack@cs.princeton.edu>
5 # Copyright (C) 2006 The Trustees of Princeton University
6 #
7 #
8
9 from types import StringTypes
10 from PLC.Faults import *
11 from PLC.Parameter import Parameter
12 from PLC.Filter import Filter
13 from PLC.Table import Row, Table
14
15 class InitScript(Row):
16     """
17     Representation of a row in the initscripts table. To use,
18     instantiate with a dict of values.
19     """
20
21     table_name = 'initscripts'
22     primary_key = 'initscript_id'
23     join_tables = []
24     fields = {
25         'initscript_id': Parameter(int, "Initscript identifier"),
26         'name': Parameter(str, "Initscript name", max = 254),
27         'enabled': Parameter(bool, "Initscript is active"),
28         'script': Parameter(str, "Initscript"),
29         }
30
31     def validate_name(self, name):
32         """ 
33         validates the script name 
34         """
35         
36         conflicts = InitScripts(self.api, [name])
37         for initscript in conflicts:
38             if 'initscript_id' not in self or self['initscript_id'] != initscript['initscript_id']:
39                 raise PLCInvalidArgument, "Initscript name already in use"
40
41         return name
42
43
44 class InitScripts(Table):
45     """
46     Representation of the initscipts table in the database.
47     """
48
49     def __init__(self, api, initscript_filter = None, columns = None):
50         Table.__init__(self, api, InitScript, columns)
51
52         sql = "SELECT %s FROM initscripts WHERE True" % \
53               ", ".join(self.columns)
54
55         if initscript_filter is not None:
56             if isinstance(initscript_filter, (list, tuple, set)):
57                 # Separate the list into integers and strings
58                 ints = filter(lambda x: isinstance(x, (int, long)), initscript_filter)
59                 strs = filter(lambda x: isinstance(x, StringTypes), initscript_filter)
60                 initscript_filter = Filter(InitScript.fields, {'initscript_id': ints, 'name': strs })
61                 sql += " AND (%s) %s" % initscript_filter.sql(api, "OR")
62             elif isinstance(initscript_filter, dict):
63                 initscript_filter = Filter(InitScript.fields, initscript_filter)
64                 sql += " AND (%s) %s" % initscript_filter.sql(api, "AND")
65
66         self.selectall(sql)