Skip to content

Commit c07224e

Browse files
committed
Merge branch 'main' into projectversionresources
2 parents d15f0b3 + d55231c commit c07224e

39 files changed

+1875
-1823
lines changed

.github/workflows/coder.yaml

Lines changed: 12 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -159,45 +159,27 @@ jobs:
159159
-covermode=atomic -coverprofile="gotests.coverage"
160160
-timeout=3m -count=5 -race -short -parallel=2
161161

162+
- name: Upload DataDog Trace
163+
if: (success() || failure()) && github.actor != 'dependabot[bot]'
164+
env:
165+
DATADOG_API_KEY: ${{ secrets.DATADOG_API_KEY }}
166+
DD_DATABASE: fake
167+
GIT_COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
168+
run: go run scripts/datadog-cireport/main.go gotests.xml
169+
162170
- name: Test with PostgreSQL Database
163171
if: runner.os == 'Linux'
164172
run: DB=true gotestsum --junitfile="gotests.xml" --packages="./..." --
165173
-covermode=atomic -coverprofile="gotests.coverage" -timeout=3m
166174
-count=1 -race -parallel=2
167175

168-
- name: Setup Node for DataDog CLI
169-
uses: actions/setup-node@v2
170-
if: always() && github.actor != 'dependabot[bot]'
171-
with:
172-
node-version: "14"
173-
174-
- name: Cache DataDog CLI
175-
if: always() && github.actor != 'dependabot[bot]'
176-
uses: actions/cache@v2
177-
with:
178-
path: |
179-
~/.npm
180-
%LocalAppData%\npm-cache
181-
key: datadogci-
182-
restore-keys: datadogci-
183-
184176
- name: Upload DataDog Trace
185-
if: always() && github.actor != 'dependabot[bot]'
186-
# See: https://docs.datadoghq.com/continuous_integration/setup_tests/junit_upload/#collecting-environment-configuration-metadata
177+
if: (success() || failure()) && github.actor != 'dependabot[bot]'
187178
env:
188179
DATADOG_API_KEY: ${{ secrets.DATADOG_API_KEY }}
189-
DD_GIT_REPOSITORY_URL: ${{ github.repositoryUrl }}
190-
DD_GIT_BRANCH: ${{ github.head_ref }}
191-
DD_GIT_COMMIT_SHA: ${{ github.sha }}
192-
DD_GIT_COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
193-
DD_GIT_COMMIT_AUTHOR_NAME: ${{ github.event.head_commit.author.name }}
194-
DD_GIT_COMMIT_AUTHOR_EMAIL: ${{ github.event.head_commit.author.email }}
195-
DD_GIT_COMMIT_COMMITTER_NAME: ${{ github.event.head_commit.committer.name }}
196-
DD_GIT_COMMIT_COMMITTER_EMAIL: ${{ github.event.head_commit.committer.email }}
197-
DD_TAGS: ${{ format('os.platform:{0},os.architecture:{1}', runner.os, runner.arch) }}
198-
run: |
199-
npm install -g @datadog/datadog-ci
200-
datadog-ci junit upload --service coder gotests.xml
180+
DD_DATABASE: postgresql
181+
GIT_COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
182+
run: go run scripts/datadog-cireport/main.go gotests.xml
201183

202184
- uses: codecov/codecov-action@v2
203185
if: github.actor != 'dependabot[bot]'

codecov.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,4 @@ ignore:
3131
- peerbroker/proto
3232
- provisionerd/proto
3333
- provisionersdk/proto
34+
- scripts/datadog-cireport

coderd/coderd.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,16 +96,21 @@ func New(options *Options) http.Handler {
9696
r.Route("/{workspacehistory}", func(r chi.Router) {
9797
r.Use(httpmw.ExtractWorkspaceHistoryParam(options.Database))
9898
r.Get("/", api.workspaceHistoryByName)
99-
r.Get("/logs", api.workspaceHistoryLogsByName)
10099
})
101100
})
102101
})
103102
})
104103
})
105104

