Quarantine is a tiny OTP application for feature toggles.
Currently it supports two strategies:
whitelistlist of ids that can access some featurepercentagecompute a score from the givenidcheck withscore <= percentage. Note that the combination offeaturename andidproduce a deterministic score
Add quarantine to your application deps
def deps do
[
{:quarantine, "~> 0.1.2"}
]
endYou can setup flags using config environment or provide a Quarantine.Driver to fetch configuration from an external source
When hardcoded config is good enough you can provide it as below
config :quarantine,
some_percentage_flag: 0.5,
some_whitelist_flag: [1, 2, 3]
other_whitelist_flag: ["08362804-bdc0-11e8-9407-24750000045e", "9fbc6c6e-f2dd-4f9d-8944-b81dd5a25fed"]Simply call enabled?/2 where you want to split the control flow
Quarantine.enabled?(:some_percentage_flag, 1)
=> false
Quarantine.enabled?(:some_percentage_flag, 2)
=> true
Quarantine.enabled?(:some_whitelist_flag, 1)
=> true
Quarantine.enabled?(:some_whitelist_flag, 9)
=> falseWhen using percentage you can check current ids distribution if needed with scores/2
Quarantine.scores(:some_percentage_flag, [1, 2, 3])
=> [{1, 0.9967498283360037},
{2, 0.18811322194247349},
{3, 0.30522621499961855}]Flags can be enabled for a specific test with Quarantine.Server.start_link/1.
Quarantine.Server.start_link(feature1: [1], feature2: [3,4])To do that you should provide an implementation of Quarantine.Driver that fetch flags configuration from a external source
Redis Driver example:
defmodule RedisDriver do
@behaviour Quarantine.Driver
def get_flags() do
Redix.command!(:my_redix, ["GET", "my_flags"])
end
endS3 Driver example:
defmodule S3Driver do
@behaviour Quarantine.Driver
def get_flags() do
"bucket"
|> ExAws.S3.get_object("path")
|> ExAws.request!()
end
endThen add it to :quarantine configuration:
config :quarantine,
driver: RedisDriver,
poll_interval: 60_000 # in ms