Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions app/controllers/v3/feature_flags_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
require 'fetchers/feature_flag_list_fetcher'

class FeatureFlagsController < ApplicationController
OVERRIDE_IN_MANIFEST_MSG = 'The feature flag has an override configured in the bosh manifest and can be overwritten when the deployment is updated.'.freeze

def index
message = FeatureFlagsListMessage.from_params(query_params)
invalid_param!(message.errors.full_messages) unless message.valid?
Expand Down Expand Up @@ -38,6 +40,7 @@ def update
unprocessable!(message.errors.full_messages) unless message.valid?

flag = VCAP::CloudController::FeatureFlagUpdate.new.update(flag, message)
add_warning_headers([OVERRIDE_IN_MANIFEST_MSG]) if VCAP::CloudController::FeatureFlag.config_overridden?(hashed_params[:name].to_sym)
render status: :ok, json: Presenters::V3::FeatureFlagPresenter.new(flag)
rescue FeatureFlagUpdate::Error => e
unprocessable!(e)
Expand Down
8 changes: 8 additions & 0 deletions app/models/runtime/feature_flag.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ class UndefinedFeatureFlagError < StandardError

ADMIN_READ_ONLY_SKIPPABLE = [:space_developer_env_var_visibility].freeze

@feature_flag_overrides = nil

export_attributes :name, :enabled, :error_message
import_attributes :name, :enabled, :error_message

Expand Down Expand Up @@ -104,6 +106,12 @@ def self.override_default_flags(feature_flag_overrides)
feature_flag.enabled = flag_value
feature_flag.save
end

@feature_flag_overrides = feature_flag_overrides
end

def self.config_overridden?(feature_flag_name)
@feature_flag_overrides && @feature_flag_overrides.keys.include?(feature_flag_name)
end

private_class_method :admin?
Expand Down
45 changes: 45 additions & 0 deletions spec/unit/controllers/v3/feature_flags_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,51 @@
expect(parsed_body['custom_error_message']).to be_nil
end
end

context 'when there are overrides in configuration' do
before do
stub_const('VCAP::CloudController::FeatureFlag::DEFAULT_FLAGS', {
flag1: false, flag2: true, flag3: true, flag4: false
})
VCAP::CloudController::FeatureFlag.override_default_flags({ flag1: false, flag4: true })
end

it 'returns a warning message for the overridden flags' do
patch :update, params: {
name: 'flag1',
enabled: false
}, as: :json

expect(response).to have_http_status :ok
expect(response).to have_warning_message FeatureFlagsController::OVERRIDE_IN_MANIFEST_MSG

patch :update, params: {
name: 'flag4',
enabled: false
}, as: :json

expect(response).to have_http_status :ok
expect(response).to have_warning_message FeatureFlagsController::OVERRIDE_IN_MANIFEST_MSG
end

it 'returns no warning message for not overridden flags' do
patch :update, params: {
name: 'flag2',
enabled: false
}, as: :json

expect(response).to have_http_status :ok
expect(response.headers['X-Cf-Warnings']).to be_nil

patch :update, params: {
name: 'flag3',
enabled: false
}, as: :json

expect(response).to have_http_status :ok
expect(response.headers['X-Cf-Warnings']).to be_nil
end
end
end
end
end
28 changes: 28 additions & 0 deletions spec/unit/models/runtime/feature_flag_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -332,5 +332,33 @@ module VCAP::CloudController
end
end
end

describe '.config_overridden?' do
context 'when overrides have not been set yet' do
before do
FeatureFlag.instance_variable_set(:@feature_flag_overrides, nil)
end

it 'returns nil' do
expect(FeatureFlag.config_overridden?(:diego_docker)).to be_nil
end
end

context 'when overrides have been set' do
let(:default_diego_docker_value) { FeatureFlag::DEFAULT_FLAGS[:diego_docker] }

before do
FeatureFlag.override_default_flags({ diego_docker: !default_diego_docker_value })
end

it 'return true for the overriden flag' do
expect(FeatureFlag.config_overridden?(:diego_docker)).to be true
end

it 'return false for other flags' do
expect(FeatureFlag.config_overridden?(:potato)).to be false
end
end
end
end
end