forked from vieter-v/vieter
				
			feat(cli): added commands for interacting with build logs
							parent
							
								
									fa6603bd45
								
							
						
					
					
						commit
						5b016df85d
					
				|  | @ -18,15 +18,7 @@ pub fn new(address string, api_key string) Client { | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| // send_request<T> just calls send_request_with_body<T> with an empty body. | ||||
| fn (c &Client) send_request<T>(method Method, url string, params map[string]string) ?Response<T> { | ||||
| 	return c.send_request_with_body<T>(method, url, params, '') | ||||
| } | ||||
| 
 | ||||
| // send_request_with_body<T> is a convenience method for sending requests to | ||||
| // the repos API. It mostly does string manipulation to create a query string | ||||
| // containing the provided params. | ||||
| fn (c &Client) send_request_with_body<T>(method Method, url string, params map[string]string, body string) ?Response<T> { | ||||
| fn (c &Client) send_request_raw(method Method, url string, params map[string]string, body string) ?http.Response { | ||||
| 	mut full_url := '$c.address$url' | ||||
| 
 | ||||
| 	if params.len > 0 { | ||||
|  | @ -46,7 +38,27 @@ fn (c &Client) send_request_with_body<T>(method Method, url string, params map[s | |||
| 	req.add_custom_header('X-Api-Key', c.api_key) ? | ||||
| 
 | ||||
| 	res := req.do() ? | ||||
| 	data := json.decode(Response<T>, res.text) ? | ||||
| 
 | ||||
| 	return res | ||||
| } | ||||
| 
 | ||||
| // send_request<T> just calls send_request_with_body<T> with an empty body. | ||||
| fn (c &Client) send_request<T>(method Method, url string, params map[string]string) ?Response<T> { | ||||
| 	return c.send_request_with_body<T>(method, url, params, '') | ||||
| } | ||||
| 
 | ||||
| // send_request_with_body<T> is a convenience method for sending requests to | ||||
| // the repos API. It mostly does string manipulation to create a query string | ||||
| // containing the provided params. | ||||
| fn (c &Client) send_request_with_body<T>(method Method, url string, params map[string]string, body string) ?Response<T> { | ||||
| 	res_text := c.send_request_raw_response(method, url, params, body) ? | ||||
| 	data := json.decode(Response<T>, res_text) ? | ||||
| 
 | ||||
| 	return data | ||||
| } | ||||
| 
 | ||||
| fn (c &Client) send_request_raw_response(method Method, url string, params map[string]string, body string) ?string { | ||||
| 	res := c.send_request_raw(method, url, params, body) ? | ||||
| 
 | ||||
| 	return res.text | ||||
| } | ||||
|  |  | |||
|  | @ -27,6 +27,12 @@ pub fn (c &Client) get_build_log(id int) ?Response<BuildLog> { | |||
| 	return data | ||||
| } | ||||
| 
 | ||||
| pub fn (c &Client) get_build_log_content(id int) ?string { | ||||
| 	data := c.send_request_raw_response(Method.get, '/api/logs/$id/content', {}, '') ? | ||||
| 
 | ||||
| 	return data | ||||
| } | ||||
| 
 | ||||
| pub fn (c &Client) add_build_log(repo_id int, start_time time.Time, end_time time.Time, arch string, exit_code int, content string) ?Response<string> { | ||||
| 	params := { | ||||
| 		'repo':      repo_id.str() | ||||
|  |  | |||
|  | @ -0,0 +1 @@ | |||
| module console | ||||
|  | @ -0,0 +1,99 @@ | |||
| module logs | ||||
| 
 | ||||
| import cli | ||||
| import env | ||||
| import client | ||||
| import db | ||||
| 
 | ||||
| struct Config { | ||||
| 	address string [required] | ||||
| 	api_key string [required] | ||||
| } | ||||
| 
 | ||||
| pub fn cmd() cli.Command { | ||||
| 	return cli.Command{ | ||||
| 		name: 'logs' | ||||
| 		description: 'Interact with the build logs API.' | ||||
| 		commands: [ | ||||
| 			cli.Command{ | ||||
| 				name: 'list' | ||||
| 				description: 'List the build logs. If a repo ID is provided, only list the build logs for that repo.' | ||||
| 				flags: [ | ||||
| 					cli.Flag{ | ||||
| 						name: 'repo' | ||||
| 						description: 'ID of the Git repo to restrict list to.' | ||||
| 						flag: cli.FlagType.int | ||||
| 					}, | ||||
| 				] | ||||
| 				execute: fn (cmd cli.Command) ? { | ||||
| 					config_file := cmd.flags.get_string('config-file') ? | ||||
| 					conf := env.load<Config>(config_file) ? | ||||
| 
 | ||||
| 					repo_id := cmd.flags.get_int('repo') ? | ||||
| 
 | ||||
| 					if repo_id == 0 { list(conf) ? } else { list_for_repo(conf, repo_id) ? } | ||||
| 				} | ||||
| 			}, | ||||
| 			cli.Command{ | ||||
| 				name: 'info' | ||||
| 				required_args: 1 | ||||
| 				usage: 'id' | ||||
| 				description: 'Show all info for a specific build log.' | ||||
| 				execute: fn (cmd cli.Command) ? { | ||||
| 					config_file := cmd.flags.get_string('config-file') ? | ||||
| 					conf := env.load<Config>(config_file) ? | ||||
| 
 | ||||
| 					id := cmd.args[0].int() | ||||
| 					info(conf, id) ? | ||||
| 				} | ||||
| 			}, | ||||
| 			cli.Command{ | ||||
| 				name: 'content' | ||||
| 				required_args: 1 | ||||
| 				usage: 'id' | ||||
| 				description: 'Output the content of a build log to stdout.' | ||||
| 				execute: fn (cmd cli.Command) ? { | ||||
| 					config_file := cmd.flags.get_string('config-file') ? | ||||
| 					conf := env.load<Config>(config_file) ? | ||||
| 
 | ||||
| 					id := cmd.args[0].int() | ||||
| 					content(conf, id) ? | ||||
| 				} | ||||
| 			}, | ||||
| 		] | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn print_log_list(logs []db.BuildLog) { | ||||
| 	for log in logs { | ||||
| 		println('$log.id\t$log.start_time\t$log.exit_code') | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn list(conf Config) ? { | ||||
| 	c := client.new(conf.address, conf.api_key) | ||||
| 	logs := c.get_build_logs() ?.data | ||||
| 
 | ||||
| 	print_log_list(logs) | ||||
| } | ||||
| 
 | ||||
| fn list_for_repo(conf Config, repo_id int) ? { | ||||
| 	c := client.new(conf.address, conf.api_key) | ||||
| 	logs := c.get_build_logs_for_repo(repo_id) ?.data | ||||
| 
 | ||||
| 	print_log_list(logs) | ||||
| } | ||||
| 
 | ||||
| fn info(conf Config, id int) ? { | ||||
| 	c := client.new(conf.address, conf.api_key) | ||||
| 	log := c.get_build_log(id) ?.data | ||||
| 
 | ||||
| 	print(log) | ||||
| } | ||||
| 
 | ||||
| fn content(conf Config, id int) ? { | ||||
| 	c := client.new(conf.address, conf.api_key) | ||||
| 	content := c.get_build_log_content(id) ? | ||||
| 
 | ||||
| 	println(content) | ||||
| } | ||||
|  | @ -12,6 +12,20 @@ pub: | |||
| 	exit_code  int       [nonull] | ||||
| } | ||||
| 
 | ||||
| pub fn (bl &BuildLog) str() string { | ||||
| 	mut parts := [ | ||||
| 		'id: $bl.id', | ||||
| 		'repo id: $bl.repo_id', | ||||
| 		'start time: $bl.start_time', | ||||
| 		'end time: $bl.end_time', | ||||
| 		'arch: $bl.arch', | ||||
| 		'exit code: $bl.exit_code', | ||||
| 	] | ||||
| 	str := parts.join('\n') | ||||
| 
 | ||||
| 	return str | ||||
| } | ||||
| 
 | ||||
| // get_build_logs returns all BuildLog's in the database. | ||||
| pub fn (db &VieterDb) get_build_logs() []BuildLog { | ||||
| 	res := sql db.conn { | ||||
|  |  | |||
|  | @ -4,7 +4,8 @@ import os | |||
| import server | ||||
| import cli | ||||
| import build | ||||
| import git | ||||
| import console.git | ||||
| import console.logs | ||||
| import cron | ||||
| 
 | ||||
| fn main() { | ||||
|  | @ -27,6 +28,7 @@ fn main() { | |||
| 			build.cmd(), | ||||
| 			git.cmd(), | ||||
| 			cron.cmd(), | ||||
| 			logs.cmd(), | ||||
| 		] | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue