Commit 81ced6f5 authored by Tomasz Maczukin's avatar Tomasz Maczukin

Split `/runners` entrypoint to `/runners` and `/runners/all`

parent b56ee397
# Runners API # Runners API
## List runners ## List owned runners
Get a list of runners. Get a list of specific runners available for user.
``` ```
GET /runners GET /runners
...@@ -37,6 +37,57 @@ Example response: ...@@ -37,6 +37,57 @@ Example response:
] ]
``` ```
## List all runners
Get a list of all runners (specific and shared). Access restricted to users with `admin` privileges.
```
GET /runners/all
```
| Attribute | Type | Required | Description |
|-----------|---------|----------|---------------------|
| `scope` | string | no | The scope of runners to show, one of: `specific`, `shared`, `active`, `paused`, `online`; showing all runners if none provided |
```
curl -H "PRIVATE_TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/runners/all"
```
Example response:
```json
[
{
"active": true,
"description": "shared-runner-1",
"id": 1,
"is_shared": true,
"name": null
},
{
"active": true,
"description": "shared-runner-2",
"id": 3,
"is_shared": true,
"name": null
},
{
"active": true,
"description": "test-1-20150125",
"id": 6,
"is_shared": false,
"name": null
},
{
"active": true,
"description": "test-2-20150125",
"id": 8,
"is_shared": false,
"name": null
}
]
```
## Get runner's details ## Get runner's details
Get details of a runner. Get details of a runner.
......
...@@ -4,19 +4,22 @@ module API ...@@ -4,19 +4,22 @@ module API
before { authenticate! } before { authenticate! }
resource :runners do resource :runners do
# Get available shared runners # Get runners available for user
# #
# Example Request: # Example Request:
# GET /runners # GET /runners
get do get do
runners = runners = filter_runners(current_user.ci_authorized_runners, params[:scope])
if current_user.is_admin? present paginate(runners), with: Entities::Runner
Ci::Runner.all
else
current_user.ci_authorized_runners
end end
runners = filter_runners(runners, params[:scope]) # Get all runners - shared and specific
#
# Example Request:
# GET /runners/all
get 'all' do
authenticated_as_admin!
runners = filter_runners(Ci::Runner.all, params[:scope])
present paginate(runners), with: Entities::Runner present paginate(runners), with: Entities::Runner
end end
......
...@@ -23,30 +23,62 @@ describe API::API, api: true do ...@@ -23,30 +23,62 @@ describe API::API, api: true do
describe 'GET /runners' do describe 'GET /runners' do
context 'authorized user' do context 'authorized user' do
context 'authorized user with admin privileges' do it 'should return user available runners' do
it 'should return all runners' do get api('/runners', user)
get api('/runners', admin)
shared = false || json_response.map{ |r| r['is_shared'] }.inject{ |sum, shr| sum || shr} shared = false || json_response.map{ |r| r['is_shared'] }.inject{ |sum, shr| sum || shr}
expect(response.status).to eq(200) expect(response.status).to eq(200)
expect(json_response).to be_an Array expect(json_response).to be_an Array
expect(shared).to be_truthy expect(shared).to be_falsey
end
end end
context 'authorized user without admin privileges' do it 'should filter runners by scope' do
it 'should return user available runners' do get api('/runners?scope=specific', user)
get api('/runners', user)
shared = false || json_response.map{ |r| r['is_shared'] }.inject{ |sum, shr| sum || shr} shared = false || json_response.map{ |r| r['is_shared'] }.inject{ |sum, shr| sum || shr}
expect(response.status).to eq(200) expect(response.status).to eq(200)
expect(json_response).to be_an Array expect(json_response).to be_an Array
expect(shared).to be_falsey expect(shared).to be_falsey
end end
it 'should avoid filtering if scope is invalid' do
get api('/runners?scope=unknown', user)
expect(response.status).to eq(400)
end
end
context 'unauthorized user' do
it 'should not return runners' do
get api('/runners')
expect(response.status).to eq(401)
end
end
end
describe 'GET /runners/all' do
context 'authorized user' do
context 'with admin privileges' do
it 'should return all runners' do
get api('/runners/all', admin)
shared = false || json_response.map{ |r| r['is_shared'] }.inject{ |sum, shr| sum || shr}
expect(response.status).to eq(200)
expect(json_response).to be_an Array
expect(shared).to be_truthy
end
end
context 'without admin privileges' do
it 'should not return runners list' do
get api('/runners/all', user)
expect(response.status).to eq(403)
end
end end
it 'should filter runners by scope' do it 'should filter runners by scope' do
get api('/runners?scope=specific', user) get api('/runners?scope=specific', admin)
shared = false || json_response.map{ |r| r['is_shared'] }.inject{ |sum, shr| sum || shr} shared = false || json_response.map{ |r| r['is_shared'] }.inject{ |sum, shr| sum || shr}
expect(response.status).to eq(200) expect(response.status).to eq(200)
...@@ -55,7 +87,7 @@ describe API::API, api: true do ...@@ -55,7 +87,7 @@ describe API::API, api: true do
end end
it 'should avoid filtering if scope is invalid' do it 'should avoid filtering if scope is invalid' do
get api('/runners?scope=unknown', user) get api('/runners?scope=unknown', admin)
expect(response.status).to eq(400) expect(response.status).to eq(400)
end end
end end
......
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