Commit 982e8466 authored by Joanne Hugé's avatar Joanne Hugé

Update Release Candidate

parents 9f30e19d bb44e5d5
# Dovecot
# https://doc.dovecot.org/
[buildout]
extends =
../lua/buildout.cfg
../openssl/buildout.cfg
../zlib/buildout.cfg
[dovecot]
recipe = slapos.recipe.cmmi
url = https://dovecot.org/releases/2.3/dovecot-2.3.20.tar.gz
md5sum = b8add62d0311dcc95ac25b379e8ba043
location = @@LOCATION@@
configure-options =
--enable-maintainer-mode
--prefix=${:location}
--exec-prefix=${:location}
--with-systemd=no
--with-lua=yes
--with-libcrypto=${openssl:location}
environment =
PATH=${pkgconfig:location}/bin:%(PATH)s
PKG_CONFIG_PATH=${lua:location}/lib/pkgconfig
LUA_LIBS=-L${lua:location}/lib -Wl,-rpath=${lua:location}/lib -llua -lm
LUA_CFLAGS=-I${lua:location}/include
LDFLAGS=-L${openssl:location}/lib -Wl,-rpath=${openssl:location}/lib -L${zlib:location}/lib -Wl,-rpath=${zlib:location}/lib
make-targets = install
post-install = cp -r ${:location}/share/doc/dovecot/example-config/* ${:location}/etc/dovecot/
From cfdd177131b8f453c024ad3008da4951aab16a50 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9rome=20Perrin?= <jerome@nexedi.com>
Date: Tue, 2 May 2023 13:53:46 +0900
Subject: [PATCH] Add a confirmation prompt on ``Delete All Objects`` button
(#19)
Co-authored-by: Michael Howitz <icemac@gmx.net>
patch amended to remove the changelog entry
---
src/Products/BTreeFolder2/contents.dtml | 2 +-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/src/Products/BTreeFolder2/contents.dtml b/src/Products/BTreeFolder2/contents.dtml
index d00e04a..9629700 100644
--- a/src/Products/BTreeFolder2/contents.dtml
+++ b/src/Products/BTreeFolder2/contents.dtml
@@ -82,7 +82,7 @@ function toggleSelect() {
<input class="form-element" type="submit" name="manage_delObjects:method"
value="Delete" />
<input class="form-element" type="submit" name="manage_delAllObjects:method"
- value="Delete All Objects" />
+ value="Delete All Objects" onClick="return confirm('Really delete all objects?')"/>
</dtml-if>
<dtml-if "_.SecurityCheckPermission('Import/Export objects', this())">
<input class="form-element" type="submit"
--
2.39.1
...@@ -128,6 +128,7 @@ command = ...@@ -128,6 +128,7 @@ command =
sed -i 's#DefaultZone=public#DefaultZone=trusted#' ${firewalld:etc-dir}/firewalld.conf sed -i 's#DefaultZone=public#DefaultZone=trusted#' ${firewalld:etc-dir}/firewalld.conf
sed -i 's#FirewallBackend=nftables#FirewallBackend=iptables#' ${firewalld:etc-dir}/firewalld.conf sed -i 's#FirewallBackend=nftables#FirewallBackend=iptables#' ${firewalld:etc-dir}/firewalld.conf
sed -i 's#IPv6_rpfilter=yes#IPv6_rpfilter=no#' ${firewalld:etc-dir}/firewalld.conf
sed -i "s#'/etc/firewalld'#'${firewalld:etc-dir}'#" ${firewalld:python-egg}/firewall/config/__init__.py sed -i "s#'/etc/firewalld'#'${firewalld:etc-dir}'#" ${firewalld:python-egg}/firewall/config/__init__.py
sed -i "s#'/usr/lib/firewalld'#'${firewalld:location}/lib/firewalld'#" ${firewalld:python-egg}/firewall/config/__init__.py sed -i "s#'/usr/lib/firewalld'#'${firewalld:location}/lib/firewalld'#" ${firewalld:python-egg}/firewall/config/__init__.py
......
...@@ -18,8 +18,8 @@ parts = ...@@ -18,8 +18,8 @@ parts =
fluentbit-plugin-wendelin fluentbit-plugin-wendelin
[fluentbit-plugin-wendelin] [fluentbit-plugin-wendelin]
url = https://lab.nexedi.com/nexedi/fluentbit-plugin-wendelin/-/archive/0.3.2/fluentbit-plugin-wendelin-0.3.2.tar.gz url = https://lab.nexedi.com/nexedi/fluentbit-plugin-wendelin/-/archive/0.3.3/fluentbit-plugin-wendelin-0.3.3.tar.gz
md5sum = 3d5c1e0457ec1ab46a4e464eba6a1abc md5sum = 982b76021a30384e7ecfc05d55e3419a
[golang1.17] [golang1.17]
# Using "./make.bash" instead of "./all.bash" disables golang tests. Some of these tests attempt to use the network, which fails on OBS' VM. # Using "./make.bash" instead of "./all.bash" disables golang tests. Some of these tests attempt to use the network, which fails on OBS' VM.
......
...@@ -28,3 +28,27 @@ pc = ...@@ -28,3 +28,27 @@ pc =
Version: $${version} Version: $${version}
Libs: -L$${libdir} -llua Libs: -L$${libdir} -llua
Cflags: -I$${includedir} Cflags: -I$${includedir}
[lua5.2]
recipe = slapos.recipe.cmmi
shared = true
url = http://www.lua.org/ftp/lua-5.2.3.tar.gz
md5sum = dc7f94ec6ff15c985d2d6ad0f1b35654
configure-command = true
make-options =
"$(uname -sr 2>/dev/null|grep -Eq '^Linux' && echo linux || echo posix)"
MYCFLAGS="-I${readline:location}/include -fPIC"
MYLDFLAGS="-L${readline:location}/lib -Wl,-rpath=${readline:location}/lib"
INSTALL_TOP=@@LOCATION@@
post-install =
mkdir -p %(location)s/lib/pkgconfig
{
make pc INSTALL_TOP=%(location)s
echo '%(pc)s'
} > %(location)s/lib/pkgconfig/lua.pc
pc =
Name: Lua
Description: Lua language engine
Version: $${version}
Libs: -L$${libdir} -llua
Cflags: -I$${includedir}
...@@ -9,8 +9,8 @@ parts = qjs-wrapper ...@@ -9,8 +9,8 @@ parts = qjs-wrapper
[qjs-wrapper] [qjs-wrapper]
recipe = slapos.recipe.cmmi recipe = slapos.recipe.cmmi
configure-command = true configure-command = true
url = https://lab.nexedi.com/nexedi/qjs-wrapper/-/archive/v1.2/qjs-wrapper-v1.2.tar.gz url = https://lab.nexedi.com/nexedi/qjs-wrapper/-/archive/v1.3/qjs-wrapper-v1.3.tar.gz
md5sum = e335fc2251610c09dde3e74787317d98 md5sum = 5f63356c6a10bf227e2641ea4f78c7a2
environment = environment =
C_INCLUDE_PATH=include:${open62541:location}/include:${open62541:location}/deps:${open62541:location}/src/pubsub:${quickjs:location}/include C_INCLUDE_PATH=include:${open62541:location}/include:${open62541:location}/deps:${open62541:location}/src/pubsub:${quickjs:location}/include
CPLUS_INCLUDE_PATH=include:${mavsdk:location}/include:${mavsdk:location}/include/mavsdk CPLUS_INCLUDE_PATH=include:${mavsdk:location}/include:${mavsdk:location}/include/mavsdk
......
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
"type": "string" "type": "string"
}, },
"bt5": { "bt5": {
"description": "Business Template to install at automatic site creation. By default, all configurators are installed.", "description": "A space-separated list of Business Templates to install at automatic site creation (e.g. \"erp5_full_text_mroonga_catalog erp5_base\"). By default, all configurators are installed.",
"type": "string" "type": "string"
}, },
"id-store-interval": { "id-store-interval": {
......
...@@ -25,9 +25,12 @@ ...@@ -25,9 +25,12 @@
# #
############################################################################## ##############################################################################
import contextlib
import datetime import datetime
import json import json
import pathlib import pathlib
import socket
import struct
import subprocess import subprocess
import time import time
import typing import typing
...@@ -68,7 +71,7 @@ class TestOrderBuildPackingListSimulation( ...@@ -68,7 +71,7 @@ class TestOrderBuildPackingListSimulation(
"mariadb": { "mariadb": {
# We use a large innodb-buffer-pool-size because the simulation # We use a large innodb-buffer-pool-size because the simulation
# select method used for sale packing list does not use index and # select method used for sale packing list does not use index and
# cause slpow queries # cause slow queries
"innodb-buffer-pool-size": 32 * 1024 * 1024 * 1024, # 32Go "innodb-buffer-pool-size": 32 * 1024 * 1024 * 1024, # 32Go
}, },
"zope-partition-dict": { "zope-partition-dict": {
...@@ -99,6 +102,41 @@ class TestOrderBuildPackingListSimulation( ...@@ -99,6 +102,41 @@ class TestOrderBuildPackingListSimulation(
self.measurement_file = open(f'measures{self.id()}.jsonl', 'w') self.measurement_file = open(f'measures{self.id()}.jsonl', 'w')
self.addCleanup(self.measurement_file.close) self.addCleanup(self.measurement_file.close)
# Describe the software used. TODO: use nxd-bom once integrated
self.write_measurement(
{
'type': 'sbom',
# content of runwsgi script, to know which versions of python packages were used
'runwsgi-content':
(pathlib.Path(
self.computer_partition_root_path
) / 'software_release' / 'bin' / 'runwsgi').read_text(),
'mysql-show-variables':
subprocess.check_output((
pathlib.Path(self.getComputerPartitionPath('mariadb')) / 'bin' / 'mysql',
'-e', 'show variables'), text=True),
'erp5-git-describe':
subprocess.check_output(
('git', 'describe', '--long'),
cwd=pathlib.Path(self.computer_partition_root_path) / 'software_release' / 'parts' / 'erp5',
text=True),
'erp5-git-diff':
subprocess.check_output(
('git', 'diff'),
cwd=pathlib.Path(self.computer_partition_root_path) / 'software_release' / 'parts' / 'erp5',
text=True),
'slapos-software-release-git-describe':
subprocess.check_output(
('git', 'describe', '--long'),
cwd=pathlib.Path(self.getSoftwareURL()).parent,
text=True),
'slapos-software-release-git-diff':
subprocess.check_output(
('git', 'diff'),
cwd=pathlib.Path(self.getSoftwareURL()).parent,
text=True),
})
def write_measurement( def write_measurement(
self, measurement: dict[str, typing.Union[str, float]]) -> None: self, measurement: dict[str, typing.Union[str, float]]) -> None:
json.dump( json.dump(
...@@ -129,6 +167,16 @@ class TestOrderBuildPackingListSimulation( ...@@ -129,6 +167,16 @@ class TestOrderBuildPackingListSimulation(
self.getComputerPartitionPath('zodb')) / 'srv' / 'zodb' / 'root.fs' self.getComputerPartitionPath('zodb')) / 'srv' / 'zodb' / 'root.fs'
root_fs_size = root_fs.stat().st_size root_fs_size = root_fs.stat().st_size
# ZEO stats ( using ruok protocol https://github.com/zopefoundation/ZEO/commit/d5082536 )
with contextlib.closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s:
s.connect((self._ipv4_address, 2100))
s.sendall(b'\x00\x00\x00\x04ruok')
_ = s.recv(struct.unpack(">I", s.recv(4))[0])
zeo_stats = json.loads(s.recv(struct.unpack(">I", s.recv(4))[0]))
# we are supposed to have only one storage with name "root"
zeo_root_stats = zeo_stats.pop('root')
assert not zeo_stats
self.logger.info( self.logger.info(
"Measurements for %s (after %s): " "Measurements for %s (after %s): "
"elapsed=%s zope_total_rss=%s / %s root_fs_size=%s", "elapsed=%s zope_total_rss=%s / %s root_fs_size=%s",
...@@ -147,6 +195,7 @@ class TestOrderBuildPackingListSimulation( ...@@ -147,6 +195,7 @@ class TestOrderBuildPackingListSimulation(
'zope_total_rss': zope_total_rss, 'zope_total_rss': zope_total_rss,
'zope_count': zope_count, 'zope_count': zope_count,
'root_fs_size': root_fs_size, 'root_fs_size': root_fs_size,
'zeo_stats': zeo_root_stats,
'now': str(now), 'now': str(now),
}) })
...@@ -161,6 +210,8 @@ class TestOrderBuildPackingListSimulation( ...@@ -161,6 +210,8 @@ class TestOrderBuildPackingListSimulation(
params={'user_quantity:int': 1}) params={'user_quantity:int': 1})
if not ret.ok: if not ret.ok:
self.logger.error(ret.text) self.logger.error(ret.text)
if self._debug:
breakpoint()
ret.raise_for_status() ret.raise_for_status()
self._waitForActivities( self._waitForActivities(
timeout=datetime.timedelta(hours=2).total_seconds()) timeout=datetime.timedelta(hours=2).total_seconds())
...@@ -197,6 +248,8 @@ class TestOrderBuildPackingListSimulation( ...@@ -197,6 +248,8 @@ class TestOrderBuildPackingListSimulation(
) )
if not ret.ok: if not ret.ok:
self.logger.error(ret.text) self.logger.error(ret.text)
if self._debug:
breakpoint()
ret.raise_for_status() ret.raise_for_status()
self._waitForActivities( self._waitForActivities(
timeout=datetime.timedelta(hours=2).total_seconds()) timeout=datetime.timedelta(hours=2).total_seconds())
...@@ -216,8 +269,8 @@ class TestOrderBuildPackingListSimulation( ...@@ -216,8 +269,8 @@ class TestOrderBuildPackingListSimulation(
# and a pt-query-digest for slow log # and a pt-query-digest for slow log
pt_query_digest = pathlib.Path( pt_query_digest = pathlib.Path(
self.computer_partition_root_path self.getComputerPartitionPath(
) / 'software_release' / 'parts' / 'percona-toolkit' / 'bin' / 'pt-query-digest' 'mariadb')) / 'bin' / 'pt-query-digest'
mariadb_slowquery_log = pathlib.Path( mariadb_slowquery_log = pathlib.Path(
self.getComputerPartitionPath( self.getComputerPartitionPath(
'mariadb')) / 'var' / 'log' / 'mariadb_slowquery.log' 'mariadb')) / 'var' / 'log' / 'mariadb_slowquery.log'
...@@ -227,5 +280,3 @@ class TestOrderBuildPackingListSimulation( ...@@ -227,5 +280,3 @@ class TestOrderBuildPackingListSimulation(
subprocess.check_output( subprocess.check_output(
(pt_query_digest, mariadb_slowquery_log), text=True) (pt_query_digest, mariadb_slowquery_log), text=True)
}) })
breakpoint()
...@@ -460,6 +460,8 @@ class ZopeSkinsMixin: ...@@ -460,6 +460,8 @@ class ZopeSkinsMixin:
pass pass
time.sleep(5) time.sleep(5)
else: else:
if cls._debug:
breakpoint()
raise AssertionError("Timeout waiting for activities") raise AssertionError("Timeout waiting for activities")
@classmethod @classmethod
......
...@@ -13,6 +13,10 @@ ...@@ -13,6 +13,10 @@
# section inheritance (< = ...) are NOT supported (but you should really # section inheritance (< = ...) are NOT supported (but you should really
# not need these here). # not need these here).
[instance-cfg] [template]
filename = instance.cfg.in filename = instance.cfg.in
md5sum = 38c79a4952a7cb63698135f1d1ed6c8c md5sum = 1747b8cda8d815055453420de4ed677f
[template-default]
filename = instance-default.cfg.in
md5sum = fa9bd07d6a5fcf55e9548f63a943f022
{
"type": "object",
"$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters",
"properties": {
"allow_subgroups": {
"title": "Allow subgroups",
"description": "Subgroups are automatically created when first accessed",
"type": "boolean",
"default": false
},
"use_password": {
"title": "Use password",
"description": "Use a password for presenter",
"type": "boolean",
"default": true
}
}
}
{% if slapparameter_dict.get("use_password", True) %}
{% set presenter_password = "nexedi" %}
{% else %}
{% set presenter_password = "" %}
{% endif %}
[buildout]
parts =
publish-connection-parameter
stat-password
monitor-base
port-listening-promise
galene-service
{% if slapparameter_dict.get('dns_sr_url', '') %}
request-dns-entry
{% endif %}
extends = ${monitor-template:output}
eggs-directory = {{ eggs_directory }}
develop-eggs-directory = {{ develop_eggs_directory }}
offline = true
[publish-connection-parameter]
recipe = slapos.cookbook:publish
<= monitor-publish
url = https://[$${galene-wrapper:ip}]:$${galene-wrapper:port}
admin-user = $${admin-password:username}
admin-password = $${admin-password:passwd}
{% if slapparameter_dict.get('dns_sr_url', '') %}
domain-url = https://$${request-dns-entry:connection-domain}:$${galene-wrapper:port}
{% endif %}
[slap-configuration]
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'] }}
configuration.ice-servers.json = [{"urls":["stun:turn-paris-rapidspace.api.nexedi.net:443"]}]
[directory]
recipe = slapos.cookbook:mkdirectory
etc = $${buildout:directory}/etc
var = $${buildout:directory}/var
srv = $${buildout:directory}/srv
bin = $${buildout:directory}/bin
tmp = $${buildout:directory}/tmp
run = $${:var}/run
services = $${:etc}/service
data = $${:srv}/data
groups = $${:srv}/groups
recordings = $${:srv}/recordings
[galene-ssl]
recipe = plone.recipe.command
cert-file = $${directory:data}/cert.pem
key-file = $${directory:data}/key.pem
command = ${openssl:location}/bin/openssl req -newkey rsa:2048 -batch -new -x509 -days 3650 -nodes -keyout "$${:key-file}" -out "$${:cert-file}"
update-command =
stop-on-error = true
[admin-password]
recipe = slapos.cookbook:generate.password
storage-path = $${directory:data}/.passwd
username = admin
[stat-password]
recipe = slapos.recipe.template
inline =
$${admin-password:username}:$${admin-password:passwd}
output = $${directory:data}/passwd
[ice-servers.json]
recipe = slapos.recipe.template
inline =
$${slap-configuration:configuration.ice-servers.json}
output = $${directory:data}/ice-servers.json
[groups-json]
recipe = slapos.recipe.template
inline =
{
"public":true,
"op": [{"username":"$${admin-password:username}","password":"$${admin-password:passwd}"}],
"other": [],
"presenter": [{"username": "", "password": "{{ presenter_password }}"}],
{%- if slapparameter_dict.get("allow_subgroups", False) %}
"allow-subgroups": true
{%- else %}
"allow-subgroups": false
{%- endif %}
}
output = $${directory:groups}/public.json
[galene-service]
recipe = slapos.cookbook:wrapper
command-line = $${galene-wrapper:output}
wrapper-path = $${directory:services}/galene
mode = 0775
hash-files =
$${groups-json:output}
[galene-wrapper]
recipe = slapos.recipe.template
port = 8443
ip = $${slap-configuration:ipv6-random}
inline =
#!/bin/sh
ulimit -n $(ulimit -Hn)
exec ${gowork:bin}/galene \
-static ${galene:location}/static \
-recordings $${directory:recordings} \
-groups $${directory:groups} \
-data $${directory:data} \
-http [$${:ip}]:$${:port} \
-turn ""
output = $${directory:bin}/galene-wrapper
depends =
$${ice-servers.json:recipe}
$${groups-json:recipe}
$${galene-ssl:recipe}
[port-listening-promise]
<= monitor-promise-base
promise = check_socket_listening
name = galene-port-listening.py
config-host = $${slap-configuration:ipv6-random}
config-port = 8443
{% if slapparameter_dict.get('dns_sr_url', '') %}
[request-dns-entry]
name = dns-galene-entry
recipe = slapos.cookbook:request.serialised
software-url = {{ slapparameter_dict['dns_sr_url'] }}
software-type = core-network
server-url = {{ slap_connection['server-url'] }}
computer-id = {{ slap_connection['computer-id'] }}
partition-id = {{ slap_connection['partition-id'] }}
key-file = {{ slap_connection['key-file'] }}
cert-file = {{ slap_connection['cert-file'] }}
shared = true
sla-computer_guid = {{ slap_connection['computer-id'] }}
config-name = dns-galene-entry
config-subdomain = conference
config-ip = $${slap-configuration:ipv6-random}
return = domain ip
{% endif %}
{
"type": "object",
"$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters",
"properties": {
"allow_subgroups": {
"title": "Allow subgroups",
"description": "Subgroups are automatically created when first accessed",
"type": "boolean",
"default": false
},
"use_password": {
"title": "Use password",
"description": "Use a password for presenter",
"type": "boolean",
"default": true
},
"dns_sr_url": {
"default": "",
"title": "DNS SR URL",
"description": "URL of the SR running the DNS server",
"type": "string"
}
}
}
[buildout] [buildout]
parts = parts =
publish-connection-parameter switch-softwaretype
stat-password
eggs-directory = ${buildout:eggs-directory} eggs-directory = ${buildout:eggs-directory}
develop-eggs-directory = ${buildout:develop-eggs-directory} develop-eggs-directory = ${buildout:develop-eggs-directory}
offline = true offline = true
[publish-connection-parameter]
recipe = slapos.cookbook:publish
url = https://[$${galene-wrapper:ip}]:$${galene-wrapper:port}
admin-user = $${admin-password:username}
admin-password = $${admin-password:passwd}
[slap-configuration] [slap-configuration]
recipe = slapos.cookbook:slapconfiguration recipe = slapos.cookbook:slapconfiguration.serialised
computer = $${slap-connection:computer-id} computer = $${slap-connection:computer-id}
partition = $${slap-connection:partition-id} partition = $${slap-connection:partition-id}
url = $${slap-connection:server-url} url = $${slap-connection:server-url}
key = $${slap-connection:key-file} key = $${slap-connection:key-file}
cert = $${slap-connection:cert-file} cert = $${slap-connection:cert-file}
configuration.ice-servers.json = [{"urls":["stun:turn-paris-rapidspace.api.nexedi.net:443"]}]
[directory]
recipe = slapos.cookbook:mkdirectory
etc = $${buildout:directory}/etc
var = $${buildout:directory}/var
srv = $${buildout:directory}/srv
bin = $${buildout:directory}/bin
tmp = $${buildout:directory}/tmp
run = $${:var}/run
services = $${:etc}/service
data = $${:srv}/data
groups = $${:srv}/groups
recordings = $${:srv}/recordings
[galene-ssl]
recipe = plone.recipe.command
cert-file = $${directory:data}/cert.pem
key-file = $${directory:data}/key.pem
command = ${openssl:location}/bin/openssl req -newkey rsa:2048 -batch -new -x509 -days 3650 -nodes -keyout "$${:key-file}" -out "$${:cert-file}"
update-command =
stop-on-error = true
[admin-password]
recipe = slapos.cookbook:generate.password
storage-path = $${directory:data}/.passwd
username = admin
[stat-password]
recipe = slapos.recipe.template
inline =
$${admin-password:username}:$${admin-password:passwd}
output = $${directory:data}/passwd
[ice-servers.json]
recipe = slapos.recipe.template
inline =
$${slap-configuration:configuration.ice-servers.json}
output = $${directory:data}/ice-servers.json
[groups-json]
recipe = slapos.recipe.template
inline =
{
"public":true,
"op": [{"username":"$${admin-password:username}","password":"$${admin-password:passwd}"}],
"other": [],
"presenter": [{"username": "", "password": "nexedi"}]
}
output = $${directory:groups}/public.json
[galene-wrapper]
recipe = slapos.recipe.template
port = 8443
ip = $${slap-configuration:ipv6-random}
inline =
#!/bin/sh
ulimit -n $(ulimit -Hn)
exec ${gowork:bin}/galene \
-static ${galene:location}/static \
-recordings $${directory:recordings} \
-groups $${directory:groups} \
-data $${directory:data} \
-http [$${:ip}]:$${:port} \
-turn ""
output = $${directory:services}/galene
depends =
$${ice-servers.json:recipe}
$${groups-json:recipe}
$${galene-ssl:recipe}
[switch-softwaretype]
recipe = slapos.cookbook:switch-softwaretype
default = dynamic-template-default:output
RootSoftwareInstance = $${:default}
[dynamic-template-default]
recipe = slapos.recipe.template:jinja2
url = ${template-default:output}
output = $${buildout:parts-directory}/$${:_buildout_section_name_}/$${:filename}
filename = instance-default.cfg
context =
key eggs_directory buildout:eggs-directory
key develop_eggs_directory buildout:develop-eggs-directory
raw buildout_directory ${buildout:directory}
section slap_connection slap-connection
key slapparameter_dict slap-configuration:configuration
[buildout]
extends =
../../component/golang/buildout.cfg
../../component/openssl/buildout.cfg
../../stack/slapos.cfg
../../stack/monitor/buildout.cfg
buildout.hash.cfg
parts =
slapos-cookbook
eggs
template
template-default
# eggs for instance.cfg
[eggs]
recipe = zc.recipe.egg
eggs =
plone.recipe.command
collective.recipe.template
[galene]
<= go-git-package
go.importpath = lab.nexedi.com/nexedi/galene
repository = https://lab.nexedi.com/nexedi/galene.git
revision = galene-ptt-0.6.4
[gowork]
install =
${galene:location}:./...
environment =
CGO_ENABLED = 0
buildflags = -ldflags='-s -w'
[template]
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/${:filename}
output = ${buildout:directory}/template.cfg
[template-default]
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/${:filename}
output = ${buildout:directory}/template-default.cfg
[buildout]
extends =
software-base.cfg
[galene]
<= go-git-package
go.importpath = lab.nexedi.com/nexedi/galene
repository = https://lab.nexedi.com/nexedi/galene.git
revision = galene-ptt-0.6.4
{
"name": "Galene",
"description": "Galene Video-conferencing",
"serialisation": "json-in-xml",
"software-type": {
"default": {
"title": "default",
"software-type": "default",
"description": "default",
"request": "instance-ptt-default-input-schema.json",
"response": "instance-default-schema.json",
"index": 0
}
}
}
[buildout] [buildout]
extends = extends =
../../component/golang/buildout.cfg software-base.cfg
../../component/openssl/buildout.cfg
../../stack/slapos.cfg
buildout.hash.cfg
parts =
slapos-cookbook
eggs
instance-cfg
# eggs for instance.cfg
[eggs]
recipe = zc.recipe.egg
eggs =
plone.recipe.command
collective.recipe.template
[galene] [galene]
<= go-git-package <= go-git-package
go.importpath = lab.nexedi.com/nexedi/galene go.importpath = lab.nexedi.com/nexedi/galene
repository = https://lab.nexedi.com/nexedi/galene.git repository = https://lab.nexedi.com/nexedi/galene.git
revision = galene-0.6 revision = galene-0.7.1
[gowork]
install =
${galene:location}:./...
environment =
CGO_ENABLED = 0
buildflags = -ldflags='-s -w'
[instance-cfg]
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/${:filename}
output = ${buildout:directory}/instance.cfg
{
"name": "Galene",
"description": "Galene Video-conferencing",
"serialisation": "json-in-xml",
"software-type": {
"default": {
"title": "default",
"software-type": "default",
"description": "default",
"request": "instance-default-input-schema.json",
"response": "instance-default-schema.json",
"index": 0
}
}
}
...@@ -18,7 +18,7 @@ md5sum = 360b58007c25727b7bd8a9154d5cafd4 ...@@ -18,7 +18,7 @@ md5sum = 360b58007c25727b7bd8a9154d5cafd4
[instance-default] [instance-default]
filename = instance-default.cfg filename = instance-default.cfg
md5sum = b26633b118cddd7c7b8dfd61b360999c md5sum = 903939308701b11b1ff751784a9be110
[instance-drone] [instance-drone]
filename = instance-drone.cfg filename = instance-drone.cfg
...@@ -26,7 +26,7 @@ md5sum = 1ff50063f5a54712a0bc0ff38fa74630 ...@@ -26,7 +26,7 @@ md5sum = 1ff50063f5a54712a0bc0ff38fa74630
[main] [main]
filename = main.js filename = main.js
md5sum = 2118d7908a909c585e03531147b1d540 md5sum = d0bfcc79cdd7c1e5b8f5d264cc59074e
[pubsub] [pubsub]
filename = pubsub.js filename = pubsub.js
...@@ -34,4 +34,4 @@ md5sum = 1555496ad591a31a845f33488d5c335d ...@@ -34,4 +34,4 @@ md5sum = 1555496ad591a31a845f33488d5c335d
[worker] [worker]
filename = worker.js filename = worker.js
md5sum = 3893fb9228603e8c74f803476ec64dec md5sum = e4b4ca3bde1a21f1dbfc4ff7fa3b872c
{% set autopilot_ip = slapparameter_dict.get('autopilotIp', '192.168.27.1') -%} {% set autopilot_ip = slapparameter_dict.get('autopilotIp', '192.168.27.1') -%}
{% set autopilot_port = slapparameter_dict.get('autopilotPort', 7909) -%}
{% set flight_script = slapparameter_dict.get('flightScript', 'https://lab.nexedi.com/nexedi/flight-scripts/raw/master/default.js') -%} {% set flight_script = slapparameter_dict.get('flightScript', 'https://lab.nexedi.com/nexedi/flight-scripts/raw/master/default.js') -%}
{% set is_a_simulation = slapparameter_dict.get('isASimulation', False) -%} {% set is_a_simulation = slapparameter_dict.get('isASimulation', False) -%}
{% set multicast_ip = slapparameter_dict.get('multicastIp', 'ff15::1111') -%} {% set multicast_ip = slapparameter_dict.get('multicastIp', 'ff15::1111') -%}
...@@ -25,6 +26,7 @@ software-type = drone ...@@ -25,6 +26,7 @@ software-type = drone
return = instance-path return = instance-path
sla-computer_guid = {{ guid }} sla-computer_guid = {{ guid }}
config-autopilotIp = {{ autopilot_ip }} config-autopilotIp = {{ autopilot_ip }}
config-autopilotPort = {{ dumps(autopilot_port) }}
config-numberOfPeers = {{ dumps(nb_peer) }} config-numberOfPeers = {{ dumps(nb_peer) }}
config-id = {{ dumps(id) }} config-id = {{ dumps(id) }}
config-isASimulation = {{ dumps(is_a_simulation) }} config-isASimulation = {{ dumps(is_a_simulation) }}
......
...@@ -9,6 +9,11 @@ ...@@ -9,6 +9,11 @@
"description": "IP used to create a connection with the autopilot.", "description": "IP used to create a connection with the autopilot.",
"type": "string" "type": "string"
}, },
"autopilotPort": {
"title": "Port of the drone's autopilot",
"description": "Port on which autopilot service is running.",
"type": "integer"
},
"numberOfPeers": { "numberOfPeers": {
"title": "Number of Peers", "title": "Number of Peers",
"description": "Number of drones and subscribers in the swarm", "description": "Number of drones and subscribers in the swarm",
......
...@@ -10,6 +10,12 @@ ...@@ -10,6 +10,12 @@
"type": "string", "type": "string",
"default": "192.168.27.1" "default": "192.168.27.1"
}, },
"autopilotPort": {
"title": "Port of the drone's autopilot",
"description": "Port on which autopilot service is running.",
"type": "integer",
"default": "7909"
},
"droneGuidList": { "droneGuidList": {
"title": "List of drones computer ID", "title": "List of drones computer ID",
"description": "List of computer ID of drones in the swarm", "description": "List of computer ID of drones in the swarm",
......
...@@ -18,7 +18,6 @@ import { open, exit } from "std"; ...@@ -18,7 +18,6 @@ import { open, exit } from "std";
var CONF_PATH = {{ json_module.dumps(configuration) }}, var CONF_PATH = {{ json_module.dumps(configuration) }},
conf_file = open(CONF_PATH, "r"), conf_file = open(CONF_PATH, "r"),
configuration = JSON.parse(conf_file.readAsString()), configuration = JSON.parse(conf_file.readAsString()),
URL = "udp://" + configuration.autopilotIp + ":7909",
LOG_FILE = "{{ log_dir }}/mavsdk-log", LOG_FILE = "{{ log_dir }}/mavsdk-log",
pubsubWorker, pubsubWorker,
worker, worker,
...@@ -53,8 +52,12 @@ import { open, exit } from "std"; ...@@ -53,8 +52,12 @@ import { open, exit } from "std";
} }
function connect() { function connect() {
console.log("Will connect to", URL); var address = configuration.autopilotIp + ":" + configuration.autopilotPort;
exitOnFail(start(URL, LOG_FILE, 60), "Failed to connect to " + URL); console.log("Will connect to", address);
exitOnFail(
start(configuration.autopilotIp, configuration.autopilotPort, LOG_FILE, 60),
"Failed to connect to " + address
);
} }
if (configuration.isADrone) { if (configuration.isADrone) {
......
[buildout]
extends =
software.cfg
[sqdr-source]
recipe = slapos.recipe.build:gitclone
repository = https://lab.nexedi.com/slaposdrone/squadrone.git
revision = v1.0
git-executable = ${git:location}/bin/git
[qjs-wrapper]
recipe = slapos.recipe.cmmi
configure-command = true
url =
path = ${sqdr-source:location}
md5sum =
environment =
C_INCLUDE_PATH=include:${open62541:location}/include:${open62541:location}/deps:${open62541:location}/src/pubsub:${quickjs:location}/include
CPLUS_INCLUDE_PATH=include
LDFLAGS=-L${open62541:location}/lib -Wl,-rpath=${open62541:location}/lib -L${sqdr-source:location}/lib -Wl,-rpath=${sqdr-source:location}/lib
...@@ -255,6 +255,7 @@ class JSDroneTestCase(SlapOSInstanceTestCase): ...@@ -255,6 +255,7 @@ class JSDroneTestCase(SlapOSInstanceTestCase):
json.loads(self.get_partition('drone').getInstanceParameterDict()['_']), json.loads(self.get_partition('drone').getInstanceParameterDict()['_']),
{ {
'autopilotIp': '192.168.27.1', 'autopilotIp': '192.168.27.1',
'autopilotPort': 7909,
'id': 0, 'id': 0,
'isASimulation': False, 'isASimulation': False,
'isADrone': False, 'isADrone': False,
......
/*jslint nomen: true, indent: 2, maxerr: 3, maxlen: 80 */ /*jslint nomen: true, indent: 2, maxerr: 3, maxlen: 80 */
/*global console, getAltitude, getAltitudeRel, getInitialAltitude, getLatitude, /*global console, getAltitude, getAltitudeRel, getInitialAltitude, getLatitude,
getLongitude, getYaw, execUserScript, initPubsub, isInManualMode, landed, getLongitude, getYaw, execUserScript, initPubsub, landed, loiter, setAirspeed,
loiter, setAirspeed, setAltitude, setManualControlInput, setMessage, setMessage, setTargetCoordinates, std, triggerParachute, Drone, Worker*/
setTargetCoordinates, std, triggerParachute, Drone, Worker*/
import { import {
Drone, Drone,
triggerParachute, triggerParachute,
...@@ -15,12 +14,9 @@ import { ...@@ -15,12 +14,9 @@ import {
getLongitude, getLongitude,
getYaw, getYaw,
initPubsub, initPubsub,
isInManualMode,
landed, landed,
loiter, loiter,
setAirspeed, setAirspeed,
setAltitude,
setManualControlInput,
setMessage, setMessage,
setTargetCoordinates setTargetCoordinates
} from {{ json_module.dumps(qjs_wrapper) }}; } from {{ json_module.dumps(qjs_wrapper) }};
...@@ -28,10 +24,9 @@ import * as std from "std"; ...@@ -28,10 +24,9 @@ import * as std from "std";
import { Worker } from "os"; import { Worker } from "os";
(function (console, getAltitude, getAltitudeRel, getInitialAltitude, (function (console, getAltitude, getAltitudeRel, getInitialAltitude,
getLatitude, getLongitude, getYaw, initPubsub, isInManualMode, getLatitude, getLongitude, getYaw, initPubsub, landed, loiter,
landed, loiter, setAirspeed, setAltitude, setManualControlInput, setAirspeed, setMessage, setTargetCoordinates, std, triggerParachute,
setMessage, setTargetCoordinates, std, triggerParachute, Drone, Drone, Worker) {
Worker) {
// Every script is evaluated per drone // Every script is evaluated per drone
"use strict"; "use strict";
...@@ -70,7 +65,6 @@ import { Worker } from "os"; ...@@ -70,7 +65,6 @@ import { Worker } from "os";
setMessage(JSON.stringify({ content: msg, dest_id: id })); setMessage(JSON.stringify({ content: msg, dest_id: id }));
}, },
setAirspeed: setAirspeed, setAirspeed: setAirspeed,
setAltitude: setAltitude,
setTargetCoordinates: setTargetCoordinates setTargetCoordinates: setTargetCoordinates
}; };
conf_file.close(); conf_file.close();
...@@ -123,9 +117,6 @@ import { Worker } from "os"; ...@@ -123,9 +117,6 @@ import { Worker } from "os";
}); });
// Call the drone onStart function // Call the drone onStart function
if (user_me.hasOwnProperty("onUpdate")) { if (user_me.hasOwnProperty("onUpdate")) {
if (configuration.isADrone && isInManualMode()) {
setManualControlInput();
}
user_me.onUpdate(evt.data.timestamp); user_me.onUpdate(evt.data.timestamp);
} }
parent.postMessage({type: "updated"}); parent.postMessage({type: "updated"});
...@@ -145,6 +136,5 @@ import { Worker } from "os"; ...@@ -145,6 +136,5 @@ import { Worker } from "os";
} }
}; };
}(console, getAltitude, getAltitudeRel, getInitialAltitude, getLatitude, }(console, getAltitude, getAltitudeRel, getInitialAltitude, getLatitude,
getLongitude, getYaw, initPubsub, isInManualMode, landed, loiter, setAirspeed, getLongitude, getYaw, initPubsub, landed, loiter, setAirspeed, setMessage,
setAltitude, setManualControlInput, setMessage, setTargetCoordinates, std, setTargetCoordinates, std, triggerParachute, Drone, Worker));
triggerParachute, Drone, Worker));
# mail-server
- Local IMAP / SMTP mail server using Dovecot and Postfix
- Runs on port 10143 and 10025
- Designed to be deployed on 4G / 5G base stations such as ORS
# THIS IS NOT A BUILDOUT FILE, despite purposedly using a compatible syntax.
# The only allowed lines here are (regexes):
# - "^#" comments, copied verbatim
# - "^[" section beginings, copied verbatim
# - lines containing an "=" sign which must fit in the following categorie.
# - "^\s*filename\s*=\s*path\s*$" where "path" is relative to this file
# Copied verbatim.
# - "^\s*hashtype\s*=.*" where "hashtype" is one of the values supported
# by the re-generation script.
# Re-generated.
# - other lines are copied verbatim
# Substitution (${...:...}), extension ([buildout] extends = ...) and
# section inheritance (< = ...) are NOT supported (but you should really
# not need these here).
[template]
filename = instance.cfg.in
md5sum = 7ab3b606972e1b338d28fc1374617835
[template-default]
_update_hash_filename_ = instance-default.cfg.in
md5sum = 123a56ab69723d869bc52169fa5d530b
[dovecot.jinja2.conf]
_update_hash_filename_ = dovecot.jinja2.conf
md5sum = a1f695cb881e9be680b7b8a597a4b0c9
[dovecot-passdb.jinja2.lua]
_update_hash_filename_ = dovecot-passdb.jinja2.lua
md5sum = 060107ee6ad0eb9092529bc2bd1ee52f
[postfix_main.jinja2.cf]
_update_hash_filename_ = postfix_main.jinja2.cf
md5sum = e3b2b86282816ac4020154de70cd5074
[postfix_master.jinja2.cf]
_update_hash_filename_ = postfix_master.jinja2.cf
md5sum = 7752a8b4af5c18dc404e0a862af89272
[postfix_vmailbox.jinja2]
_update_hash_filename_ = postfix_vmailbox.jinja2
md5sum = b01eb42fd9cecc1fcc9bad85f463eea6
[postfix_virtual.jinja2]
_update_hash_filename_ = postfix_virtual.jinja2
md5sum = 701c95b5542890034444cf82ecf2a5e3
function auth_passdb_lookup(req)
return dovecot.auth.PASSDB_RESULT_OK, string.format("password=%s", req.password)
end
function script_init()
return 0
end
function script_deinit()
end
function auth_userdb_iterate()
return {"alpha"}
end
protocols = " imap lmtp pop3"
auth_debug = yes
auth_mechanisms = plain login
auth_username_format = %n
auth_verbose = yes
base_dir = {{ directory['run-dovecot'] }}
state_dir = {{directory['var-dovecot'] }}
mail_temp_dir = {{directory['tmp-dovecot'] }}
default_internal_user = {{ slap_configuration['user-name'] }}
default_login_user = {{ slap_configuration['user-name'] }}
default_internal_group = {{ slap_configuration['user-name'] }}
disable_plaintext_auth = no
mail_location = maildir:~/Maildir
mail_debug = yes
service anvil {
chroot =
}
service imap-login {
chroot =
}
service pop3-login {
chroot =
inet_listener pop3 {
port = 10110
}
inet_listener pop3s {
port = 10995
}
}
service imap-login {
inet_listener imap {
port = 10143
}
inet_listener imaps {
port = 10993
}
}
service auth {
unix_listener {{ postfix_auth }} {
mode = 0660
user = {{ slap_configuration['user-name'] }}
group = {{ slap_configuration['user-name'] }}
}
}
service lmtp {
unix_listener {{ postfix_dovecot_lmtp }} {
user = {{ slap_configuration['user-name'] }}
group = {{ slap_configuration['user-name'] }}
mode = 0600
}
}
log_path = {{ directory['log'] }}/dovecot.log
namespace inbox {
inbox = yes
location =
mailbox Drafts {
special_use = \Drafts
}
mailbox Junk {
special_use = \Junk
}
mailbox Sent {
special_use = \Sent
}
mailbox "Sent Messages" {
special_use = \Sent
}
mailbox Trash {
special_use = \Trash
}
prefix =
}
ssl = no
passdb {
driver = lua
args = file={{ dovecot_passdb_lua }} blocking=yes
}
userdb {
driver = static
args = uid={{ slap_configuration['user-name'] }} gid={{ slap_configuration['user-name'] }} home={{ directory['home-dovecot'] }}/%u
}
{
"type": "object",
"$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters",
"properties": {
"dns_sr_url": {
"default": "",
"title": "DNS SR URL",
"description": "URL of the SR running the DNS server",
"type": "string"
}
}
}
{
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "Values returned by mail server",
"properties": {
"imap-port": {
"description": "IMAP port of the dovecot instance",
"type": "integer"
},
"smtp-port": {
"description": "SMTP port of the postfix instance",
"type": "integer"
},
"imap-smtp-ipv6": {
"description": "IPv6 address of the IMAP and SMTP instances",
"type": "string"
},
"domain": {
"description": "Domain of the mail server",
"type": "string"
}
},
"type": "object"
}
{% set part_list = [] -%}
{% macro section(name) %}{% do part_list.append(name) %}{{ name }}{% endmacro -%}
[directory]
recipe = slapos.cookbook:mkdirectory
home = ${buildout:directory}
etc = ${:home}/etc
var = ${:home}/var
bin = ${:home}/bin
usr = ${:home}/usr
tmp = ${:home}/tmp
run = ${:var}/run
libexec = ${:usr}/libexec
run-dovecot = ${:run}/dovecot
var-dovecot = ${:var}/dovecot
tmp-dovecot = ${:tmp}/dovecot
libexec-dovecot = ${:libexec}/dovecot
home-dovecot = ${:home}/dovecot-home
script = ${:etc}/run
service = ${:etc}/service
promise = ${:etc}/promise
log = ${:var}/log
usr-postfix = ${:usr}/postfix
etc-postfix = ${:etc}/postfix
var-log = ${:var}/log
var-lib = ${:var}/lib
var-lib-postfix = ${:var-lib}/postfix
var-spool = ${:var}/spool
var-spool-postfix = ${:var-spool}/postfix
vhosts = ${:home}/vhosts
# Not used at buildout level, presence needed by postfix.
var-spool-postfix-active = ${:var-spool-postfix}/active
var-spool-postfix-bounce = ${:var-spool-postfix}/bounce
var-spool-postfix-corrupt = ${:var-spool-postfix}/corrupt
var-spool-postfix-defer = ${:var-spool-postfix}/defer
var-spool-postfix-deferred = ${:var-spool-postfix}/deferred
var-spool-postfix-flush = ${:var-spool-postfix}/flush
var-spool-postfix-hold = ${:var-spool-postfix}/hold
var-spool-postfix-incoming = ${:var-spool-postfix}/incoming
var-spool-postfix-maildrop = ${:var-spool-postfix}/maildrop
var-spool-postfix-pid = ${:var-spool-postfix}/pid
var-spool-postfix-private = ${:var-spool-postfix}/private
var-spool-postfix-public = ${:var-spool-postfix}/public
var-spool-postfix-saved = ${:var-spool-postfix}/saved
var-spool-postfix-trace = ${:var-spool-postfix}/trace
[slap-configuration]
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'] }}
[config-base]
recipe = slapos.recipe.template:jinja2
extensions = jinja2.ext.do
extra-context =
context =
section directory directory
section slap_configuration slap-configuration
import netaddr netaddr
${:extra-context}
[dovecot-conf]
<= config-base
url = {{ dovecot_conf_template }}
output = ${directory:etc}/dovecot.conf
extra-context =
key dovecot_passdb_lua dovecot-passdb-lua:output
raw postfix_auth ${directory:var-spool-postfix-private}/auth
raw postfix_dovecot_lmtp ${directory:var-spool-postfix-private}/dovecot-lmtp
[dovecot-passdb-lua]
<= config-base
url = {{ dovecot_passdb_lua_template }}
output = ${directory:etc}/dovecot-passdb.lua
[userinfo]
recipe = slapos.cookbook:userinfo
[ethernet-ip]
recipe = slapos.recipe.build
init =
import netifaces
for i in netifaces.interfaces():
if not (i.startswith("slaptun") or i.startswith("re6stnet") or i == "lo"):
a = netifaces.ifaddresses(i)
if netifaces.AF_INET in a:
try:
options['ipv4'] = a[netifaces.AF_INET][0]['addr']
except:
options['ipv4'] = "0.0.0.0"
[{{ section('postmap-virtual') }}]
recipe = plone.recipe.command
stop-on-error = true
command = '${wrapper-postmap:wrapper-path}' '${postfix-virtual:output}'
update-command = ${:command}
[{{ section('postmap-vmailbox') }}]
recipe = plone.recipe.command
stop-on-error = true
command = '${wrapper-postmap:wrapper-path}' '${postfix-vmailbox:output}'
update-command = ${:command}
[postfix-conf-main]
<= config-base
url = {{ postfix_main_template }}
output = ${directory:etc-postfix}/main.cf
extra-context =
key vmailbox_file postfix-vmailbox:output
key virtual_file postfix-virtual:output
key bin_directory directory:bin
key usr_directory directory:usr-postfix
key queue_directory directory:var-spool-postfix
key data_directory directory:var-lib-postfix
key spool_directory directory:var-spool
key vhosts_directory directory:vhosts
key log_directory directory:var-log
key mail_owner userinfo:pw-name
key setgid_group userinfo:gr-name
key ip_address slap-configuration:ipv6-random
key mail_domain request-dns-entry:connection-domain
raw xz_utils_location {{ xz_utils_location }}
raw postfix_location {{ postfix_location }}
[postfix-conf-master]
<= config-base
url = {{ postfix_master_template }}
output = ${directory:etc-postfix}/master.cf
[postfix-vmailbox]
<= config-base
url = {{ postfix_vmailbox_template }}
output = ${directory:etc-postfix}/postfix-vmailbox
extra-context =
raw mail_domain {{ slapparameter_dict.get('mail_domain', '') }}
[postfix-virtual]
<= config-base
url = {{ postfix_virtual_template }}
output = ${directory:etc-postfix}/postfix-virtual
extra-context =
raw mail_domain {{ slapparameter_dict.get('mail_domain', '') }}
[dovecot-wrapper]
recipe = slapos.recipe.template
output = ${directory:bin}/${:_buildout_section_name_}
inline =
#!/bin/sh
{{ dovecot_binary }} -F -c ${dovecot-conf:output}
[dovecot-service]
recipe = slapos.cookbook:wrapper
command-line = ${dovecot-wrapper:output}
wrapper-path = ${directory:service}/dovecot
mode = 0775
pidfile = ${directory:run}/dovecot.pid
hash-files =
${dovecot-conf:output}
${dovecot-wrapper:output}
[postfix-symlinks-libexec]
recipe = slapos.cookbook:symbolic.link
target-directory = ${directory:usr-postfix}
link-binary =
{{ postfix_location }}/usr/libexec
[postfix-wrapper]
recipe = slapos.recipe.template
output = ${directory:bin}/${:_buildout_section_name_}
inline =
#!/bin/sh
${directory:usr-postfix}/libexec/postfix/master -c ${directory:etc-postfix}
[postfix-service]
recipe = slapos.cookbook:wrapper
command-line = ${postfix-wrapper:output}
wrapper-path = ${directory:service}/postfix
mode = 0775
pidfile = ${directory:run}/postfix.pid
environment =
MAIL_CONFIG=${directory:etc-postfix}
hash-files =
${postfix-conf-main:output}
${postfix-wrapper:output}
[publish-connection-parameters]
recipe = slapos.cookbook:publish
<= monitor-publish
imap-port = 10143
smtp-port = 10025
imap-smtp-ipv6 = ${slap-configuration:ipv6-random}
{% if slapparameter_dict.get('dns_sr_url', '') %}
domain = ${request-dns-entry:connection-domain}
{% endif %}
[imap-listen-promise]
<= monitor-promise-base
promise = check_socket_listening
name = imap_listen.py
config-host = ${slap-configuration:ipv6-random}
config-port = 10143
[smtp-listen-promise]
<= monitor-promise-base
promise = check_socket_listening
name = smtp_listen.py
config-host = ${slap-configuration:ipv6-random}
config-port = 10025
[request-dns-entry]
name = dns-mail-entry
recipe = slapos.cookbook:request.serialised
software-url = {{ slapparameter_dict['dns_sr_url'] }}
software-type = core-network
server-url = {{ slap_connection['server-url'] }}
computer-id = {{ slap_connection['computer-id'] }}
partition-id = {{ slap_connection['partition-id'] }}
key-file = {{ slap_connection['key-file'] }}
cert-file = {{ slap_connection['cert-file'] }}
shared = true
sla-computer_guid = {{ slap_connection['computer-id'] }}
config-name = dns-mail-entry
config-subdomain = mail
config-ip = ${slap-configuration:ipv6-random}
return = domain ip
[base-wrapper]
recipe = slapos.cookbook:wrapper
environment =
MAIL_CONFIG=${directory:etc-postfix}
[base-bin-wrapper]
< = base-wrapper
command-line = ${:path}/${:basename}
wrapper-path = ${directory:bin}/${:basename}
[base-bin-bin-wrapper]
< = base-bin-wrapper
path = {{ postfix_location }}/usr/bin
[base-sbin-bin-wrapper]
< = base-bin-wrapper
path = {{ postfix_location }}/usr/sbin
{% for extend, basename_list in (
(
'base-bin-bin-wrapper',
(
'mailq',
'newaliases',
),
),
(
'base-sbin-bin-wrapper',
(
'postcat',
'postconf',
'postdrop',
'postfix',
'postkick',
'postlock',
'postlog',
'postmap',
'postmulti',
'postqueue',
'postsuper',
'sendmail',
),
),
) %}
{% for basename in basename_list -%}
[{{ section('wrapper-' ~ basename) }}]
< = {{ extend }}
basename = {{ basename }}
{% endfor %}
{% endfor %}
[{{ section('service-postfix-master') }}]
< = base-wrapper
command-line = ${directory:usr}/libexec/postfix/master -c ${directory:etc-postfix}
wrapper-path = ${directory:run}/postfix-master
[buildout]
extends =
{{ template_monitor }}
parts =
directory
dovecot-conf
dovecot-service
postfix-conf-main
postfix-conf-master
postfix-service
postfix-symlinks-libexec
monitor-base
publish-connection-parameters
imap-listen-promise
smtp-listen-promise
{{ part_list | join('\n ') }}
{% if slapparameter_dict.get('dns_sr_url', '') %}
request-dns-entry
{% endif %}
eggs-directory = {{ eggs_directory }}
develop-eggs-directory = {{ develop_eggs_directory }}
offline= true
[buildout]
parts =
switch-softwaretype
eggs-directory = ${buildout:eggs-directory}
develop-eggs-directory = ${buildout:develop-eggs-directory}
offline = true
[default-dynamic-template-parameters]
bin-directory = ${buildout:bin-directory}
buildout-bin-directory = ${buildout:bin-directory}
[dynamic-template-default]
recipe = slapos.recipe.template:jinja2
url = ${template-default:target}
filename = instance-default.cfg
output = $${buildout:directory}/$${:filename}
extensions = jinja2.ext.do
context =
key develop_eggs_directory buildout:develop-eggs-directory
key eggs_directory buildout:eggs-directory
key slapparameter_dict slap-configuration:configuration
raw template_monitor ${monitor2-template:output}
raw dovecot_conf_template ${dovecot.jinja2.conf:target}
raw dovecot_passdb_lua_template ${dovecot-passdb.jinja2.lua:target}
raw dovecot_binary ${dovecot:location}/sbin/dovecot
raw postfix_main_template ${postfix_main.jinja2.cf:target}
raw postfix_master_template ${postfix_master.jinja2.cf:target}
raw postfix_virtual_template ${postfix_virtual.jinja2:target}
raw postfix_vmailbox_template ${postfix_vmailbox.jinja2:target}
raw postfix_location ${postfix:location}
raw xz_utils_location ${xz-utils:location}
section slap_connection slap-connection
[slap-configuration]
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}
[switch-softwaretype]
recipe = slapos.cookbook:switch-softwaretype
default = dynamic-template-default:output
RootSoftwareInstance = $${:default}
# http://www.postfix.org/STANDARD_CONFIGURATION_README.html
# http://www.postfix.org/postconf.5.html
queue_directory = {{ queue_directory }}
command_directory = {{ bin_directory }}
daemon_directory = {{ usr_directory }}/libexec/postfix
data_directory = {{ data_directory }}
mail_spool_directory = {{ spool_directory }}
html_directory = no
manpage_directory = {{ postfix_location }}/usr/local/man
sample_directory = {{ postfix_location }}/etc/postfix
readme_directory = no
sendmail_path = {{ bin_directory }}/sendmail
newaliases_path = {{ bin_directory }}/newaliases
mailq_path = {{ bin_directory }}/mailq
compatibility_level = 3.6
smtputf8_enable = no
mail_owner = {{ mail_owner }}
setgid_group = {{ setgid_group }}
virtual_mailbox_domains = {{ mail_domain }}
virtual_mailbox_base = {{ vhosts_directory }}
virtual_mailbox_maps = hash:{{ vmailbox_file }}
virtual_minimum_uid = 100
virtual_uid_maps = static:1001
virtual_gid_maps = static:1022
virtual_alias_maps = hash:{{ virtual_file }}
virtual_transport = lmtp:unix:private/dovecot-lmtp
inet_interfaces = {{ ip_address }}
inet_protocols = all
smtp_bind_address = 0.0.0.0
smtp_bind_address6 = ::
import_environment =
MAIL_CONFIG MAIL_DEBUG MAIL_LOGTAG TZ LANG=C
smtpd_tls_security_level = none
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions =
permit_sasl_authenticated
smtpd_relay_restrictions =
permit_sasl_authenticated
defer_unauth_destination
allow_min_user = yes
local_transport = error
maillog_file = {{ log_directory }}/postfix.log
maillog_file_compressor = {{ xz_utils_location }}/bin/xz
maillog_file_prefixes = {{ log_directory }}
# http://www.postfix.org/master.5.html
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
# ==========================================================================
10025 inet n - n - - smtpd
pickup unix n - n 60 1 pickup
cleanup unix n - n - 0 cleanup
qmgr unix n - n 300 1 qmgr
tlsmgr unix - - n 1000? 1 tlsmgr
rewrite unix - - n - - trivial-rewrite
bounce unix - - n - 0 bounce
defer unix - - n - 0 bounce
trace unix - - n - 0 bounce
verify unix - - n - 1 verify
flush unix n - n 1000? 0 flush
proxymap unix - - n - - proxymap
proxywrite unix - - n - 1 proxymap
smtp unix - - n - - smtp
relay unix - - n - - smtp
showq unix n - n - - showq
error unix - - n - - error
retry unix - - n - - error
discard unix - - n - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - n - - lmtp
anvil unix - - n - 1 anvil
scache unix - - n - 1 scache
postlog unix-dgram n - n - 1 postlogd
postmaster@{{ mail_domain }} postmaster
@{{ mail_domain }} {{ mail_domain }}/catchall
[buildout]
extends =
../../component/xz-utils/buildout.cfg
../../component/postfix/buildout.cfg
../../component/dovecot/buildout.cfg
../../stack/monitor/buildout.cfg
../../stack/slapos.cfg
buildout.hash.cfg
parts =
slapos-cookbook
template
dovecot
postfix
[template]
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/${:filename}
output = ${buildout:directory}/template.cfg
[download-base]
recipe = slapos.recipe.build:download
url = ${:_profile_base_location_}/${:_update_hash_filename_}
[template-default]
<= download-base
[copy-to-instance]
recipe = slapos.recipe.build:download
url = ${:_profile_base_location_}/${:_buildout_section_name_}
filename = ${:_buildout_section_name_}
[dovecot.jinja2.conf]
< = copy-to-instance
[dovecot-passdb.jinja2.lua]
< = copy-to-instance
[postfix_main.jinja2.cf]
< = copy-to-instance
[postfix_master.jinja2.cf]
< = copy-to-instance
[postfix_vmailbox.jinja2]
< = copy-to-instance
[postfix_virtual.jinja2]
< = copy-to-instance
{
"name": "Mail Server",
"description": "Mail Server",
"serialisation": "json-in-xml",
"software-type": {
"default": {
"title": "Default",
"software-type": "default",
"request": "instance-default-input-schema.json",
"response": "instance-default-output-schema.json",
"index": 0
}
}
}
Tests for mail-server software release
##############################################################################
#
# Copyright (c) 2018 Nexedi SA and Contributors. All Rights Reserved.
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsibility of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# guarantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 3
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
from setuptools import setup, find_packages
version = '0.0.1.dev0'
name = 'slapos.test.mail_server'
with open("README.md") as f:
long_description = f.read()
setup(
name=name,
version=version,
description="Test for SlapOS' mail-server",
long_description=long_description,
long_description_content_type='text/markdown',
maintainer="Nexedi",
maintainer_email="info@nexedi.com",
url="https://lab.nexedi.com/nexedi/slapos",
packages=find_packages(),
install_requires=[
'slapos.core',
'slapos.libnetworkcache',
'slapos.cookbook',
],
zip_safe=True,
test_suite='test',
)
##############################################################################
#
# Copyright (c) 2018 Nexedi SA and Contributors. All Rights Reserved.
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsibility of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# guarantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 3
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
import os
from slapos.testing.testcase import makeModuleSetUpAndTestCaseClass
setUpModule, MailServerTestCase = makeModuleSetUpAndTestCaseClass(
os.path.abspath(
os.path.join(os.path.dirname(__file__), '..', 'software.cfg')))
param_dict = {
"mail_domain": "mail.local",
}
class TestDefaultInstance(MailServerTestCase):
@classmethod
def getInstanceParameterDict(cls):
return {'_': json.dumps(param_dict)}
@classmethod
def getInstanceSoftwareType(cls):
return "default"
def test_enb_conf(self):
self.slap.waitForInstance()
connection_parameters = self.computer_partition.getConnectionParameterDict()
imap_smtp_ipv6 = connection_parameters['imap-smtp-ipv6']
imap_port = connection_parameters['imap-port']
smtp_port = connection_parameters['smtp-port']
# Check connection parameters are not empty
self.assertTrue(imap_smtp_ipv6)
self.assertTrue(imap_port)
self.assertTrue(smtp_port)
# Check conf contains correct domain
conf_file = glob.glob(os.path.join(
self.slap.instance_directory, '*', 'etc', 'postfix', 'main.cf'))[0]
with open(conf_file, 'r') as f:
domain_configured = False
for line in f:
if line.startswith("virtual_mailbox_domains"):
self.assertEqual(line, "virtual_mailbox_domains = {}\n".format(param_dict['mail_domain']))
domain_configured = True
self.assertTrue(domain_configured)
...@@ -22,7 +22,7 @@ md5sum = 2eb5596544d9c341acf653d4f7ce2680 ...@@ -22,7 +22,7 @@ md5sum = 2eb5596544d9c341acf653d4f7ce2680
[template-monitor-edgetest-basic] [template-monitor-edgetest-basic]
_update_hash_filename_ = instance-monitor-edgetest-basic.cfg.jinja2 _update_hash_filename_ = instance-monitor-edgetest-basic.cfg.jinja2
md5sum = 6b933beb0744d97c7760e4601298e137 md5sum = fa044accc1230ece41edfc822eb39f07
[template-node-monitoring] [template-node-monitoring]
_update_hash_filename_ = instance-node-monitoring.jinja2.cfg _update_hash_filename_ = instance-node-monitoring.jinja2.cfg
......
...@@ -97,6 +97,12 @@ ...@@ -97,6 +97,12 @@
"type": "number", "type": "number",
"default": 2, "default": 2,
"minimum": 1 "minimum": 1
},
"enabled-sense-list": {
"title": "[EXPERT] Enabled Senses",
"description": "Space separated list of enabled senses of the promise.",
"type": "string",
"default": "dns_query tcp_server http_query ssl_certificate elapsed_time"
} }
} }
} }
...@@ -6,9 +6,10 @@ ...@@ -6,9 +6,10 @@
'failure-amount': 2, 'failure-amount': 2,
'check-maximum-elapsed-time': 2, 'check-maximum-elapsed-time': 2,
'check-frontend-ip-list': [], 'check-frontend-ip-list': [],
'nameserver-list': [] 'nameserver-list': [],
'enabled-sense-list': 'dns_query tcp_server http_query ssl_certificate elapsed_time'
} %} } %}
{%- for default_key in ['check-frontend-ip-list', 'nameserver-list', 'check-status-code', 'check-certificate-expiration-days', 'check-maximum-elapsed-time', 'failure-amount'] %} {%- for default_key in ['check-frontend-ip-list', 'nameserver-list', 'check-status-code', 'check-certificate-expiration-days', 'check-maximum-elapsed-time', 'failure-amount', 'enabled-sense-list'] %}
{%- if default_key in slapparameter_dict %} {%- if default_key in slapparameter_dict %}
{%- do DEFAULT_DICT.__setitem__(default_key, slapparameter_dict[default_key]) %} {%- do DEFAULT_DICT.__setitem__(default_key, slapparameter_dict[default_key]) %}
{%- endif %} {%- endif %}
...@@ -68,6 +69,7 @@ config-certificate-expiration-days = {{ check['check-certificate-expiration-days ...@@ -68,6 +69,7 @@ config-certificate-expiration-days = {{ check['check-certificate-expiration-days
config-failure-amount = {{ check['failure-amount'] }} config-failure-amount = {{ check['failure-amount'] }}
config-maximum-elapsed-time = {{ check['check-maximum-elapsed-time'] }} config-maximum-elapsed-time = {{ check['check-maximum-elapsed-time'] }}
config-ip-list = {{ ' '.join(check['check-frontend-ip-list']) }} config-ip-list = {{ ' '.join(check['check-frontend-ip-list']) }}
config-enabled-sense-list = {{ check['enabled-sense-list'] }}
config-json-file = ${surykatka-config-{{ class }}:json} config-json-file = ${surykatka-config-{{ class }}:json}
{%- endfor %} {#- for url in check['url-list'] #} {%- endfor %} {#- for url in check['url-list'] #}
{%- endfor %} {#- for check in class_check_list | sort(attribute='-name') #} {%- endfor %} {#- for check in class_check_list | sort(attribute='-name') #}
......
...@@ -377,12 +377,16 @@ URL = ...@@ -377,12 +377,16 @@ URL =
def getInstanceSoftwareType(cls): def getInstanceSoftwareType(cls):
return 'edgetest-basic' return 'edgetest-basic'
enabled_sense_list = "'dns_query tcp_server http_query ssl_certificate '\n"\
" 'elapsed_time'"
def assertSurykatkaPromises(self): def assertSurykatkaPromises(self):
self.assertHttpQueryPromiseContent( self.assertHttpQueryPromiseContent(
'edge0', 'edge0',
'path-check', 'path-check',
'https://path.example.com/path', 'https://path.example.com/path',
"""extra_config_dict = { 'certificate-expiration-days': '7', """extra_config_dict = { 'certificate-expiration-days': '7',
'enabled-sense-list': %s,
'failure-amount': '1', 'failure-amount': '1',
'http-header-dict': '{}', 'http-header-dict': '{}',
'ip-list': '127.0.0.1 127.0.0.2', 'ip-list': '127.0.0.1 127.0.0.2',
...@@ -391,6 +395,7 @@ URL = ...@@ -391,6 +395,7 @@ URL =
'report': 'http_query', 'report': 'http_query',
'status-code': '201', 'status-code': '201',
'url': 'https://path.example.com/path'}""" % ( 'url': 'https://path.example.com/path'}""" % (
self.enabled_sense_list,
self.surykatka_dict['edge0'][5]['json-file'],)) self.surykatka_dict['edge0'][5]['json-file'],))
self.assertHttpQueryPromiseContent( self.assertHttpQueryPromiseContent(
...@@ -398,6 +403,7 @@ URL = ...@@ -398,6 +403,7 @@ URL =
'domain-check', 'domain-check',
'https://domain.example.com', 'https://domain.example.com',
"""extra_config_dict = { 'certificate-expiration-days': '7', """extra_config_dict = { 'certificate-expiration-days': '7',
'enabled-sense-list': %s,
'failure-amount': '1', 'failure-amount': '1',
'http-header-dict': '{}', 'http-header-dict': '{}',
'ip-list': '127.0.0.1 127.0.0.2', 'ip-list': '127.0.0.1 127.0.0.2',
...@@ -406,6 +412,7 @@ URL = ...@@ -406,6 +412,7 @@ URL =
'report': 'http_query', 'report': 'http_query',
'status-code': '201', 'status-code': '201',
'url': 'https://domain.example.com'}""" % ( 'url': 'https://domain.example.com'}""" % (
self.enabled_sense_list,
self.surykatka_dict['edge0'][5]['json-file'],)) self.surykatka_dict['edge0'][5]['json-file'],))
self.assertHttpQueryPromiseContent( self.assertHttpQueryPromiseContent(
...@@ -413,6 +420,7 @@ URL = ...@@ -413,6 +420,7 @@ URL =
'domain-check', 'domain-check',
'http://domain.example.com', 'http://domain.example.com',
"""extra_config_dict = { 'certificate-expiration-days': '7', """extra_config_dict = { 'certificate-expiration-days': '7',
'enabled-sense-list': %s,
'failure-amount': '1', 'failure-amount': '1',
'http-header-dict': '{}', 'http-header-dict': '{}',
'ip-list': '127.0.0.1 127.0.0.2', 'ip-list': '127.0.0.1 127.0.0.2',
...@@ -421,6 +429,7 @@ URL = ...@@ -421,6 +429,7 @@ URL =
'report': 'http_query', 'report': 'http_query',
'status-code': '201', 'status-code': '201',
'url': 'http://domain.example.com'}""" % ( 'url': 'http://domain.example.com'}""" % (
self.enabled_sense_list,
self.surykatka_dict['edge0'][5]['json-file'],)) self.surykatka_dict['edge0'][5]['json-file'],))
self.assertHttpQueryPromiseContent( self.assertHttpQueryPromiseContent(
...@@ -428,6 +437,7 @@ URL = ...@@ -428,6 +437,7 @@ URL =
'frontend-check', 'frontend-check',
'https://frontend.example.com', 'https://frontend.example.com',
"""extra_config_dict = { 'certificate-expiration-days': '7', """extra_config_dict = { 'certificate-expiration-days': '7',
'enabled-sense-list': %s,
'failure-amount': '1', 'failure-amount': '1',
'http-header-dict': '{}', 'http-header-dict': '{}',
'ip-list': '127.0.0.3', 'ip-list': '127.0.0.3',
...@@ -436,6 +446,7 @@ URL = ...@@ -436,6 +446,7 @@ URL =
'report': 'http_query', 'report': 'http_query',
'status-code': '201', 'status-code': '201',
'url': 'https://frontend.example.com'}""" % ( 'url': 'https://frontend.example.com'}""" % (
self.enabled_sense_list,
self.surykatka_dict['edge0'][5]['json-file'],)) self.surykatka_dict['edge0'][5]['json-file'],))
self.assertHttpQueryPromiseContent( self.assertHttpQueryPromiseContent(
...@@ -443,6 +454,7 @@ URL = ...@@ -443,6 +454,7 @@ URL =
'frontend-empty-check', 'frontend-empty-check',
'https://frontendempty.example.com', 'https://frontendempty.example.com',
"""extra_config_dict = { 'certificate-expiration-days': '7', """extra_config_dict = { 'certificate-expiration-days': '7',
'enabled-sense-list': %s,
'failure-amount': '1', 'failure-amount': '1',
'http-header-dict': '{}', 'http-header-dict': '{}',
'ip-list': '', 'ip-list': '',
...@@ -451,6 +463,7 @@ URL = ...@@ -451,6 +463,7 @@ URL =
'report': 'http_query', 'report': 'http_query',
'status-code': '201', 'status-code': '201',
'url': 'https://frontendempty.example.com'}""" % ( 'url': 'https://frontendempty.example.com'}""" % (
self.enabled_sense_list,
self.surykatka_dict['edge0'][5]['json-file'],)) self.surykatka_dict['edge0'][5]['json-file'],))
self.assertHttpQueryPromiseContent( self.assertHttpQueryPromiseContent(
...@@ -458,6 +471,7 @@ URL = ...@@ -458,6 +471,7 @@ URL =
'status-check', 'status-check',
'https://status.example.com', 'https://status.example.com',
"""extra_config_dict = { 'certificate-expiration-days': '7', """extra_config_dict = { 'certificate-expiration-days': '7',
'enabled-sense-list': %s,
'failure-amount': '1', 'failure-amount': '1',
'http-header-dict': '{}', 'http-header-dict': '{}',
'ip-list': '127.0.0.1 127.0.0.2', 'ip-list': '127.0.0.1 127.0.0.2',
...@@ -466,6 +480,7 @@ URL = ...@@ -466,6 +480,7 @@ URL =
'report': 'http_query', 'report': 'http_query',
'status-code': '202', 'status-code': '202',
'url': 'https://status.example.com'}""" % ( 'url': 'https://status.example.com'}""" % (
self.enabled_sense_list,
self.surykatka_dict['edge0'][5]['json-file'],)) self.surykatka_dict['edge0'][5]['json-file'],))
self.assertHttpQueryPromiseContent( self.assertHttpQueryPromiseContent(
...@@ -473,6 +488,7 @@ URL = ...@@ -473,6 +488,7 @@ URL =
'certificate-check', 'certificate-check',
'https://certificate.example.com', 'https://certificate.example.com',
"""extra_config_dict = { 'certificate-expiration-days': '11', """extra_config_dict = { 'certificate-expiration-days': '11',
'enabled-sense-list': %s,
'failure-amount': '1', 'failure-amount': '1',
'http-header-dict': '{}', 'http-header-dict': '{}',
'ip-list': '127.0.0.1 127.0.0.2', 'ip-list': '127.0.0.1 127.0.0.2',
...@@ -481,6 +497,7 @@ URL = ...@@ -481,6 +497,7 @@ URL =
'report': 'http_query', 'report': 'http_query',
'status-code': '201', 'status-code': '201',
'url': 'https://certificate.example.com'}""" % ( 'url': 'https://certificate.example.com'}""" % (
self.enabled_sense_list,
self.surykatka_dict['edge0'][5]['json-file'],)) self.surykatka_dict['edge0'][5]['json-file'],))
self.assertHttpQueryPromiseContent( self.assertHttpQueryPromiseContent(
...@@ -488,6 +505,7 @@ URL = ...@@ -488,6 +505,7 @@ URL =
'time-check', 'time-check',
'https://time.example.com', 'https://time.example.com',
"""extra_config_dict = { 'certificate-expiration-days': '7', """extra_config_dict = { 'certificate-expiration-days': '7',
'enabled-sense-list': %s,
'failure-amount': '1', 'failure-amount': '1',
'http-header-dict': '{}', 'http-header-dict': '{}',
'ip-list': '127.0.0.1 127.0.0.2', 'ip-list': '127.0.0.1 127.0.0.2',
...@@ -496,6 +514,7 @@ URL = ...@@ -496,6 +514,7 @@ URL =
'report': 'http_query', 'report': 'http_query',
'status-code': '201', 'status-code': '201',
'url': 'https://time.example.com'}""" % ( 'url': 'https://time.example.com'}""" % (
self.enabled_sense_list,
self.surykatka_dict['edge0'][11]['json-file'],)) self.surykatka_dict['edge0'][11]['json-file'],))
self.assertHttpQueryPromiseContent( self.assertHttpQueryPromiseContent(
...@@ -503,6 +522,7 @@ URL = ...@@ -503,6 +522,7 @@ URL =
'failure-check', 'failure-check',
'https://failure.example.com', 'https://failure.example.com',
"""extra_config_dict = { 'certificate-expiration-days': '7', """extra_config_dict = { 'certificate-expiration-days': '7',
'enabled-sense-list': %s,
'failure-amount': '3', 'failure-amount': '3',
'http-header-dict': '{}', 'http-header-dict': '{}',
'ip-list': '127.0.0.1 127.0.0.2', 'ip-list': '127.0.0.1 127.0.0.2',
...@@ -511,6 +531,7 @@ URL = ...@@ -511,6 +531,7 @@ URL =
'report': 'http_query', 'report': 'http_query',
'status-code': '201', 'status-code': '201',
'url': 'https://failure.example.com'}""" % ( 'url': 'https://failure.example.com'}""" % (
self.enabled_sense_list,
self.surykatka_dict['edge0'][5]['json-file'],)) self.surykatka_dict['edge0'][5]['json-file'],))
self.assertHttpQueryPromiseContent( self.assertHttpQueryPromiseContent(
...@@ -518,6 +539,7 @@ URL = ...@@ -518,6 +539,7 @@ URL =
'header-check', 'header-check',
'https://header.example.com', 'https://header.example.com',
"""extra_config_dict = { 'certificate-expiration-days': '7', """extra_config_dict = { 'certificate-expiration-days': '7',
'enabled-sense-list': %s,
'failure-amount': '1', 'failure-amount': '1',
'http-header-dict': '{"A": "AAA"}', 'http-header-dict': '{"A": "AAA"}',
'ip-list': '127.0.0.1 127.0.0.2', 'ip-list': '127.0.0.1 127.0.0.2',
...@@ -526,6 +548,7 @@ URL = ...@@ -526,6 +548,7 @@ URL =
'report': 'http_query', 'report': 'http_query',
'status-code': '201', 'status-code': '201',
'url': 'https://header.example.com'}""" % ( 'url': 'https://header.example.com'}""" % (
self.enabled_sense_list,
self.surykatka_dict['edge0'][5]['json-file'],)) self.surykatka_dict['edge0'][5]['json-file'],))
def test(self): def test(self):
...@@ -545,6 +568,17 @@ URL = ...@@ -545,6 +568,17 @@ URL =
self.assertConnectionParameterDict() self.assertConnectionParameterDict()
class TestEdgeBasicEnableSenseList(TestEdgeBasic):
enabled_sense_list = "'ssl_certificate'"
@classmethod
def getInstanceParameterDict(cls):
orig_instance_parameter_dict = super().getInstanceParameterDict()
_ = json.loads(orig_instance_parameter_dict['_'])
_['enabled-sense-list'] = 'ssl_certificate'
return {'_': json.dumps(_)}
class TestNodeMonitoring(SlapOSInstanceTestCase): class TestNodeMonitoring(SlapOSInstanceTestCase):
"""Test class for node monitoring instanciation""" """Test class for node monitoring instanciation"""
@classmethod @classmethod
......
...@@ -36,23 +36,23 @@ md5sum = e0b68a87238282568e0e04c792ec7288 ...@@ -36,23 +36,23 @@ md5sum = e0b68a87238282568e0e04c792ec7288
[template-enb] [template-enb]
_update_hash_filename_ = instance-enb.jinja2.cfg _update_hash_filename_ = instance-enb.jinja2.cfg
md5sum = ba704d02815e85f3ab30227f117c88ff md5sum = 8fc0bff45b68c89928f0623188470ded
[template-gnb] [template-gnb]
_update_hash_filename_ = instance-gnb.jinja2.cfg _update_hash_filename_ = instance-gnb.jinja2.cfg
md5sum = b2a1816ceb8e7f475e71454e5389d091 md5sum = 89230ab64b3d4fa826ea47d6612de101
[template-core-network] [template-core-network]
_update_hash_filename_ = instance-core-network.jinja2.cfg _update_hash_filename_ = instance-core-network.jinja2.cfg
md5sum = b4af66e7cdb3be1d48eabd14488bea24 md5sum = eda157219444c3ac10272626dd5cea10
[template-ue-lte] [template-ue-lte]
_update_hash_filename_ = instance-ue-lte.jinja2.cfg _update_hash_filename_ = instance-ue-lte.jinja2.cfg
md5sum = e201f486d31388cc2542e91bbda85711 md5sum = 41c0a900ec61f0b57f21dcbf721c2226
[template-ue-nr] [template-ue-nr]
_update_hash_filename_ = instance-ue-nr.jinja2.cfg _update_hash_filename_ = instance-ue-nr.jinja2.cfg
md5sum = 765fd303d6013cf4dbee108c53623412 md5sum = 8217b7b7c8ace3b4f1d9ed1241143bdf
[template-obsolete] [template-obsolete]
_update_hash_filename_ = instance-obsolete.jinja2.cfg _update_hash_filename_ = instance-obsolete.jinja2.cfg
...@@ -64,7 +64,7 @@ md5sum = dcaac06553a3222b14c0013a13f4a149 ...@@ -64,7 +64,7 @@ md5sum = dcaac06553a3222b14c0013a13f4a149
[enb.jinja2.cfg] [enb.jinja2.cfg]
filename = config/enb.jinja2.cfg filename = config/enb.jinja2.cfg
md5sum = 879c015828ba33edf751358f163a45ba md5sum = 90e0d38ff42dc0f65245496d3809f3b3
[sib23.asn] [sib23.asn]
filename = config/sib23.asn filename = config/sib23.asn
...@@ -80,11 +80,11 @@ md5sum = 1ba2e065bdf14a6411e95e80db17dcfd ...@@ -80,11 +80,11 @@ md5sum = 1ba2e065bdf14a6411e95e80db17dcfd
[mme.jinja2.cfg] [mme.jinja2.cfg]
filename = config/mme.jinja2.cfg filename = config/mme.jinja2.cfg
md5sum = c153d191c91a3bf28bae8724b0deb616 md5sum = 48b577daa5b53c2cf7fe2d30ea9c0235
[dnsmasq.jinja2.cfg] [dnsmasq.jinja2.cfg]
filename = config/dnsmasq.jinja2.cfg filename = config/dnsmasq.jinja2.cfg
md5sum = 972fbdd1c19aadec519b83731d26b608 md5sum = 05a983d97898813d5953fef4d03333a1
[ims.jinja2.cfg] [ims.jinja2.cfg]
filename = config/ims.jinja2.cfg filename = config/ims.jinja2.cfg
......
Changelog Changelog
========= =========
Version 1.0.322 (2023-05-17)
-------------
* Add support for first version of MCPTT (Mission Critical Push To Talk)
Version 1.0.321 (2023-05-05) Version 1.0.321 (2023-05-05)
------------- -------------
......
...@@ -8,11 +8,11 @@ port=5353 ...@@ -8,11 +8,11 @@ port=5353
{%- else %} {%- else %}
{%- set slave = slave_instance %} {%- set slave = slave_instance %}
{%- endif %} {%- endif %}
{%- if slave.get('domain', '') != '' %} {%- if slave.get('subdomain', '') != '' %}
{%- do filtered_slave_instance_list.append(slave) %} {%- do filtered_slave_instance_list.append(slave) %}
{%- endif %} {%- endif %}
{%- endfor -%} {%- endfor %}
{%- for i, slave in enumerate(filtered_slave_instance_list) -%} {% for i, slave in enumerate(filtered_slave_instance_list) -%}
address=/{{ slave['domain'] }}/{{ slave.get('ip', '') }} address=/{{ slave['subdomain'] }}.{{ slap_configuration.get('local_domain', '') }}/{{ slave.get('ip', '') }}
{% endfor -%} {% endfor -%}
This diff is collapsed.
...@@ -89,7 +89,7 @@ ...@@ -89,7 +89,7 @@
dl_earfcn: {{ slapparameter_dict.get('dl_earfcn', slap_configuration['configuration.default_dl_earfcn']) }}, dl_earfcn: {{ slapparameter_dict.get('dl_earfcn', slap_configuration['configuration.default_dl_earfcn']) }},
n_id_cell: {{ slapparameter_dict.get('pci', 1) }}, n_id_cell: {{ slapparameter_dict.get('pci', 1) }},
cell_id: 0x01, cell_id: {{ slapparameter_dict.get('cell_id', '0x01') }},
tac: 0x0001, tac: 0x0001,
root_sequence_index: 204, root_sequence_index: 204,
}, },
......
This diff is collapsed.
...@@ -55,7 +55,7 @@ ...@@ -55,7 +55,7 @@
pdn_type: "ipv4v6", pdn_type: "ipv4v6",
first_ipv6_prefix: "{{ netaddr.IPAddress(slap_configuration.get('tun-ipv6-addr', '')) + 1 }}", first_ipv6_prefix: "{{ netaddr.IPAddress(slap_configuration.get('tun-ipv6-addr', '')) + 1 }}",
last_ipv6_prefix: "{{ netaddr.IPAddress(netaddr.IPNetwork(slap_configuration.get('tun-ipv6-network', '')).last) - 1 }}", last_ipv6_prefix: "{{ netaddr.IPAddress(netaddr.IPNetwork(slap_configuration.get('tun-ipv6-network', '')).last) - 1 }}",
{% if slapparameter_dict.get('dnsmasq', False) %} {% if slapparameter_dict.get('local_domain', '') %}
dns_addr: ["{{ slap_configuration.get('tun-ipv4-addr', '') }}"], dns_addr: ["{{ slap_configuration.get('tun-ipv4-addr', '') }}"],
{% else %} {% else %}
dns_addr: ["8.8.8.8", "2001:4860:4860::8888"], dns_addr: ["8.8.8.8", "2001:4860:4860::8888"],
......
...@@ -21,35 +21,17 @@ ...@@ -21,35 +21,17 @@
"description": "Activate iperf3 UDP server", "description": "Activate iperf3 UDP server",
"type": "boolean" "type": "boolean"
}, },
"dnsmasq": { "local_domain": {
"default": false, "default": "",
"title": "dnsmasq", "title": "Local Domain",
"description": "dnsmasq", "description": "Activates local DNS server serving the given domain name",
"type": "boolean" "type": "string"
}, },
"use_ipv4": { "use_ipv4": {
"default": false, "default": false,
"title": "Use IPv4", "title": "Use IPv4",
"description": "Set to true to use IPv4 for AMF / MME addresses", "description": "Set to true to use IPv4 for AMF / MME addresses",
"type": "boolean" "type": "boolean"
},
"promise_cpu_temperature_threshold": {
"title": "CPU temperature promise threshold",
"description": "Temperature threshold above which CPU temperature promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold": {
"title": "Average CPU temperature promise threshold",
"description": "If average temperature over specified duration reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold_duration": {
"title": "Average CPU temperature promise threshold duration",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
{%- set dns_slave_instance_list = [] %}
{%- set sim_slave_instance_list = [] %}
{%- for slave in slave_instance_list %}
{%- set slave_parameters = json_module.loads(slave['_']) %}
{%- if slave_parameters.get('subdomain', '') != '' %}
{%- do dns_slave_instance_list.append(slave) %}
{%- elif slave_parameters.get('imsi', '') != '' %}
{%- do sim_slave_instance_list.append(slave) %}
{%- endif %}
{%- endfor %}
{% set part_list = [] -%} {% set part_list = [] -%}
{%- for i, slave in enumerate(slave_instance_list) %} {%- for slave in sim_slave_instance_list %}
{%- set slave_parameters = json_module.loads(slave['_']) %} {%- set slave_parameters = json_module.loads(slave['_']) %}
{% set slave_reference = slave.get('slave_reference', '') %} {% set slave_reference = slave.get('slave_reference', '') %}
{% set publish_section_title = 'publish-%s' % slave_reference %} {% set publish_section_title = 'publish-%s' % slave_reference %}
...@@ -10,6 +21,19 @@ recipe = slapos.cookbook:publish.serialised ...@@ -10,6 +21,19 @@ recipe = slapos.cookbook:publish.serialised
info = Your SIM card with IMSI {{ slave_parameters.get('imsi', '') }} has been attached to service ${slap-configuration:instance-title}. info = Your SIM card with IMSI {{ slave_parameters.get('imsi', '') }} has been attached to service ${slap-configuration:instance-title}.
{%- endfor %} {%- endfor %}
{%- for slave in dns_slave_instance_list %}
{%- set slave_parameters = json_module.loads(slave['_']) %}
{% set slave_reference = slave.get('slave_reference', '') %}
{% set publish_section_title = 'publish-%s' % slave_reference %}
{% do part_list.append(publish_section_title) %}
[{{ publish_section_title }}]
recipe = slapos.cookbook:publish.serialised
-slave-reference = {{ slave_reference }}
domain = {{ slave_parameters['subdomain'] }}.{{ slapparameter_dict.get('local_domain', '') }}
ip = {{ slave_parameters.get('ip', '') }}
info = DNS entry with has been attached to service ${slap-configuration:instance-title}.
{%- endfor %}
[buildout] [buildout]
parts = parts =
directory directory
...@@ -17,14 +41,13 @@ parts = ...@@ -17,14 +41,13 @@ parts =
mme-config mme-config
mme-service mme-service
monitor-base monitor-base
check-cpu-temperature.py
check-interface-up.py check-interface-up.py
publish-connection-information publish-connection-information
{% if slapparameter_dict.get("iperf3", None) %} {% if slapparameter_dict.get("iperf3", None) %}
iperf-service iperf-service
iperf-listen-promise iperf-listen-promise
{% endif %} {% endif %}
{% if slapparameter_dict.get("dnsmasq", None) %} {% if slapparameter_dict.get("local_domain", '') %}
dnsmasq-service dnsmasq-service
{% endif %} {% endif %}
{% for part in part_list -%} {% for part in part_list -%}
...@@ -84,16 +107,6 @@ service = ${:etc}/service ...@@ -84,16 +107,6 @@ service = ${:etc}/service
promise = ${:etc}/promise promise = ${:etc}/promise
log = ${:var}/log log = ${:var}/log
[check-cpu-temperature.py]
<= macro.promise
promise = check_cpu_temperature
config-testing = {{ slapparameter_dict.get("testing", False) }}
config-frequency = {{ slapparameter_dict.get("promise_cpu_temperature_frequency", 5) }}
config-max-spot-temp = {{ slapparameter_dict.get("promise_cpu_max_spot_temp", 90) }}
config-max-avg-temp = {{ slapparameter_dict.get("promise_cpu_max_avg_temp", 80) }}
config-avg-temp-duration = {{ slapparameter_dict.get("promise_cpu_avg_temp_duration", 600) }}
config-avg-flag-file = ${directory:var}/promise_cpu_avg_flag_file
[ltelogs] [ltelogs]
recipe = slapos.recipe.template:jinja2 recipe = slapos.recipe.template:jinja2
url = {{ ltelogs_template }} url = {{ ltelogs_template }}
...@@ -207,7 +220,7 @@ url = {{ mme_template }} ...@@ -207,7 +220,7 @@ url = {{ mme_template }}
{% endif %} {% endif %}
output = ${directory:etc}/mme.cfg output = ${directory:etc}/mme.cfg
{% if slapparameter_dict.get("dnsmasq", None) %} {% if slapparameter_dict.get("local_domain", '') %}
[dnsmasq-service] [dnsmasq-service]
recipe = slapos.cookbook:wrapper recipe = slapos.cookbook:wrapper
port = 5353 port = 5353
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters", "title": "Input Parameters",
"properties": { "properties": {
{% if rf_mode == 'tdd' %} {%- if rf_mode == 'tdd' %}
"rrh": { "rrh": {
"title": "RRH", "title": "RRH",
"description": "RRH", "description": "RRH",
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
"INACTIVE" "INACTIVE"
] ]
}, },
{% endif %} {%- endif %}
"log_phy_debug": { "log_phy_debug": {
"title": "Physical layer log debug", "title": "Physical layer log debug",
"description": "Enable debug mode for physical layer logs", "description": "Enable debug mode for physical layer logs",
...@@ -185,24 +185,6 @@ ...@@ -185,24 +185,6 @@
"description": "Baseband latency promise will fail if average TX/RX diff reaches threshold (higher than this value)", "description": "Baseband latency promise will fail if average TX/RX diff reaches threshold (higher than this value)",
"type": "number", "type": "number",
"default": 7 "default": 7
},
"promise_cpu_max_spot_temp": {
"title": "Maximum CPU spot temperature",
"description": "Maximum CPU spot temperature above which CPU temperature promise will fail",
"type": "number",
"default": 90
},
"promise_cpu_max_avg_temp": {
"title": "Maximum average CPU temperature",
"description": "If average temperature over specified period reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temp_period": {
"title": "Period of Average CPU temperature checks",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
...@@ -15,9 +15,6 @@ parts = ...@@ -15,9 +15,6 @@ parts =
check-lopcomm-lof.py check-lopcomm-lof.py
check-lopcomm-rssi.py check-lopcomm-rssi.py
check-cpri-lock.py check-cpri-lock.py
{% endif %}
{% if not slapparameter_dict.get("sub-instance", False) %}
check-cpu-temperature.py
{% endif %} {% endif %}
check-sdr-busy.py check-sdr-busy.py
check-baseband-latency.py check-baseband-latency.py
...@@ -292,16 +289,6 @@ password = {{ slapparameter_dict['monitor-password'] | string }} ...@@ -292,16 +289,6 @@ password = {{ slapparameter_dict['monitor-password'] | string }}
<= monitor-promise-base <= monitor-promise-base
name = ${:_buildout_section_name_} name = ${:_buildout_section_name_}
[check-cpu-temperature.py]
<= macro.promise
promise = check_cpu_temperature
config-testing = {{ slapparameter_dict.get("testing", False) }}
config-frequency = {{ slapparameter_dict.get("promise_cpu_temperature_frequency", 5) }}
config-max-spot-temp = {{ slapparameter_dict.get("promise_cpu_max_spot_temp", 90) }}
config-max-avg-temp = {{ slapparameter_dict.get("promise_cpu_max_avg_temp", 80) }}
config-avg-temp-duration = {{ slapparameter_dict.get("promise_cpu_avg_temp_duration", 600) }}
config-avg-flag-file = ${directory:var}/promise_cpu_avg_flag_file
[check-sdr-busy.py] [check-sdr-busy.py]
<= macro.promise <= macro.promise
promise = check_sdr_busy promise = check_sdr_busy
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters", "title": "Input Parameters",
"properties": { "properties": {
{% if rf_mode == 'tdd' %} {%- if rf_mode == 'tdd' %}
"rrh": { "rrh": {
"title": "RRH", "title": "RRH",
"description": "RRH", "description": "RRH",
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
"M2RU Sunwave" "M2RU Sunwave"
] ]
}, },
{% endif %} {%- endif %}
"log_phy_debug": { "log_phy_debug": {
"title": "Physical layer log debug", "title": "Physical layer log debug",
"description": "Enable debug mode for physical layer logs", "description": "Enable debug mode for physical layer logs",
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
"title": "A3 offset for NR handover", "title": "A3 offset for NR handover",
"description": "RSRP gain offset between gNBs which will trigger handover", "description": "RSRP gain offset between gNBs which will trigger handover",
"type": "number", "type": "number",
"default": 6, "default": 6
}, },
"nr_handover_time_to_trigger": { "nr_handover_time_to_trigger": {
"title": "Time to Trigger for NR handover", "title": "Time to Trigger for NR handover",
...@@ -57,7 +57,7 @@ ...@@ -57,7 +57,7 @@
"type": "string", "type": "string",
"enum": [ "enum": [
"5ms 2UL 7DL 4/6 (default)", "5ms 2UL 7DL 4/6 (default)",
"2.5ms 1UL 3DL 2/10", "2.5ms 1UL 3DL 2/10"
], ],
"default": "5ms 2UL 7DL 4/6 (default)" "default": "5ms 2UL 7DL 4/6 (default)"
}, },
...@@ -325,24 +325,6 @@ ...@@ -325,24 +325,6 @@
"description": "Average TX/RX diff threshold above which baseband latency promise will fail", "description": "Average TX/RX diff threshold above which baseband latency promise will fail",
"type": "number", "type": "number",
"default": 7 "default": 7
},
"promise_cpu_temperature_threshold": {
"title": "CPU temperature promise threshold",
"description": "Temperature threshold above which CPU temperature promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold": {
"title": "Average CPU temperature promise threshold",
"description": "If average temperature over specified duration reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold_duration": {
"title": "Average CPU temperature promise threshold duration",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
...@@ -13,9 +13,6 @@ parts = ...@@ -13,9 +13,6 @@ parts =
check-lopcomm-lof.py check-lopcomm-lof.py
check-lopcomm-rssi.py check-lopcomm-rssi.py
check-cpri-lock.py check-cpri-lock.py
{% endif %}
{% if not slapparameter_dict.get("sub-instance", False) %}
check-cpu-temperature.py
{% endif %} {% endif %}
check-sdr-busy.py check-sdr-busy.py
check-baseband-latency.py check-baseband-latency.py
...@@ -246,16 +243,6 @@ password = {{ slapparameter_dict['monitor-password'] | string }} ...@@ -246,16 +243,6 @@ password = {{ slapparameter_dict['monitor-password'] | string }}
<= monitor-promise-base <= monitor-promise-base
name = ${:_buildout_section_name_} name = ${:_buildout_section_name_}
[check-cpu-temperature.py]
<= macro.promise
promise = check_cpu_temperature
config-testing = {{ slapparameter_dict.get("testing", False) }}
config-frequency = {{ slapparameter_dict.get("promise_cpu_temperature_frequency", 5) }}
config-max-spot-temp = {{ slapparameter_dict.get("promise_cpu_max_spot_temp", 90) }}
config-max-avg-temp = {{ slapparameter_dict.get("promise_cpu_max_avg_temp", 80) }}
config-avg-temp-duration = {{ slapparameter_dict.get("promise_cpu_avg_temp_duration", 600) }}
config-avg-flag-file = ${directory:var}/promise_cpu_avg_flag_file
[check-sdr-busy.py] [check-sdr-busy.py]
<= macro.promise <= macro.promise
promise = check_sdr_busy promise = check_sdr_busy
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters", "title": "Input Parameters",
"properties": { "properties": {
"rrh": { "rrh": {
"title": "RRH", "title": "RRH",
"description": "RRH", "description": "RRH",
...@@ -34,7 +33,6 @@ ...@@ -34,7 +33,6 @@
"INACTIVE" "INACTIVE"
] ]
}, },
"log_phy_debug": { "log_phy_debug": {
"title": "Physical layer log debug", "title": "Physical layer log debug",
"description": "Enable debug mode for physical layer logs", "description": "Enable debug mode for physical layer logs",
...@@ -45,13 +43,13 @@ ...@@ -45,13 +43,13 @@
"title": "Tx gain", "title": "Tx gain",
"description": "Tx gain (in dB)", "description": "Tx gain (in dB)",
"type": "number", "type": "number",
"default": "default": 60
}, },
"rx_gain": { "rx_gain": {
"title": "Rx gain", "title": "Rx gain",
"description": "Rx gain (in dB)", "description": "Rx gain (in dB)",
"type": "number", "type": "number",
"default": "default": 45
}, },
"gps_sync": { "gps_sync": {
"default": false, "default": false,
...@@ -63,13 +61,13 @@ ...@@ -63,13 +61,13 @@
"title": "Number of DL antennas", "title": "Number of DL antennas",
"description": "Enumeration: 1, 2, 4 or 8. Number of DL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.", "description": "Enumeration: 1, 2, 4 or 8. Number of DL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.",
"type": "number", "type": "number",
"default": "default": 2
}, },
"n_antenna_ul": { "n_antenna_ul": {
"title": "Number of UL antennas", "title": "Number of UL antennas",
"description": "Enumeration: 1, 2, 4 or 8. Number of UL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.", "description": "Enumeration: 1, 2, 4 or 8. Number of UL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.",
"type": "number", "type": "number",
"default": "default": 2
}, },
"dl_earfcn": { "dl_earfcn": {
"title": "DL EARFCN", "title": "DL EARFCN",
...@@ -81,7 +79,7 @@ ...@@ -81,7 +79,7 @@
"title": "DL RB", "title": "DL RB",
"description": "number of DL resource blocks", "description": "number of DL resource blocks",
"type": "number", "type": "number",
"default": "default": 100
}, },
"mme_list": { "mme_list": {
"title": "MME list", "title": "MME list",
...@@ -148,7 +146,7 @@ ...@@ -148,7 +146,7 @@
"title": "Inactivity Timer", "title": "Inactivity Timer",
"description": "Send RRC connection release after this time (in ms) of network inactivity.", "description": "Send RRC connection release after this time (in ms) of network inactivity.",
"type": "number", "type": "number",
"default": "default": 10000
}, },
"use_ipv4": { "use_ipv4": {
"default": false, "default": false,
...@@ -185,24 +183,6 @@ ...@@ -185,24 +183,6 @@
"description": "Baseband latency promise will fail if average TX/RX diff reaches threshold (higher than this value)", "description": "Baseband latency promise will fail if average TX/RX diff reaches threshold (higher than this value)",
"type": "number", "type": "number",
"default": 7 "default": 7
},
"promise_cpu_max_spot_temp": {
"title": "Maximum CPU spot temperature",
"description": "Maximum CPU spot temperature above which CPU temperature promise will fail",
"type": "number",
"default": 90
},
"promise_cpu_max_avg_temp": {
"title": "Maximum average CPU temperature",
"description": "If average temperature over specified period reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temp_period": {
"title": "Period of Average CPU temperature checks",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters", "title": "Input Parameters",
"properties": { "properties": {
"rrh": { "rrh": {
"title": "RRH", "title": "RRH",
"description": "RRH", "description": "RRH",
...@@ -14,7 +13,6 @@ ...@@ -14,7 +13,6 @@
"M2RU Sunwave" "M2RU Sunwave"
] ]
}, },
"log_phy_debug": { "log_phy_debug": {
"title": "Physical layer log debug", "title": "Physical layer log debug",
"description": "Enable debug mode for physical layer logs", "description": "Enable debug mode for physical layer logs",
...@@ -25,7 +23,7 @@ ...@@ -25,7 +23,7 @@
"title": "A3 offset for NR handover", "title": "A3 offset for NR handover",
"description": "RSRP gain offset between gNBs which will trigger handover", "description": "RSRP gain offset between gNBs which will trigger handover",
"type": "number", "type": "number",
"default": 6, "default": 6
}, },
"nr_handover_time_to_trigger": { "nr_handover_time_to_trigger": {
"title": "Time to Trigger for NR handover", "title": "Time to Trigger for NR handover",
...@@ -57,7 +55,7 @@ ...@@ -57,7 +55,7 @@
"type": "string", "type": "string",
"enum": [ "enum": [
"5ms 2UL 7DL 4/6 (default)", "5ms 2UL 7DL 4/6 (default)",
"2.5ms 1UL 3DL 2/10", "2.5ms 1UL 3DL 2/10"
], ],
"default": "5ms 2UL 7DL 4/6 (default)" "default": "5ms 2UL 7DL 4/6 (default)"
}, },
...@@ -65,25 +63,25 @@ ...@@ -65,25 +63,25 @@
"title": "Tx gain", "title": "Tx gain",
"description": "Tx gain (in dB)", "description": "Tx gain (in dB)",
"type": "number", "type": "number",
"default": "default": 60
}, },
"rx_gain": { "rx_gain": {
"title": "Rx gain", "title": "Rx gain",
"description": "Rx gain (in dB)", "description": "Rx gain (in dB)",
"type": "number", "type": "number",
"default": "default": 45
}, },
"n_antenna_dl": { "n_antenna_dl": {
"title": "Number of DL antennas", "title": "Number of DL antennas",
"description": "Enumeration: 1, 2, 4 or 8. Number of DL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.", "description": "Enumeration: 1, 2, 4 or 8. Number of DL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.",
"type": "number", "type": "number",
"default": "default": 2
}, },
"n_antenna_ul": { "n_antenna_ul": {
"title": "Number of UL antennas", "title": "Number of UL antennas",
"description": "Enumeration: 1, 2, 4 or 8. Number of UL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.", "description": "Enumeration: 1, 2, 4 or 8. Number of UL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.",
"type": "number", "type": "number",
"default": "default": 2
}, },
"gps_sync": { "gps_sync": {
"default": false, "default": false,
...@@ -107,7 +105,7 @@ ...@@ -107,7 +105,7 @@
"title": "Bandwidth", "title": "Bandwidth",
"description": "Downlink Bandwidth (in MHz)", "description": "Downlink Bandwidth (in MHz)",
"type": "number", "type": "number",
"default": "default": 40
}, },
"amf_list": { "amf_list": {
"title": "AMF list", "title": "AMF list",
...@@ -288,7 +286,7 @@ ...@@ -288,7 +286,7 @@
"title": "Inactivity Timer", "title": "Inactivity Timer",
"description": "Send RRC connection release after this time (in ms) of network inactivity.", "description": "Send RRC connection release after this time (in ms) of network inactivity.",
"type": "number", "type": "number",
"default": "default": 10000
}, },
"use_ipv4": { "use_ipv4": {
"default": false, "default": false,
...@@ -325,24 +323,6 @@ ...@@ -325,24 +323,6 @@
"description": "Average TX/RX diff threshold above which baseband latency promise will fail", "description": "Average TX/RX diff threshold above which baseband latency promise will fail",
"type": "number", "type": "number",
"default": 7 "default": 7
},
"promise_cpu_temperature_threshold": {
"title": "CPU temperature promise threshold",
"description": "Temperature threshold above which CPU temperature promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold": {
"title": "Average CPU temperature promise threshold",
"description": "If average temperature over specified duration reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold_duration": {
"title": "Average CPU temperature promise threshold duration",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
...@@ -13,13 +13,13 @@ ...@@ -13,13 +13,13 @@
"title": "Tx gain", "title": "Tx gain",
"description": "Tx gain (in dB)", "description": "Tx gain (in dB)",
"type": "number", "type": "number",
"default": "default": 60
}, },
"rx_gain": { "rx_gain": {
"title": "Rx gain", "title": "Rx gain",
"description": "Rx gain (in dB)", "description": "Rx gain (in dB)",
"type": "number", "type": "number",
"default": "default": 45
}, },
"dl_earfcn": { "dl_earfcn": {
"title": "DL EARFCN", "title": "DL EARFCN",
...@@ -31,31 +31,31 @@ ...@@ -31,31 +31,31 @@
"title": "DL RB", "title": "DL RB",
"description": "number of DL resource blocks", "description": "number of DL resource blocks",
"type": "number", "type": "number",
"default": "default": 100
}, },
"n_antenna_dl": { "n_antenna_dl": {
"title": "Number of DL antennas", "title": "Number of DL antennas",
"description": "Enumeration: 1, 2, 4 or 8. Number of DL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.", "description": "Enumeration: 1, 2, 4 or 8. Number of DL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.",
"type": "number", "type": "number",
"default": "default": 2
}, },
"n_antenna_ul": { "n_antenna_ul": {
"title": "Number of UL antennas", "title": "Number of UL antennas",
"description": "Enumeration: 1, 2, 4 or 8. Number of UL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.", "description": "Enumeration: 1, 2, 4 or 8. Number of UL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.",
"type": "number", "type": "number",
"default": "default": 2
}, },
"imsi": { "imsi": {
"title": "IMSI", "title": "IMSI",
"description": "IMSI", "description": "IMSI",
"type": "string", "type": "string",
"default": "" "default": "001010123456789"
}, },
"k": { "k": {
"title": "K", "title": "K",
"description": "Set the user secret key (as a 16 bytes hexadecimal string, or eventually 32 bytes hexadecimal string for TUAK).", "description": "Set the user secret key (as a 16 bytes hexadecimal string, or eventually 32 bytes hexadecimal string for TUAK).",
"type": "string", "type": "string",
"default": "" "default": "00112233445566778899aabbccddeeff"
}, },
"sim_algo": { "sim_algo": {
"title": "sim_algo", "title": "sim_algo",
...@@ -92,24 +92,6 @@ ...@@ -92,24 +92,6 @@
"description": "String. Defines user IMPI. Must be fully filled with hostname if necessary.", "description": "String. Defines user IMPI. Must be fully filled with hostname if necessary.",
"type": "string", "type": "string",
"default": "" "default": ""
},
"promise_cpu_temperature_threshold": {
"title": "CPU temperature promise threshold",
"description": "Temperature threshold above which CPU temperature promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold": {
"title": "Average CPU temperature promise threshold",
"description": "If average temperature over specified duration reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold_duration": {
"title": "Average CPU temperature promise threshold duration",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
...@@ -13,13 +13,13 @@ ...@@ -13,13 +13,13 @@
"title": "Tx gain", "title": "Tx gain",
"description": "Tx gain (in dB)", "description": "Tx gain (in dB)",
"type": "number", "type": "number",
"default": "default": 60
}, },
"rx_gain": { "rx_gain": {
"title": "Rx gain", "title": "Rx gain",
"description": "Rx gain (in dB)", "description": "Rx gain (in dB)",
"type": "number", "type": "number",
"default": "default": 45
}, },
"dl_nr_arfcn": { "dl_nr_arfcn": {
"title": "DL NR ARFCN", "title": "DL NR ARFCN",
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
"title": "Bandwidth", "title": "Bandwidth",
"description": "Downlink Bandwidth (in MHz)", "description": "Downlink Bandwidth (in MHz)",
"type": "number", "type": "number",
"default": "default": 40
}, },
"ssb_nr_arfcn": { "ssb_nr_arfcn": {
"title": "SSB NR ARFCN", "title": "SSB NR ARFCN",
...@@ -49,25 +49,25 @@ ...@@ -49,25 +49,25 @@
"title": "Number of DL antennas", "title": "Number of DL antennas",
"description": "Enumeration: 1, 2, 4 or 8. Number of DL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.", "description": "Enumeration: 1, 2, 4 or 8. Number of DL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.",
"type": "number", "type": "number",
"default": "default": 2
}, },
"n_antenna_ul": { "n_antenna_ul": {
"title": "Number of UL antennas", "title": "Number of UL antennas",
"description": "Enumeration: 1, 2, 4 or 8. Number of UL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.", "description": "Enumeration: 1, 2, 4 or 8. Number of UL antennas. It must be the same for all NB-IoT and LTE cells sharing the same RF port.",
"type": "number", "type": "number",
"default": "default": 2
}, },
"imsi": { "imsi": {
"title": "IMSI", "title": "IMSI",
"description": "IMSI", "description": "IMSI",
"type": "string", "type": "string",
"default": "" "default": "001010123456789"
}, },
"k": { "k": {
"title": "K", "title": "K",
"description": "Set the user secret key (as a 16 bytes hexadecimal string, or eventually 32 bytes hexadecimal string for TUAK).", "description": "Set the user secret key (as a 16 bytes hexadecimal string, or eventually 32 bytes hexadecimal string for TUAK).",
"type": "string", "type": "string",
"default": "" "default": "00112233445566778899aabbccddeeff"
}, },
"sim_algo": { "sim_algo": {
"title": "sim_algo", "title": "sim_algo",
...@@ -104,24 +104,6 @@ ...@@ -104,24 +104,6 @@
"description": "String. Defines user IMPI. Must be fully filled with hostname if necessary.", "description": "String. Defines user IMPI. Must be fully filled with hostname if necessary.",
"type": "string", "type": "string",
"default": "" "default": ""
},
"promise_cpu_temperature_threshold": {
"title": "CPU temperature promise threshold",
"description": "Temperature threshold above which CPU temperature promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold": {
"title": "Average CPU temperature promise threshold",
"description": "If average temperature over specified duration reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold_duration": {
"title": "Average CPU temperature promise threshold duration",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters", "title": "Input Parameters",
"properties": { "properties": {
"log_phy_debug": { "log_phy_debug": {
"title": "Physical layer log debug", "title": "Physical layer log debug",
"description": "Enable debug mode for physical layer logs", "description": "Enable debug mode for physical layer logs",
...@@ -154,24 +153,6 @@ ...@@ -154,24 +153,6 @@
"description": "Baseband latency promise will fail if average TX/RX diff reaches threshold (higher than this value)", "description": "Baseband latency promise will fail if average TX/RX diff reaches threshold (higher than this value)",
"type": "number", "type": "number",
"default": 7 "default": 7
},
"promise_cpu_max_spot_temp": {
"title": "Maximum CPU spot temperature",
"description": "Maximum CPU spot temperature above which CPU temperature promise will fail",
"type": "number",
"default": 90
},
"promise_cpu_max_avg_temp": {
"title": "Maximum average CPU temperature",
"description": "If average temperature over specified period reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temp_period": {
"title": "Period of Average CPU temperature checks",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters", "title": "Input Parameters",
"properties": { "properties": {
"log_phy_debug": { "log_phy_debug": {
"title": "Physical layer log debug", "title": "Physical layer log debug",
"description": "Enable debug mode for physical layer logs", "description": "Enable debug mode for physical layer logs",
...@@ -14,7 +13,7 @@ ...@@ -14,7 +13,7 @@
"title": "A3 offset for NR handover", "title": "A3 offset for NR handover",
"description": "RSRP gain offset between gNBs which will trigger handover", "description": "RSRP gain offset between gNBs which will trigger handover",
"type": "number", "type": "number",
"default": 6, "default": 6
}, },
"nr_handover_time_to_trigger": { "nr_handover_time_to_trigger": {
"title": "Time to Trigger for NR handover", "title": "Time to Trigger for NR handover",
...@@ -46,7 +45,7 @@ ...@@ -46,7 +45,7 @@
"type": "string", "type": "string",
"enum": [ "enum": [
"5ms 2UL 7DL 4/6 (default)", "5ms 2UL 7DL 4/6 (default)",
"2.5ms 1UL 3DL 2/10", "2.5ms 1UL 3DL 2/10"
], ],
"default": "5ms 2UL 7DL 4/6 (default)" "default": "5ms 2UL 7DL 4/6 (default)"
}, },
...@@ -314,24 +313,6 @@ ...@@ -314,24 +313,6 @@
"description": "Average TX/RX diff threshold above which baseband latency promise will fail", "description": "Average TX/RX diff threshold above which baseband latency promise will fail",
"type": "number", "type": "number",
"default": 7 "default": 7
},
"promise_cpu_temperature_threshold": {
"title": "CPU temperature promise threshold",
"description": "Temperature threshold above which CPU temperature promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold": {
"title": "Average CPU temperature promise threshold",
"description": "If average temperature over specified duration reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold_duration": {
"title": "Average CPU temperature promise threshold duration",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
...@@ -92,24 +92,6 @@ ...@@ -92,24 +92,6 @@
"description": "String. Defines user IMPI. Must be fully filled with hostname if necessary.", "description": "String. Defines user IMPI. Must be fully filled with hostname if necessary.",
"type": "string", "type": "string",
"default": "" "default": ""
},
"promise_cpu_temperature_threshold": {
"title": "CPU temperature promise threshold",
"description": "Temperature threshold above which CPU temperature promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold": {
"title": "Average CPU temperature promise threshold",
"description": "If average temperature over specified duration reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold_duration": {
"title": "Average CPU temperature promise threshold duration",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
...@@ -104,24 +104,6 @@ ...@@ -104,24 +104,6 @@
"description": "String. Defines user IMPI. Must be fully filled with hostname if necessary.", "description": "String. Defines user IMPI. Must be fully filled with hostname if necessary.",
"type": "string", "type": "string",
"default": "" "default": ""
},
"promise_cpu_temperature_threshold": {
"title": "CPU temperature promise threshold",
"description": "Temperature threshold above which CPU temperature promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold": {
"title": "Average CPU temperature promise threshold",
"description": "If average temperature over specified duration reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold_duration": {
"title": "Average CPU temperature promise threshold duration",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters", "title": "Input Parameters",
"properties": { "properties": {
"log_phy_debug": { "log_phy_debug": {
"title": "Physical layer log debug", "title": "Physical layer log debug",
"description": "Enable debug mode for physical layer logs", "description": "Enable debug mode for physical layer logs",
...@@ -154,24 +153,6 @@ ...@@ -154,24 +153,6 @@
"description": "Baseband latency promise will fail if average TX/RX diff reaches threshold (higher than this value)", "description": "Baseband latency promise will fail if average TX/RX diff reaches threshold (higher than this value)",
"type": "number", "type": "number",
"default": 7 "default": 7
},
"promise_cpu_max_spot_temp": {
"title": "Maximum CPU spot temperature",
"description": "Maximum CPU spot temperature above which CPU temperature promise will fail",
"type": "number",
"default": 90
},
"promise_cpu_max_avg_temp": {
"title": "Maximum average CPU temperature",
"description": "If average temperature over specified period reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temp_period": {
"title": "Period of Average CPU temperature checks",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters", "title": "Input Parameters",
"properties": { "properties": {
"log_phy_debug": { "log_phy_debug": {
"title": "Physical layer log debug", "title": "Physical layer log debug",
"description": "Enable debug mode for physical layer logs", "description": "Enable debug mode for physical layer logs",
...@@ -14,7 +13,7 @@ ...@@ -14,7 +13,7 @@
"title": "A3 offset for NR handover", "title": "A3 offset for NR handover",
"description": "RSRP gain offset between gNBs which will trigger handover", "description": "RSRP gain offset between gNBs which will trigger handover",
"type": "number", "type": "number",
"default": 6, "default": 6
}, },
"nr_handover_time_to_trigger": { "nr_handover_time_to_trigger": {
"title": "Time to Trigger for NR handover", "title": "Time to Trigger for NR handover",
...@@ -46,7 +45,7 @@ ...@@ -46,7 +45,7 @@
"type": "string", "type": "string",
"enum": [ "enum": [
"5ms 2UL 7DL 4/6 (default)", "5ms 2UL 7DL 4/6 (default)",
"2.5ms 1UL 3DL 2/10", "2.5ms 1UL 3DL 2/10"
], ],
"default": "5ms 2UL 7DL 4/6 (default)" "default": "5ms 2UL 7DL 4/6 (default)"
}, },
...@@ -314,24 +313,6 @@ ...@@ -314,24 +313,6 @@
"description": "Average TX/RX diff threshold above which baseband latency promise will fail", "description": "Average TX/RX diff threshold above which baseband latency promise will fail",
"type": "number", "type": "number",
"default": 7 "default": 7
},
"promise_cpu_temperature_threshold": {
"title": "CPU temperature promise threshold",
"description": "Temperature threshold above which CPU temperature promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold": {
"title": "Average CPU temperature promise threshold",
"description": "If average temperature over specified duration reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold_duration": {
"title": "Average CPU temperature promise threshold duration",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
...@@ -92,24 +92,6 @@ ...@@ -92,24 +92,6 @@
"description": "String. Defines user IMPI. Must be fully filled with hostname if necessary.", "description": "String. Defines user IMPI. Must be fully filled with hostname if necessary.",
"type": "string", "type": "string",
"default": "" "default": ""
},
"promise_cpu_temperature_threshold": {
"title": "CPU temperature promise threshold",
"description": "Temperature threshold above which CPU temperature promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold": {
"title": "Average CPU temperature promise threshold",
"description": "If average temperature over specified duration reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold_duration": {
"title": "Average CPU temperature promise threshold duration",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
...@@ -104,24 +104,6 @@ ...@@ -104,24 +104,6 @@
"description": "String. Defines user IMPI. Must be fully filled with hostname if necessary.", "description": "String. Defines user IMPI. Must be fully filled with hostname if necessary.",
"type": "string", "type": "string",
"default": "" "default": ""
},
"promise_cpu_temperature_threshold": {
"title": "CPU temperature promise threshold",
"description": "Temperature threshold above which CPU temperature promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold": {
"title": "Average CPU temperature promise threshold",
"description": "If average temperature over specified duration reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold_duration": {
"title": "Average CPU temperature promise threshold duration",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters", "title": "Input Parameters",
"properties": { "properties": {
"log_phy_debug": { "log_phy_debug": {
"title": "Physical layer log debug", "title": "Physical layer log debug",
"description": "Enable debug mode for physical layer logs", "description": "Enable debug mode for physical layer logs",
...@@ -154,24 +153,6 @@ ...@@ -154,24 +153,6 @@
"description": "Baseband latency promise will fail if average TX/RX diff reaches threshold (higher than this value)", "description": "Baseband latency promise will fail if average TX/RX diff reaches threshold (higher than this value)",
"type": "number", "type": "number",
"default": 7 "default": 7
},
"promise_cpu_max_spot_temp": {
"title": "Maximum CPU spot temperature",
"description": "Maximum CPU spot temperature above which CPU temperature promise will fail",
"type": "number",
"default": 90
},
"promise_cpu_max_avg_temp": {
"title": "Maximum average CPU temperature",
"description": "If average temperature over specified period reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temp_period": {
"title": "Period of Average CPU temperature checks",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters", "title": "Input Parameters",
"properties": { "properties": {
"log_phy_debug": { "log_phy_debug": {
"title": "Physical layer log debug", "title": "Physical layer log debug",
"description": "Enable debug mode for physical layer logs", "description": "Enable debug mode for physical layer logs",
...@@ -14,7 +13,7 @@ ...@@ -14,7 +13,7 @@
"title": "A3 offset for NR handover", "title": "A3 offset for NR handover",
"description": "RSRP gain offset between gNBs which will trigger handover", "description": "RSRP gain offset between gNBs which will trigger handover",
"type": "number", "type": "number",
"default": 6, "default": 6
}, },
"nr_handover_time_to_trigger": { "nr_handover_time_to_trigger": {
"title": "Time to Trigger for NR handover", "title": "Time to Trigger for NR handover",
...@@ -46,7 +45,7 @@ ...@@ -46,7 +45,7 @@
"type": "string", "type": "string",
"enum": [ "enum": [
"5ms 2UL 7DL 4/6 (default)", "5ms 2UL 7DL 4/6 (default)",
"2.5ms 1UL 3DL 2/10", "2.5ms 1UL 3DL 2/10"
], ],
"default": "5ms 2UL 7DL 4/6 (default)" "default": "5ms 2UL 7DL 4/6 (default)"
}, },
...@@ -314,24 +313,6 @@ ...@@ -314,24 +313,6 @@
"description": "Average TX/RX diff threshold above which baseband latency promise will fail", "description": "Average TX/RX diff threshold above which baseband latency promise will fail",
"type": "number", "type": "number",
"default": 7 "default": 7
},
"promise_cpu_temperature_threshold": {
"title": "CPU temperature promise threshold",
"description": "Temperature threshold above which CPU temperature promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold": {
"title": "Average CPU temperature promise threshold",
"description": "If average temperature over specified duration reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold_duration": {
"title": "Average CPU temperature promise threshold duration",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
...@@ -92,24 +92,6 @@ ...@@ -92,24 +92,6 @@
"description": "String. Defines user IMPI. Must be fully filled with hostname if necessary.", "description": "String. Defines user IMPI. Must be fully filled with hostname if necessary.",
"type": "string", "type": "string",
"default": "" "default": ""
},
"promise_cpu_temperature_threshold": {
"title": "CPU temperature promise threshold",
"description": "Temperature threshold above which CPU temperature promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold": {
"title": "Average CPU temperature promise threshold",
"description": "If average temperature over specified duration reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold_duration": {
"title": "Average CPU temperature promise threshold duration",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
...@@ -104,24 +104,6 @@ ...@@ -104,24 +104,6 @@
"description": "String. Defines user IMPI. Must be fully filled with hostname if necessary.", "description": "String. Defines user IMPI. Must be fully filled with hostname if necessary.",
"type": "string", "type": "string",
"default": "" "default": ""
},
"promise_cpu_temperature_threshold": {
"title": "CPU temperature promise threshold",
"description": "Temperature threshold above which CPU temperature promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold": {
"title": "Average CPU temperature promise threshold",
"description": "If average temperature over specified duration reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold_duration": {
"title": "Average CPU temperature promise threshold duration",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters", "title": "Input Parameters",
"properties": { "properties": {
"log_phy_debug": { "log_phy_debug": {
"title": "Physical layer log debug", "title": "Physical layer log debug",
"description": "Enable debug mode for physical layer logs", "description": "Enable debug mode for physical layer logs",
...@@ -154,24 +153,6 @@ ...@@ -154,24 +153,6 @@
"description": "Baseband latency promise will fail if average TX/RX diff reaches threshold (higher than this value)", "description": "Baseband latency promise will fail if average TX/RX diff reaches threshold (higher than this value)",
"type": "number", "type": "number",
"default": 7 "default": 7
},
"promise_cpu_max_spot_temp": {
"title": "Maximum CPU spot temperature",
"description": "Maximum CPU spot temperature above which CPU temperature promise will fail",
"type": "number",
"default": 90
},
"promise_cpu_max_avg_temp": {
"title": "Maximum average CPU temperature",
"description": "If average temperature over specified period reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temp_period": {
"title": "Period of Average CPU temperature checks",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
"$schema": "http://json-schema.org/draft-04/schema", "$schema": "http://json-schema.org/draft-04/schema",
"title": "Input Parameters", "title": "Input Parameters",
"properties": { "properties": {
"log_phy_debug": { "log_phy_debug": {
"title": "Physical layer log debug", "title": "Physical layer log debug",
"description": "Enable debug mode for physical layer logs", "description": "Enable debug mode for physical layer logs",
...@@ -14,7 +13,7 @@ ...@@ -14,7 +13,7 @@
"title": "A3 offset for NR handover", "title": "A3 offset for NR handover",
"description": "RSRP gain offset between gNBs which will trigger handover", "description": "RSRP gain offset between gNBs which will trigger handover",
"type": "number", "type": "number",
"default": 6, "default": 6
}, },
"nr_handover_time_to_trigger": { "nr_handover_time_to_trigger": {
"title": "Time to Trigger for NR handover", "title": "Time to Trigger for NR handover",
...@@ -46,7 +45,7 @@ ...@@ -46,7 +45,7 @@
"type": "string", "type": "string",
"enum": [ "enum": [
"5ms 2UL 7DL 4/6 (default)", "5ms 2UL 7DL 4/6 (default)",
"2.5ms 1UL 3DL 2/10", "2.5ms 1UL 3DL 2/10"
], ],
"default": "5ms 2UL 7DL 4/6 (default)" "default": "5ms 2UL 7DL 4/6 (default)"
}, },
...@@ -314,24 +313,6 @@ ...@@ -314,24 +313,6 @@
"description": "Average TX/RX diff threshold above which baseband latency promise will fail", "description": "Average TX/RX diff threshold above which baseband latency promise will fail",
"type": "number", "type": "number",
"default": 7 "default": 7
},
"promise_cpu_temperature_threshold": {
"title": "CPU temperature promise threshold",
"description": "Temperature threshold above which CPU temperature promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold": {
"title": "Average CPU temperature promise threshold",
"description": "If average temperature over specified duration reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold_duration": {
"title": "Average CPU temperature promise threshold duration",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
...@@ -92,24 +92,6 @@ ...@@ -92,24 +92,6 @@
"description": "String. Defines user IMPI. Must be fully filled with hostname if necessary.", "description": "String. Defines user IMPI. Must be fully filled with hostname if necessary.",
"type": "string", "type": "string",
"default": "" "default": ""
},
"promise_cpu_temperature_threshold": {
"title": "CPU temperature promise threshold",
"description": "Temperature threshold above which CPU temperature promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold": {
"title": "Average CPU temperature promise threshold",
"description": "If average temperature over specified duration reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold_duration": {
"title": "Average CPU temperature promise threshold duration",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
...@@ -104,24 +104,6 @@ ...@@ -104,24 +104,6 @@
"description": "String. Defines user IMPI. Must be fully filled with hostname if necessary.", "description": "String. Defines user IMPI. Must be fully filled with hostname if necessary.",
"type": "string", "type": "string",
"default": "" "default": ""
},
"promise_cpu_temperature_threshold": {
"title": "CPU temperature promise threshold",
"description": "Temperature threshold above which CPU temperature promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold": {
"title": "Average CPU temperature promise threshold",
"description": "If average temperature over specified duration reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold_duration": {
"title": "Average CPU temperature promise threshold duration",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
...@@ -92,24 +92,6 @@ ...@@ -92,24 +92,6 @@
"description": "String. Defines user IMPI. Must be fully filled with hostname if necessary.", "description": "String. Defines user IMPI. Must be fully filled with hostname if necessary.",
"type": "string", "type": "string",
"default": "" "default": ""
},
"promise_cpu_temperature_threshold": {
"title": "CPU temperature promise threshold",
"description": "Temperature threshold above which CPU temperature promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold": {
"title": "Average CPU temperature promise threshold",
"description": "If average temperature over specified duration reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold_duration": {
"title": "Average CPU temperature promise threshold duration",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
...@@ -5,7 +5,6 @@ parts = ...@@ -5,7 +5,6 @@ parts =
lte-ue-lte-config lte-ue-lte-config
lte-ue-service lte-ue-service
check-sdr-busy.py check-sdr-busy.py
check-cpu-temperature.py
monitor-base monitor-base
publish-connection-information publish-connection-information
...@@ -144,16 +143,6 @@ password = {{ slapparameter_dict['monitor-password'] | string }} ...@@ -144,16 +143,6 @@ password = {{ slapparameter_dict['monitor-password'] | string }}
<= monitor-promise-base <= monitor-promise-base
name = ${:_buildout_section_name_} name = ${:_buildout_section_name_}
[check-cpu-temperature.py]
<= macro.promise
promise = check_cpu_temperature
config-testing = {{ slapparameter_dict.get("testing", False) }}
config-frequency = {{ slapparameter_dict.get("promise_cpu_temperature_frequency", 5) }}
config-max-spot-temp = {{ slapparameter_dict.get("promise_cpu_max_spot_temp", 90) }}
config-max-avg-temp = {{ slapparameter_dict.get("promise_cpu_max_avg_temp", 80) }}
config-avg-temp-duration = {{ slapparameter_dict.get("promise_cpu_avg_temp_duration", 600) }}
config-avg-flag-file = ${directory:var}/promise_cpu_avg_flag_file
[check-sdr-busy.py] [check-sdr-busy.py]
<= macro.promise <= macro.promise
promise = check_sdr_busy promise = check_sdr_busy
......
...@@ -104,24 +104,6 @@ ...@@ -104,24 +104,6 @@
"description": "String. Defines user IMPI. Must be fully filled with hostname if necessary.", "description": "String. Defines user IMPI. Must be fully filled with hostname if necessary.",
"type": "string", "type": "string",
"default": "" "default": ""
},
"promise_cpu_temperature_threshold": {
"title": "CPU temperature promise threshold",
"description": "Temperature threshold above which CPU temperature promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold": {
"title": "Average CPU temperature promise threshold",
"description": "If average temperature over specified duration reaches this threshold, promise will fail",
"type": "number",
"default": 80
},
"promise_cpu_avg_temperature_threshold_duration": {
"title": "Average CPU temperature promise threshold duration",
"description": "Duration during which average temperature should not exceed specified threshold",
"type": "number",
"default": 600
} }
} }
} }
...@@ -5,7 +5,6 @@ parts = ...@@ -5,7 +5,6 @@ parts =
lte-ue-nr-config lte-ue-nr-config
lte-ue-service lte-ue-service
check-sdr-busy.py check-sdr-busy.py
check-cpu-temperature.py
monitor-base monitor-base
publish-connection-information publish-connection-information
...@@ -147,16 +146,6 @@ password = {{ slapparameter_dict['monitor-password'] | string }} ...@@ -147,16 +146,6 @@ password = {{ slapparameter_dict['monitor-password'] | string }}
<= monitor-promise-base <= monitor-promise-base
name = ${:_buildout_section_name_} name = ${:_buildout_section_name_}
[check-cpu-temperature.py]
<= macro.promise
promise = check_cpu_temperature
config-testing = {{ slapparameter_dict.get("testing", False) }}
config-frequency = {{ slapparameter_dict.get("promise_cpu_temperature_frequency", 5) }}
config-max-spot-temp = {{ slapparameter_dict.get("promise_cpu_max_spot_temp", 90) }}
config-max-avg-temp = {{ slapparameter_dict.get("promise_cpu_max_avg_temp", 80) }}
config-avg-temp-duration = {{ slapparameter_dict.get("promise_cpu_avg_temp_duration", 600) }}
config-avg-flag-file = ${directory:var}/promise_cpu_avg_flag_file
[check-sdr-busy.py] [check-sdr-busy.py]
<= macro.promise <= macro.promise
promise = check_sdr_busy promise = check_sdr_busy
......
...@@ -87,7 +87,7 @@ rf_mode_context_list = [ ...@@ -87,7 +87,7 @@ rf_mode_context_list = [
} }
] ]
for i in range (4): for i in range (len(rf_mode_context_list)):
rf_mode_context_list[i].update({ rf_mode_context_list[i].update({
'default_lte_n_rb_dl' : 100, 'default_lte_n_rb_dl' : 100,
'default_lte_tx_gain' : 60, 'default_lte_tx_gain' : 60,
......
...@@ -7,26 +7,26 @@ extends = ...@@ -7,26 +7,26 @@ extends =
default-dl-earfcn = 0 default-dl-earfcn = 0
default-lte-dl-freq = 0.0 default-lte-dl-freq = 0.0
default-lte-band = 0 default-lte-band = 0
default-lte-n-rb-dl = default-lte-n-rb-dl = 100
default-lte-tx-gain = default-lte-tx-gain = 60
default-lte-rx-gain = default-lte-rx-gain = 45
default-lte-inactivity-timer = default-lte-inactivity-timer = 10000
default-lte-imsi = default-lte-imsi = 001010123456789
default-lte-k = default-lte-k = 00112233445566778899aabbccddeeff
default-dl-nr-arfcn = 0 default-dl-nr-arfcn = 0
default-nr-band = 0 default-nr-band = 0
default-nr-dl-freq = 0.0 default-nr-dl-freq = 0.0
default-nr-bandwidth = default-nr-bandwidth = 40
default-nr-tx-gain = default-nr-tx-gain = 60
default-nr-rx-gain = default-nr-rx-gain = 45
default-nr-ssb-pos-bitmap = 10000000 default-nr-ssb-pos-bitmap = 10000000
default-ssb-nr-arfcn = 0 default-ssb-nr-arfcn = 0
default-nr-inactivity-timer = default-nr-inactivity-timer = 10000
default-nr-imsi = default-nr-imsi = 001010123456789
default-nr-k = default-nr-k = 00112233445566778899aabbccddeeff
min-frequency = 0 min-frequency = 0
max-frequency = 0 max-frequency = 0
default-n-antenna-dl = default-n-antenna-dl =2
default-n-antenna-ul = default-n-antenna-ul =2
...@@ -19,7 +19,7 @@ md5sum = 39cdfbd3bdfcd48eddb4132ff9dcda62 ...@@ -19,7 +19,7 @@ md5sum = 39cdfbd3bdfcd48eddb4132ff9dcda62
[instance-default] [instance-default]
filename = instance-default.cfg.in filename = instance-default.cfg.in
md5sum = 6b8ab50d49136291024c8327aa0931e9 md5sum = 49167e0b289a87723c3108c4dc4fa8b5
[proftpd-config-file] [proftpd-config-file]
filename = proftpd-config-file.cfg.in filename = proftpd-config-file.cfg.in
......
...@@ -49,7 +49,6 @@ recipe = slapos.cookbook:userinfo ...@@ -49,7 +49,6 @@ recipe = slapos.cookbook:userinfo
[proftpd-password] [proftpd-password]
recipe = slapos.cookbook:generate.password recipe = slapos.cookbook:generate.password
username = proftpd username = proftpd
bytes = 12
[proftpd] [proftpd]
ipv6 = ${instance-parameter:ipv6-random} ipv6 = ${instance-parameter:ipv6-random}
......
...@@ -18,7 +18,7 @@ md5sum = 7be0c21751f8385ef876c3d7192d4057 ...@@ -18,7 +18,7 @@ md5sum = 7be0c21751f8385ef876c3d7192d4057
[template-re6stnet] [template-re6stnet]
filename = instance-re6stnet.cfg.in filename = instance-re6stnet.cfg.in
md5sum = 416b5c94810332adf938608e0556fdb4 md5sum = 84320356634f8d241fc827683d211bb8
[template-apache-conf] [template-apache-conf]
filename = apache.conf.in filename = apache.conf.in
...@@ -26,4 +26,4 @@ md5sum = 3d55f7c9c4fc7279f06bfe6313a78a4b ...@@ -26,4 +26,4 @@ md5sum = 3d55f7c9c4fc7279f06bfe6313a78a4b
[template-re6st-registry-conf] [template-re6st-registry-conf]
filename = re6st-registry.conf.in filename = re6st-registry.conf.in
md5sum = 28ffb7a742e293139814f1324ff003ff md5sum = d82f1f25ce429669373cd9a69ae59cd1
...@@ -89,6 +89,11 @@ ...@@ -89,6 +89,11 @@
"title": "Community configuration", "title": "Community configuration",
"textarea": true, "textarea": true,
"type": "string" "type": "string"
},
"grace-period": {
"title": "Period in seconds during which a client can renew its certificate even if expired (default 100 days)",
"type": "integer",
"default": 8640000
} }
} }
} }
...@@ -84,6 +84,7 @@ hello = {{ slapparameter_dict.get('hello', 15) }} ...@@ -84,6 +84,7 @@ hello = {{ slapparameter_dict.get('hello', 15) }}
min-protocol = {{ slapparameter_dict.get('min-protocol', -1) }} min-protocol = {{ slapparameter_dict.get('min-protocol', -1) }}
encrypt = {{ slapparameter_dict.get('encrypt', 'False') }} encrypt = {{ slapparameter_dict.get('encrypt', 'False') }}
same-country = {{ slapparameter_dict.get('same-country', '') }} same-country = {{ slapparameter_dict.get('same-country', '') }}
grace-period = {{ slapparameter_dict.get('grace-period', 8640000) }}
{%- set community = slapparameter_dict.get('community-conf') %} {%- set community = slapparameter_dict.get('community-conf') %}
{%- if community %} {%- if community %}
community-path = ${re6st-community-conf:output} community-path = ${re6st-community-conf:output}
......
...@@ -33,3 +33,4 @@ same-country {{ parameter_dict['same-country'] }} ...@@ -33,3 +33,4 @@ same-country {{ parameter_dict['same-country'] }}
{% if parameter_dict.get('community-path') -%} {% if parameter_dict.get('community-path') -%}
community {{ parameter_dict['community-path'] }} community {{ parameter_dict['community-path'] }}
{% endif -%} {% endif -%}
grace-period {{ parameter_dict['grace-period'] }}
...@@ -262,6 +262,11 @@ setup = ${slapos-repository:location}/software/js-drone/test/ ...@@ -262,6 +262,11 @@ setup = ${slapos-repository:location}/software/js-drone/test/
egg = slapos.test.osie_coupler egg = slapos.test.osie_coupler
setup = ${slapos-repository:location}/software/osie-coupler/test/ setup = ${slapos-repository:location}/software/osie-coupler/test/
[slapos.test.mail-server-setup]
<= setup-develop-egg
egg = slapos.test.mail-server
setup = ${slapos-repository:location}/software/mail-server/test/
[slapos.core-repository] [slapos.core-repository]
<= git-clone-repository <= git-clone-repository
repository = https://lab.nexedi.com/nexedi/slapos.core.git repository = https://lab.nexedi.com/nexedi/slapos.core.git
...@@ -364,6 +369,7 @@ eggs += ...@@ -364,6 +369,7 @@ eggs +=
${slapos.test.theia-setup:egg} ${slapos.test.theia-setup:egg}
${slapos.test.turnserver-setup:egg} ${slapos.test.turnserver-setup:egg}
${slapos.test.upgrade_erp5-setup:egg} ${slapos.test.upgrade_erp5-setup:egg}
${slapos.test.mail-server-setup:egg}
# We don't name this interpreter `python`, so that when we run slapos node # We don't name this interpreter `python`, so that when we run slapos node
# software, installation scripts running `python` use a python without any # software, installation scripts running `python` use a python without any
...@@ -457,6 +463,7 @@ tests = ...@@ -457,6 +463,7 @@ tests =
theia ${slapos.test.theia-setup:setup} theia ${slapos.test.theia-setup:setup}
turnserver ${slapos.test.turnserver-setup:setup} turnserver ${slapos.test.turnserver-setup:setup}
upgrade_erp5 ${slapos.test.upgrade_erp5-setup:setup} upgrade_erp5 ${slapos.test.upgrade_erp5-setup:setup}
mail-server ${slapos.test.mail-server-setup:setup}
[versions] [versions]
# recurls are under development # recurls are under development
......
...@@ -690,10 +690,12 @@ extra-paths = ...@@ -690,10 +690,12 @@ extra-paths =
patch-binary = ${patch:location}/bin/patch patch-binary = ${patch:location}/bin/patch
Acquisition-patches = ${:_profile_base_location_}/../../component/egg-patch/Acquisition/aq_dynamic-4.7.patch#85b0090e216cead0fc86c5c274450d96 Acquisition-patches = ${:_profile_base_location_}/../../component/egg-patch/Acquisition/aq_dynamic-4.7.patch#85b0090e216cead0fc86c5c274450d96
Acquisition-patch-options = -p1 Acquisition-patch-options = -p1
Products.DCWorkflow-patches = ${:_profile_base_location_}/../../component/egg-patch/Products.DCWorkflow/workflow_method-2.4.1.patch#ec7bb56a9f1d37fcbf960cd1e96e6e6d Products.BTreeFolder2-patches = ${:_profile_base_location_}/../../component/egg-patch/Products.BTreeFolder2/0001-Add-a-confirmation-prompt-on-Delete-All-Objects-butt.patch#44de3abf382e287b8766c2f29ec1cf74
Products.DCWorkflow-patch-options = -p1 Products.BTreeFolder2-patch-options = -p1
Products.CMFCore-patches = ${:_profile_base_location_}/../../component/egg-patch/Products.CMFCore/portal_skins_ZMI_find.patch#19ec05c0477c50927ee1df6eb75d1e7f Products.CMFCore-patches = ${:_profile_base_location_}/../../component/egg-patch/Products.CMFCore/portal_skins_ZMI_find.patch#19ec05c0477c50927ee1df6eb75d1e7f
Products.CMFCore-patch-options = -p1 Products.CMFCore-patch-options = -p1
Products.DCWorkflow-patches = ${:_profile_base_location_}/../../component/egg-patch/Products.DCWorkflow/workflow_method-2.4.1.patch#ec7bb56a9f1d37fcbf960cd1e96e6e6d
Products.DCWorkflow-patch-options = -p1
PyPDF2-patches = ${:_profile_base_location_}/../../component/egg-patch/PyPDF2/0001-Custom-implementation-of-warnings.formatwarning-remo.patch#d25bb0f5dde7f3337a0a50c2f986f5c8 PyPDF2-patches = ${:_profile_base_location_}/../../component/egg-patch/PyPDF2/0001-Custom-implementation-of-warnings.formatwarning-remo.patch#d25bb0f5dde7f3337a0a50c2f986f5c8
PyPDF2-patch-options = -p1 PyPDF2-patch-options = -p1
python-magic-patches = ${:_profile_base_location_}/../../component/egg-patch/python_magic/magic.patch#de0839bffac17801e39b60873a6c2068 python-magic-patches = ${:_profile_base_location_}/../../component/egg-patch/python_magic/magic.patch#de0839bffac17801e39b60873a6c2068
...@@ -801,6 +803,7 @@ parso = 0.5.1 ...@@ -801,6 +803,7 @@ parso = 0.5.1
Pillow = 6.2.2 Pillow = 6.2.2
polib = 1.0.8 polib = 1.0.8
pprofile = 2.0.4 pprofile = 2.0.4
Products.BTreeFolder2 = 4.4+SlapOSPatched001
Products.CMFCore = 2.7.0+SlapOSPatched001 Products.CMFCore = 2.7.0+SlapOSPatched001
Products.ExternalMethod = 4.7 Products.ExternalMethod = 4.7
Products.GenericSetup = 2.3.0 Products.GenericSetup = 2.3.0
......
...@@ -304,7 +304,7 @@ slapos.rebootstrap = 4.5 ...@@ -304,7 +304,7 @@ slapos.rebootstrap = 4.5
slapos.recipe.build = 0.56 slapos.recipe.build = 0.56
slapos.recipe.cmmi = 0.19 slapos.recipe.cmmi = 0.19
slapos.recipe.template = 5.1 slapos.recipe.template = 5.1
slapos.toolbox = 0.134 slapos.toolbox = 0.136
smmap = 5.0.0 smmap = 5.0.0
sniffio = 1.3.0 sniffio = 1.3.0
sortedcontainers = 2.4.0 sortedcontainers = 2.4.0
......
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