1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
# Is this *too* flexible?
# Am I being naive? Doing it wrong?
from contextlib import contextmanager
class MissingParameterError(Exception):
def __init__(self, value):
self.parameter = value
def __str__(self):
return repr(self.parameter)
# Something like this for the template backend stuff
class Template(object):
def __init__(self, template_name):
self.template_name = template_name
self.arguments = {}
def __setattr__(self, attr, value):
if attr in ("arguments", "template_name"):
object.__setattr__(self, attr, value)
else:
self.arguments[attr] = value
def build(self):
print "Building template %s with arguments: %s" % (self.template_name, self.arguments)
# Do some validation checking on certain arguments, execute code as needed
# Delete arbitrairy arguments that could be created (but inform the user)
# Something like this for the service backend stuff
class Service(object):
def __init__(self, service_name):
self.service_name = service_name
self.arguments = {}
def __setattr__(self, attr, value):
if attr in ("arguments", "service_name"):
object.__setattr__(self, attr, value)
else:
self.arguments[attr] = value
def build(self):
print "Building service %s with arguments: %s" % (self.service_name, self.arguments)
# Do some validation checking on certain arguments, execute code as needed
# Delete arbitrairy arguments that could be created (but inform the user)
# Context manager to kick off the dirty work
@contextmanager
def create_template(name = None):
if not name:
raise MissingParameterError("Missing template name")
template = Template(name)
yield template
template.build()
# Context manager to kick off the dirty work
@contextmanager
def create_service(name = None):
if not name:
raise MissingParameterError("Missing service name")
service = Service(name)
yield service
service.build()
# Services/Templates would look something like this:
with create_service(name = "network") as service:
service.description = "Define network stuff"
service.provides = ['network_guts']
with create_template(name = "test_template") as webserver_template:
webserver_template.desciption = "Builds web server"
webserver_template.provides = ['webserver']
webserver_template.needs = ['services.network']
webserver_template.accounts = ['bsmith', 'mcrute']
|