106-
r.Route("/provisioners/daemons", func(r chi.Router) {
107-
r.Get("/", api.provisionerDaemons)
108-
r.Get("/serve", api.provisionerDaemonsServe)
105+
r.Route("/provisioners", func(r chi.Router) {
106+
r.Route("/daemons", func(r chi.Router) {
107+
r.Get("/", api.provisionerDaemons)
108+
r.Get("/serve", api.provisionerDaemonsServe)
109+
})
110+
r.Route("/jobs/{provisionerjob}", func(r chi.Router) {
111+
r.Use(httpmw.ExtractProvisionerJobParam(options.Database))
112+
r.Get("/logs", api.provisionerJobLogsByID)
113+
})
109114
})
110115
})
111116
r.NotFound(site.Handler().ServeHTTP)

coderd/projectversion.go

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -125,41 +125,39 @@ func (api *api) postProjectVersionByOrganization(rw http.ResponseWriter, r *http
125125
var provisionerJob database.ProvisionerJob
126126
var projectVersion database.ProjectVersion
127127
err = api.Database.InTx(func(db database.Store) error {
128-
projectVersionID := uuid.New()
128+
provisionerJobID := uuid.New()
129+
projectVersion, err = api.Database.InsertProjectVersion(r.Context(), database.InsertProjectVersionParams{
130+
ID: uuid.New(),
131+
ProjectID: project.ID,
132+
CreatedAt: database.Now(),
133+
UpdatedAt: database.Now(),
134+
Name: namesgenerator.GetRandomName(1),
135+
StorageMethod: createProjectVersion.StorageMethod,
136+
StorageSource: createProjectVersion.StorageSource,
137+
ImportJobID: provisionerJobID,
138+
})
139+
if err != nil {
140+
return xerrors.Errorf("insert project version: %s", err)
141+
}
142+
129143
input, err := json.Marshal(projectImportJob{
130-
ProjectVersionID: projectVersionID,
144+
ProjectVersionID: projectVersion.ID,
131145
})
132146
if err != nil {
133147
return xerrors.Errorf("marshal import job: %w", err)
134148
}
135-
136149
provisionerJob, err = db.InsertProvisionerJob(r.Context(), database.InsertProvisionerJobParams{
137-
ID: uuid.New(),
150+
ID: provisionerJobID,
138151
CreatedAt: database.Now(),
139152
UpdatedAt: database.Now(),
140153
InitiatorID: apiKey.UserID,
141154
Provisioner: project.Provisioner,
142155
Type: database.ProvisionerJobTypeProjectImport,
143-
ProjectID: project.ID,
144156
Input: input,
145157
})
146158
if err != nil {
147159
return xerrors.Errorf("insert provisioner job: %w", err)
148160
}
149-
150-
projectVersion, err = api.Database.InsertProjectVersion(r.Context(), database.InsertProjectVersionParams{
151-
ID: projectVersionID,
152-
ProjectID: project.ID,
153-
CreatedAt: database.Now(),
154-
UpdatedAt: database.Now(),
155-
Name: namesgenerator.GetRandomName(1),
156-
StorageMethod: createProjectVersion.StorageMethod,
157-
StorageSource: createProjectVersion.StorageSource,
158-
ImportJobID: provisionerJob.ID,
159-
})
160-
if err != nil {
161-
return xerrors.Errorf("insert project version: %s", err)
162-
}
163161
return nil
164162
})
165163
if err != nil {
@@ -250,7 +248,3 @@ func convertProjectParameter(parameter database.ProjectVersionParameter) Project
250248
ValidationValueType: parameter.ValidationValueType,
251249
}
252250
}
253-
254-
func projectVersionLogsChannel(projectVersionID uuid.UUID) string {
255-
return fmt.Sprintf("project-version-logs:%s", projectVersionID)
256-
}

coderd/provisionerdaemons.go

Lines changed: 47 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -165,26 +165,16 @@ func (server *provisionerdServer) AcquireJob(ctx context.Context, _ *proto.Empty
165165
return xerrors.Errorf("request job was invalidated: %s", errorMessage)
166166
}
167167

168-
project, err := server.Database.GetProjectByID(ctx, job.ProjectID)
169-
if err != nil {
170-
return nil, failJob(fmt.Sprintf("get project: %s", err))
171-
}
172-
organization, err := server.Database.GetOrganizationByID(ctx, project.OrganizationID)
173-
if err != nil {
174-
return nil, failJob(fmt.Sprintf("get organization: %s", err))
175-
}
176168
user, err := server.Database.GetUserByID(ctx, job.InitiatorID)
177169
if err != nil {
178170
return nil, failJob(fmt.Sprintf("get user: %s", err))
179171
}
180172

181173
protoJob := &proto.AcquiredJob{
182-
JobId: job.ID.String(),
183-
CreatedAt: job.CreatedAt.UnixMilli(),
184-
Provisioner: string(job.Provisioner),
185-
OrganizationName: organization.Name,
186-
ProjectName: project.Name,
187-
UserName: user.Username,
174+
JobId: job.ID.String(),
175+
CreatedAt: job.CreatedAt.UnixMilli(),
176+
Provisioner: string(job.Provisioner),
177+
UserName: user.Username,
188178
}
189179
var projectVersion database.ProjectVersion
190180
switch job.Type {
@@ -206,6 +196,14 @@ func (server *provisionerdServer) AcquireJob(ctx context.Context, _ *proto.Empty
206196
if err != nil {
207197
return nil, failJob(fmt.Sprintf("get project version: %s", err))
208198
}
199+
project, err := server.Database.GetProjectByID(ctx, projectVersion.ProjectID)
200+
if err != nil {
201+
return nil, failJob(fmt.Sprintf("get project: %s", err))
202+
}
203+
organization, err := server.Database.GetOrganizationByID(ctx, project.OrganizationID)
204+
if err != nil {
205+
return nil, failJob(fmt.Sprintf("get organization: %s", err))
206+
}
209207

210208
// Compute parameters for the workspace to consume.
211209
parameters, err := projectparameter.Compute(ctx, server.Database, projectparameter.Scope{
@@ -251,8 +249,8 @@ func (server *provisionerdServer) AcquireJob(ctx context.Context, _ *proto.Empty
251249

252250
protoJob.Type = &proto.AcquiredJob_ProjectImport_{
253251
ProjectImport: &proto.AcquiredJob_ProjectImport{
254-
ProjectVersionId: projectVersion.ID.String(),
255-
ProjectVersionName: projectVersion.Name,
252+
// This will be replaced once the project import has been refactored.
253+
ProjectName: "placeholder",
256254
},
257255
}
258256
}
@@ -294,85 +292,36 @@ func (server *provisionerdServer) UpdateJob(stream proto.DRPCProvisionerDaemon_U
294292
if err != nil {
295293
return xerrors.Errorf("update job: %w", err)
296294
}
297-
switch job.Type {
298-
case database.ProvisionerJobTypeProjectImport:
299-
if len(update.ProjectImportLogs) == 0 {
300-
continue
301-
}
302-
var input projectImportJob
303-
err = json.Unmarshal(job.Input, &input)
304-
if err != nil {
305-
return xerrors.Errorf("unmarshal job input %q: %s", job.Input, err)
306-
}
307-
insertParams := database.InsertProjectVersionLogsParams{
308-
ProjectVersionID: input.ProjectVersionID,
309-
}
310-
for _, log := range update.ProjectImportLogs {
311-
logLevel, err := convertLogLevel(log.Level)
312-
if err != nil {
313-
return xerrors.Errorf("convert log level: %w", err)
314-
}
315-
logSource, err := convertLogSource(log.Source)
316-
if err != nil {
317-
return xerrors.Errorf("convert log source: %w", err)
318-
}
319-
insertParams.ID = append(insertParams.ID, uuid.New())
320-
insertParams.CreatedAt = append(insertParams.CreatedAt, time.UnixMilli(log.CreatedAt))
321-
insertParams.Level = append(insertParams.Level, logLevel)
322-
insertParams.Source = append(insertParams.Source, logSource)
323-
insertParams.Output = append(insertParams.Output, log.Output)
324-
}
325-
logs, err := server.Database.InsertProjectVersionLogs(stream.Context(), insertParams)
326-
if err != nil {
327-
return xerrors.Errorf("insert project logs: %w", err)
328-
}
329-
data, err := json.Marshal(logs)
330-
if err != nil {
331-
return xerrors.Errorf("marshal project log: %w", err)
332-
}
333-
err = server.Pubsub.Publish(projectVersionLogsChannel(input.ProjectVersionID), data)
334-
if err != nil {
335-
return xerrors.Errorf("publish history log: %w", err)
336-
}
337-
case database.ProvisionerJobTypeWorkspaceProvision:
338-
if len(update.WorkspaceProvisionLogs) == 0 {
339-
continue
340-
}
341-
var input workspaceProvisionJob
342-
err = json.Unmarshal(job.Input, &input)
343-
if err != nil {
344-
return xerrors.Errorf("unmarshal job input %q: %s", job.Input, err)
345-
}
346-
insertParams := database.InsertWorkspaceHistoryLogsParams{
347-
WorkspaceHistoryID: input.WorkspaceHistoryID,
348-
}
349-
for _, log := range update.WorkspaceProvisionLogs {
350-
logLevel, err := convertLogLevel(log.Level)
351-
if err != nil {
352-
return xerrors.Errorf("convert log level: %w", err)
353-
}
354-
logSource, err := convertLogSource(log.Source)
355-
if err != nil {
356-
return xerrors.Errorf("convert log source: %w", err)
357-
}
358-
insertParams.ID = append(insertParams.ID, uuid.New())
359-
insertParams.CreatedAt = append(insertParams.CreatedAt, time.UnixMilli(log.CreatedAt))
360-
insertParams.Level = append(insertParams.Level, logLevel)
361-
insertParams.Source = append(insertParams.Source, logSource)
362-
insertParams.Output = append(insertParams.Output, log.Output)
363-
}
364-
logs, err := server.Database.InsertWorkspaceHistoryLogs(stream.Context(), insertParams)
365-
if err != nil {
366-
return xerrors.Errorf("insert workspace logs: %w", err)
367-
}
368-
data, err := json.Marshal(logs)
295+
insertParams := database.InsertProvisionerJobLogsParams{
296+
JobID: parsedID,
297+
}
298+
for _, log := range update.Logs {
299+
logLevel, err := convertLogLevel(log.Level)
369300
if err != nil {
370-
return xerrors.Errorf("marshal project log: %w", err)
301+
return xerrors.Errorf("convert log level: %w", err)
371302
}
372-
err = server.Pubsub.Publish(workspaceHistoryLogsChannel(input.WorkspaceHistoryID), data)
303+
logSource, err := convertLogSource(log.Source)
373304
if err != nil {
374-
return xerrors.Errorf("publish history log: %w", err)
305+
return xerrors.Errorf("convert log source: %w", err)
375306
}
307+
insertParams.ID = append(insertParams.ID, uuid.New())
308+
insertParams.CreatedAt = append(insertParams.CreatedAt, time.UnixMilli(log.CreatedAt))
309+
insertParams.Level = append(insertParams.Level, logLevel)
310+
insertParams.Source = append(insertParams.Source, logSource)
311+
insertParams.Output = append(insertParams.Output, log.Output)
312+
}
313+
logs, err := server.Database.InsertProvisionerJobLogs(stream.Context(), insertParams)
314+
if err != nil {
315+
server.Logger.Error(stream.Context(), "insert provisioner job logs", slog.Error(err))
316+
return xerrors.Errorf("insert job logs: %w", err)
317+
}
318+
data, err := json.Marshal(logs)
319+
if err != nil {
320+
return xerrors.Errorf("marshal job log: %w", err)
321+
}
322+
err = server.Pubsub.Publish(provisionerJobLogsChannel(parsedID), data)
323+
if err != nil {
324+
return xerrors.Errorf("publish job log: %w", err)
376325
}
377326
}
378327
}
@@ -382,6 +331,13 @@ func (server *provisionerdServer) CancelJob(ctx context.Context, cancelJob *prot
382331
if err != nil {
383332
return nil, xerrors.Errorf("parse job id: %w", err)
384333
}
334+
job, err := server.Database.GetProvisionerJobByID(ctx, jobID)
335+
if err != nil {
336+
return nil, xerrors.Errorf("get provisioner job: %w", err)
337+
}
338+
if job.CompletedAt.Valid {
339+
return nil, xerrors.Errorf("job already completed")
340+
}
385341
err = server.Database.UpdateProvisionerJobWithCompleteByID(ctx, database.UpdateProvisionerJobWithCompleteByIDParams{
386342
ID: jobID,
387343
CompletedAt: sql.NullTime{

coderd/provisionerdaemons_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,5 @@ func TestProvisionerDaemons(t *testing.T) {
2424
daemons, err := client.ProvisionerDaemons(context.Background())
2525
require.NoError(t, err)
2626
return len(daemons) > 0
27-
}, time.Second, 25*time.Millisecond)
27+
}, 3*time.Second, 50*time.Millisecond)
2828
}

0 commit comments

Comments
 (0)