Code Monkey home page Code Monkey logo

quarantine's Introduction

Quarantine

Build Status Quarantine Version

Quarantine is a tiny OTP application for feature toggles.

Currently it supports two strategies:

  • whitelist list of ids that can access some feature
  • percentage compute a score from the given id check with score <= percentage. Note that the combination of feature name and id produce a deterministic score

Setup

Add quarantine to your application deps

def deps do
  [
    {:quarantine, "~> 0.1.2"}
  ]
end

You 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"]

Usage

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)
=> false

When 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}]

Testing

Flags can be enabled for a specific test with Quarantine.Server.start_link/1.

Quarantine.Server.start_link(feature1: [1], feature2: [3,4])

Refresh config without re-deploying your application

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
end

S3 Driver example:

defmodule S3Driver do
  @behaviour Quarantine.Driver

  def get_flags() do
    "bucket"
    |> ExAws.S3.get_object("path")
    |> ExAws.request!()
  end
end

Then add it to :quarantine configuration:

config :quarantine, 
   driver: RedisDriver,
   poll_interval: 60_000 # in ms

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.