Commit e5a7d1da authored by Rémy Coutable's avatar Rémy Coutable

Improve Features API and its docs and add a Changelog item

Signed-off-by: default avatarRémy Coutable <remy@rymai.me>
parent 00ac76cc
---
title: Allow to enable the performance bar per user or Feature group
merge_request: 12362
author:
# Performance Bar # Performance Bar
>**Note:** >**Note:**
Available since GitLab 9.4. Available since GitLab 9.4. For installations from source you'll have to
configure it yourself.
A Performance Bar can be displayed, to dig into the performance of a page. When A Performance Bar can be displayed, to dig into the performance of a page. When
activated, it looks as follows: activated, it looks as follows:
...@@ -22,8 +23,9 @@ It allows you to: ...@@ -22,8 +23,9 @@ It allows you to:
## Enable the Performance Bar ## Enable the Performance Bar
By default, the Performance Bar is disabled. You can enable it either for a By default, the Performance Bar is disabled. You can enable it for a group
given feature group or user. and/or users. Note that it's possible to enable it for a group and for
individual users at the same time.
1. Edit `/etc/gitlab/gitlab.rb` 1. Edit `/etc/gitlab/gitlab.rb`
1. Find the following line, and set it to the group's **full path** that should 1. Find the following line, and set it to the group's **full path** that should
...@@ -47,7 +49,10 @@ The `performance_team` feature group maps to the group specified by the ...@@ -47,7 +49,10 @@ The `performance_team` feature group maps to the group specified by the
curl --data "feature_group=performance_team" --data "value=true" --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/features/performance_bar curl --data "feature_group=performance_team" --data "value=true" --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/features/performance_bar
``` ```
### Enable for a specific user ### Enable for specific users
It's possible to enable the Performance Bar for specific users in addition to a
group, or even instead of a group:
``` ```
curl --data "user=my_username" --data "value=true" --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/features/performance_bar curl --data "user=my_username" --data "value=true" --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/features/performance_bar
......
...@@ -61,8 +61,8 @@ POST /features/:name ...@@ -61,8 +61,8 @@ POST /features/:name
| `feature_group` | string | no | A Feature group name | | `feature_group` | string | no | A Feature group name |
| `user` | string | no | A GitLab username | | `user` | string | no | A GitLab username |
Note that `feature_group` and `user` are mutually exclusive, with Note that you can enable or disable a feature for both a `feature_group` and a
`feature_group` taking priority. `user` with a single API call.
```bash ```bash
curl --data "value=30" --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/features/new_library curl --data "value=30" --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/features/new_library
......
...@@ -13,7 +13,8 @@ During runtime you can set the values for the gates via the ...@@ -13,7 +13,8 @@ During runtime you can set the values for the gates via the
Starting from GitLab 9.4 we support feature groups via Starting from GitLab 9.4 we support feature groups via
[Flipper groups](https://github.com/jnunemaker/flipper/blob/v0.10.2/docs/Gates.md#2-group). [Flipper groups](https://github.com/jnunemaker/flipper/blob/v0.10.2/docs/Gates.md#2-group).
Feature groups must be defined statically in `lib/feature.rb` (in the `.register_feature_groups` method), but their implementation can obviously be Feature groups must be defined statically in `lib/feature.rb` (in the
`.register_feature_groups` method), but their implementation can obviously be
dynamic (querying the DB etc.). You can see how the `performance_team` feature dynamic (querying the DB etc.). You can see how the `performance_team` feature
group for a concrete example. group for a concrete example.
......
...@@ -14,14 +14,12 @@ module API ...@@ -14,14 +14,12 @@ module API
end end
end end
def gate_target(params) def gate_targets(params)
if params[:feature_group] targets = []
Feature.group(params[:feature_group]) targets << Feature.group(params[:feature_group]) if params[:feature_group]
elsif params[:user] targets << User.find_by_username(params[:user]) if params[:user]
User.find_by_username(params[:user])
else targets
gate_value(params)
end
end end
end end
...@@ -42,18 +40,25 @@ module API ...@@ -42,18 +40,25 @@ module API
requires :value, type: String, desc: '`true` or `false` to enable/disable, an integer for percentage of time' requires :value, type: String, desc: '`true` or `false` to enable/disable, an integer for percentage of time'
optional :feature_group, type: String, desc: 'A Feature group name' optional :feature_group, type: String, desc: 'A Feature group name'
optional :user, type: String, desc: 'A GitLab username' optional :user, type: String, desc: 'A GitLab username'
mutually_exclusive :feature_group, :user
end end
post ':name' do post ':name' do
feature = Feature.get(params[:name]) feature = Feature.get(params[:name])
target = gate_target(params) targets = gate_targets(params)
value = gate_value(params) value = gate_value(params)
case value case value
when true when true
feature.enable(target) if targets.present?
targets.each { |target| feature.enable(target) }
else
feature.enable
end
when false when false
feature.disable(target) if targets.present?
targets.each { |target| feature.disable(target) }
else
feature.disable
end
else else
feature.enable_percentage_of_time(value) feature.enable_percentage_of_time(value)
end end
......
...@@ -113,6 +113,20 @@ describe API::Features do ...@@ -113,6 +113,20 @@ describe API::Features do
{ 'key' => 'actors', 'value' => ["User:#{user.id}"] } { 'key' => 'actors', 'value' => ["User:#{user.id}"] }
]) ])
end end
it 'creates an enabled feature for the given user and feature group when passed user=username and feature_group=perf_team' do
post api("/features/#{feature_name}", admin), value: 'true', user: user.username, feature_group: 'perf_team'
expect(response).to have_http_status(201)
expect(json_response).to eq(
'name' => 'my_feature',
'state' => 'conditional',
'gates' => [
{ 'key' => 'boolean', 'value' => false },
{ 'key' => 'groups', 'value' => ['perf_team'] },
{ 'key' => 'actors', 'value' => ["User:#{user.id}"] }
])
end
end end
it 'creates a feature with the given percentage if passed an integer' do it 'creates a feature with the given percentage if passed an integer' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment