aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--guix-build-coordinator/datastore.scm2
-rw-r--r--guix-build-coordinator/datastore/sqlite.scm101
-rw-r--r--sqitch/pg/deploy/add_agent_tags.sql7
-rw-r--r--sqitch/pg/revert/add_agent_tags.sql7
-rw-r--r--sqitch/pg/verify/add_agent_tags.sql7
-rw-r--r--sqitch/sqitch.plan1
-rw-r--r--sqitch/sqlite/deploy/add_agent_tags.sql11
-rw-r--r--sqitch/sqlite/revert/add_agent_tags.sql7
-rw-r--r--sqitch/sqlite/verify/add_agent_tags.sql7
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;