From a7a7ce18857fa1de313eebf539e2d69b2402962d Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Mon, 27 Mar 2023 23:48:36 -0400 Subject: [PATCH] Add API endpoint to register runners for repos --- modules/structs/actions.go | 11 +++++++ routers/api/v1/api.go | 5 ++++ routers/api/v1/repo/runners.go | 52 ++++++++++++++++++++++++++++++++++ services/convert/actions.go | 16 +++++++++++ templates/swagger/v1_json.tmpl | 36 +++++++++++++++++++++++ 5 files changed, 120 insertions(+) create mode 100644 modules/structs/actions.go create mode 100644 routers/api/v1/repo/runners.go create mode 100644 services/convert/actions.go diff --git a/modules/structs/actions.go b/modules/structs/actions.go new file mode 100644 index 0000000000000..12c45c74da4e0 --- /dev/null +++ b/modules/structs/actions.go @@ -0,0 +1,11 @@ +// Copyright 2023 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package structs // import "code.gitea.io/gitea/modules/structs" + +// ActionRunnerToken represents an action runner token +// swagger:model +type ActionRunnerToken struct { + ID int64 `json:"id"` + Token string `json:"token"` +} diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 8fd824640ff7f..5d2f37355c873 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -1162,6 +1162,11 @@ func Routes(ctx gocontext.Context) *web.Route { }, reqAnyRepoReader()) m.Get("/issue_templates", context.ReferencesGitRepo(), repo.GetIssueTemplates) m.Get("/languages", reqRepoReader(unit.TypeCode), repo.GetLanguages) + + // TODO: list runners + // TODO: update runner + // TODO: delete runner + m.Put("/runners", reqToken(auth_model.AccessTokenScopeRepo), reqRepoWriter(unit.TypeActions), repo.GenerateRunnerToken) }, repoAssignment()) }) diff --git a/routers/api/v1/repo/runners.go b/routers/api/v1/repo/runners.go new file mode 100644 index 0000000000000..28072841bcc6c --- /dev/null +++ b/routers/api/v1/repo/runners.go @@ -0,0 +1,52 @@ +// Copyright 2023 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package repo + +import ( + "errors" + "net/http" + + actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/modules/context" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/convert" +) + +// GenerateRunnerToken generate a new runner token for a repository. +func GenerateRunnerToken(ctx *context.APIContext) { + // swagger:operation PUT /repos/{owner}/{repo}/runners repository repoGenerateRunnerToken + // --- + // summary: Generate a new runner token for a repository. + // produces: + // - application/json + // parameters: + // - name: owner + // in: path + // description: owner of the repo + // type: string + // required: true + // - name: repo + // in: path + // description: name of the repo + // type: string + // required: true + // responses: + // "200": + // "$ref": "#/responses/ActionRunnerToken" + // "404": + // "$ref": "#/responses/notFound" + + token, err := actions_model.GetUnactivatedRunnerToken(ctx, ctx.Repo.Owner.ID, ctx.Repo.Repository.ID) + if errors.Is(err, util.ErrNotExist) { + token, err = actions_model.NewRunnerToken(ctx, ctx.Repo.Owner.ID, ctx.Repo.Repository.ID) + if err != nil { + ctx.ServerError("CreateRunnerToken", err) + return + } + } else if err != nil { + ctx.ServerError("GetUnactivatedRunnerToken", err) + return + } + ctx.JSON(http.StatusOK, convert.ToAPIActionRunnerToken(token)) +} diff --git a/services/convert/actions.go b/services/convert/actions.go new file mode 100644 index 0000000000000..e567d936e6f07 --- /dev/null +++ b/services/convert/actions.go @@ -0,0 +1,16 @@ +// Copyright 2023 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package convert + +import ( + actions_model "code.gitea.io/gitea/models/actions" + api "code.gitea.io/gitea/modules/structs" +) + +func ToAPIActionRunnerToken(token *actions_model.ActionRunnerToken) *api.ActionRunnerToken { + return &api.ActionRunnerToken{ + ID: token.ID, + Token: token.Token, + } +} diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 0f7e60c598bf8..cb305d28d0539 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -10648,6 +10648,42 @@ } } }, + "/repos/{owner}/{repo}/runners": { + "put": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Generate a new runner token for a repository.", + "operationId": "repoGenerateRunnerToken", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/ActionRunnerToken" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, "/repos/{owner}/{repo}/signing-key.gpg": { "get": { "produces": [