From f7ca005ad530fd0861f63d10636521ef0b434990 Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Tue, 6 Dec 2022 14:11:17 +0100 Subject: [PATCH] WIP server queeu stuff --- src/agent/agent.v | 2 +- src/agent/cli.v | 16 ++++++++-------- src/agent/daemon.v | 10 ++++------ src/build/build.v | 10 +++++----- src/main.v | 2 +- src/server/api_builds.v | 31 +++++++++++++++++++++++++++++++ src/server/server.v | 21 +++++++++++++++++++-- 7 files changed, 69 insertions(+), 23 deletions(-) create mode 100644 src/server/api_builds.v diff --git a/src/agent/agent.v b/src/agent/agent.v index 3affd21..1758c85 100644 --- a/src/agent/agent.v +++ b/src/agent/agent.v @@ -20,6 +20,6 @@ pub fn agent(conf Config) ! { logger.set_full_logpath(log_file) logger.log_to_console_too() - mut d := agent.agent_init(logger, conf) + mut d := agent_init(logger, conf) d.run() } diff --git a/src/agent/cli.v b/src/agent/cli.v index 46942ec..a0a249c 100644 --- a/src/agent/cli.v +++ b/src/agent/cli.v @@ -5,15 +5,15 @@ import conf as vconf struct Config { pub: - log_level string = 'WARN' - api_key string - address string - data_dir string - max_concurrent_builds int = 1 - polling_frequency int = 30 + log_level string = 'WARN' + api_key string + address string + data_dir string + max_concurrent_builds int = 1 + polling_frequency int = 30 // Architecture of agent - /* arch string */ - /* image_rebuild_frequency int = 1440 */ + // arch string + // image_rebuild_frequency int = 1440 } // cmd returns the cli module that handles the cron daemon. diff --git a/src/agent/daemon.v b/src/agent/daemon.v index 389a148..fd5fe04 100644 --- a/src/agent/daemon.v +++ b/src/agent/daemon.v @@ -13,13 +13,13 @@ const ( struct AgentDaemon { logger shared log.Log - conf Config + conf Config // Which builds are currently running; length is same as // conf.max_concurrent_builds builds []BuildConfig // Atomic variables used to detect when a build has finished; length is the // same as conf.max_concurrent_builds - client client.Client + client client.Client atomics []u64 } @@ -39,10 +39,8 @@ pub fn (mut d AgentDaemon) run() { for { free_builds := d.update_atomics() - if free_builds > 0 { - - } - + if free_builds > 0 { + } } } diff --git a/src/build/build.v b/src/build/build.v index b7c5cb6..01f9a53 100644 --- a/src/build/build.v +++ b/src/build/build.v @@ -18,11 +18,11 @@ const ( pub struct BuildConfig { pub: - id int - kind string - url string - branch string - repo string + id int + kind string + url string + branch string + repo string base_image string } diff --git a/src/main.v b/src/main.v index 424e328..34387bf 100644 --- a/src/main.v +++ b/src/main.v @@ -41,7 +41,7 @@ fn main() { schedule.cmd(), man.cmd(), aur.cmd(), - agent.cmd() + agent.cmd(), ] } app.setup() diff --git a/src/server/api_builds.v b/src/server/api_builds.v new file mode 100644 index 0000000..1870025 --- /dev/null +++ b/src/server/api_builds.v @@ -0,0 +1,31 @@ +module server + +import web +import web.response { new_response } +// import db +import time +// import os +// import util +// import models { BuildLog, BuildLogFilter } + +['/api/v1/builds/poll'; auth; get] +fn (mut app App) v1_poll_build_queue() web.Result { + arch := app.query['arch'] or { + return app.json(.bad_request, new_response('Missing arch query arg.')) + } + + max_str := app.query['max'] or { + return app.json(.bad_request, new_response('Missing max query arg.')) + } + max := max_str.int() + + + mut out := [] + + now := time.now() + lock app.build_queue { + for app.build_queue.len() > 0 && out.len() < max { + + } + } +} diff --git a/src/server/server.v b/src/server/server.v index d5f6135..c1691f2 100644 --- a/src/server/server.v +++ b/src/server/server.v @@ -6,6 +6,9 @@ import log import repo import util import db +import datatypes { MinHeap } +import build { BuildConfig } +import time const ( log_file_name = 'vieter.log' @@ -14,13 +17,26 @@ const ( logs_dir_name = 'logs' ) +struct ScheduledBuild { +pub: + timestamp time.Time + target_id int + build_config BuildConfig +} + +// Overloaded operator for comparing ScheduledBuild objects +fn (r1 ScheduledBuild) < (r2 ScheduledBuild) bool { + return r1.timestamp < r2.timestamp +} + struct App { web.Context pub: conf Config [required; web_global] pub mut: - repo repo.RepoGroupManager [required; web_global] - db db.VieterDb + repo repo.RepoGroupManager [required; web_global] + build_queue shared MinHeap + db db.VieterDb } // server starts the web server & starts listening for requests @@ -77,5 +93,6 @@ pub fn server(conf Config) ! { conf: conf repo: repo db: db + build_queue: MinHeap{} }, conf.port) }