docker-compose/.paasify/plugins/_paasify.jsonnet
2022-08-18 22:08:53 -04:00

260 lines
7.0 KiB
Jsonnet

# Helpers functions
# -------------------------------------
# Internal Tag functions
# -------------------------------------
local BuildConfImage(image, name, version, prefix) =
local array = if std.isString(image) then
std.splitLimit(image, ':', 2)
else [name, version];
local app_name = if std.length(array) > 0 then array[0] else name;
local app_version = if std.length(array) > 1 then array[1] else version;
local app_image = app_name + ':' + app_version;
{
#app_image_INPUT: [image, name, version, prefix],
#app_image_prefix: prefix,
#app_image_name: prefix + app_name,
#app_image_version: app_version,
#app_image: prefix + app_image,
_app_image_prefix: prefix,
_app_image_name: prefix + app_name,
_app_image_version: app_version,
_app_image: prefix + app_image,
};
# ---
local Sanitize(str) =
std.strReplace(str, '_', '-');
local ParseFQDN(fqdn, name, domain) =
local array = if std.isString(fqdn) then
std.splitLimit(fqdn, '.', 2)
else [];
{
# Deprecated
_app_name: if std.length(array) > 1 then array[0] else name,
_app_domain: if std.length(array) > 1 then array[1] else domain,
_app_fqdn: if std.length(array) > 1 then fqdn else name + '.' + domain,
};
local BuildConfDomain(fqdn, name, domain) =
local conf = ParseFQDN(fqdn, name, domain);
{ [x]: Sanitize(conf[x]) for x in std.objectFields(conf) };
# Base functions
# -------------------------------------
# Provides plugin metadata
local metadata = {
name: '',
description: '',
author: '',
email: '',
license: '',
version: '',
require: '',
api: 1,
schema: {},
};
# Provides global vars
local global_vars_default(runtime) =
# Only the usage of paasify.X vars is allowed
assert std.isString(runtime.paasify_stack);
local app_ident = runtime.paasify_ns + runtime.paasify_sep + runtime.paasify_stack;
{
app_ident: app_ident,
app_name: runtime.paasify_stack,
app_domain: runtime.paasify_ns,
app_fqdn: null,
app_image_name: runtime.paasify_stack,
app_image_version: 'latest',
app_image_prefix: '',
app_image: null,
##########################
app_service: runtime.paasify_stack,
app_network: 'default',
app_network_external: false,
app_network_name: app_ident,
#########
app_expose: false,
app_expose_ip: '0.0.0.0',
app_expose_port: null,
app_port: '80',
app_prot: 'tcp',
app_puid: '1000',
app_pgid: '1000',
app_tz: 'UTC',
app_tz_var: 'TZ',
app_tz_mount: false,
app_tz_mounts: '/etc/timezone:/etc/timezone:ro,/etc/localtime:/etc/localtime:ro',
app_debug: 'false',
app_dir_conf: './conf',
app_dir_data: './data',
app_dir_logs: './logs',
app_dir_share: './share',
app_dir_tmp: './tmp',
app_dir_secrets: './secrets',
# TOFIX: Merging data, SHOULD BEIN OVERRIDE !!!
app_admin_login: 'admin',
app_admin_email: 'admin@' + self.app_domain,
app_admin_passwd: 'admin',
app_user_login: 'user',
app_user_email: 'user@' + self.app_domain,
app_user_passwd: 'user',
# Other implementations standard:
# mysql_network_name
# pgsql_network_name
# ldap_network_name
# wireguard_network_name
# traefik_network_name
# Like:
# traefik_network_name: ns + sep + 'traefik',
#FUTURE app_dir_prefix: std.get(user_data, 'app_dir_prefix', './')
# app_dir_logs: ResolvePath(std.get(user_data, 'app_dir_logs', './logs/'), cwd),
# app_dir_conf: ResolvePath(std.get(user_data, 'app_dir_conf', './conf/'), cwd),
# app_dir_data: ResolvePath(std.get(user_data, 'app_dir_data', './data/'), cwd),
# app_dir_share: ResolvePath(std.get(user_data, 'app_dir_share', './share/'), cwd),
# app_dir_tmp: ResolvePath(std.get(user_data, 'app_dir_tmp', './tmp/'), cwd),
}
;
# Provides global var overrides
local global_vars_override(conf) =
# Any plugin user configuration can be used here
# No usage of paasify.X is permitted here at anytime !
# Forbidden to change existing vars, only new vars with _PREFIX
BuildConfImage(
conf.app_image,
conf.app_image_name,
conf.app_image_version,
conf.app_image_prefix)
+ BuildConfDomain(
conf.app_fqdn,
conf.app_name,
conf.app_domain)
;
# Provides docker data override
local docker_transform(conf_raw, docker_data) =
assert std.isString(conf_raw.paasify_stack_service);
local conf = global_vars_default(conf_raw) + conf_raw + global_vars_override(conf_raw);
#local service_name = std.prune( conf.tag_name , conf.paasify_service);
local service_name = conf.paasify_stack_service;
local services_names = std.split(conf.paasify_stack_services, ',') ;
{
services+: {
[svc_name]+: {
restart: 'always',
environment+: {
[conf.app_tz_var]: conf.app_tz,
},
} for svc_name in services_names
},
#[service_name]+: {
# comment: 'only on main container',
#},
#
#['x-paasify']+: {
# config_dump: conf,
#}
}
;
# Return result
# -------------------------------------
local main() =
local getConf(name) = std.parseJson(std.extVar(name));
local action = getConf('action');
if action == 'metadata' then
metadata
# TOFIX IN CODE: else if action == 'docker_vars' then
# else if action == 'vars_docker_v1' then
# local user_data = getConf('user_data');
# local default_data = global_vars_override(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) };
# #local common = { [std.lstripChars(x, '_')]: std.get(user_data, std.lstripChars(x, '_'), default_data[x] ) for x in std.objectFields(default_data) };
# {
# input: user_data,
# base: global_vars_override(default_data),
# diff: global_vars_override(default_data + common ),
# merged: global_vars_override(default_data + user_data ),
# }
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_default(user_data);
local common = { [x]: std.get(user_data, std.lstripChars(x, '_'), default_data[x] ) for x in std.objectFields(default_data) };
#local common = { [std.lstripChars(x, '_')]: std.get(user_data, std.lstripChars(x, '_'), default_data[x] ) for x in std.objectFields(default_data) };
{
input: user_data,
diff: default_data + common + global_vars_override(default_data + user_data ),
merged: user_data + global_vars_override(default_data + user_data ),
}
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()