Add cron running API (#12421)
* Add cron running API Signed-off-by: Andrew Thornton <art27@cantab.net> * Apply suggestions from code review * placate-swagger Signed-off-by: Andrew Thornton <art27@cantab.net> * return not found Signed-off-by: Andrew Thornton <art27@cantab.net> * Apply suggestions from code review Co-authored-by: techknowlogick <techknowlogick@gitea.io>
This commit is contained in:
		
							parent
							
								
									ee047312a1
								
							
						
					
					
						commit
						2ae8c7ab1c
					
				
					 6 changed files with 232 additions and 0 deletions
				
			
		|  | @ -37,6 +37,14 @@ func (opts ListOptions) setEnginePagination(e Engine) Engine { | |||
| 	return e.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize) | ||||
| } | ||||
| 
 | ||||
| // GetStartEnd returns the start and end of the ListOptions
 | ||||
| func (opts ListOptions) GetStartEnd() (start, end int) { | ||||
| 	opts.setDefaultValues() | ||||
| 	start = (opts.Page - 1) * opts.PageSize | ||||
| 	end = start + opts.Page | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| func (opts ListOptions) setDefaultValues() { | ||||
| 	if opts.PageSize <= 0 { | ||||
| 		opts.PageSize = setting.API.DefaultPagingNum | ||||
|  |  | |||
							
								
								
									
										16
									
								
								modules/structs/cron.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								modules/structs/cron.go
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,16 @@ | |||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package structs | ||||
| 
 | ||||
| import "time" | ||||
| 
 | ||||
| // Cron represents a Cron task
 | ||||
| type Cron struct { | ||||
| 	Name      string    `json:"name"` | ||||
| 	Schedule  string    `json:"schedule"` | ||||
| 	Next      time.Time `json:"next"` | ||||
| 	Prev      time.Time `json:"prev"` | ||||
| 	ExecTimes int64     `json:"exec_times"` | ||||
| } | ||||
							
								
								
									
										86
									
								
								routers/api/v1/admin/cron.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								routers/api/v1/admin/cron.go
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,86 @@ | |||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package admin | ||||
| 
 | ||||
| import ( | ||||
| 	"net/http" | ||||
| 
 | ||||
| 	"code.gitea.io/gitea/modules/context" | ||||
| 	"code.gitea.io/gitea/modules/cron" | ||||
| 	"code.gitea.io/gitea/modules/log" | ||||
| 	"code.gitea.io/gitea/modules/structs" | ||||
| 	"code.gitea.io/gitea/routers/api/v1/utils" | ||||
| ) | ||||
| 
 | ||||
| // ListCronTasks api for getting cron tasks
 | ||||
| func ListCronTasks(ctx *context.APIContext) { | ||||
| 	// swagger:operation GET /admin/cron admin adminCronList
 | ||||
| 	// ---
 | ||||
| 	// summary: List cron tasks
 | ||||
| 	// produces:
 | ||||
| 	// - application/json
 | ||||
| 	// parameters:
 | ||||
| 	// - name: page
 | ||||
| 	//   in: query
 | ||||
| 	//   description: page number of results to return (1-based)
 | ||||
| 	//   type: integer
 | ||||
| 	// - name: limit
 | ||||
| 	//   in: query
 | ||||
| 	//   description: page size of results
 | ||||
| 	//   type: integer
 | ||||
| 	// responses:
 | ||||
| 	//   "200":
 | ||||
| 	//     "$ref": "#/responses/CronList"
 | ||||
| 	//   "403":
 | ||||
| 	//     "$ref": "#/responses/forbidden"
 | ||||
| 	tasks := cron.ListTasks() | ||||
| 	listOpts := utils.GetListOptions(ctx) | ||||
| 	start, end := listOpts.GetStartEnd() | ||||
| 
 | ||||
| 	if len(tasks) > listOpts.PageSize { | ||||
| 		tasks = tasks[start:end] | ||||
| 	} | ||||
| 
 | ||||
| 	res := make([]structs.Cron, len(tasks)) | ||||
| 	for i, task := range tasks { | ||||
| 		res[i] = structs.Cron{ | ||||
| 			Name:      task.Name, | ||||
| 			Schedule:  task.Spec, | ||||
| 			Next:      task.Next, | ||||
| 			Prev:      task.Prev, | ||||
| 			ExecTimes: task.ExecTimes, | ||||
| 		} | ||||
| 	} | ||||
| 	ctx.JSON(http.StatusOK, res) | ||||
| } | ||||
| 
 | ||||
| // PostCronTask api for getting cron tasks
 | ||||
| func PostCronTask(ctx *context.APIContext) { | ||||
| 	// swagger:operation POST /admin/cron/{task} admin adminCronRun
 | ||||
| 	// ---
 | ||||
| 	// summary: Run cron task
 | ||||
| 	// produces:
 | ||||
| 	// - application/json
 | ||||
| 	// parameters:
 | ||||
| 	// - name: task
 | ||||
| 	//   in: path
 | ||||
| 	//   description: task to run
 | ||||
| 	//   type: string
 | ||||
| 	//   required: true
 | ||||
| 	// responses:
 | ||||
| 	//   "204":
 | ||||
| 	//     "$ref": "#/responses/empty"
 | ||||
| 	//   "404":
 | ||||
| 	//     "$ref": "#/responses/notFound"
 | ||||
| 	task := cron.GetTask(ctx.Params(":task")) | ||||
| 	if task == nil { | ||||
| 		ctx.NotFound() | ||||
| 		return | ||||
| 	} | ||||
| 	task.Run() | ||||
| 	log.Trace("Cron Task %s started by admin(%s)", task.Name, ctx.User.Name) | ||||
| 
 | ||||
| 	ctx.Status(http.StatusNoContent) | ||||
| } | ||||
|  | @ -934,6 +934,10 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
| 		}) | ||||
| 
 | ||||
| 		m.Group("/admin", func() { | ||||
| 			m.Group("/cron", func() { | ||||
| 				m.Get("", admin.ListCronTasks) | ||||
| 				m.Post("/:task", admin.PostCronTask) | ||||
| 			}) | ||||
| 			m.Get("/orgs", admin.GetAllOrgs) | ||||
| 			m.Group("/users", func() { | ||||
| 				m.Get("", admin.GetAllUsers) | ||||
|  |  | |||
							
								
								
									
										16
									
								
								routers/api/v1/swagger/cron.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								routers/api/v1/swagger/cron.go
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,16 @@ | |||
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a MIT-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package swagger | ||||
| 
 | ||||
| import ( | ||||
| 	api "code.gitea.io/gitea/modules/structs" | ||||
| ) | ||||
| 
 | ||||
| // CronList
 | ||||
| // swagger:response CronList
 | ||||
| type swaggerResponseCronList struct { | ||||
| 	// in:body
 | ||||
| 	Body []api.Cron `json:"body"` | ||||
| } | ||||
|  | @ -23,6 +23,69 @@ | |||
|   }, | ||||
|   "basePath": "{{AppSubUrl}}/api/v1", | ||||
|   "paths": { | ||||
|     "/admin/cron": { | ||||
|       "get": { | ||||
|         "produces": [ | ||||
|           "application/json" | ||||
|         ], | ||||
|         "tags": [ | ||||
|           "admin" | ||||
|         ], | ||||
|         "summary": "List cron tasks", | ||||
|         "operationId": "adminCronList", | ||||
|         "parameters": [ | ||||
|           { | ||||
|             "type": "integer", | ||||
|             "description": "page number of results to return (1-based)", | ||||
|             "name": "page", | ||||
|             "in": "query" | ||||
|           }, | ||||
|           { | ||||
|             "type": "integer", | ||||
|             "description": "page size of results", | ||||
|             "name": "limit", | ||||
|             "in": "query" | ||||
|           } | ||||
|         ], | ||||
|         "responses": { | ||||
|           "200": { | ||||
|             "$ref": "#/responses/CronList" | ||||
|           }, | ||||
|           "403": { | ||||
|             "$ref": "#/responses/forbidden" | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "/admin/cron/{task}": { | ||||
|       "post": { | ||||
|         "produces": [ | ||||
|           "application/json" | ||||
|         ], | ||||
|         "tags": [ | ||||
|           "admin" | ||||
|         ], | ||||
|         "summary": "Run cron task", | ||||
|         "operationId": "adminCronRun", | ||||
|         "parameters": [ | ||||
|           { | ||||
|             "type": "string", | ||||
|             "description": "task to run", | ||||
|             "name": "task", | ||||
|             "in": "path", | ||||
|             "required": true | ||||
|           } | ||||
|         ], | ||||
|         "responses": { | ||||
|           "204": { | ||||
|             "$ref": "#/responses/empty" | ||||
|           }, | ||||
|           "404": { | ||||
|             "$ref": "#/responses/notFound" | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "/admin/orgs": { | ||||
|       "get": { | ||||
|         "produces": [ | ||||
|  | @ -11931,6 +11994,36 @@ | |||
|       }, | ||||
|       "x-go-package": "code.gitea.io/gitea/modules/structs" | ||||
|     }, | ||||
|     "Cron": { | ||||
|       "description": "Cron represents a Cron task", | ||||
|       "type": "object", | ||||
|       "properties": { | ||||
|         "exec_times": { | ||||
|           "type": "integer", | ||||
|           "format": "int64", | ||||
|           "x-go-name": "ExecTimes" | ||||
|         }, | ||||
|         "name": { | ||||
|           "type": "string", | ||||
|           "x-go-name": "Name" | ||||
|         }, | ||||
|         "next": { | ||||
|           "type": "string", | ||||
|           "format": "date-time", | ||||
|           "x-go-name": "Next" | ||||
|         }, | ||||
|         "prev": { | ||||
|           "type": "string", | ||||
|           "format": "date-time", | ||||
|           "x-go-name": "Prev" | ||||
|         }, | ||||
|         "schedule": { | ||||
|           "type": "string", | ||||
|           "x-go-name": "Schedule" | ||||
|         } | ||||
|       }, | ||||
|       "x-go-package": "code.gitea.io/gitea/modules/structs" | ||||
|     }, | ||||
|     "DeleteEmailOption": { | ||||
|       "description": "DeleteEmailOption options when deleting email addresses", | ||||
|       "type": "object", | ||||
|  | @ -15027,6 +15120,15 @@ | |||
|         "$ref": "#/definitions/ContentsResponse" | ||||
|       } | ||||
|     }, | ||||
|     "CronList": { | ||||
|       "description": "CronList", | ||||
|       "schema": { | ||||
|         "type": "array", | ||||
|         "items": { | ||||
|           "$ref": "#/definitions/Cron" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "DeployKey": { | ||||
|       "description": "DeployKey", | ||||
|       "schema": { | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue