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