308 lines
8.4 KiB
Jsonnet
308 lines
8.4 KiB
Jsonnet
# Tag to add a restart policy on all containers
|
|
#
|
|
# Examples:
|
|
# tags:
|
|
# - docker-services-restart:
|
|
# policy: always
|
|
# services:
|
|
# - srv1
|
|
# - mysqldb
|
|
|
|
# Default imports
|
|
# -------------------------------------
|
|
|
|
# Import from external data
|
|
local action = std.parseJson(std.extVar('action'));
|
|
local docker_data = std.parseJson(std.extVar('docker_data'));
|
|
local user_data = std.parseJson(std.extVar('user_data'));
|
|
|
|
|
|
#
|
|
# Default config
|
|
# -------------------------------------
|
|
|
|
# Build default config
|
|
local global_vars_default(user_data) =
|
|
assert std.isString(user_data.paasify_ns);
|
|
|
|
# Init defaults
|
|
local ns = std.get(user_data, 'paasify_ns', '<NS>');
|
|
local stack = std.get(user_data, 'paasify_stack', '<STACK>');
|
|
local sep = std.get(user_data, 'paasify_sep', '_');
|
|
|
|
# Runtime vars
|
|
local default_name = std.get(user_data, 'app_name', stack);
|
|
local default_top_domain = std.get(user_data, 'app_domain', ns);
|
|
|
|
# We replace app name by 'app', just for nice looking
|
|
local traefik_ident = if stack != default_name then default_name else 'app';
|
|
#local traefik_ident = stack;
|
|
|
|
{
|
|
|
|
# Required by API:
|
|
traefik_network_name: ns + sep + 'traefik',
|
|
traefik_net_ident: 'default',
|
|
traefik_net_external: true,
|
|
traefik_svc_ident: stack ,
|
|
traefik_svc_port: 80,
|
|
|
|
traefik_svc_name: null,
|
|
traefik_svc_domain: null,
|
|
traefik_svc_entrypoints: null,
|
|
traefik_svc_auth: null,
|
|
traefik_svc_tls: null,
|
|
traefik_svc_certresolver: null,
|
|
|
|
};
|
|
|
|
local global_vars_override(conf) =
|
|
|
|
local default_ident = conf.paasify_ns + conf.paasify_sep + conf.paasify_stack;
|
|
|
|
local default_svc_name = [
|
|
std.get(conf, 'traefik_svc_name'),
|
|
default_ident
|
|
];
|
|
local default_svc_domain = [
|
|
std.get(conf, 'traefik_svc_domain'),
|
|
std.get(conf, 'app_fqdn'),
|
|
std.get(conf, 'app_name', conf.paasify_stack) + '.' + std.get(conf, 'app_domain', conf.paasify_ns),
|
|
];
|
|
|
|
local default_svc_entrypoints = [
|
|
std.get(conf, 'traefik_svc_entrypoints'),
|
|
"web",
|
|
];
|
|
|
|
|
|
{
|
|
_traefik_svc_name: std.prune(default_svc_name)[0],
|
|
_traefik_svc_domain: std.prune(default_svc_domain)[0],
|
|
#_traefik_svc_domain: std.prune(default_svc_domain), #[0],
|
|
#_traefik_svc_domain2: conf,
|
|
|
|
_traefik_svc_entrypoints: std.prune(default_svc_entrypoints)[0],
|
|
_traefik_svc_auth: std.get(conf, 'traefik_svc_auth', default=null),
|
|
_traefik_svc_tls: std.get(conf, 'traefik_svc_tls', default=false),
|
|
_traefik_svc_certresolver: std.get(conf, 'traefik_svc_certresolver', default=null),
|
|
#zz_conf: conf ,
|
|
}
|
|
;
|
|
|
|
|
|
|
|
|
|
######### OLD , new => global_vars_override
|
|
#local conf_override(user_data) =
|
|
#
|
|
# local ns = std.get(user_data, 'paasify_ns');
|
|
# local stack = std.get(user_data, 'paasify_stack');
|
|
# local sep = std.get(user_data, 'paasify_sep');
|
|
#
|
|
# # Runtime vars
|
|
# local default_name = std.get(user_data, 'app_name', stack);
|
|
# local default_top_domain = std.get(user_data, 'app_domain', ns);
|
|
# local traefik_ident = if stack != default_name then default_name else 'app';
|
|
# #local svc_name = ns + sep + default_name + sep + traefik_ident;
|
|
# local svc_name = traefik_ident + ns + default_name ;
|
|
#
|
|
# # Build config
|
|
# user_data
|
|
# + {
|
|
# _traefik_svc_domain: std.get(user_data, 'traefik_svc_domain', default_name + '.' + default_top_domain),
|
|
# _traefik_svc_name: std.get(user_data, 'traefik_svc_name', svc_name),
|
|
# }
|
|
# ;
|
|
|
|
|
|
# Internal functions
|
|
# -------------------------------------
|
|
|
|
# Base routing
|
|
local LabelsTraefik(svc, domain, entrypoints, port) =
|
|
{
|
|
["traefik.enable"]: "true",
|
|
["traefik.http.routers." + svc + ".rule"]: 'Host(`' + domain + '`)',
|
|
["traefik.http.routers." + svc + ".entrypoints"]: entrypoints,
|
|
["traefik.http.routers." + svc + ".service"]: svc,
|
|
["traefik.http.services." + svc + ".loadbalancer.server.port"]: std.format("%s", port),
|
|
};
|
|
|
|
# Middleware
|
|
local LabelsTraefikAuthelia(svc, authservice) =
|
|
if std.isString(authservice) && std.length(authservice) > 0 then
|
|
{
|
|
["traefik.http.routers." + svc + ".middlewares"]: authservice + '@docker',
|
|
} else {};
|
|
|
|
# TLS management
|
|
local LabelsTraefikTls(svc, status) =
|
|
if status == true then
|
|
{
|
|
["traefik.http.routers." + svc + ".tls"]: "true",
|
|
} else {};
|
|
|
|
local LabelsTraefikCertResolver(svc, name) =
|
|
if std.isString(name) && std.length(name) > 0 then
|
|
LabelsTraefikTls(svc, true) + {
|
|
["traefik.http.routers." + svc + ".tls.certresolver"]: name,
|
|
} else {};
|
|
|
|
# Networking
|
|
local TraefikSvcNetwork(id, name) =
|
|
if std.isString(id) then
|
|
{
|
|
[id]: null,
|
|
} else {};
|
|
|
|
local TraefikPrjNetwork(id, name, external) =
|
|
if std.isString(id) then
|
|
{
|
|
[id]+: {
|
|
name: name
|
|
},
|
|
} +
|
|
if external == true then
|
|
{
|
|
[id]+: {
|
|
external: true,
|
|
},
|
|
} else {}
|
|
else {};
|
|
|
|
|
|
# Return result
|
|
# -------------------------------------
|
|
local docker_transform(conf_raw, docker_data) =
|
|
assert std.isString(conf_raw.paasify_stack_service);
|
|
local conf = conf_raw + global_vars_override(conf_raw);
|
|
|
|
#local paasify_stack_service = std.get(conf, 'traefik_svc_ident', conf.paasify_stack_service );
|
|
local service = std.get(conf, 'traefik_svc_ident', conf.paasify_stack_service );
|
|
local services = std.split(std.get(conf, 'paasify_stack_services', service), ',');
|
|
|
|
{
|
|
# Append stack network
|
|
#networks+: TraefikPrjNetwork(svc_network_id, svc_network),
|
|
networks+: TraefikPrjNetwork(
|
|
conf.traefik_net_ident,
|
|
conf.traefik_network_name,
|
|
conf.traefik_net_external),
|
|
|
|
# Apply per services labels
|
|
services+: {
|
|
[conf.traefik_svc_ident]+: {
|
|
labels+:
|
|
LabelsTraefik(
|
|
conf.traefik_svc_name,
|
|
conf._traefik_svc_domain,
|
|
conf.traefik_svc_entrypoints,
|
|
conf.traefik_svc_port)
|
|
+ LabelsTraefikAuthelia(
|
|
conf.traefik_svc_name,
|
|
conf.traefik_svc_auth)
|
|
+ LabelsTraefikTls(
|
|
conf.traefik_svc_name,
|
|
conf.traefik_svc_tls)
|
|
+ LabelsTraefikCertResolver(
|
|
conf.traefik_svc_name,
|
|
conf.traefik_svc_certresolver)
|
|
,
|
|
networks+: TraefikSvcNetwork(
|
|
conf.traefik_net_ident,
|
|
conf.traefik_network_name),
|
|
},
|
|
},
|
|
|
|
#["x-paasify"]: {
|
|
# #stack_data: stack_data,
|
|
# #user_data: user_data,
|
|
# #config: config,
|
|
# config2: conf,
|
|
# #env_data: env_data,
|
|
#},
|
|
|
|
};
|
|
|
|
|
|
|
|
# Return result
|
|
# -------------------------------------
|
|
|
|
|
|
local main() =
|
|
|
|
local getConf(name) = std.parseJson(std.extVar(name));
|
|
local action = getConf('action');
|
|
|
|
if action == 'metadata' then
|
|
{}
|
|
|
|
# TOFIX IN CODE: else if action == 'docker_vars' then
|
|
else if action == 'vars_docker' then
|
|
local user_data = getConf('user_data');
|
|
#local runtime = { [key]: user_data[key] for key in std.objectFields(user_data) if std.startsWith(key, 'paasify_') };
|
|
|
|
#local default_data = global_vars_override(runtime, global_vars_default(user_data));
|
|
local default_data = global_vars_default(user_data);
|
|
|
|
local common = { [x]: std.get(user_data, std.lstripChars(x, '_'), default_data[x] ) for x in std.objectFields(default_data) };
|
|
{
|
|
input: user_data,
|
|
default_data: default_data,
|
|
|
|
diff: default_data + common + global_vars_override(default_data + user_data ),
|
|
merged: user_data + global_vars_override(default_data + user_data ),
|
|
|
|
# PROD
|
|
#diff_OLD: global_vars_override(runtime, default_data + common ),
|
|
}
|
|
|
|
else if action == 'docker_transform' then
|
|
local user_data = getConf('user_data');
|
|
local docker_data = getConf('docker_data');
|
|
|
|
{
|
|
input: user_data,
|
|
|
|
#diff: docker_transform(user_data + global_vars_override(user_data), docker_data),
|
|
diff: docker_transform(user_data, docker_data),
|
|
merged: docker_data + self.diff,
|
|
};
|
|
|
|
# Run main script !
|
|
main()
|
|
|
|
|
|
|
|
#
|
|
#
|
|
#if action == 'conf_schema' then
|
|
# {}
|
|
#else if action == 'vars_docker' then # Fetch default variables
|
|
#
|
|
# local default_data = global_vars_default(user_data);
|
|
# local common = { [x]: std.get(user_data, x, default_data[x] ) for x in std.objectFields(default_data) };
|
|
# {
|
|
# #input: user_data,
|
|
#
|
|
# # Mendatory fields
|
|
# diff: conf_override( common ),
|
|
# merged: conf_override( default_data + user_data ),
|
|
# }
|
|
#
|
|
#else if action == 'docker_transform' then
|
|
# {
|
|
# conf_in: user_data,
|
|
# conf_out: conf_override(user_data),
|
|
# diff: docker_transform(conf_override(user_data), docker_data),
|
|
# merged: docker_data + self.diff,
|
|
# }
|
|
#
|
|
# # + {
|
|
# # 'zz_diff': docker_transform(conf_override(user_data), {})
|
|
# # }
|
|
#
|
|
#
|