Skip to content

Commit c79653e

Browse files
committed
Add new query functions for storing project history logs
1 parent 342a9de commit c79653e

File tree

7 files changed

+385
-56
lines changed

7 files changed

+385
-56
lines changed

database/databasefake/databasefake.go

Lines changed: 86 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,18 @@ func New() database.Store {
1818
organizationMembers: make([]database.OrganizationMember, 0),
1919
users: make([]database.User, 0),
2020

21-
parameterValue: make([]database.ParameterValue, 0),
22-
project: make([]database.Project, 0),
23-
projectHistory: make([]database.ProjectHistory, 0),
24-
projectParameter: make([]database.ProjectParameter, 0),
25-
provisionerDaemons: make([]database.ProvisionerDaemon, 0),
26-
provisionerJobs: make([]database.ProvisionerJob, 0),
27-
workspace: make([]database.Workspace, 0),
28-
workspaceResource: make([]database.WorkspaceResource, 0),
29-
workspaceHistory: make([]database.WorkspaceHistory, 0),
30-
workspaceAgent: make([]database.WorkspaceAgent, 0),
21+
parameterValue: make([]database.ParameterValue, 0),
22+
project: make([]database.Project, 0),
23+
projectHistory: make([]database.ProjectHistory, 0),
24+
projectHistoryLog: make([]database.ProjectHistoryLog, 0),
25+
projectParameter: make([]database.ProjectParameter, 0),
26+
provisionerDaemons: make([]database.ProvisionerDaemon, 0),
27+
provisionerJobs: make([]database.ProvisionerJob, 0),
28+
workspace: make([]database.Workspace, 0),
29+
workspaceResource: make([]database.WorkspaceResource, 0),
30+
workspaceHistory: make([]database.WorkspaceHistory, 0),
31+
workspaceHistoryLog: make([]database.WorkspaceHistoryLog, 0),
32+
workspaceAgent: make([]database.WorkspaceAgent, 0),
3133
}
3234
}
3335

@@ -40,16 +42,18 @@ type fakeQuerier struct {
4042
users []database.User
4143

4244
// New tables
43-
parameterValue []database.ParameterValue
44-
project []database.Project
45-
projectHistory []database.ProjectHistory
46-
projectParameter []database.ProjectParameter
47-
provisionerDaemons []database.ProvisionerDaemon
48-
provisionerJobs []database.ProvisionerJob
49-
workspace []database.Workspace
50-
workspaceResource []database.WorkspaceResource
51-
workspaceHistory []database.WorkspaceHistory
52-
workspaceAgent []database.WorkspaceAgent
45+
parameterValue []database.ParameterValue
46+
project []database.Project
47+
projectHistory []database.ProjectHistory
48+
projectHistoryLog []database.ProjectHistoryLog
49+
projectParameter []database.ProjectParameter
50+
provisionerDaemons []database.ProvisionerDaemon
51+
provisionerJobs []database.ProvisionerJob
52+
workspace []database.Workspace
53+
workspaceAgent []database.WorkspaceAgent
54+
workspaceHistory []database.WorkspaceHistory
55+
workspaceHistoryLog []database.WorkspaceHistoryLog
56+
workspaceResource []database.WorkspaceResource
5357
}
5458

5559
// InTx doesn't rollback data properly for in-memory yet.
@@ -318,6 +322,36 @@ func (q *fakeQuerier) GetProjectHistoryByProjectID(_ context.Context, projectID
318322
return history, nil
319323
}
320324

325+
func (q *fakeQuerier) GetProjectHistoryByProjectIDAndName(_ context.Context, arg database.GetProjectHistoryByProjectIDAndNameParams) (database.ProjectHistory, error) {
326+
for _, projectHistory := range q.projectHistory {
327+
if projectHistory.ProjectID.String() != arg.ProjectID.String() {
328+
continue
329+
}
330+
if !strings.EqualFold(projectHistory.Name, arg.Name) {
331+
continue
332+
}
333+
return projectHistory, nil
334+
}
335+
return database.ProjectHistory{}, sql.ErrNoRows
336+
}
337+
338+
func (q *fakeQuerier) GetProjectHistoryLogsByIDBefore(_ context.Context, arg database.GetProjectHistoryLogsByIDBeforeParams) ([]database.ProjectHistoryLog, error) {
339+
logs := make([]database.ProjectHistoryLog, 0)
340+
for _, projectHistoryLog := range q.projectHistoryLog {
341+
if projectHistoryLog.ProjectHistoryID.String() != arg.ProjectHistoryID.String() {
342+
continue
343+
}
344+
if projectHistoryLog.CreatedAt.After(arg.CreatedAt) {
345+
continue
346+
}
347+
logs = append(logs, projectHistoryLog)
348+
}
349+
if len(logs) == 0 {
350+
return nil, sql.ErrNoRows
351+
}
352+
return logs, nil
353+
}
354+
321355
func (q *fakeQuerier) GetProjectHistoryByID(_ context.Context, projectHistoryID uuid.UUID) (database.ProjectHistory, error) {
322356
for _, projectHistory := range q.projectHistory {
323357
if projectHistory.ID.String() != projectHistoryID.String() {
@@ -486,6 +520,22 @@ func (q *fakeQuerier) InsertProjectHistory(_ context.Context, arg database.Inser
486520
return history, nil
487521
}
488522

523+
func (q *fakeQuerier) InsertProjectHistoryLogs(_ context.Context, arg database.InsertProjectHistoryLogsParams) ([]database.ProjectHistoryLog, error) {
524+
logs := make([]database.ProjectHistoryLog, 0)
525+
for index, output := range arg.Output {
526+
logs = append(logs, database.ProjectHistoryLog{
527+
ProjectHistoryID: arg.ProjectHistoryID,
528+
ID: arg.ID[index],
529+
CreatedAt: arg.CreatedAt[index],
530+
Source: arg.Source[index],
531+
Level: arg.Level[index],
532+
Output: output,
533+
})
534+
}
535+
q.projectHistoryLog = append(q.projectHistoryLog, logs...)
536+
return logs, nil
537+
}
538+
489539
func (q *fakeQuerier) InsertProjectParameter(_ context.Context, arg database.InsertProjectParameterParams) (database.ProjectParameter, error) {
490540
//nolint:gosimple
491541
param := database.ProjectParameter{
@@ -596,6 +646,22 @@ func (q *fakeQuerier) InsertWorkspaceHistory(_ context.Context, arg database.Ins
596646
return workspaceHistory, nil
597647
}
598648

649+
func (q *fakeQuerier) InsertWorkspaceHistoryLogs(_ context.Context, arg database.InsertWorkspaceHistoryLogsParams) ([]database.WorkspaceHistoryLog, error) {
650+
logs := make([]database.WorkspaceHistoryLog, 0)
651+
for index, output := range arg.Output {
652+
logs = append(logs, database.WorkspaceHistoryLog{
653+
WorkspaceHistoryID: arg.WorkspaceHistoryID,
654+
ID: arg.ID[index],
655+
CreatedAt: arg.CreatedAt[index],
656+
Source: arg.Source[index],
657+
Level: arg.Level[index],
658+
Output: output,
659+
})
660+
}
661+
q.workspaceHistoryLog = append(q.workspaceHistoryLog, logs...)
662+
return logs, nil
663+
}
664+
599665
func (q *fakeQuerier) InsertWorkspaceResource(_ context.Context, arg database.InsertWorkspaceResourceParams) (database.WorkspaceResource, error) {
600666
workspaceResource := database.WorkspaceResource{
601667
ID: arg.ID,

database/dump.sql

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,12 @@ CREATE TYPE log_level AS ENUM (
55
'debug',
66
'info',
77
'warn',
8-
'error',
9-
'fatal'
8+
'error'
9+
);
10+
11+
CREATE TYPE log_source AS ENUM (
12+
'provisioner_daemon',
13+
'provisioner'
1014
);
1115

1216
CREATE TYPE login_type AS ENUM (
@@ -142,6 +146,15 @@ CREATE TABLE project_history (
142146
import_job_id uuid NOT NULL
143147
);
144148

149+
CREATE TABLE project_history_log (
150+
id uuid NOT NULL,
151+
project_history_id uuid NOT NULL,
152+
created_at timestamp with time zone NOT NULL,
153+
source log_source NOT NULL,
154+
level log_level NOT NULL,
155+
output character varying(1024) NOT NULL
156+
);
157+
145158
CREATE TABLE project_parameter (
146159
id uuid NOT NULL,
147160
created_at timestamp with time zone NOT NULL,
@@ -241,13 +254,13 @@ CREATE TABLE workspace_history (
241254
provision_job_id uuid NOT NULL
242255
);
243256

244-
CREATE TABLE workspace_log (
245-
workspace_id uuid NOT NULL,
257+
CREATE TABLE workspace_history_log (
258+
id uuid NOT NULL,
246259
workspace_history_id uuid NOT NULL,
247-
created timestamp with time zone NOT NULL,
248-
logged_by character varying(255),
260+
created_at timestamp with time zone NOT NULL,
261+
source log_source NOT NULL,
249262
level log_level NOT NULL,
250-
log jsonb NOT NULL
263+
output character varying(1024) NOT NULL
251264
);
252265

253266
CREATE TABLE workspace_resource (
@@ -269,6 +282,9 @@ ALTER TABLE ONLY parameter_value
269282
ALTER TABLE ONLY project_history
270283
ADD CONSTRAINT project_history_id_key UNIQUE (id);
271284

285+
ALTER TABLE ONLY project_history_log
286+
ADD CONSTRAINT project_history_log_id_key UNIQUE (id);
287+
272288
ALTER TABLE ONLY project_history
273289
ADD CONSTRAINT project_history_project_id_name_key UNIQUE (project_id, name);
274290

@@ -299,6 +315,9 @@ ALTER TABLE ONLY workspace_agent
299315
ALTER TABLE ONLY workspace_history
300316
ADD CONSTRAINT workspace_history_id_key UNIQUE (id);
301317

318+
ALTER TABLE ONLY workspace_history_log
319+
ADD CONSTRAINT workspace_history_log_id_key UNIQUE (id);
320+
302321
ALTER TABLE ONLY workspace
303322
ADD CONSTRAINT workspace_id_key UNIQUE (id);
304323

@@ -311,7 +330,8 @@ ALTER TABLE ONLY workspace_resource
311330
ALTER TABLE ONLY workspace_resource
312331
ADD CONSTRAINT workspace_resource_workspace_history_id_name_key UNIQUE (workspace_history_id, name);
313332

314-
CREATE INDEX workspace_log_index ON workspace_log USING btree (workspace_id, workspace_history_id);
333+
ALTER TABLE ONLY project_history_log
334+
ADD CONSTRAINT project_history_log_project_history_id_fkey FOREIGN KEY (project_history_id) REFERENCES project_history(id) ON DELETE CASCADE;
315335

316336
ALTER TABLE ONLY project_history
317337
ADD CONSTRAINT project_history_project_id_fkey FOREIGN KEY (project_id) REFERENCES project(id);
@@ -325,18 +345,15 @@ ALTER TABLE ONLY provisioner_job
325345
ALTER TABLE ONLY workspace_agent
326346
ADD CONSTRAINT workspace_agent_workspace_resource_id_fkey FOREIGN KEY (workspace_resource_id) REFERENCES workspace_resource(id) ON DELETE CASCADE;
327347

348+
ALTER TABLE ONLY workspace_history_log
349+
ADD CONSTRAINT workspace_history_log_workspace_history_id_fkey FOREIGN KEY (workspace_history_id) REFERENCES workspace_history(id) ON DELETE CASCADE;
350+
328351
ALTER TABLE ONLY workspace_history
329352
ADD CONSTRAINT workspace_history_project_history_id_fkey FOREIGN KEY (project_history_id) REFERENCES project_history(id) ON DELETE CASCADE;
330353

331354
ALTER TABLE ONLY workspace_history
332355
ADD CONSTRAINT workspace_history_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES workspace(id) ON DELETE CASCADE;
333356

334-
ALTER TABLE ONLY workspace_log
335-
ADD CONSTRAINT workspace_log_workspace_history_id_fkey FOREIGN KEY (workspace_history_id) REFERENCES workspace_history(id) ON DELETE CASCADE;
336-
337-
ALTER TABLE ONLY workspace_log
338-
ADD CONSTRAINT workspace_log_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES workspace(id) ON DELETE CASCADE;
339-
340357
ALTER TABLE ONLY workspace
341358
ADD CONSTRAINT workspace_project_id_fkey FOREIGN KEY (project_id) REFERENCES project(id);
342359

database/migrations/000002_projects.up.sql

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,3 +90,25 @@ CREATE TABLE project_parameter (
9090
validation_value_type varchar(64) NOT NULL,
9191
UNIQUE(project_history_id, name)
9292
);
93+
94+
CREATE TYPE log_level AS ENUM (
95+
'trace',
96+
'debug',
97+
'info',
98+
'warn',
99+
'error'
100+
);
101+
102+
CREATE TYPE log_source AS ENUM (
103+
'provisioner_daemon',
104+
'provisioner'
105+
);
106+
107+
CREATE TABLE project_history_log (
108+
id uuid NOT NULL UNIQUE,
109+
project_history_id uuid NOT NULL REFERENCES project_history (id) ON DELETE CASCADE,
110+
created_at timestamptz NOT NULL,
111+
source log_source NOT NULL,
112+
level log_level NOT NULL,
113+
output varchar(1024) NOT NULL
114+
);

database/migrations/000003_workspaces.up.sql

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -63,28 +63,11 @@ CREATE TABLE workspace_agent (
6363
resource_metadata jsonb NOT NULL
6464
);
6565

66-
CREATE TYPE log_level AS ENUM (
67-
'trace',
68-
'debug',
69-
'info',
70-
'warn',
71-
'error',
72-
'fatal'
73-
);
74-
75-
CREATE TABLE workspace_log (
76-
workspace_id uuid NOT NULL REFERENCES workspace (id) ON DELETE CASCADE,
77-
-- workspace_history_id can be NULL because some events are not going to be part of a
78-
-- deliberate transition, e.g. an infrastructure failure that kills the workspace
66+
CREATE TABLE workspace_history_log (
67+
id uuid NOT NULL UNIQUE,
7968
workspace_history_id uuid NOT NULL REFERENCES workspace_history (id) ON DELETE CASCADE,
80-
created timestamptz NOT NULL,
81-
-- not sure this is necessary, also not sure it's necessary separate from the log column
82-
logged_by varchar(255),
69+
created_at timestamptz NOT NULL,
70+
source log_source NOT NULL,
8371
level log_level NOT NULL,
84-
log jsonb NOT NULL
72+
output varchar(1024) NOT NULL
8573
);
86-
87-
CREATE INDEX workspace_log_index ON workspace_log (
88-
workspace_id,
89-
workspace_history_id
90-
);

database/querier.go

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

database/query.sql

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,15 @@ FROM
171171
WHERE
172172
project_id = $1;
173173

174+
-- name: GetProjectHistoryByProjectIDAndName :one
175+
SELECT
176+
*
177+
FROM
178+
project_history
179+
WHERE
180+
project_id = $1
181+
AND name = $2;
182+
174183
-- name: GetProjectHistoryByID :one
175184
SELECT
176185
*
@@ -179,6 +188,17 @@ FROM
179188
WHERE
180189
id = $1;
181190

191+
-- name: GetProjectHistoryLogsByIDBefore :many
192+
SELECT
193+
*
194+
FROM
195+
project_history_log
196+
WHERE
197+
project_history_id = $1
198+
AND created_at <= $2
199+
ORDER BY
200+
created_at;
201+
182202
-- name: GetProvisionerDaemonByID :one
183203
SELECT
184204
*
@@ -378,6 +398,17 @@ INSERT INTO
378398
VALUES
379399
($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING *;
380400

401+
-- name: InsertProjectHistoryLogs :many
402+
INSERT INTO
403+
project_history_log
404+
SELECT
405+
@project_history_id :: uuid AS project_history_id,
406+
unnset(@id :: uuid [ ]) AS id,
407+
unnest(@created_at :: timestamptz [ ]) AS created_at,
408+
unnset(@source :: log_source [ ]) as source,
409+
unnset(@level :: log_level [ ]) as level,
410+
unnset(@output :: varchar(1024) [ ]) as output RETURNING *;
411+
381412
-- name: InsertProjectParameter :one
382413
INSERT INTO
383414
project_parameter (
@@ -499,6 +530,17 @@ INSERT INTO
499530
VALUES
500531
($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING *;
501532

533+
-- name: InsertWorkspaceHistoryLogs :many
534+
INSERT INTO
535+
workspace_history_log
536+
SELECT
537+
@workspace_history_id :: uuid AS workspace_history_id,
538+
unnset(@id :: uuid [ ]) AS id,
539+
unnest(@created_at :: timestamptz [ ]) AS created_at,
540+
unnset(@source :: log_source [ ]) as source,
541+
unnset(@level :: log_level [ ]) as level,
542+
unnset(@output :: varchar(1024) [ ]) as output RETURNING *;
543+
502544
-- name: InsertWorkspaceResource :one
503545
INSERT INTO
504546
workspace_resource (

0 commit comments

Comments
 (0)