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  }