Packages

A simple somewhat opinionated consul config provider for elixir 1.9+ releases.

Current section

Files

Jump to
consul_config_provider doc readme.html
Raw

doc/readme.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="ExDoc v0.24.1">
<meta name="project" content="Consul Config Provider v0.2.3">
<title>ConsulConfigProvider — Consul Config Provider v0.2.3</title>
<link rel="stylesheet" href="dist/elixir-a172fe91e725dcb259e2.css" />
<script src="dist/sidebar_items-0dddf5bac7.js"></script>
<script src="docs_config.js"></script>
<script async src="dist/app-f27ff079945e43879c46.js"></script>
</head>
<body data-type="extras">
<script>
try {
if (localStorage.getItem('night-mode') === 'true') {
document.body.classList.add('night-mode');
}
} catch (error) { }
</script>
<div class="main">
<button class="sidebar-button sidebar-toggle">
<span class="icon-menu" title="Collapse/expand sidebar"></span>
</button>
<section class="sidebar">
<form class="sidebar-search" action="search.html">
<button type="submit" class="search-button" aria-label="Submit Search">
<span class="icon-search" aria-hidden="true" title="Submit search"></span>
</button>
<button type="button" tabindex="-1" class="search-close-button" aria-label="Cancel Search">
<span class="icon-cross" aria-hidden="true" title="Cancel search"></span>
</button>
<label class="search-label">
<input name="q" type="text" class="search-input" placeholder="Search..." aria-label="Input your search terms" autocomplete="off" />
</label>
</form>
<div class="autocomplete">
<div class="autocomplete-results">
</div>
</div>
<div class="sidebar-header">
<div class="sidebar-projectDetails">
<a href="https://github.com/blueshift-labs/consul_config_provider" class="sidebar-projectName">
Consul Config Provider
</a>
<strong class="sidebar-projectVersion">
v0.2.3
</strong>
</div>
</div>
<ul class="sidebar-listNav">
<li><a id="extras-list-link" href="#full-list">Pages</a></li>
<li><a id="modules-list-link" href="#full-list">Modules</a></li>
</ul>
<div class="gradient"></div>
<ul id="full-list" class="sidebar-fullList"></ul>
</section>
<section class="content">
<div class="content-outer">
<div id="content" class="content-inner">
<h1>ConsulConfigProvider</h1><p><a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT"></img></a>
<a href="https://hex.pm/packages/consul_config_provider"><img src="http://img.shields.io/hexpm/v/consul_config_provider.svg?style=flat" alt="Hex pm"></img></a>
<a href="https://hexdocs.pm/consul_config_provider/"><img src="https://img.shields.io/badge/docs-latest-green.svg?style=flat" alt="hexdocs.pm"></img></a></p><h2 id="installation" class="section-heading">
<a href="#installation" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
Installation
</h2>
<p>The package can be installed by adding <code class="inline">consul_config_provider</code> to your list of dependencies in <code class="inline">mix.exs</code>:</p><pre><code class="makeup elixir"><span class="kd">def</span><span class="w"> </span><span class="nf">deps</span><span class="w"> </span><span class="k" data-group-id="2470087354-1">do</span><span class="w">
</span><span class="p" data-group-id="2470087354-2">[</span><span class="w">
</span><span class="p" data-group-id="2470087354-3">{</span><span class="ss">:consul_config_provider</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;~&gt; 0.2&quot;</span><span class="p" data-group-id="2470087354-3">}</span><span class="p">,</span><span class="w">
</span><span class="p" data-group-id="2470087354-4">{</span><span class="ss">:mojito</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;~&gt; 0.7&quot;</span><span class="p" data-group-id="2470087354-4">}</span><span class="p">,</span><span class="w"> </span><span class="c1"># default implmentation for http client</span><span class="w">
</span><span class="p" data-group-id="2470087354-2">]</span><span class="w">
</span><span class="k" data-group-id="2470087354-1">end</span></code></pre><ul><li>Only add in mojito if you want to use the default http behaviour and not define your own client</li></ul><p>The docs can be found at <a href="https://hexdocs.pm/consul_config_provider">https://hexdocs.pm/consul_config_provider</a>.</p><h3 id="sample-usage" class="section-heading">
<a href="#sample-usage" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
Sample Usage
</h3>
<ul><li>In mix.exs<pre><code class="makeup elixir"><span class="ss">releases</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="6246326066-1">[</span><span class="w">
</span><span class="ss">release_name</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="6246326066-2">[</span><span class="w">
</span><span class="ss">include_executables_for</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="6246326066-3">[</span><span class="ss">:unix</span><span class="p" data-group-id="6246326066-3">]</span><span class="p">,</span><span class="w">
</span><span class="ss">applications</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="6246326066-4">[</span><span class="w">
</span><span class="ss">runtime_tools</span><span class="p">:</span><span class="w"> </span><span class="ss">:permanent</span><span class="p">,</span><span class="w">
</span><span class="ss">app_name_here</span><span class="p">:</span><span class="w"> </span><span class="ss">:permanent</span><span class="w">
</span><span class="p" data-group-id="6246326066-4">]</span><span class="p">,</span><span class="w">
</span><span class="ss">config_providers</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="6246326066-5">[</span><span class="w">
</span><span class="p" data-group-id="6246326066-6">{</span><span class="nc">ConsulConfigProvider</span><span class="p">,</span><span class="w">
</span><span class="p" data-group-id="6246326066-7">%{</span><span class="ss">prefix</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;services/app_namespace_in_consul/v1&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">app_name</span><span class="p">:</span><span class="w"> </span><span class="ss">:app_name_here</span><span class="p" data-group-id="6246326066-7">}</span><span class="p" data-group-id="6246326066-6">}</span><span class="w">
</span><span class="p" data-group-id="6246326066-5">]</span><span class="w">
</span><span class="p" data-group-id="6246326066-2">]</span><span class="w">
</span><span class="p" data-group-id="6246326066-1">]</span><span class="p">,</span></code></pre></li></ul><h3 id="transformer" class="section-heading">
<a href="#transformer" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
Transformer
</h3>
<ul><li>You can also implement an optional transformer behaviour to change the form of your configs.</li><li>This is helpful for interopt with erlang modules that might have different opinions about things</li></ul><pre><code class="makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">Example.Config</span><span class="w"> </span><span class="k" data-group-id="3851092545-1">do</span><span class="w">
</span><span class="na">@behaviour</span><span class="w"> </span><span class="nc">ConsulConfigProvider.Transformer</span><span class="w">
</span><span class="na">@impl</span><span class="w"> </span><span class="no">true</span><span class="w">
</span><span class="kd">def</span><span class="w"> </span><span class="nf">transform</span><span class="p" data-group-id="3851092545-2">(</span><span class="p" data-group-id="3851092545-3">{</span><span class="ss">:erlkaf</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3851092545-4">[</span><span class="ss">clients</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="3851092545-5">[</span><span class="ss">producer</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="3851092545-6">[</span><span class="ss">client_options</span><span class="p">:</span><span class="w"> </span><span class="n">client_options</span><span class="p" data-group-id="3851092545-6">]</span><span class="p" data-group-id="3851092545-5">]</span><span class="p" data-group-id="3851092545-4">]</span><span class="p" data-group-id="3851092545-3">}</span><span class="p" data-group-id="3851092545-2">)</span><span class="w"> </span><span class="k" data-group-id="3851092545-7">do</span><span class="w">
</span><span class="n">default_client_options</span><span class="w"> </span><span class="o">=</span><span class="w">
</span><span class="nc">Application</span><span class="o">.</span><span class="n">get_env</span><span class="p" data-group-id="3851092545-8">(</span><span class="ss">:erlkaf</span><span class="p">,</span><span class="w"> </span><span class="ss">:clients</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3851092545-9">[</span><span class="p" data-group-id="3851092545-9">]</span><span class="p" data-group-id="3851092545-8">)</span><span class="w">
</span><span class="o">|&gt;</span><span class="w"> </span><span class="nc">Keyword</span><span class="o">.</span><span class="n">get</span><span class="p" data-group-id="3851092545-10">(</span><span class="ss">:producer</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3851092545-11">[</span><span class="p" data-group-id="3851092545-11">]</span><span class="p" data-group-id="3851092545-10">)</span><span class="w">
</span><span class="o">|&gt;</span><span class="w"> </span><span class="nc">Keyword</span><span class="o">.</span><span class="n">get</span><span class="p" data-group-id="3851092545-12">(</span><span class="ss">:client_options</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3851092545-13">[</span><span class="p" data-group-id="3851092545-13">]</span><span class="p" data-group-id="3851092545-12">)</span><span class="w">
</span><span class="p" data-group-id="3851092545-14">{</span><span class="ss">:erlkaf</span><span class="p">,</span><span class="w">
</span><span class="p" data-group-id="3851092545-15">[</span><span class="w">
</span><span class="ss">clients</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="3851092545-16">[</span><span class="w">
</span><span class="ss">producer</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="3851092545-17">[</span><span class="w">
</span><span class="ss">type</span><span class="p">:</span><span class="w"> </span><span class="ss">:producer</span><span class="p">,</span><span class="w">
</span><span class="ss">client_options</span><span class="p">:</span><span class="w"> </span><span class="nc">Keyword</span><span class="o">.</span><span class="n">merge</span><span class="p" data-group-id="3851092545-18">(</span><span class="n">default_client_options</span><span class="p">,</span><span class="w"> </span><span class="n">client_options</span><span class="p" data-group-id="3851092545-18">)</span><span class="w">
</span><span class="p" data-group-id="3851092545-17">]</span><span class="w">
</span><span class="p" data-group-id="3851092545-16">]</span><span class="w">
</span><span class="p" data-group-id="3851092545-15">]</span><span class="p" data-group-id="3851092545-14">}</span><span class="w">
</span><span class="k" data-group-id="3851092545-7">end</span><span class="w">
</span><span class="na">@impl</span><span class="w"> </span><span class="no">true</span><span class="w">
</span><span class="kd">def</span><span class="w"> </span><span class="nf">transform</span><span class="p" data-group-id="3851092545-19">(</span><span class="n">config</span><span class="p" data-group-id="3851092545-19">)</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="n">config</span><span class="w">
</span><span class="k" data-group-id="3851092545-1">end</span></code></pre><p>Then in your configs:</p><pre><code class="makeup elixir"><span class="n">config</span><span class="w"> </span><span class="ss">:consul_config_provider</span><span class="p">,</span><span class="w"> </span><span class="ss">transformer_module</span><span class="p">:</span><span class="w"> </span><span class="nc">Example.Config</span></code></pre><h3 id="information" class="section-heading">
<a href="#information" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a>
Information
</h3>
<ul><li>This provider assumes the config name has a file extension which is either <code class="inline">.json</code>, <code class="inline">.yml</code>, or <code class="inline">.yaml</code> no other extensions are supported although PRs would be welcomed. If you do not follow this naming convention the provider will not work and throw.</li><li>In the above the <code class="inline">prefix</code> is used for the keys path and can also be set with <code class="inline">CONSUL_PREFIX</code> (provide an empty string to the prefix if you wish to just use the env var)</li><li>The <code class="inline">CONSUL_HOST</code> env var is used for the host to talk to consul and defaults to localhost</li><li>The <code class="inline">CONSUL_PORT</code> env var is used for the port to talk to consul and defaults to 8500</li><li>The http_module is dynamic and you can specify your own if you choose to do so. Just implement the HTTP behaviour and make your implementation return an <code class="inline">{:ok, json_body_binary_string}</code> as per the mojito example which will be the fallback. You might have to deal with coercing the input keyword list for the mojito arguments to support the client you are using, as well. You also need to set <code class="inline">config :consul_config_provider, :http_module, Client.YourClient</code> pointing to your client in your configs.</li><li>Dependency-related configs are namespaced with their own application name while other configs use the input app_name for their namespace</li></ul>
<div class="bottom-actions">
<div class="bottom-actions-item">
<a href="api-reference.html" class="bottom-actions-button" rel="prev">
<span class="subheader">
← Previous Page
</span>
<span class="title">
API Reference
</span>
</a>
</div>
<div class="bottom-actions-item">
</div>
</div>
<footer class="footer">
<p>
<span class="line">
Built using
<a href="https://github.com/elixir-lang/ex_doc" title="ExDoc" target="_blank" rel="help noopener">ExDoc</a> (v0.24.1) for the
<a href="https://elixir-lang.org" title="Elixir" target="_blank">Elixir programming language</a>.
</span>
<span class="line">
Designed by
<a href="https://twitter.com/dignifiedquire" target="_blank" rel="noopener" title="@dignifiedquire">Friedel Ziegelmayer</a>.
</span>
</p>
<p>
<a href="api-reference.html" title="API reference" class="line footer-button">API Reference</a>
<button class="line footer-button display-shortcuts-help">
Display keyboard shortcuts
</button>
<button class="line footer-button night-mode-toggle">
Toggle night mode
</button>
<button class="line footer-button display-quick-switch">
Go to a HexDocs package
</button>
<button class="line footer-button tooltips-toggle">
<span class="tooltips-option-disable">Disable tooltips</span>
<span class="tooltips-option-enable">Enable tooltips</span>
</button>
</p>
</footer>
</div>
</div>
</section>
</div>
</body>
</html>