aboutsummaryrefslogtreecommitdiff
path: root/mrbelvedere_dsl_thoughts.py
blob: 3310e65b05b9bf711c85adef59ec7bed7ef4f24f (plain)
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']