diff options
-rw-r--r-- | guix-build-coordinator/datastore.scm | 2 | ||||
-rw-r--r-- | guix-build-coordinator/datastore/sqlite.scm | 101 | ||||
-rw-r--r-- | sqitch/pg/deploy/add_agent_tags.sql | 7 | ||||
-rw-r--r-- | sqitch/pg/revert/add_agent_tags.sql | 7 | ||||
-rw-r--r-- | sqitch/pg/verify/add_agent_tags.sql | 7 | ||||
-rw-r--r-- | sqitch/sqitch.plan | 1 | ||||
-rw-r--r-- | sqitch/sqlite/deploy/add_agent_tags.sql | 11 | ||||
-rw-r--r-- | sqitch/sqlite/revert/add_agent_tags.sql | 7 | ||||
-rw-r--r-- | sqitch/sqlite/verify/add_agent_tags.sql | 7 |
9 files changed, 150 insertions, 0 deletions
diff --git a/guix-build-coordinator/datastore.scm b/guix-build-coordinator/datastore.scm index 20df399..c977ff0 100644 --- a/guix-build-coordinator/datastore.scm +++ b/guix-build-coordinator/datastore.scm @@ -19,6 +19,7 @@ (re-export datastore-new-agent) (re-export datastore-list-agents) (re-export datastore-find-agent) +(re-export datastore-fetch-agent-tags) (re-export datastore-count-build-results) (re-export datastore-insert-build-result) (re-export datastore-remove-build-allocation) @@ -40,6 +41,7 @@ (re-export datastore-list-setup-failure-missing-inputs) (re-export datastore-new-agent-password) (re-export datastore-agent-password-exists?) +(re-export datastore-replace-agent-tags) (re-export datastore-count-builds) (re-export datastore-for-each-build) (re-export datastore-find-build) diff --git a/guix-build-coordinator/datastore/sqlite.scm b/guix-build-coordinator/datastore/sqlite.scm index 5ad1777..ecd6097 100644 --- a/guix-build-coordinator/datastore/sqlite.scm +++ b/guix-build-coordinator/datastore/sqlite.scm @@ -46,6 +46,7 @@ datastore-new-agent datastore-list-agents datastore-find-agent + datastore-fetch-agent-tags datastore-store-build-start datastore-find-build-starts datastore-count-setup-failures @@ -63,6 +64,7 @@ datastore-list-builds-for-output-and-system datastore-new-agent-password datastore-agent-password-exists? + datastore-replace-agent-tags datastore-list-processed-builds datastore-list-unprocessed-builds datastore-fetch-build-ids-and-propagated-priorities-for-unprocessed-builds @@ -375,6 +377,40 @@ SELECT description FROM agents WHERE id = :id" result))))) +(define-method (datastore-fetch-agent-tags + (datastore <sqlite-datastore>) + agent-id) + (call-with-worker-thread + (slot-ref datastore 'worker-reader-thread-channel) + (lambda (db) + (let ((statement + (sqlite-prepare + db + " +SELECT key, value +FROM tags +INNER JOIN agent_tags + ON tags.id = agent_tags.tag_id +WHERE agent_tags.agent_id = :agent_id" + #:cache? #t))) + + (sqlite-bind-arguments + statement + #:agent_id agent-id) + + (let ((result + (sqlite-fold + (lambda (row result) + (match row + (#(key value) + `((,key . ,value) + ,@result)))) + '() + statement))) + (sqlite-reset statement) + + result))))) + (define-method (datastore-new-agent (datastore <sqlite-datastore>) uuid @@ -445,6 +481,71 @@ WHERE agent_id = :agent_id AND password = :password" result))))) +(define-method (datastore-replace-agent-tags + (datastore <sqlite-datastore>) + agent-id + tags) + (datastore-call-with-transaction + datastore + (lambda (db) + (let ((delete-agent-tags-statement + (sqlite-prepare + db + " +DELETE FROM agent_tags WHERE agent_id = :agent_id" + #:cache? #t)) + (insert-tag-statement + (sqlite-prepare + db + " +INSERT INTO tags (\"key\", \"value\") VALUES (:tagkey, :tagvalue)" + #:cache? #t)) + (find-tag-statement + (sqlite-prepare + db + " +SELECT id FROM tags WHERE key = :tag_key AND value = :tag_value" + #:cache? #t)) + (agent-tags-statement + (sqlite-prepare + db + " +INSERT INTO agent_tags (agent_id, tag_id) VALUES (:agent_id, :tag_id)" + #:cache? #t))) + + (define (tag->id key value) + (sqlite-bind-arguments find-tag-statement + #:tag_key key + #:tag_value value) + (let ((result + (match (sqlite-step find-tag-statement) + (#(id) id) + (#f + (sqlite-bind-arguments insert-tag-statement + #:tagkey key + #:tagvalue value) + (sqlite-step insert-tag-statement) + (sqlite-reset insert-tag-statement) + (last-insert-rowid db))))) + (sqlite-reset find-tag-statement) + + result)) + + (sqlite-bind-arguments delete-agent-tags-statement + #:agent_id agent-id) + (sqlite-step delete-agent-tags-statement) + (sqlite-reset delete-agent-tags-statement) + (for-each + (match-lambda + ((key . value) + (sqlite-bind-arguments agent-tags-statement + #:agent_id agent-id + #:tag_id (tag->id key value)) + (sqlite-step agent-tags-statement) + (sqlite-reset agent-tags-statement))) + tags)))) + #t) + (define-method (datastore-store-derivation (datastore <sqlite-datastore>) derivation) diff --git a/sqitch/pg/deploy/add_agent_tags.sql b/sqitch/pg/deploy/add_agent_tags.sql new file mode 100644 index 0000000..ad061a3 --- /dev/null +++ b/sqitch/pg/deploy/add_agent_tags.sql @@ -0,0 +1,7 @@ +-- Deploy guix-build-coordinator:add_agent_tags to pg + +BEGIN; + +-- XXX Add DDLs here. + +COMMIT; diff --git a/sqitch/pg/revert/add_agent_tags.sql b/sqitch/pg/revert/add_agent_tags.sql new file mode 100644 index 0000000..1d6e34c --- /dev/null +++ b/sqitch/pg/revert/add_agent_tags.sql @@ -0,0 +1,7 @@ +-- Revert guix-build-coordinator:add_agent_tags from pg + +BEGIN; + +-- XXX Add DDLs here. + +COMMIT; diff --git a/sqitch/pg/verify/add_agent_tags.sql b/sqitch/pg/verify/add_agent_tags.sql new file mode 100644 index 0000000..b374187 --- /dev/null +++ b/sqitch/pg/verify/add_agent_tags.sql @@ -0,0 +1,7 @@ +-- Verify guix-build-coordinator:add_agent_tags on pg + +BEGIN; + +-- XXX Add verifications here. + +ROLLBACK; diff --git a/sqitch/sqitch.plan b/sqitch/sqitch.plan index 2240cc1..513609c 100644 --- a/sqitch/sqitch.plan +++ b/sqitch/sqitch.plan @@ -25,3 +25,4 @@ add_unbuilt_outputs_table 2020-11-06T18:58:08Z Christopher Baines <mail@cbaines. support_build_cancelation 2020-12-11T18:25:42Z Christopher Baines <mail@cbaines.net> # Add builds.canceled add_build_tags_build_id_idx 2020-12-21T13:20:54Z Christopher Baines <mail@cbaines.net> # Add an index on build_tags.build_id add_builds_deferred_until 2020-12-26T19:26:32Z Christopher Baines <mail@cbaines.net> # Add builds.deferred_until +add_agent_tags 2021-01-17T11:13:23Z Christopher Baines <mail@cbaines.net> # Add tags for agents diff --git a/sqitch/sqlite/deploy/add_agent_tags.sql b/sqitch/sqlite/deploy/add_agent_tags.sql new file mode 100644 index 0000000..d1efbe1 --- /dev/null +++ b/sqitch/sqlite/deploy/add_agent_tags.sql @@ -0,0 +1,11 @@ +-- Deploy guix-build-coordinator:add_agent_tags to sqlite + +BEGIN; + +CREATE TABLE agent_tags ( + agent_id TEXT NOT NULL REFERENCES agents (id), + tag_id INTEGER NOT NULL REFERENCES tags (id), + PRIMARY KEY (agent_id, tag_id) +); + +COMMIT; diff --git a/sqitch/sqlite/revert/add_agent_tags.sql b/sqitch/sqlite/revert/add_agent_tags.sql new file mode 100644 index 0000000..f9891f6 --- /dev/null +++ b/sqitch/sqlite/revert/add_agent_tags.sql @@ -0,0 +1,7 @@ +-- Revert guix-build-coordinator:add_agent_tags from sqlite + +BEGIN; + +-- XXX Add DDLs here. + +COMMIT; diff --git a/sqitch/sqlite/verify/add_agent_tags.sql b/sqitch/sqlite/verify/add_agent_tags.sql new file mode 100644 index 0000000..27bd13a --- /dev/null +++ b/sqitch/sqlite/verify/add_agent_tags.sql @@ -0,0 +1,7 @@ +-- Verify guix-build-coordinator:add_agent_tags on sqlite + +BEGIN; + +-- XXX Add verifications here. + +ROLLBACK; |