{% set additional_frontend = slapparameter_dict.get('frontend-additional-instance-guid') %} [buildout] parts = instance publish-connection-parameter jupyter-notebook-config erp5-kernel kernel-json custom-js frontend-promise {% if additional_frontend %} frontend-additional-promise {% endif %} monitor-base extends = {{ monitor_template_rendered }}/template-monitor.cfg eggs-directory = {{ eggs_directory }} develop-eggs-directory = {{ develop_eggs_directory }} offline = true [slapconfiguration] recipe = slapos.cookbook:slapconfiguration.serialised computer = ${slap-connection:computer-id} partition = ${slap-connection:partition-id} url = ${slap-connection:server-url} key = ${slap-connection:key-file} cert = ${slap-connection:cert-file} # ERP5 URL to use in Jupyter by default # default value is empty - which means no default ERP5 URL configuration.erp5-url = [instance-parameter] port = 8888 host = ${slapconfiguration:ipv6-random} cert_file = ${generate-certificate:cert_file} key_file = ${generate-certificate:key_file} logfile = ${directory:log}/jupyter_notebook.log notebook_dir = ${directory:notebook_dir} [slap-parameter] frontend-software-type = RootSoftwareInstance frontend-software-url = http://git.erp5.org/gitweb/slapos.git/blob_plain/HEAD:/software/apache-frontend/software.cfg frontend-instance-guid = frontend-instance-name = Jupyter Frontend frontend-additional-software-type = RootSoftwareInstance frontend-additional-software-url = http://git.erp5.org/gitweb/slapos.git/blob_plain/HEAD:/software/apache-frontend/software.cfg frontend-additional-instance-guid = frontend-additional-instance-name = Jupyter Frontend Additional {% for k, v in slapparameter_dict.items() -%} {{ k }} = {{ v }} {% endfor -%} [dynamic-jinja2-template-base] recipe = slapos.recipe.template:jinja2 mode = 0644 [generate-certificate] ; TODO: there is a slapos recipe to generate certificates. Use it instead recipe = plone.recipe.command command = if [ ! -e ${instance-parameter:key_file} ] then {{ openssl_output }} req -x509 -nodes -days 3650 \ -subj "/C=AA/ST=X/L=X/O=Dis/CN=${instance-parameter:host}" \ -newkey rsa:1024 -keyout ${instance-parameter:key_file} \ -out ${instance-parameter:cert_file} fi update-command = ${:command} cert_file = ${directory:etc}/jupyter_cert.crt key_file = ${directory:etc}/jupyter_cert.key [instance] recipe = slapos.cookbook:wrapper command-line = {{ bin_directory }}/jupyter-lab --no-browser --ip=${instance-parameter:host} --port=${instance-parameter:port} --port-retries=0 --certfile=${instance-parameter:cert_file} --keyfile=${instance-parameter:key_file} --notebook-dir=${instance-parameter:notebook_dir} --log-level="DEBUG" wrapper-path = ${directory:service}/jupyter-lab environment = JUPYTER_PATH=${directory:jupyter_dir} JUPYTER_CONFIG_DIR=${directory:jupyter_config_dir} JUPYTER_RUNTIME_DIR=${directory:jupyter_runtime_dir} LANG=C.UTF-8 [jupyter-password] recipe = slapos.cookbook:generate.password bytes = 10 [jupyter-notebook-config] <= dynamic-jinja2-template-base template = {{ jupyter_config_location }}/{{ jupyter_config_filename }} rendered = ${directory:jupyter_config_dir}/jupyter_notebook_config.py mode = 0744 context = key password jupyter-password:passwd raw gcc_location {{ gcc_location }} raw cythonplus_repository {{ cythonplus_repository }} [directory] recipe = slapos.cookbook:mkdirectory home = ${buildout:directory} etc = ${:home}/etc var = ${:home}/var script = ${:etc}/run/ service = ${:etc}/service log = ${:var}/log notebook_dir = ${:var}/notebooks # Add folders to explicitly define jupyter directory jupyter_dir = ${:home}/jupyter jupyter_config_dir = ${:jupyter_dir}/etc jupyter_kernel_dir = ${:jupyter_dir}/kernels jupyter_runtime_dir = ${:jupyter_dir}/runtime jupyter_custom_dir = ${:jupyter_config_dir}/custom jupyter_nbextensions_dir = ${:jupyter_dir}/nbextensions erp5_kernel_dir = ${:jupyter_kernel_dir}/ERP5 [request-slave-frontend-base] recipe = slapos.cookbook:requestoptional server-url = ${slap-connection:server-url} key-file = ${slap-connection:key-file} cert-file = ${slap-connection:cert-file} computer-id = ${slap-connection:computer-id} partition-id = ${slap-connection:partition-id} slave = true config-type = notebook config-url = https://[${instance-parameter:host}]:${instance-parameter:port} return = secure_access [request-slave-frontend] <= request-slave-frontend-base software-url = ${slap-parameter:frontend-software-url} software-type = ${slap-parameter:frontend-software-type} name = ${slap-parameter:frontend-instance-name} sla-instance_guid = ${slap-parameter:frontend-instance-guid} [frontend-promise] <= monitor-promise-base module = check_url_available name = frontend_promise.py config-url = ${publish-connection-parameter:url} {% if additional_frontend %} [request-slave-frontend-additional] <= request-slave-frontend-base software-url = ${slap-parameter:frontend-additional-software-url} software-type = ${slap-parameter:frontend-additional-software-type} name = ${slap-parameter:frontend-additional-instance-name} sla-instance_guid = ${slap-parameter:frontend-additional-instance-guid} [frontend-additional-promise] <= monitor-promise-base module = check_url_available name = frontend_additional_promise.py config-url = ${publish-connection-parameter:url-additional} {% endif %} [monitor-instance-parameter] monitor-base-url = ${monitor-frontend-promise:url} # In case you're using a developer instance you should edit these in: # monitor-base-url = ${monitor-httpd-conf-parameter:url} # cors-domains = softinstXXXXX.host.vifib.net (or equivalent) # interface-url = https://softinstXXXXX.host.vifib.net/erp5/web_site_module/monitoring_rjs_unsafe instance-configuration = raw jupyter-password ${jupyter-password:passwd} [publish-connection-parameter] recipe = slapos.cookbook:publish jupyter-classic-url = ${request-slave-frontend:connection-secure_access}/tree url = ${:jupyter-classic-url} jupyterlab-url = ${request-slave-frontend:connection-secure_access}/lab {% if additional_frontend %} jupyter-classic-url-additional = ${request-slave-frontend-additional:connection-secure_access}/tree url-additional = ${:jupyter-classic-url-additional} jupyterlab-url-additional = ${request-slave-frontend-additional:connection-secure_access}/lab {% endif %} password = ${jupyter-password:passwd} [erp5-kernel] recipe = slapos.cookbook:symbolic.link link-binary = {{ erp5_kernel_location }}/{{ erp5_kernel_filename }} target-directory = ${directory:erp5_kernel_dir} [kernel-json] <= dynamic-jinja2-template-base template = {{ kernel_json_location }}/{{ kernel_json_filename }} rendered = ${directory:erp5_kernel_dir}/kernel.json # Use python2.7 executable bin file for kernel config context = raw python_executable {{ python_executable }} raw kernel_dir ${erp5-kernel:target-directory}/{{ erp5_kernel_filename }} key erp5_url slapconfiguration:configuration.erp5-url raw display_name ERP5 raw language_name python [custom-js] recipe = slapos.cookbook:symbolic.link target-directory = ${directory:jupyter_custom_dir} link-binary = {{ custom_js_location }}/custom.js