mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 03:18:24 +00:00 
			
		
		
		
	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:
		| @@ -37,6 +37,14 @@ func (opts ListOptions) setEnginePagination(e Engine) Engine { | |||||||
| 	return e.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize) | 	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() { | func (opts ListOptions) setDefaultValues() { | ||||||
| 	if opts.PageSize <= 0 { | 	if opts.PageSize <= 0 { | ||||||
| 		opts.PageSize = setting.API.DefaultPagingNum | 		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("/admin", func() { | ||||||
|  | 			m.Group("/cron", func() { | ||||||
|  | 				m.Get("", admin.ListCronTasks) | ||||||
|  | 				m.Post("/:task", admin.PostCronTask) | ||||||
|  | 			}) | ||||||
| 			m.Get("/orgs", admin.GetAllOrgs) | 			m.Get("/orgs", admin.GetAllOrgs) | ||||||
| 			m.Group("/users", func() { | 			m.Group("/users", func() { | ||||||
| 				m.Get("", admin.GetAllUsers) | 				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", |   "basePath": "{{AppSubUrl}}/api/v1", | ||||||
|   "paths": { |   "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": { |     "/admin/orgs": { | ||||||
|       "get": { |       "get": { | ||||||
|         "produces": [ |         "produces": [ | ||||||
| @@ -11931,6 +11994,36 @@ | |||||||
|       }, |       }, | ||||||
|       "x-go-package": "code.gitea.io/gitea/modules/structs" |       "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": { |     "DeleteEmailOption": { | ||||||
|       "description": "DeleteEmailOption options when deleting email addresses", |       "description": "DeleteEmailOption options when deleting email addresses", | ||||||
|       "type": "object", |       "type": "object", | ||||||
| @@ -15027,6 +15120,15 @@ | |||||||
|         "$ref": "#/definitions/ContentsResponse" |         "$ref": "#/definitions/ContentsResponse" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "CronList": { | ||||||
|  |       "description": "CronList", | ||||||
|  |       "schema": { | ||||||
|  |         "type": "array", | ||||||
|  |         "items": { | ||||||
|  |           "$ref": "#/definitions/Cron" | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "DeployKey": { |     "DeployKey": { | ||||||
|       "description": "DeployKey", |       "description": "DeployKey", | ||||||
|       "schema": { |       "schema": { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user