1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
require "flipper/feature"
require "flipper/gate_values"
require "flipper/adapters/sync/feature_synchronizer"
module Flipper
module Adapters
class Sync
# Public: Given a local and remote adapter, it can update the local to
# match the remote doing only the necessary enable/disable operations.
class Synchronizer
# Public: Initializes a new synchronizer.
#
# local - The Flipper adapter to get in sync with the remote.
# remote - The Flipper adapter that is source of truth that the local
# adapter should be brought in line with.
# options - The Hash of options.
# :instrumenter - The instrumenter used to instrument.
def initialize(local, remote, options = {})
@local = local
@remote = remote
@instrumenter = options.fetch(:instrumenter, Instrumenters::Noop)
@raise = options.fetch(:raise, true)
end
# Public: Forces a sync.
def call
@instrumenter.instrument("synchronizer_call.flipper") { sync }
end
private
def sync
local_get_all = @local.get_all
remote_get_all = @remote.get_all
# Sync all the gate values.
remote_get_all.each do |feature_key, remote_gates_hash|
feature = Feature.new(feature_key, @local)
local_gates_hash = local_get_all[feature_key] || @local.default_config
local_gate_values = GateValues.new(local_gates_hash)
remote_gate_values = GateValues.new(remote_gates_hash)
FeatureSynchronizer.new(feature, local_gate_values, remote_gate_values).call
end
# Add features that are missing in local and present in remote.
features_to_add = remote_get_all.keys - local_get_all.keys
features_to_add.each { |key| Feature.new(key, @local).add }
# Remove features that are present in local and missing in remote.
features_to_remove = local_get_all.keys - remote_get_all.keys
features_to_remove.each { |key| Feature.new(key, @local).remove }
nil
rescue => exception
@instrumenter.instrument("synchronizer_exception.flipper", exception: exception)
raise if @raise
end
end
end
end
end
|