code.gitea.io/gitea@v1.21.7/routers/web/shared/actions/runners.go (about) 1 // Copyright 2022 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package actions 5 6 import ( 7 "errors" 8 9 actions_model "code.gitea.io/gitea/models/actions" 10 "code.gitea.io/gitea/models/db" 11 "code.gitea.io/gitea/modules/context" 12 "code.gitea.io/gitea/modules/log" 13 "code.gitea.io/gitea/modules/util" 14 "code.gitea.io/gitea/modules/web" 15 "code.gitea.io/gitea/services/forms" 16 ) 17 18 // RunnersList prepares data for runners list 19 func RunnersList(ctx *context.Context, opts actions_model.FindRunnerOptions) { 20 count, err := actions_model.CountRunners(ctx, opts) 21 if err != nil { 22 ctx.ServerError("CountRunners", err) 23 return 24 } 25 26 runners, err := actions_model.FindRunners(ctx, opts) 27 if err != nil { 28 ctx.ServerError("FindRunners", err) 29 return 30 } 31 if err := runners.LoadAttributes(ctx); err != nil { 32 ctx.ServerError("LoadAttributes", err) 33 return 34 } 35 36 // ownid=0,repo_id=0,means this token is used for global 37 var token *actions_model.ActionRunnerToken 38 token, err = actions_model.GetLastestRunnerToken(ctx, opts.OwnerID, opts.RepoID) 39 if errors.Is(err, util.ErrNotExist) || (token != nil && !token.IsActive) { 40 token, err = actions_model.NewRunnerToken(ctx, opts.OwnerID, opts.RepoID) 41 if err != nil { 42 ctx.ServerError("CreateRunnerToken", err) 43 return 44 } 45 } else if err != nil { 46 ctx.ServerError("GetLastestRunnerToken", err) 47 return 48 } 49 50 ctx.Data["Keyword"] = opts.Filter 51 ctx.Data["Runners"] = runners 52 ctx.Data["Total"] = count 53 ctx.Data["RegistrationToken"] = token.Token 54 ctx.Data["RunnerOwnerID"] = opts.OwnerID 55 ctx.Data["RunnerRepoID"] = opts.RepoID 56 ctx.Data["SortType"] = opts.Sort 57 58 pager := context.NewPagination(int(count), opts.PageSize, opts.Page, 5) 59 60 ctx.Data["Page"] = pager 61 } 62 63 // RunnerDetails prepares data for runners edit page 64 func RunnerDetails(ctx *context.Context, page int, runnerID, ownerID, repoID int64) { 65 runner, err := actions_model.GetRunnerByID(ctx, runnerID) 66 if err != nil { 67 ctx.ServerError("GetRunnerByID", err) 68 return 69 } 70 if err := runner.LoadAttributes(ctx); err != nil { 71 ctx.ServerError("LoadAttributes", err) 72 return 73 } 74 if !runner.Editable(ownerID, repoID) { 75 err = errors.New("no permission to edit this runner") 76 ctx.NotFound("RunnerDetails", err) 77 return 78 } 79 80 ctx.Data["Runner"] = runner 81 82 opts := actions_model.FindTaskOptions{ 83 ListOptions: db.ListOptions{ 84 Page: page, 85 PageSize: 30, 86 }, 87 Status: actions_model.StatusUnknown, // Unknown means all 88 IDOrderDesc: true, 89 RunnerID: runner.ID, 90 } 91 92 count, err := actions_model.CountTasks(ctx, opts) 93 if err != nil { 94 ctx.ServerError("CountTasks", err) 95 return 96 } 97 98 tasks, err := actions_model.FindTasks(ctx, opts) 99 if err != nil { 100 ctx.ServerError("FindTasks", err) 101 return 102 } 103 if err = tasks.LoadAttributes(ctx); err != nil { 104 ctx.ServerError("TasksLoadAttributes", err) 105 return 106 } 107 108 ctx.Data["Tasks"] = tasks 109 pager := context.NewPagination(int(count), opts.PageSize, opts.Page, 5) 110 ctx.Data["Page"] = pager 111 } 112 113 // RunnerDetailsEditPost response for edit runner details 114 func RunnerDetailsEditPost(ctx *context.Context, runnerID, ownerID, repoID int64, redirectTo string) { 115 runner, err := actions_model.GetRunnerByID(ctx, runnerID) 116 if err != nil { 117 log.Warn("RunnerDetailsEditPost.GetRunnerByID failed: %v, url: %s", err, ctx.Req.URL) 118 ctx.ServerError("RunnerDetailsEditPost.GetRunnerByID", err) 119 return 120 } 121 if !runner.Editable(ownerID, repoID) { 122 ctx.NotFound("RunnerDetailsEditPost.Editable", util.NewPermissionDeniedErrorf("no permission to edit this runner")) 123 return 124 } 125 126 form := web.GetForm(ctx).(*forms.EditRunnerForm) 127 runner.Description = form.Description 128 129 err = actions_model.UpdateRunner(ctx, runner, "description") 130 if err != nil { 131 log.Warn("RunnerDetailsEditPost.UpdateRunner failed: %v, url: %s", err, ctx.Req.URL) 132 ctx.Flash.Warning(ctx.Tr("actions.runners.update_runner_failed")) 133 ctx.Redirect(redirectTo) 134 return 135 } 136 137 log.Debug("RunnerDetailsEditPost success: %s", ctx.Req.URL) 138 139 ctx.Flash.Success(ctx.Tr("actions.runners.update_runner_success")) 140 ctx.Redirect(redirectTo) 141 } 142 143 // RunnerResetRegistrationToken reset registration token 144 func RunnerResetRegistrationToken(ctx *context.Context, ownerID, repoID int64, redirectTo string) { 145 _, err := actions_model.NewRunnerToken(ctx, ownerID, repoID) 146 if err != nil { 147 ctx.ServerError("ResetRunnerRegistrationToken", err) 148 return 149 } 150 151 ctx.Flash.Success(ctx.Tr("actions.runners.reset_registration_token_success")) 152 ctx.Redirect(redirectTo) 153 } 154 155 // RunnerDeletePost response for deleting a runner 156 func RunnerDeletePost(ctx *context.Context, runnerID int64, 157 successRedirectTo, failedRedirectTo string, 158 ) { 159 if err := actions_model.DeleteRunner(ctx, runnerID); err != nil { 160 log.Warn("DeleteRunnerPost.UpdateRunner failed: %v, url: %s", err, ctx.Req.URL) 161 ctx.Flash.Warning(ctx.Tr("actions.runners.delete_runner_failed")) 162 163 ctx.JSONRedirect(failedRedirectTo) 164 return 165 } 166 167 log.Info("DeleteRunnerPost success: %s", ctx.Req.URL) 168 169 ctx.Flash.Success(ctx.Tr("actions.runners.delete_runner_success")) 170 171 ctx.JSONRedirect(successRedirectTo) 172 }