Skip to content

Commit b503c8b

Browse files
authored
feat: Add parameter and jobs database schema (#81)
* feat: Add parameter and jobs database schema This modifies a prior migration which is typically forbidden, but because we're pre-production deployment I felt grouping would be helpful to future contributors. This adds database functions that are required for the provisioner daemon and job queue logic. * Add comment to acquire provisioner job query * PostgreSQL hates running in parallel
1 parent 599ea2a commit b503c8b

File tree

11 files changed

+1174
-63
lines changed

11 files changed

+1174
-63
lines changed

.github/workflows/coder.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ jobs:
160160
run:
161161
DB=true gotestsum --jsonfile="gotests.json" --packages="./..." --
162162
-covermode=atomic -coverprofile="gotests.coverage" -timeout=3m
163-
-count=1 -race -parallel=2
163+
-count=1 -race -parallel=1
164164

165165
- uses: codecov/codecov-action@v2
166166
with:

database/databasefake/databasefake.go

+199-16
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,16 @@ func New() database.Store {
1818
organizationMembers: make([]database.OrganizationMember, 0),
1919
users: make([]database.User, 0),
2020

21-
project: make([]database.Project, 0),
22-
projectHistory: make([]database.ProjectHistory, 0),
23-
projectParameter: make([]database.ProjectParameter, 0),
24-
workspace: make([]database.Workspace, 0),
25-
workspaceResource: make([]database.WorkspaceResource, 0),
26-
workspaceHistory: make([]database.WorkspaceHistory, 0),
27-
workspaceAgent: make([]database.WorkspaceAgent, 0),
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),
2831
}
2932
}
3033

@@ -37,20 +40,48 @@ type fakeQuerier struct {
3740
users []database.User
3841

3942
// New tables
40-
project []database.Project
41-
projectHistory []database.ProjectHistory
42-
projectParameter []database.ProjectParameter
43-
workspace []database.Workspace
44-
workspaceResource []database.WorkspaceResource
45-
workspaceHistory []database.WorkspaceHistory
46-
workspaceAgent []database.WorkspaceAgent
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
4753
}
4854

4955
// InTx doesn't rollback data properly for in-memory yet.
5056
func (q *fakeQuerier) InTx(fn func(database.Store) error) error {
5157
return fn(q)
5258
}
5359

60+
func (q *fakeQuerier) AcquireProvisionerJob(_ context.Context, arg database.AcquireProvisionerJobParams) (database.ProvisionerJob, error) {
61+
for index, provisionerJob := range q.provisionerJobs {
62+
if provisionerJob.StartedAt.Valid {
63+
continue
64+
}
65+
found := false
66+
for _, provisionerType := range arg.Types {
67+
if provisionerJob.Provisioner != provisionerType {
68+
continue
69+
}
70+
found = true
71+
break
72+
}
73+
if !found {
74+
continue
75+
}
76+
provisionerJob.StartedAt = arg.StartedAt
77+
provisionerJob.UpdatedAt = arg.StartedAt.Time
78+
provisionerJob.WorkerID = arg.WorkerID
79+
q.provisionerJobs[index] = provisionerJob
80+
return provisionerJob, nil
81+
}
82+
return database.ProvisionerJob{}, sql.ErrNoRows
83+
}
84+
5485
func (q *fakeQuerier) GetAPIKeyByID(_ context.Context, id string) (database.APIKey, error) {
5586
for _, apiKey := range q.apiKeys {
5687
if apiKey.ID == id {
@@ -97,6 +128,15 @@ func (q *fakeQuerier) GetWorkspaceAgentsByResourceIDs(_ context.Context, ids []u
97128
return agents, nil
98129
}
99130

131+
func (q *fakeQuerier) GetWorkspaceByID(_ context.Context, id uuid.UUID) (database.Workspace, error) {
132+
for _, workspace := range q.workspace {
133+
if workspace.ID.String() == id.String() {
134+
return workspace, nil
135+
}
136+
}
137+
return database.Workspace{}, sql.ErrNoRows
138+
}
139+
100140
func (q *fakeQuerier) GetWorkspaceByUserIDAndName(_ context.Context, arg database.GetWorkspaceByUserIDAndNameParams) (database.Workspace, error) {
101141
for _, workspace := range q.workspace {
102142
if workspace.OwnerID != arg.OwnerID {
@@ -123,6 +163,15 @@ func (q *fakeQuerier) GetWorkspaceResourcesByHistoryID(_ context.Context, worksp
123163
return resources, nil
124164
}
125165

166+
func (q *fakeQuerier) GetWorkspaceHistoryByID(_ context.Context, id uuid.UUID) (database.WorkspaceHistory, error) {
167+
for _, history := range q.workspaceHistory {
168+
if history.ID.String() == id.String() {
169+
return history, nil
170+
}
171+
}
172+
return database.WorkspaceHistory{}, sql.ErrNoRows
173+
}
174+
126175
func (q *fakeQuerier) GetWorkspaceHistoryByWorkspaceIDWithoutAfter(_ context.Context, workspaceID uuid.UUID) (database.WorkspaceHistory, error) {
127176
for _, workspaceHistory := range q.workspaceHistory {
128177
if workspaceHistory.WorkspaceID.String() != workspaceID.String() {
@@ -179,6 +228,15 @@ func (q *fakeQuerier) GetWorkspacesByUserID(_ context.Context, ownerID string) (
179228
return workspaces, nil
180229
}
181230

231+
func (q *fakeQuerier) GetOrganizationByID(_ context.Context, id string) (database.Organization, error) {
232+
for _, organization := range q.organizations {
233+
if organization.ID == id {
234+
return organization, nil
235+
}
236+
}
237+
return database.Organization{}, sql.ErrNoRows
238+
}
239+
182240
func (q *fakeQuerier) GetOrganizationByName(_ context.Context, name string) (database.Organization, error) {
183241
for _, organization := range q.organizations {
184242
if organization.Name == name {
@@ -207,6 +265,23 @@ func (q *fakeQuerier) GetOrganizationsByUserID(_ context.Context, userID string)
207265
return organizations, nil
208266
}
209267

268+
func (q *fakeQuerier) GetParameterValuesByScope(_ context.Context, arg database.GetParameterValuesByScopeParams) ([]database.ParameterValue, error) {
269+
parameterValues := make([]database.ParameterValue, 0)
270+
for _, parameterValue := range q.parameterValue {
271+
if parameterValue.Scope != arg.Scope {
272+
continue
273+
}
274+
if parameterValue.ScopeID != arg.ScopeID {
275+
continue
276+
}
277+
parameterValues = append(parameterValues, parameterValue)
278+
}
279+
if len(parameterValues) == 0 {
280+
return nil, sql.ErrNoRows
281+
}
282+
return parameterValues, nil
283+
}
284+
210285
func (q *fakeQuerier) GetProjectByID(_ context.Context, id uuid.UUID) (database.Project, error) {
211286
for _, project := range q.project {
212287
if project.ID.String() == id.String() {
@@ -253,6 +328,20 @@ func (q *fakeQuerier) GetProjectHistoryByID(_ context.Context, projectHistoryID
253328
return database.ProjectHistory{}, sql.ErrNoRows
254329
}
255330

331+
func (q *fakeQuerier) GetProjectParametersByHistoryID(_ context.Context, projectHistoryID uuid.UUID) ([]database.ProjectParameter, error) {
332+
parameters := make([]database.ProjectParameter, 0)
333+
for _, projectParameter := range q.projectParameter {
334+
if projectParameter.ProjectHistoryID.String() != projectHistoryID.String() {
335+
continue
336+
}
337+
parameters = append(parameters, projectParameter)
338+
}
339+
if len(parameters) == 0 {
340+
return nil, sql.ErrNoRows
341+
}
342+
return parameters, nil
343+
}
344+
256345
func (q *fakeQuerier) GetProjectsByOrganizationIDs(_ context.Context, ids []string) ([]database.Project, error) {
257346
projects := make([]database.Project, 0)
258347
for _, project := range q.project {
@@ -282,6 +371,26 @@ func (q *fakeQuerier) GetOrganizationMemberByUserID(_ context.Context, arg datab
282371
return database.OrganizationMember{}, sql.ErrNoRows
283372
}
284373

374+
func (q *fakeQuerier) GetProvisionerDaemonByID(_ context.Context, id uuid.UUID) (database.ProvisionerDaemon, error) {
375+
for _, provisionerDaemon := range q.provisionerDaemons {
376+
if provisionerDaemon.ID.String() != id.String() {
377+
continue
378+
}
379+
return provisionerDaemon, nil
380+
}
381+
return database.ProvisionerDaemon{}, sql.ErrNoRows
382+
}
383+
384+
func (q *fakeQuerier) GetProvisionerJobByID(_ context.Context, id uuid.UUID) (database.ProvisionerJob, error) {
385+
for _, provisionerJob := range q.provisionerJobs {
386+
if provisionerJob.ID.String() != id.String() {
387+
continue
388+
}
389+
return provisionerJob, nil
390+
}
391+
return database.ProvisionerJob{}, sql.ErrNoRows
392+
}
393+
285394
func (q *fakeQuerier) InsertAPIKey(_ context.Context, arg database.InsertAPIKeyParams) (database.APIKey, error) {
286395
//nolint:gosimple
287396
key := database.APIKey{
@@ -329,6 +438,24 @@ func (q *fakeQuerier) InsertOrganizationMember(_ context.Context, arg database.I
329438
return organizationMember, nil
330439
}
331440

441+
func (q *fakeQuerier) InsertParameterValue(_ context.Context, arg database.InsertParameterValueParams) (database.ParameterValue, error) {
442+
//nolint:gosimple
443+
parameterValue := database.ParameterValue{
444+
ID: arg.ID,
445+
Name: arg.Name,
446+
CreatedAt: arg.CreatedAt,
447+
UpdatedAt: arg.UpdatedAt,
448+
Scope: arg.Scope,
449+
ScopeID: arg.ScopeID,
450+
SourceScheme: arg.SourceScheme,
451+
SourceValue: arg.SourceValue,
452+
DestinationScheme: arg.DestinationScheme,
453+
DestinationValue: arg.DestinationValue,
454+
}
455+
q.parameterValue = append(q.parameterValue, parameterValue)
456+
return parameterValue, nil
457+
}
458+
332459
func (q *fakeQuerier) InsertProject(_ context.Context, arg database.InsertProjectParams) (database.Project, error) {
333460
project := database.Project{
334461
ID: arg.ID,
@@ -367,9 +494,11 @@ func (q *fakeQuerier) InsertProjectParameter(_ context.Context, arg database.Ins
367494
ProjectHistoryID: arg.ProjectHistoryID,
368495
Name: arg.Name,
369496
Description: arg.Description,
370-
DefaultSource: arg.DefaultSource,
497+
DefaultSourceScheme: arg.DefaultSourceScheme,
498+
DefaultSourceValue: arg.DefaultSourceValue,
371499
AllowOverrideSource: arg.AllowOverrideSource,
372-
DefaultDestination: arg.DefaultDestination,
500+
DefaultDestinationScheme: arg.DefaultDestinationScheme,
501+
DefaultDestinationValue: arg.DefaultDestinationValue,
373502
AllowOverrideDestination: arg.AllowOverrideDestination,
374503
DefaultRefresh: arg.DefaultRefresh,
375504
RedisplayValue: arg.RedisplayValue,
@@ -382,6 +511,32 @@ func (q *fakeQuerier) InsertProjectParameter(_ context.Context, arg database.Ins
382511
return param, nil
383512
}
384513

514+
func (q *fakeQuerier) InsertProvisionerDaemon(_ context.Context, arg database.InsertProvisionerDaemonParams) (database.ProvisionerDaemon, error) {
515+
daemon := database.ProvisionerDaemon{
516+
ID: arg.ID,
517+
CreatedAt: arg.CreatedAt,
518+
Name: arg.Name,
519+
Provisioners: arg.Provisioners,
520+
}
521+
q.provisionerDaemons = append(q.provisionerDaemons, daemon)
522+
return daemon, nil
523+
}
524+
525+
func (q *fakeQuerier) InsertProvisionerJob(_ context.Context, arg database.InsertProvisionerJobParams) (database.ProvisionerJob, error) {
526+
job := database.ProvisionerJob{
527+
ID: arg.ID,
528+
CreatedAt: arg.CreatedAt,
529+
UpdatedAt: arg.UpdatedAt,
530+
InitiatorID: arg.InitiatorID,
531+
Provisioner: arg.Provisioner,
532+
ProjectID: arg.ProjectID,
533+
Type: arg.Type,
534+
Input: arg.Input,
535+
}
536+
q.provisionerJobs = append(q.provisionerJobs, job)
537+
return job, nil
538+
}
539+
385540
func (q *fakeQuerier) InsertUser(_ context.Context, arg database.InsertUserParams) (database.User, error) {
386541
user := database.User{
387542
ID: arg.ID,
@@ -470,6 +625,34 @@ func (q *fakeQuerier) UpdateAPIKeyByID(_ context.Context, arg database.UpdateAPI
470625
return sql.ErrNoRows
471626
}
472627

628+
func (q *fakeQuerier) UpdateProvisionerDaemonByID(_ context.Context, arg database.UpdateProvisionerDaemonByIDParams) error {
629+
for index, daemon := range q.provisionerDaemons {
630+
if arg.ID.String() != daemon.ID.String() {
631+
continue
632+
}
633+
daemon.UpdatedAt = arg.UpdatedAt
634+
daemon.Provisioners = arg.Provisioners
635+
q.provisionerDaemons[index] = daemon
636+
return nil
637+
}
638+
return sql.ErrNoRows
639+
}
640+
641+
func (q *fakeQuerier) UpdateProvisionerJobByID(_ context.Context, arg database.UpdateProvisionerJobByIDParams) error {
642+
for index, job := range q.provisionerJobs {
643+
if arg.ID.String() != job.ID.String() {
644+
continue
645+
}
646+
job.CompletedAt = arg.CompletedAt
647+
job.CancelledAt = arg.CancelledAt
648+
job.UpdatedAt = arg.UpdatedAt
649+
job.Error = arg.Error
650+
q.provisionerJobs[index] = job
651+
return nil
652+
}
653+
return sql.ErrNoRows
654+
}
655+
473656
func (q *fakeQuerier) UpdateWorkspaceHistoryByID(_ context.Context, arg database.UpdateWorkspaceHistoryByIDParams) error {
474657
for index, workspaceHistory := range q.workspaceHistory {
475658
if workspaceHistory.ID.String() != arg.ID.String() {

0 commit comments

Comments
 (0)