# 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', ''); 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); # 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), {}) # # } # #