Skip to content

Commit f2fcc25

Browse files
committed
Merge branch 'main' into provisionerservice
2 parents ce4a9fb + 2b922b1 commit f2fcc25

File tree

8 files changed

+74
-72
lines changed

8 files changed

+74
-72
lines changed

.github/workflows/coder.yaml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ on:
1010

1111
pull_request:
1212
branches:
13-
- main
14-
- "release/*"
13+
- "*"
1514

1615
workflow_dispatch:
1716

@@ -160,7 +159,7 @@ jobs:
160159
run:
161160
DB=true gotestsum --jsonfile="gotests.json" --packages="./..." --
162161
-covermode=atomic -coverprofile="gotests.coverage" -timeout=3m
163-
-count=1 -race -parallel=2
162+
-count=1 -race -parallel=1
164163

165164
- uses: codecov/codecov-action@v2
166165
with:

.golangci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ linters:
241241
- staticcheck
242242
- structcheck
243243
- tenv
244+
- tparallel
244245
- typecheck
245246
- unconvert
246247
- unused

coderd/projectparameter/projectparameter.go

Lines changed: 51 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -34,159 +34,142 @@ type Value struct {
3434
}
3535

3636
// Compute accepts a scope in which parameter values are sourced.
37-
// These sources are iterated in a hierarchial fashion to determine
38-
// the runtime parameter vaues for a project.
37+
// These sources are iterated in a hierarchical fashion to determine
38+
// the runtime parameter values for a project.
3939
func Compute(ctx context.Context, db database.Store, scope Scope) ([]Value, error) {
4040
compute := &compute{
41-
parameterByName: map[string]Value{},
42-
projectParameterByName: map[string]database.ProjectParameter{},
41+
db: db,
42+
computedParameterByName: map[string]Value{},
43+
projectHistoryParametersByName: map[string]database.ProjectParameter{},
4344
}
4445

4546
// All parameters for the project version!
4647
projectHistoryParameters, err := db.GetProjectParametersByHistoryID(ctx, scope.ProjectHistoryID)
4748
if errors.Is(err, sql.ErrNoRows) {
48-
// It's valid to have no parameters!
49+
// This occurs when the project history has defined
50+
// no parameters, so we have nothing to compute!
4951
return []Value{}, nil
5052
}
5153
if err != nil {
5254
return nil, xerrors.Errorf("get project parameters: %w", err)
5355
}
54-
for _, projectParameter := range projectHistoryParameters {
55-
compute.projectParameterByName[projectParameter.Name] = projectParameter
56+
for _, projectHistoryParameter := range projectHistoryParameters {
57+
compute.projectHistoryParametersByName[projectHistoryParameter.Name] = projectHistoryParameter
5658
}
5759

5860
// Organization parameters come first!
59-
organizationParameters, err := db.GetParameterValuesByScope(ctx, database.GetParameterValuesByScopeParams{
61+
err = compute.inject(ctx, database.GetParameterValuesByScopeParams{
6062
Scope: database.ParameterScopeOrganization,
6163
ScopeID: scope.OrganizationID,
6264
})
63-
if errors.Is(err, sql.ErrNoRows) {
64-
err = nil
65-
}
6665
if err != nil {
67-
return nil, xerrors.Errorf("get organization parameters: %w", err)
68-
}
69-
err = compute.inject(organizationParameters)
70-
if err != nil {
71-
return nil, xerrors.Errorf("inject organization parameters: %w", err)
66+
return nil, err
7267
}
7368

7469
// Default project parameter values come second!
75-
for _, projectParameter := range projectHistoryParameters {
76-
if !projectParameter.DefaultSourceValue.Valid {
70+
for _, projectHistoryParameter := range projectHistoryParameters {
71+
if !projectHistoryParameter.DefaultSourceValue.Valid {
7772
continue
7873
}
79-
if !projectParameter.DefaultDestinationValue.Valid {
74+
if !projectHistoryParameter.DefaultDestinationValue.Valid {
8075
continue
8176
}
8277

83-
destinationScheme, err := convertDestinationScheme(projectParameter.DefaultDestinationScheme)
78+
destinationScheme, err := convertDestinationScheme(projectHistoryParameter.DefaultDestinationScheme)
8479
if err != nil {
85-
return nil, xerrors.Errorf("convert default destination scheme for project parameter %q: %w", projectParameter.Name, err)
80+
return nil, xerrors.Errorf("convert default destination scheme for project history parameter %q: %w", projectHistoryParameter.Name, err)
8681
}
8782

88-
switch projectParameter.DefaultSourceScheme {
83+
switch projectHistoryParameter.DefaultSourceScheme {
8984
case database.ParameterSourceSchemeData:
90-
compute.parameterByName[projectParameter.Name] = Value{
85+
compute.computedParameterByName[projectHistoryParameter.Name] = Value{
9186
Proto: &proto.ParameterValue{
9287
DestinationScheme: destinationScheme,
93-
Name: projectParameter.DefaultDestinationValue.String,
94-
Value: projectParameter.DefaultSourceValue.String,
88+
Name: projectHistoryParameter.DefaultDestinationValue.String,
89+
Value: projectHistoryParameter.DefaultSourceValue.String,
9590
},
9691
DefaultValue: true,
9792
Scope: database.ParameterScopeProject,
9893
ScopeID: scope.ProjectID.String(),
9994
}
10095
default:
101-
return nil, xerrors.Errorf("unsupported source scheme for project parameter %q: %q", projectParameter.Name, string(projectParameter.DefaultSourceScheme))
96+
return nil, xerrors.Errorf("unsupported source scheme for project history parameter %q: %q", projectHistoryParameter.Name, string(projectHistoryParameter.DefaultSourceScheme))
10297
}
10398
}
10499

105100
// Project parameters come third!
106-
projectParameters, err := db.GetParameterValuesByScope(ctx, database.GetParameterValuesByScopeParams{
101+
err = compute.inject(ctx, database.GetParameterValuesByScopeParams{
107102
Scope: database.ParameterScopeProject,
108103
ScopeID: scope.ProjectID.String(),
109104
})
110-
if errors.Is(err, sql.ErrNoRows) {
111-
err = nil
112-
}
113-
if err != nil {
114-
return nil, xerrors.Errorf("get project parameters: %w", err)
115-
}
116-
err = compute.inject(projectParameters)
117105
if err != nil {
118-
return nil, xerrors.Errorf("inject project parameters: %w", err)
106+
return nil, err
119107
}
120108

121109
// User parameters come fourth!
122-
userParameters, err := db.GetParameterValuesByScope(ctx, database.GetParameterValuesByScopeParams{
110+
err = compute.inject(ctx, database.GetParameterValuesByScopeParams{
123111
Scope: database.ParameterScopeUser,
124112
ScopeID: scope.UserID,
125113
})
126-
if errors.Is(err, sql.ErrNoRows) {
127-
err = nil
128-
}
129114
if err != nil {
130-
return nil, xerrors.Errorf("get user parameters: %w", err)
131-
}
132-
err = compute.inject(userParameters)
133-
if err != nil {
134-
return nil, xerrors.Errorf("inject user parameters: %w", err)
115+
return nil, err
135116
}
136117

137118
// Workspace parameters come last!
138-
workspaceParameters, err := db.GetParameterValuesByScope(ctx, database.GetParameterValuesByScopeParams{
119+
err = compute.inject(ctx, database.GetParameterValuesByScopeParams{
139120
Scope: database.ParameterScopeWorkspace,
140121
ScopeID: scope.WorkspaceID.String(),
141122
})
142-
if errors.Is(err, sql.ErrNoRows) {
143-
err = nil
144-
}
145-
if err != nil {
146-
return nil, xerrors.Errorf("get workspace parameters: %w", err)
147-
}
148-
err = compute.inject(workspaceParameters)
149123
if err != nil {
150-
return nil, xerrors.Errorf("inject workspace parameters: %w", err)
124+
return nil, err
151125
}
152126

153-
for _, projectParameter := range compute.projectParameterByName {
154-
if _, ok := compute.parameterByName[projectParameter.Name]; ok {
127+
for _, projectHistoryParameter := range compute.projectHistoryParametersByName {
128+
if _, ok := compute.computedParameterByName[projectHistoryParameter.Name]; ok {
155129
continue
156130
}
157131
return nil, NoValueError{
158-
ParameterID: projectParameter.ID,
159-
ParameterName: projectParameter.Name,
132+
ParameterID: projectHistoryParameter.ID,
133+
ParameterName: projectHistoryParameter.Name,
160134
}
161135
}
162136

163-
values := make([]Value, 0, len(compute.parameterByName))
164-
for _, value := range compute.parameterByName {
137+
values := make([]Value, 0, len(compute.computedParameterByName))
138+
for _, value := range compute.computedParameterByName {
165139
values = append(values, value)
166140
}
167141
return values, nil
168142
}
169143

170144
type compute struct {
171-
parameterByName map[string]Value
172-
projectParameterByName map[string]database.ProjectParameter
145+
db database.Store
146+
computedParameterByName map[string]Value
147+
projectHistoryParametersByName map[string]database.ProjectParameter
173148
}
174149

175150
// Validates and computes the value for parameters; setting the value on "parameterByName".
176-
func (c *compute) inject(scopedParameters []database.ParameterValue) error {
151+
func (c *compute) inject(ctx context.Context, scopeParams database.GetParameterValuesByScopeParams) error {
152+
scopedParameters, err := c.db.GetParameterValuesByScope(ctx, scopeParams)
153+
if errors.Is(err, sql.ErrNoRows) {
154+
err = nil
155+
}
156+
if err != nil {
157+
return xerrors.Errorf("get %s parameters: %w", scopeParams.Scope, err)
158+
}
159+
177160
for _, scopedParameter := range scopedParameters {
178-
projectParameter, hasProjectParameter := c.projectParameterByName[scopedParameter.Name]
179-
if !hasProjectParameter {
161+
projectHistoryParameter, hasProjectHistoryParameter := c.projectHistoryParametersByName[scopedParameter.Name]
162+
if !hasProjectHistoryParameter {
180163
// Don't inject parameters that aren't defined by the project.
181164
continue
182165
}
183166

184-
_, hasExistingParameter := c.parameterByName[scopedParameter.Name]
167+
_, hasExistingParameter := c.computedParameterByName[scopedParameter.Name]
185168
if hasExistingParameter {
186169
// If a parameter already exists, check if this variable can override it.
187170
// Injection hierarchy is the responsibility of the caller. This check ensures
188171
// project parameters cannot be overridden if already set.
189-
if !projectParameter.AllowOverrideSource && scopedParameter.Scope != database.ParameterScopeProject {
172+
if !projectHistoryParameter.AllowOverrideSource && scopedParameter.Scope != database.ParameterScopeProject {
190173
continue
191174
}
192175
}
@@ -198,15 +181,15 @@ func (c *compute) inject(scopedParameters []database.ParameterValue) error {
198181

199182
switch scopedParameter.SourceScheme {
200183
case database.ParameterSourceSchemeData:
201-
c.parameterByName[projectParameter.Name] = Value{
184+
c.computedParameterByName[projectHistoryParameter.Name] = Value{
202185
Proto: &proto.ParameterValue{
203186
DestinationScheme: destinationScheme,
204187
Name: scopedParameter.SourceValue,
205188
Value: scopedParameter.DestinationValue,
206189
},
207190
}
208191
default:
209-
return xerrors.Errorf("unsupported source scheme: %q", string(projectParameter.DefaultSourceScheme))
192+
return xerrors.Errorf("unsupported source scheme: %q", string(projectHistoryParameter.DefaultSourceScheme))
210193
}
211194
}
212195
return nil

database/pubsub_memory_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ func TestPubsubMemory(t *testing.T) {
1414
t.Parallel()
1515

1616
t.Run("Memory", func(t *testing.T) {
17+
t.Parallel()
18+
1719
pubsub := database.NewPubsubInMemory()
1820
event := "test"
1921
data := "testing"

database/query.sql

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@
44
-- Run "make gen" to generate models and query functions.
55
;
66

7+
-- Acquires the lock for a single job that isn't started, completed,
8+
-- cancelled, and that matches an array of provisioner types.
9+
--
10+
-- SKIP LOCKED is used to jump over locked rows. This prevents
11+
-- multiple provisioners from acquiring the same jobs. See:
12+
-- https://www.postgresql.org/docs/9.5/sql-select.html#SQL-FOR-UPDATE-SHARE
713
-- name: AcquireProvisionerJob :one
814
UPDATE
915
provisioner_job

database/query.sql.go

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

provisioner/terraform/provision_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,9 @@ func TestProvision(t *testing.T) {
123123
require.NoError(t, err)
124124
for {
125125
msg, err := response.Recv()
126+
if msg != nil && msg.GetLog() != nil {
127+
continue
128+
}
126129
if testCase.Error {
127130
require.Error(t, err)
128131
return

provisionersdk/serve_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ func TestProvisionerSDK(t *testing.T) {
3535
}()
3636

3737
api := proto.NewDRPCProvisionerClient(drpcconn.New(client))
38-
_, err := api.Parse(context.Background(), &proto.Parse_Request{})
38+
stream, err := api.Parse(context.Background(), &proto.Parse_Request{})
39+
require.NoError(t, err)
40+
_, err = stream.Recv()
3941
require.Equal(t, drpcerr.Unimplemented, int(drpcerr.Code(err)))
4042
})
4143
t.Run("ServeClosedPipe", func(t *testing.T) {

0 commit comments

Comments
 (0)