diff --git a/software/theia/buildout.hash.cfg b/software/theia/buildout.hash.cfg index 9ec0e03977bd66deeaa8282acc1790b7ca0cb2fd..9169d0f7eca087b95d00a6be3224a99998dbbb9b 100644 --- a/software/theia/buildout.hash.cfg +++ b/software/theia/buildout.hash.cfg @@ -15,11 +15,11 @@ [instance-theia] _update_hash_filename_ = instance-theia.cfg.jinja.in -md5sum = 776d9275483b7378d13c5cf43a0ad886 +md5sum = 78c99ef4799063dc5b67e76b8dba2112 [instance] _update_hash_filename_ = instance.cfg.in -md5sum = 4d8d3a351f17c45048fd3ffaee978875 +md5sum = 94703df1104405a5a73aa1bc980ea370 [instance-import] _update_hash_filename_ = instance-import.cfg.jinja.in diff --git a/software/theia/instance-theia.cfg.jinja.in b/software/theia/instance-theia.cfg.jinja.in index 3832e8f330767f401ec75199f539f64a7913e035..88ff71cb73472e9a9effb075c26715231f6f138a 100644 --- a/software/theia/instance-theia.cfg.jinja.in +++ b/software/theia/instance-theia.cfg.jinja.in @@ -444,6 +444,39 @@ command = ${buildout:bin-directory}/slapos complete --shell fish > $${directory:fish-completions}/slapos.fish +# Embedded Instance +# ----------------- + +{%- set embedded_sr = parameter_dict['embedded-sr'] %} +{%- set embedded_sr_type = parameter_dict['embedded-sr-type'] %} +{%- set embedded_instance_parameters = parameter_dict['embedded-instance-parameters'] %} +{%- if embedded_sr %} +{%- if embedded_sr.startswith('~/') %} +{%- set embedded_sr = os_module.path.join(partition_root_path, embedded_sr[2:]) %} +{%- set embedded_sr = os_module.path.normpath(embedded_sr) %} +{%- endif %} +[request-embedded-instance-script] +recipe = slapos.recipe.template:jinja2 +rendered = $${directory:project}/request_embedded.sh +mode = 0700 +template = + inline:#!/bin/sh + + slapos supply {{ embedded_sr }} slaprunner + + slapos request "Embedded Instance" {{ embedded_sr }} +{%- if embedded_sr_type %} --type {{ embedded_sr_type }} {%- endif %} +{%- if embedded_instance_parameters %} --parameters-file $${embedded-instance-parameters:rendered} + +[embedded-instance-parameters] +recipe = slapos.recipe.template:jinja2 +rendered = $${directory:project}/$${:_buildout_section_name_}.json +template = + inline:{{ embedded_instance_parameters | indent(2) }} +{%- endif %} +{%- endif %} + + # SlapOS Standalone # ----------------- @@ -488,12 +521,8 @@ template = $${slapos-standalone-config:port} \ $${slapos-standalone-config:local-software-release-root} \ $${slapos-standalone-config:computer-id} \ - {%- if parameter_dict.get('embedded-sr') %} - --sr='{{ parameter_dict['embedded-sr'] }}' \ - {%- if parameter_dict.get('embedded-sr-type') %} - --srtype='{{ parameter_dict['embedded-sr-type'] }}' \ - {%- endif %} - --srparams='$${embedded-instance-parameters:rendered}' \ + {%- if embedded_sr %} + --slapos_script=$${request-embedded-instance-script:rendered} \ {%- endif %} $${slap-connection:server-url} \ $${slap-connection:computer-id} \ @@ -622,14 +651,6 @@ recipe = slapos.cookbook:symbolic.link target-directory = $${directory:project} link-binary = $${directory:runner} -{% if parameter_dict.get('embedded-sr') -%} -[embedded-instance-parameters] -recipe = slapos.recipe.template:jinja2 -rendered = $${directory:etc}/$${:_buildout_section_name_}.json -template = - inline:{{ parameter_dict['embedded-instance-parameters'] | indent(2) }} -{%- endif %} - [request-script-template] recipe = slapos.recipe.template:jinja2 rendered = $${directory:project}/$${:_buildout_section_name_}.sh diff --git a/software/theia/instance.cfg.in b/software/theia/instance.cfg.in index 53954b32feb4755d1d3ec7030f7e207b492feb0f..7cca1277be3d88310b92147976369ba135530647 100644 --- a/software/theia/instance.cfg.in +++ b/software/theia/instance.cfg.in @@ -36,14 +36,16 @@ context = jsonkey default_parameter_dict :default-parameters key parameter_dict slap-configuration:configuration key root_title slap-configuration:root-instance-title + key partition_root_path buildout:directory key ipv6_random slap-configuration:ipv6-random key ipv4_random slap-configuration:ipv4-random + import os_module os default-parameters = { "autorun": "running", "embedded-sr": null, "embedded-sr-type": null, - "embedded-instance-parameters": "null", + "embedded-instance-parameters": null, "frontend-name": "Theia Frontend", "frontend-sr": "$${:frontend-sr}", "frontend-sr-type": "RootSoftwareInstance", diff --git a/software/theia/software.cfg b/software/theia/software.cfg index fcffde8fccd01dd2ed0c76fe475e1fcef7801986..1325da898fd0a005cc0f42c3eeea62a61e3fb4a6 100644 --- a/software/theia/software.cfg +++ b/software/theia/software.cfg @@ -62,6 +62,7 @@ initialization = import os import signal import socket + import subprocess import sys import time @@ -74,9 +75,7 @@ initialization = parser.add_argument('server_port', type=int) parser.add_argument('local_software_release_root') parser.add_argument('computer_id') - parser.add_argument('--sr') - parser.add_argument('--srtype') - parser.add_argument('--srparams') + parser.add_argument('--slapos_script') forwarded_arguments = parser.add_argument_group('forwarded') forwarded_arguments.add_argument('master_url') forwarded_arguments.add_argument('computer') @@ -130,25 +129,14 @@ initialization = except slapos.slap.standalone.SlapOSNodeCommandError as e: print("Error instanciating: {}".format(e)) - if args.sr: - try: - with open(args.srparams) as f: - params = json.load(f) - except Exception: - params = None - if not isinstance(params, dict): - params = None - print("Supplying and Requesting Embedded Software {sr} with type {srtype}".format( - sr=args.sr, srtype=args.srtype)) - print("With parameters {param_dict} parsed from '{srparams}'".format( - param_dict=params, srparams=args.srparams)) - standalone.supply(args.sr) - standalone.request( - args.sr, - "Embedded Instance", - args.srtype, - partition_parameter_kw=params, - ) + if args.slapos_script: + print("Running SlapOS script {}".format(args.slapos_script)) + slapos_env = { + 'PATH': os.path.dirname(standalone._slapos_bin), + 'SLAPOS_CONFIGURATION': standalone._slapos_config, + 'SLAPOS_CLIENT_CONFIGURATION': standalone._slapos_config + } + subprocess.call((args.slapos_script,), env=slapos_env) s = socket.socket(socket.AF_UNIX) s.bind('\0' + os.path.join(args.base_directory, 'standalone_ready')) diff --git a/software/theia/test/test.py b/software/theia/test/test.py index bd6c4087200be3bf3ec4bd9cd4e1cf7543e44cb3..af7aa9e84728d2263f3adac782ce6d926b35ee1b 100644 --- a/software/theia/test/test.py +++ b/software/theia/test/test.py @@ -230,9 +230,9 @@ class TestTheiaEmbeddedSlapOSShutdown(TheiaTestCase): class TestTheiaWithSR(TheiaTestCase): - sr_url = 'bogus/software.cfg' + sr_url = '~/bogus/software.cfg' sr_type = 'bogus_type' - instance_parameters = '{\n"bogus_param": "bogus_value"\n}' + instance_parameters = '{\n"bogus_param": "bogus_value",\n"bogus_param2": "bogus_value2"\n}' @classmethod def getInstanceParameterDict(cls): @@ -243,15 +243,18 @@ class TestTheiaWithSR(TheiaTestCase): } def test(self): + home = self.computer_partition_root_path + bogus_sr = os.path.join(home, self.sr_url[2:]) + slapos = self._getSlapos() info = subprocess.check_output((slapos, 'proxy', 'show'), universal_newlines=True) instance_name = "Embedded Instance" - self.assertIsNotNone(re.search(r"%s\s+slaprunner\s+available" % (self.sr_url,), info), info) - self.assertIsNotNone(re.search(r"%s\s+%s\s+%s" % (self.sr_url, self.sr_type, instance_name), info), info) + self.assertIsNotNone(re.search(r"%s\s+slaprunner\s+available" % (bogus_sr,), info), info) + self.assertIsNotNone(re.search(r"%s\s+%s\s+%s" % (bogus_sr, self.sr_type, instance_name), info), info) service_info = subprocess.check_output((slapos, 'service', 'info', instance_name), universal_newlines=True) - self.assertIn("{'bogus_param': 'bogus_value'}", service_info) + self.assertIn("{'bogus_param': 'bogus_value', 'bogus_param2': 'bogus_value2'}", service_info) class TestTheiaFrontend(TheiaTestCase):