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_raw(method Method, url string, params map[string]string, body string) ?http.Response { | ||||||
| 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> { |  | ||||||
| 	mut full_url := '$c.address$url' | 	mut full_url := '$c.address$url' | ||||||
| 
 | 
 | ||||||
| 	if params.len > 0 { | 	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) ? | 	req.add_custom_header('X-Api-Key', c.api_key) ? | ||||||
| 
 | 
 | ||||||
| 	res := req.do() ? | 	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 | 	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 | 	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> { | 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 := { | 	params := { | ||||||
| 		'repo':      repo_id.str() | 		'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] | 	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. | // get_build_logs returns all BuildLog's in the database. | ||||||
| pub fn (db &VieterDb) get_build_logs() []BuildLog { | pub fn (db &VieterDb) get_build_logs() []BuildLog { | ||||||
| 	res := sql db.conn { | 	res := sql db.conn { | ||||||
|  |  | ||||||
|  | @ -4,7 +4,8 @@ import os | ||||||
| import server | import server | ||||||
| import cli | import cli | ||||||
| import build | import build | ||||||
| import git | import console.git | ||||||
|  | import console.logs | ||||||
| import cron | import cron | ||||||
| 
 | 
 | ||||||
| fn main() { | fn main() { | ||||||
|  | @ -27,6 +28,7 @@ fn main() { | ||||||
| 			build.cmd(), | 			build.cmd(), | ||||||
| 			git.cmd(), | 			git.cmd(), | ||||||
| 			cron.cmd(), | 			cron.cmd(), | ||||||
|  | 			logs.cmd(), | ||||||
| 		] | 		] | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue