Commit fd6c86aa authored by Timo Furrer's avatar Timo Furrer Committed by Luke Duncalfe

Implement GET APIs for Deploy Tokens

Changelog: added
MR: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82467
parent d4762348
...@@ -94,6 +94,46 @@ Example response: ...@@ -94,6 +94,46 @@ Example response:
] ]
``` ```
### Get a project deploy token
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82467) in GitLab 14.9.
Get a single project's deploy token by ID.
```plaintext
GET /projects/:id/deploy_tokens/:token_id
```
Parameters:
| Attribute | Type | Required | Description |
| ---------- | -------------- | ---------------------- | ----------- |
| `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `token_id` | integer | **{check-circle}** Yes | ID of the deploy token |
Example request:
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/deploy_tokens/1"
```
Example response:
```json
{
"id": 1,
"name": "MyToken",
"username": "gitlab+deploy-token-1",
"expires_at": "2020-02-14T00:00:00.000Z",
"revoked": false,
"expired": false,
"scopes": [
"read_repository",
"read_registry"
]
}
```
### Create a project deploy token ### Create a project deploy token
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21811) in GitLab 12.9. > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21811) in GitLab 12.9.
...@@ -108,7 +148,7 @@ Parameters: ...@@ -108,7 +148,7 @@ Parameters:
| Attribute | Type | Required | Description | | Attribute | Type | Required | Description |
| ------------ | ---------------- | ---------------------- | ----------- | | ------------ | ---------------- | ---------------------- | ----------- |
| `id` | integer/string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user | | `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | **{check-circle}** Yes | New deploy token's name | | `name` | string | **{check-circle}** Yes | New deploy token's name |
| `expires_at` | datetime | **{dotted-circle}** No | Expiration date for the deploy token. Does not expire if no value is provided. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`) | | `expires_at` | datetime | **{dotted-circle}** No | Expiration date for the deploy token. Does not expire if no value is provided. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`) |
| `username` | string | **{dotted-circle}** No | Username for deploy token. Default is `gitlab+deploy-token-{n}` | | `username` | string | **{dotted-circle}** No | Username for deploy token. Default is `gitlab+deploy-token-{n}` |
...@@ -153,8 +193,8 @@ Parameters: ...@@ -153,8 +193,8 @@ Parameters:
| Attribute | Type | Required | Description | | Attribute | Type | Required | Description |
| ---------- | -------------- | ---------------------- | ----------- | | ---------- | -------------- | ---------------------- | ----------- |
| `id` | integer/string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user | | `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `token_id` | integer | **{check-circle}** Yes | The ID of the deploy token | | `token_id` | integer | **{check-circle}** Yes | ID of the deploy token |
Example request: Example request:
...@@ -210,6 +250,46 @@ Example response: ...@@ -210,6 +250,46 @@ Example response:
] ]
``` ```
### Get a group deploy token
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82467) in GitLab 14.9.
Get a single group's deploy token by ID.
```plaintext
GET /groups/:id/deploy_tokens/:token_id
```
Parameters:
| Attribute | Type | Required | Description |
| ----------- | -------------- | ---------------------- | ----------- |
| `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `token_id` | integer | **{check-circle}** Yes | ID of the deploy token |
Example request:
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/1/deploy_tokens/1"
```
Example response:
```json
{
"id": 1,
"name": "MyToken",
"username": "gitlab+deploy-token-1",
"expires_at": "2020-02-14T00:00:00.000Z",
"revoked": false,
"expired": false,
"scopes": [
"read_repository",
"read_registry"
]
}
```
### Create a group deploy token ### Create a group deploy token
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21811) in GitLab 12.9. > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21811) in GitLab 12.9.
...@@ -224,7 +304,7 @@ Parameters: ...@@ -224,7 +304,7 @@ Parameters:
| Attribute | Type | Required | Description | | Attribute | Type | Required | Description |
| ------------ | ---- | --------- | ----------- | | ------------ | ---- | --------- | ----------- |
| `id` | integer/string | **{check-circle}** Yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user | | `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | **{check-circle}** Yes | New deploy token's name | | `name` | string | **{check-circle}** Yes | New deploy token's name |
| `expires_at` | datetime | **{dotted-circle}** No | Expiration date for the deploy token. Does not expire if no value is provided. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`) | | `expires_at` | datetime | **{dotted-circle}** No | Expiration date for the deploy token. Does not expire if no value is provided. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`) |
| `username` | string | **{dotted-circle}** No | Username for deploy token. Default is `gitlab+deploy-token-{n}` | | `username` | string | **{dotted-circle}** No | Username for deploy token. Default is `gitlab+deploy-token-{n}` |
...@@ -269,8 +349,8 @@ Parameters: ...@@ -269,8 +349,8 @@ Parameters:
| Attribute | Type | Required | Description | | Attribute | Type | Required | Description |
| ----------- | -------------- | ---------------------- | ----------- | | ----------- | -------------- | ---------------------- | ----------- |
| `id` | integer/string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user | | `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `token_id` | integer | **{check-circle}** Yes | The ID of the deploy token | | `token_id` | integer | **{check-circle}** Yes | ID of the deploy token |
Example request: Example request:
......
...@@ -93,6 +93,21 @@ module API ...@@ -93,6 +93,21 @@ module API
end end
end end
desc 'Get a project deploy token' do
detail 'This feature was introduced in GitLab 14.9'
success Entities::DeployToken
end
params do
requires :token_id, type: Integer, desc: 'The deploy token ID'
end
get ':id/deploy_tokens/:token_id' do
authorize!(:read_deploy_token, user_project)
deploy_token = user_project.deploy_tokens.find(params[:token_id])
present deploy_token, with: Entities::DeployToken
end
desc 'Delete a project deploy token' do desc 'Delete a project deploy token' do
detail 'This feature was introduced in GitLab 12.9' detail 'This feature was introduced in GitLab 12.9'
end end
...@@ -159,6 +174,21 @@ module API ...@@ -159,6 +174,21 @@ module API
end end
end end
desc 'Get a group deploy token' do
detail 'This feature was introduced in GitLab 14.9'
success Entities::DeployToken
end
params do
requires :token_id, type: Integer, desc: 'The deploy token ID'
end
get ':id/deploy_tokens/:token_id' do
authorize!(:read_deploy_token, user_group)
deploy_token = user_group.deploy_tokens.find(params[:token_id])
present deploy_token, with: Entities::DeployToken
end
desc 'Delete a group deploy token' do desc 'Delete a group deploy token' do
detail 'This feature was introduced in GitLab 12.9' detail 'This feature was introduced in GitLab 12.9'
end end
......
...@@ -5,7 +5,9 @@ ...@@ -5,7 +5,9 @@
"name", "name",
"username", "username",
"expires_at", "expires_at",
"scopes" "scopes",
"revoked",
"expired"
], ],
"properties": { "properties": {
"id": { "id": {
...@@ -26,6 +28,12 @@ ...@@ -26,6 +28,12 @@
}, },
"token": { "token": {
"type": "string" "type": "string"
},
"revoked": {
"type": "boolean"
},
"expired": {
"type": "boolean"
} }
} }
} }
\ No newline at end of file
...@@ -130,6 +130,55 @@ RSpec.describe API::DeployTokens do ...@@ -130,6 +130,55 @@ RSpec.describe API::DeployTokens do
end end
end end
describe 'GET /projects/:id/deploy_tokens/:token_id' do
subject do
get api("/projects/#{project.id}/deploy_tokens/#{deploy_token.id}", user)
response
end
context 'when unauthenticated' do
let(:user) { nil }
it { is_expected.to have_gitlab_http_status(:not_found) }
end
context 'when authenticated as non-admin user' do
before do
project.add_developer(user)
end
it { is_expected.to have_gitlab_http_status(:forbidden) }
end
context 'when authenticated as maintainer' do
before do
project.add_maintainer(user)
end
it { is_expected.to have_gitlab_http_status(:ok) }
it 'returns specific deploy token for the project' do
subject
expect(response).to match_response_schema('public_api/v4/deploy_token')
end
context 'invalid request' do
it 'returns not found with invalid project id' do
get api("/projects/bad_id/deploy_tokens/#{deploy_token.id}", user)
expect(response).to have_gitlab_http_status(:not_found)
end
it 'returns not found with invalid token id' do
get api("/projects/#{project.id}/deploy_tokens/#{non_existing_record_id}", user)
expect(response).to have_gitlab_http_status(:not_found)
end
end
end
end
describe 'GET /groups/:id/deploy_tokens' do describe 'GET /groups/:id/deploy_tokens' do
subject do subject do
get api("/groups/#{group.id}/deploy_tokens", user) get api("/groups/#{group.id}/deploy_tokens", user)
...@@ -188,6 +237,55 @@ RSpec.describe API::DeployTokens do ...@@ -188,6 +237,55 @@ RSpec.describe API::DeployTokens do
end end
end end
describe 'GET /groups/:id/deploy_tokens/:token_id' do
subject do
get api("/groups/#{group.id}/deploy_tokens/#{group_deploy_token.id}", user)
response
end
context 'when unauthenticated' do
let(:user) { nil }
it { is_expected.to have_gitlab_http_status(:forbidden) }
end
context 'when authenticated as non-admin user' do
before do
group.add_developer(user)
end
it { is_expected.to have_gitlab_http_status(:forbidden) }
end
context 'when authenticated as maintainer' do
before do
group.add_maintainer(user)
end
it { is_expected.to have_gitlab_http_status(:ok) }
it 'returns specific deploy token for the group' do
subject
expect(response).to match_response_schema('public_api/v4/deploy_token')
end
context 'invalid request' do
it 'returns not found with invalid group id' do
get api("/groups/bad_id/deploy_tokens/#{group_deploy_token.id}", user)
expect(response).to have_gitlab_http_status(:not_found)
end
it 'returns not found with invalid token id' do
get api("/groups/#{group.id}/deploy_tokens/#{non_existing_record_id}", user)
expect(response).to have_gitlab_http_status(:not_found)
end
end
end
end
describe 'DELETE /projects/:id/deploy_tokens/:token_id' do describe 'DELETE /projects/:id/deploy_tokens/:token_id' do
subject do subject do
delete api("/projects/#{project.id}/deploy_tokens/#{deploy_token.id}", user) delete api("/projects/#{project.id}/deploy_tokens/#{deploy_token.id}", user)
...@@ -232,10 +330,10 @@ RSpec.describe API::DeployTokens do ...@@ -232,10 +330,10 @@ RSpec.describe API::DeployTokens do
it 'returns bad_request with invalid token id' do it 'returns bad_request with invalid token id' do
expect(::Projects::DeployTokens::DestroyService).to receive(:new) expect(::Projects::DeployTokens::DestroyService).to receive(:new)
.with(project, user, token_id: 999) .with(project, user, token_id: non_existing_record_id)
.and_raise(ActiveRecord::RecordNotFound) .and_raise(ActiveRecord::RecordNotFound)
delete api("/projects/#{project.id}/deploy_tokens/999", user) delete api("/projects/#{project.id}/deploy_tokens/#{non_existing_record_id}", user)
expect(response).to have_gitlab_http_status(:not_found) expect(response).to have_gitlab_http_status(:not_found)
end end
...@@ -395,10 +493,10 @@ RSpec.describe API::DeployTokens do ...@@ -395,10 +493,10 @@ RSpec.describe API::DeployTokens do
it 'returns not found with invalid deploy token id' do it 'returns not found with invalid deploy token id' do
expect(::Groups::DeployTokens::DestroyService).to receive(:new) expect(::Groups::DeployTokens::DestroyService).to receive(:new)
.with(group, user, token_id: 999) .with(group, user, token_id: non_existing_record_id)
.and_raise(ActiveRecord::RecordNotFound) .and_raise(ActiveRecord::RecordNotFound)
delete api("/groups/#{group.id}/deploy_tokens/999", user) delete api("/groups/#{group.id}/deploy_tokens/#{non_existing_record_id}", user)
expect(response).to have_gitlab_http_status(:not_found) expect(response).to have_gitlab_http_status(:not_found)
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