Commit 17b4240f authored by Jérome Perrin's avatar Jérome Perrin

software/theia: run standalone slapos in a service

Until now, standalone subsystem was started as a daemon first time a terminal
was openned and since it was running as daemon, stopping the theia instance
did not stop any of the services running in the embedded slapos.

Before nexedi/slapos.core!265 there was
two supervisor running as daemon:
 - ~/srv/slapos/etc/supervisord.conf which runs slapos proxy etc
 - ~/srv/slapos/inst/etc/supervisord.conf with runs instances in the embedded
   slapos
After, the second one runs as a service in the first one, but the first one
was still running as daemon.

This changes so that the first supervisor runs as a service managed by the
Theia instance, so stopping Theia instance will effectively stop the services.

When upgrading, running instances should continue to run as detached. To
attach them to the new service, procedure could be something like this

Stop supervisors inside Theia instance:

  supervisorctl -c ~/srv/slapos/etc/supervisord.conf shutdown
  supervisorctl -c ~/srv/slapos/inst/etc/supervisord.conf shutdown

Restart slappartX:slapos-standalone-instance-XXX-on-watch from host slapos
parent 802059cc
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
[instance] [instance]
filename = instance.cfg.in filename = instance.cfg.in
md5sum = ffd236ddd021cb1476815321d7f82085 md5sum = c266e01ede36f6e8dfc97bc3b17d2b26
[yarn.lock] [yarn.lock]
filename = yarn.lock filename = yarn.lock
......
...@@ -173,7 +173,7 @@ template = ...@@ -173,7 +173,7 @@ template =
], ],
"options": { "options": {
"env": { "env": {
"SLAPOS_CONFIGURATION": "$${slapos-standalone-activate:slapos-configuration}", "SLAPOS_CONFIGURATION": "$${slapos-standalone-config:slapos-configuration}",
"GIT_EXEC_PATH": "" "GIT_EXEC_PATH": ""
} }
}, },
...@@ -197,7 +197,7 @@ template = ...@@ -197,7 +197,7 @@ template =
], ],
"options": { "options": {
"env": { "env": {
"SLAPOS_CONFIGURATION": "$${slapos-standalone-activate:slapos-configuration}", "SLAPOS_CONFIGURATION": "$${slapos-standalone-config:slapos-configuration}",
"GIT_EXEC_PATH": "" "GIT_EXEC_PATH": ""
} }
}, },
...@@ -242,7 +242,7 @@ hash-existing-files = ...@@ -242,7 +242,7 @@ hash-existing-files =
${yarn.lock:output} ${yarn.lock:output}
${theia-wrapper:rendered} ${theia-wrapper:rendered}
ip = $${instance-parameter:ipv4-random} ip = $${instance-parameter:ipv4-random}
hostname = $${:ip} hostname = $${:ip}
port = $${theia-service:port} port = $${theia-service:port}
base-url = $${theia-service:base-url} base-url = $${theia-service:base-url}
...@@ -281,31 +281,49 @@ command = ...@@ -281,31 +281,49 @@ command =
${buildout:bin-directory}/slapos complete > $${directory:bash-completions}/slapos ${buildout:bin-directory}/slapos complete > $${directory:bash-completions}/slapos
${buildout:bin-directory}/slapos complete --shell fish > $${directory:fish-completions}/slapos.fish ${buildout:bin-directory}/slapos complete --shell fish > $${directory:fish-completions}/slapos.fish
[slapos-standalone-config]
ipv4 = $${instance-parameter:ipv4-random}
ipv6 = $${instance-parameter:ipv6-random}
port = 4000
slapos-configuration = $${directory:slapos}/etc/slapos.cfg
[slapos-standalone-activate] [slapos-standalone-activate]
recipe = slapos.recipe.template:jinja2 recipe = slapos.recipe.template:jinja2
rendered = $${directory:bin}/$${:_buildout_section_name_} rendered = $${directory:bin}/$${:_buildout_section_name_}
mode = 0700 mode = 0700
# XXX maybe standalone slapos should provide an activate script like virtualenv is doing? template =
inline:#!/bin/sh
export SLAPOS_CONFIGURATION=$${slapos-standalone-config:slapos-configuration}
export SLAPOS_CLIENT_CONFIGURATION=$SLAPOS_CONFIGURATION
[slapos-standalone]
recipe = slapos.recipe.template:jinja2
rendered = $${directory:bin}/$${:_buildout_section_name_}
mode = 0700
template = template =
inline:#!/bin/sh inline:#!/bin/sh
export PATH=${buildout:bin-directory}:$PATH export PATH=${buildout:bin-directory}:$PATH
${slapos-standalone:script-path} \ exec ${slapos-standalone:script-path} \
$${directory:slapos} \ $${directory:slapos} \
$${:ipv4} \ $${slapos-standalone-config:ipv4} \
$${:ipv6} \ $${slapos-standalone-config:ipv6} \
$${:port} \ $${slapos-standalone-config:port} \
$${slap-connection:server-url} \ $${slap-connection:server-url} \
$${slap-connection:computer-id} \ $${slap-connection:computer-id} \
$${slap-connection:partition-id} \ $${slap-connection:partition-id} \
--key='$${slap-connection:key-file}' \ --key='$${slap-connection:key-file}' \
--cert='$${slap-connection:cert-file}' --cert='$${slap-connection:cert-file}'
export SLAPOS_CONFIGURATION=$${:slapos-configuration}
export SLAPOS_CLIENT_CONFIGURATION=$SLAPOS_CONFIGURATION
ipv4 = $${instance-parameter:ipv4-random} [slapos-standalone-instance]
ipv6 = $${instance-parameter:ipv6-random} recipe = slapos.cookbook:wrapper
port = 4000 wrapper-path = $${directory:services}/$${:_buildout_section_name_}
slapos-configuration = $${directory:slapos}/etc/slapos.cfg command-line = $${slapos-standalone:rendered}
hash-files =
$${slapos-standalone:rendered}
$${slapos-standalone-config:slapos-configuration}
hostname = $${slapos-standalone-config:ipv4}
port = $${slapos-standalone-config:port}
[promises] [promises]
recipe = recipe =
...@@ -313,6 +331,7 @@ instance-promises = ...@@ -313,6 +331,7 @@ instance-promises =
$${theia-listen-promise:name} $${theia-listen-promise:name}
$${frontend-listen-promise:name} $${frontend-listen-promise:name}
$${apache-frontend-url-available-promise:name} $${apache-frontend-url-available-promise:name}
$${slapos-standalone-listen-promise:name}
[theia-listen-promise] [theia-listen-promise]
<= monitor-promise-base <= monitor-promise-base
...@@ -335,6 +354,14 @@ name = $${:_buildout_section_name_}.py ...@@ -335,6 +354,14 @@ name = $${:_buildout_section_name_}.py
config-url = $${apache-frontend:connection-secure_access} config-url = $${apache-frontend:connection-secure_access}
config-check-secure = 1 config-check-secure = 1
[slapos-standalone-listen-promise]
<= monitor-promise-base
module = check_port_listening
# XXX promise plugins can not contain "slapos" in their names
name = standalone-listen-promise.py
config-hostname = $${slapos-standalone-instance:hostname}
config-port = $${slapos-standalone-instance:port}
[apache-frontend] [apache-frontend]
<= slap-connection <= slap-connection
recipe = slapos.cookbook:requestoptional recipe = slapos.cookbook:requestoptional
......
...@@ -56,9 +56,11 @@ entry-points = ...@@ -56,9 +56,11 @@ entry-points =
${:scripts}=not_used:main ${:scripts}=not_used:main
initialization = initialization =
import argparse import argparse
import glob
import os.path import os.path
import sys import sys
import glob import signal
import time
import slapos.slap.standalone import slapos.slap.standalone
...@@ -105,7 +107,20 @@ initialization = ...@@ -105,7 +107,20 @@ initialization =
args.ipv4, args.ipv4,
args.ipv6 args.ipv6
) )
print ("Standalone SlapOS for computer `{}` activated".format(standalone.computer._computer_id)) print ("Standalone SlapOS for computer `{}` started".format(standalone.computer._computer_id))
quit_requested = []
def signal_handler(signum, frame):
print("Signal {signum} received".format(signum=signum))
quit_requested.append(True)
signal.signal(signal.SIGTERM, signal_handler)
while not quit_requested:
time.sleep(.1)
print("Stopping standalone subsystem")
standalone.stop()
print("Exiting")
sys.exit(0) sys.exit(0)
needs-these-eggs-scripts-in-path = needs-these-eggs-scripts-in-path =
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment