PROJECT_MOVED -> https://lab.nexedi.com/nexedi/slapos
[slapos.git] / software / helloworld / instance.cfg.in
1 #############################
2 #
3 # Deploy hello-world instance
4 #
5 #############################
6 [buildout]
7 parts =
8   directory
9   publish-connection-parameter
10
11 # Define egg directories to be the one from Software Release
12 # (/opt/slapgrid/...)
13 # Always the same.
14 eggs-directory = {{ buildout['eggs-directory'] }}
15 develop-eggs-directory = {{ buildout['develop-eggs-directory'] }}
16 offline = true
17
18
19 [instance-parameter]
20 # Fetch arbitrary parameters defined by the user in SlapOS Master for his instance.
21 # We use the slapconfiguration recipe with a few parameters (partition id,
22 # computer id, certificate, etc).
23 # It will then authenticate to SlapOS Master and fetch the instance parameters.
24 # The parameters are accessible from ${instance-parameter:configuration.name-of-parameter}
25 # Always the same. Just copy/paste.
26 # See docstring of slapos.cookbook:slapconfiguration for more information.
27 recipe = slapos.cookbook:slapconfiguration
28 computer = ${slap_connection:computer_id}
29 partition = ${slap_connection:partition_id}
30 url = ${slap_connection:server_url}
31 key = ${slap_connection:key_file}
32 cert = ${slap_connection:cert_file}
33
34 # Define default parameter(s) that will be used later, in case user didn't
35 # specify it.
36 # All possible parameters should have a default.
37 # In our use case, we are expecting from the user to specify one (optional) parameter: "name". We put the default value here if he doesn't specify it, so that it doesn't crash.
38 configuration.name = John Doe
39 # If our use case requires that the user can specify a mail address so that his instance can mail to him (for example), we can do:
40 # configuration.mail-address =
41 # If the user doesn't specify it, it won't break and the recipe can handle it (i.e don't send any mail for example).
42
43
44 # Create all needed directories, depending on your needs
45 [directory]
46 recipe = slapos.cookbook:mkdirectory
47 home = ${buildout:directory}
48 etc = ${:home}/etc
49 var = ${:home}/var
50 # Executables put here will be started but not monitored (for startup scripts)
51 script = ${:etc}/run/
52 # Executables put here will be started and monitored (for daemons)
53 service = ${:etc}/service
54 # Executables put here will be launched after buildout has completed to see
55 # if instance is running
56 promise = ${:etc}/promise/
57 # Path of the log directory used by our service (see [helloweb])
58 log = ${:var}/log
59
60
61 # Create a simple web server that says "hello <configuration.name>" to the web.
62 [helloweb]
63 # helloworld service is listening on:
64 # - global IPv6 address, and
65 # - fixed port
66 #
67 # NOTE because every computer partition is allocated its own global IPv6
68 # address, it is ok to fix the port - different hello-world instances will have
69 # different IPv6 addresses and they all will be accessible at the same time.
70 ipv6 = ${instance-parameter:ipv6-random}
71 # full URL - for convenience
72 url = http://[${:ipv6}]:${:port}
73
74 # the service will log here
75 logfile = ${directory:log}/helloweb-${:kind}.log
76
77 # Actual script that starts the service:
78 # This recipe will try to "exec" the command-line after separating parameters.
79 recipe = slapos.cookbook:wrapper
80 command-line =
81     {{ buildout['bin-directory'] }}/helloweb-${:kind} --logfile ${:logfile}
82         ${:ipv6} ${:port} ${instance-parameter:configuration.name}
83 # Put this shell script in the "etc/service" directory. Each executable of this
84 # repository will be started and monitored by supervisord. If a service
85 # exits/crashes, it will trigger a "bang" and cause a re-run of the instance.
86 wrapper-path = ${directory:service}/helloweb-${:kind}
87
88
89 # promise, that checks that helloweb service is alive
90 [helloweb-promise]
91 recipe = slapos.cookbook:check_port_listening
92 path = ${directory:promise}/helloweb-${:kind}
93
94 {# macro to instantiate service of `kind` to listen on `port` #}
95 {% set service_list = [] %}
96 {% macro hellowebsrv(kind, port) %}
97 {% do service_list.append(kind) %}
98 [helloweb-{{ kind }}]
99 <= helloweb
100 kind    = {{ kind }}
101 port    = {{ port }}
102
103 [helloweb-{{ kind }}-promise]
104 <= helloweb-promise
105 kind    = {{ kind }}
106 hostname= ${helloweb-{{ kind }}:ipv6}
107 port    = {{ port }}
108 {% endmacro %}
109
110 # services instantiation
111 {{ hellowebsrv('python', 7777) }}
112 {{ hellowebsrv('ruby',   7778) }}
113 {{ hellowebsrv('go',     7779) }}
114
115
116 # register all services/promises to buildout parts
117 [buildout]
118 parts +=
119 {%- for kind in service_list %}
120   helloweb-{{ kind }}
121   helloweb-{{ kind }}-promise
122 {%- endfor %}
123
124
125 # Publish all the parameters needed for the user to connect to the instance.
126 # It can be anything: URL(s), password(s), or arbitrary parameters.
127 # Here we'll just echo back the entered name as instance parameter
128 [publish-connection-parameter]
129 recipe = slapos.cookbook:publish
130 name = Hello ${instance-parameter:configuration.name}!
131 {%- for kind in service_list %}
132 url.{{ kind }} = ${helloweb-{{ kind }}:url}
133 {%- endfor %}