track node resources

This commit is contained in:
xenia 2020-11-14 04:06:32 -05:00
parent 4d458ebe59
commit 7e3d24d294
2 changed files with 34 additions and 29 deletions

View File

@ -3,21 +3,14 @@
-- @revision: e50ab485d8590ead53c2518396c04f81
-- @description: Creates some initial core tables for crossfire.
-- @up {
PRAGMA foreign_keys = ON;
-- }
-- @up {
create table node(id integer primary key, name text not null,
type text check(type in ("client", "agent")) not null,
secret blob(32) not null)
-- }
-- @up {
create table resource(id integer primary key, name text not null);
-- }
-- @up {
create table node_resource(nodeid integer not null, resid integer not null,
unique (nodeid, resid),
foreign key(resid) references resources(id),
foreign key(nodeid) references nodes(id));
create table node_resource(nodeid integer not null, resource text not null,
unique (nodeid, resource),
foreign key(nodeid) references node(id));
-- }
-- @up {
create table task(id integer primary key, name text not null, manifest blob not null);
@ -28,7 +21,7 @@ create table task_log(taskid integer not null, worker integer not null,
time_end timestamp check(time_end >= time_start) not null,
pattern blob not null,
foreign key (taskid) references tasks(id),
foreign key (worker) references nodes(id));
foreign key (worker) references node(id));
-- }
-- @up {
create table task_match(taskid integer not null, time timestamp not null, match blob not null,
@ -48,8 +41,5 @@ drop table task;
drop table node_resource;
-- }
-- @down {
drop table resource;
-- }
-- @down {
drop table node;
-- }

View File

@ -35,7 +35,9 @@
(define current-db (make-parameter #f))
(define (open-server-db [mode 'read/write])
(sqlite3-connect #:database SERVER-DB-PATH #:mode mode))
(let ([db (sqlite3-connect #:database SERVER-DB-PATH #:mode mode)])
(query-exec db "pragma foreign_keys=1;")
db))
;; this allows the server to be capable of migrating itself
(define (migrate-server-db [db (current-db)])
@ -57,25 +59,35 @@
(define name (virtual-statement what)))
(define-stmt q-new-node "insert into node (name, type, secret) values (?, ?, ?)")
(define-stmt q-assign-node-res "insert into node_resource (nodeid, resource) values (?, ?)")
(define-stmt q-get-nodes "select id, name from node where type=?")
(define-stmt q-get-resources
"select nodeid, resource from node_resource inner join node on node.id = node_resource.nodeid
where node.type = ?")
;; rpc calls
(define-rpc-type server)
(struct node-info [id name online?] #:transparent)
(struct node-info [id name resources online?] #:transparent)
(define (get-nodes type)
(for/list ([(id name) (in-query (current-db) q-get-nodes (symbol->string type))])
(define online? (comms-channel-available? (current-comms) id))
(node-info id name online?)))
(define type-str (symbol->string type))
(define resources (rows->dict #:key "nodeid" #:value "resource" #:value-mode '(list)
(query (current-db) q-get-resources type-str)))
(for/list ([(id name) (in-query (current-db) q-get-nodes type-str)])
(define online? (and (current-comms) (comms-channel-available? (current-comms) id)))
(node-info id name (hash-ref resources id) online?)))
(define (make-agent name)
(define secret (crypto-sign-make-key))
(define public (crypto-sign-public-key secret))
(define info (simple-result-info (query (current-db) q-new-node name "agent" secret)))
(define id (cdr (assoc 'insert-id info)))
(values id public))
(define (make-agent name resources)
(call-with-transaction (current-db) (lambda ()
(define secret (crypto-sign-make-key))
(define public (crypto-sign-public-key secret))
(define info (simple-result-info (query (current-db) q-new-node name "agent" secret)))
(define id (cdr (assoc 'insert-id info)))
(for ([res (in-list resources)])
(query-exec (current-db) q-assign-node-res id res))
(values id public))))
(define (enforce type)
(unless (symbol=? type (node-type (current-from-node)))
@ -87,9 +99,9 @@
(enforce 'client)
(get-nodes 'agent))
(define-rpc server (new-agent name)
(define-rpc server (new-agent name resources)
(enforce 'client)
(define-values [id public] (make-agent name))
(define-values [id public] (make-agent name resources))
(define comms-node (node id name 'agent public #f #f #f))
(comms-set-node-info (current-comms) comms-node)
id)
@ -109,5 +121,8 @@
;; command line usage
(module+ main
(require racket/cmdline)
(current-db (open-server-db))
(make-agent "meow"))
(current-db (open-server-db 'create))
(migrate-server-db)
;;(make-agent "agent0" '("gpu" "hifive"))
(get-nodes 'agent)
(get-nodes 'meow))