Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitba944ab

Browse files
committed
feat(coderd/wsbuilder): return provisioners available at time of insert
1 parent3014713 commitba944ab

File tree

17 files changed

+263
-118
lines changed

17 files changed

+263
-118
lines changed

‎coderd/apidoc/docs.go‎

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

‎coderd/apidoc/swagger.json‎

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

‎coderd/autobuild/lifecycle_executor.go‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ func (e *Executor) runOnce(t time.Time) Stats {
245245
}
246246
}
247247

248-
nextBuild,job,err=builder.Build(e.ctx,tx,nil, audit.WorkspaceBuildBaggage{IP:"127.0.0.1"})
248+
nextBuild,job,_,err=builder.Build(e.ctx,tx,nil, audit.WorkspaceBuildBaggage{IP:"127.0.0.1"})
249249
iferr!=nil {
250250
returnxerrors.Errorf("build workspace with transition %q: %w",nextTransition,err)
251251
}

‎coderd/database/db2sdk/db2sdk.go‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -673,3 +673,23 @@ func CryptoKey(key database.CryptoKey) codersdk.CryptoKey {
673673
Secret:key.Secret.String,
674674
}
675675
}
676+
677+
funcMatchedProvisioners(provisionerDaemons []database.ProvisionerDaemon,now time.Time,staleInterval time.Duration) codersdk.MatchedProvisioners {
678+
minLastSeenAt:=now.Add(-staleInterval)
679+
mostRecentlySeen:= codersdk.NullTime{}
680+
varmatched codersdk.MatchedProvisioners
681+
for_,provisioner:=rangeprovisionerDaemons {
682+
if!provisioner.LastSeenAt.Valid {
683+
continue
684+
}
685+
matched.Count++
686+
ifprovisioner.LastSeenAt.Time.After(minLastSeenAt) {
687+
matched.Available++
688+
}
689+
ifprovisioner.LastSeenAt.Time.After(mostRecentlySeen.Time) {
690+
matched.MostRecentlySeen.Valid=true
691+
matched.MostRecentlySeen.Time=provisioner.LastSeenAt.Time
692+
}
693+
}
694+
returnmatched
695+
}

‎coderd/database/dbauthz/dbauthz.go‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ var (
299299
rbac.ResourceSystem.Type: {policy.WildcardSymbol},
300300
rbac.ResourceOrganization.Type: {policy.ActionCreate,policy.ActionRead},
301301
rbac.ResourceOrganizationMember.Type: {policy.ActionCreate,policy.ActionDelete,policy.ActionRead},
302-
rbac.ResourceProvisionerDaemon.Type: {policy.ActionCreate,policy.ActionUpdate},
302+
rbac.ResourceProvisionerDaemon.Type: {policy.ActionCreate,policy.ActionRead,policy.ActionUpdate},
303303
rbac.ResourceProvisionerKeys.Type: {policy.ActionCreate,policy.ActionRead,policy.ActionDelete},
304304
rbac.ResourceUser.Type:rbac.ResourceUser.AvailableActions(),
305305
rbac.ResourceWorkspaceDormant.Type: {policy.ActionUpdate,policy.ActionDelete,policy.ActionWorkspaceStop},

‎coderd/templateversions.go‎

Lines changed: 28 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"fmt"
1111
"net/http"
1212
"os"
13-
"time"
1413

1514
"github.com/go-chi/chi/v5"
1615
"github.com/google/uuid"
@@ -22,6 +21,7 @@ import (
2221

2322
"github.com/coder/coder/v2/coderd/audit"
2423
"github.com/coder/coder/v2/coderd/database"
24+
"github.com/coder/coder/v2/coderd/database/db2sdk"
2525
"github.com/coder/coder/v2/coderd/database/dbtime"
2626
"github.com/coder/coder/v2/coderd/database/provisionerjobs"
2727
"github.com/coder/coder/v2/coderd/externalauth"
@@ -1513,27 +1513,6 @@ func (api *API) postTemplateVersionsByOrganization(rw http.ResponseWriter, r *ht
15131513
returnerr
15141514
}
15151515

1516-
// Check for eligible provisioners. This allows us to log a message warning deployment administrators
1517-
// of users submitting jobs for which no provisioners are available.
1518-
matchedProvisioners,err=checkProvisioners(ctx,tx,organization.ID,tags)
1519-
iferr!=nil {
1520-
api.Logger.Error(ctx,"failed to check eligible provisioner daemons for job",slog.Error(err))
1521-
}elseifmatchedProvisioners.Count==0 {
1522-
api.Logger.Warn(ctx,"no matching provisioners found for job",
1523-
slog.F("user_id",apiKey.UserID),
1524-
slog.F("job_id",jobID),
1525-
slog.F("job_type",database.ProvisionerJobTypeTemplateVersionImport),
1526-
slog.F("tags",tags),
1527-
)
1528-
}elseifmatchedProvisioners.Available==0 {
1529-
api.Logger.Warn(ctx,"no active provisioners found for job",
1530-
slog.F("user_id",apiKey.UserID),
1531-
slog.F("job_id",jobID),
1532-
slog.F("job_type",database.ProvisionerJobTypeTemplateVersionImport),
1533-
slog.F("tags",tags),
1534-
)
1535-
}
1536-
15371516
provisionerJob,err=tx.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{
15381517
ID:jobID,
15391518
CreatedAt:dbtime.Now(),
@@ -1559,6 +1538,33 @@ func (api *API) postTemplateVersionsByOrganization(rw http.ResponseWriter, r *ht
15591538
returnerr
15601539
}
15611540

1541+
// Check for eligible provisioners. This allows us to return a warning to the user if they
1542+
// submit a job for which no provisioner is available.
1543+
eligibleProvisioners,err:=tx.GetProvisionerDaemonsByOrganization(ctx, database.GetProvisionerDaemonsByOrganizationParams{
1544+
OrganizationID:organization.ID,
1545+
WantTags:provisionerJob.Tags,
1546+
})
1547+
iferr!=nil {
1548+
// Log the error but do not return any warnings. This is purely advisory and we should not block.
1549+
api.Logger.Error(ctx,"failed to check eligible provisioner daemons for job",slog.Error(err))
1550+
}
1551+
matchedProvisioners=db2sdk.MatchedProvisioners(eligibleProvisioners,provisionerJob.CreatedAt,provisionerdserver.StaleInterval)
1552+
ifmatchedProvisioners.Count==0 {
1553+
api.Logger.Warn(ctx,"no matching provisioners found for job",
1554+
slog.F("user_id",apiKey.UserID),
1555+
slog.F("job_id",jobID),
1556+
slog.F("job_type",database.ProvisionerJobTypeTemplateVersionImport),
1557+
slog.F("tags",tags),
1558+
)
1559+
}elseifmatchedProvisioners.Available==0 {
1560+
api.Logger.Warn(ctx,"no active provisioners found for job",
1561+
slog.F("user_id",apiKey.UserID),
1562+
slog.F("job_id",jobID),
1563+
slog.F("job_type",database.ProvisionerJobTypeTemplateVersionImport),
1564+
slog.F("tags",tags),
1565+
)
1566+
}
1567+
15621568
vartemplateID uuid.NullUUID
15631569
ifreq.TemplateID!=uuid.Nil {
15641570
templateID= uuid.NullUUID{
@@ -1822,34 +1828,3 @@ func (api *API) publishTemplateUpdate(ctx context.Context, templateID uuid.UUID)
18221828
slog.F("template_id",templateID),slog.Error(err))
18231829
}
18241830
}
1825-
1826-
funccheckProvisioners(ctx context.Context,store database.Store,orgID uuid.UUID,wantTagsmap[string]string) (codersdk.MatchedProvisioners,error) {
1827-
// Check for eligible provisioners. This allows us to return a warning to the user if they
1828-
// submit a job for which no provisioner is available.
1829-
eligibleProvisioners,err:=store.GetProvisionerDaemonsByOrganization(ctx, database.GetProvisionerDaemonsByOrganizationParams{
1830-
OrganizationID:orgID,
1831-
WantTags:wantTags,
1832-
})
1833-
iferr!=nil {
1834-
// Log the error but do not return any warnings. This is purely advisory and we should not block.
1835-
return codersdk.MatchedProvisioners{},xerrors.Errorf("provisioner daemons by organization: %w",err)
1836-
}
1837-
1838-
staleInterval:=time.Now().Add(-provisionerdserver.StaleInterval)
1839-
mostRecentlySeen:= codersdk.NullTime{}
1840-
varmatched codersdk.MatchedProvisioners
1841-
for_,provisioner:=rangeeligibleProvisioners {
1842-
if!provisioner.LastSeenAt.Valid {
1843-
continue
1844-
}
1845-
matched.Count++
1846-
ifprovisioner.LastSeenAt.Time.After(staleInterval) {
1847-
matched.Available++
1848-
}
1849-
ifprovisioner.LastSeenAt.Time.After(mostRecentlySeen.Time) {
1850-
matched.MostRecentlySeen.Valid=true
1851-
matched.MostRecentlySeen.Time=provisioner.LastSeenAt.Time
1852-
}
1853-
}
1854-
returnmatched,nil
1855-
}

‎coderd/workspacebuilds.go‎

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"github.com/coder/coder/v2/coderd/database/provisionerjobs"
2828
"github.com/coder/coder/v2/coderd/httpapi"
2929
"github.com/coder/coder/v2/coderd/httpmw"
30+
"github.com/coder/coder/v2/coderd/provisionerdserver"
3031
"github.com/coder/coder/v2/coderd/rbac"
3132
"github.com/coder/coder/v2/coderd/rbac/policy"
3233
"github.com/coder/coder/v2/coderd/wsbuilder"
@@ -85,6 +86,7 @@ func (api *API) workspaceBuild(rw http.ResponseWriter, r *http.Request) {
8586
data.scripts,
8687
data.logSources,
8788
data.templateVersions[0],
89+
nil,
8890
)
8991
iferr!=nil {
9092
httpapi.Write(ctx,rw,http.StatusInternalServerError, codersdk.Response{
@@ -289,6 +291,7 @@ func (api *API) workspaceBuildByBuildNumber(rw http.ResponseWriter, r *http.Requ
289291
data.scripts,
290292
data.logSources,
291293
data.templateVersions[0],
294+
nil,
292295
)
293296
iferr!=nil {
294297
httpapi.Write(ctx,rw,http.StatusInternalServerError, codersdk.Response{
@@ -352,7 +355,7 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
352355
builder=builder.State(createBuild.ProvisionerState)
353356
}
354357

355-
workspaceBuild,provisionerJob,err:=builder.Build(
358+
workspaceBuild,provisionerJob,provisionerDaemons,err:=builder.Build(
356359
ctx,
357360
api.Database,
358361
func(action policy.Action,object rbac.Objecter)bool {
@@ -390,6 +393,10 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
390393
api.Logger.Error(ctx,"failed to post provisioner job to pubsub",slog.Error(err))
391394
}
392395

396+
varmatchedProvisioners codersdk.MatchedProvisioners
397+
ifprovisionerJob!=nil {
398+
matchedProvisioners=db2sdk.MatchedProvisioners(provisionerDaemons,provisionerJob.CreatedAt,provisionerdserver.StaleInterval)
399+
}
393400
apiBuild,err:=api.convertWorkspaceBuild(
394401
*workspaceBuild,
395402
workspace,
@@ -404,6 +411,7 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
404411
[]database.WorkspaceAgentScript{},
405412
[]database.WorkspaceAgentLogSource{},
406413
database.TemplateVersion{},
414+
&matchedProvisioners,
407415
)
408416
iferr!=nil {
409417
httpapi.Write(ctx,rw,http.StatusInternalServerError, codersdk.Response{
@@ -804,6 +812,7 @@ func (api *API) convertWorkspaceBuilds(
804812
agentScripts,
805813
agentLogSources,
806814
templateVersion,
815+
nil,
807816
)
808817
iferr!=nil {
809818
returnnil,xerrors.Errorf("converting workspace build: %w",err)
@@ -826,6 +835,7 @@ func (api *API) convertWorkspaceBuild(
826835
agentScripts []database.WorkspaceAgentScript,
827836
agentLogSources []database.WorkspaceAgentLogSource,
828837
templateVersion database.TemplateVersion,
838+
matchedProvisioners*codersdk.MatchedProvisioners,
829839
) (codersdk.WorkspaceBuild,error) {
830840
resourcesByJobID:=map[uuid.UUID][]database.WorkspaceResource{}
831841
for_,resource:=rangeworkspaceResources {
@@ -918,6 +928,7 @@ func (api *API) convertWorkspaceBuild(
918928
Resources:apiResources,
919929
Status:codersdk.ConvertWorkspaceStatus(apiJob.Status,transition),
920930
DailyCost:build.DailyCost,
931+
MatchedProvisioners:matchedProvisioners,
921932
},nil
922933
}
923934

‎coderd/workspaces.go‎

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"github.com/coder/coder/v2/coderd/httpapi"
2828
"github.com/coder/coder/v2/coderd/httpmw"
2929
"github.com/coder/coder/v2/coderd/notifications"
30+
"github.com/coder/coder/v2/coderd/provisionerdserver"
3031
"github.com/coder/coder/v2/coderd/rbac"
3132
"github.com/coder/coder/v2/coderd/rbac/policy"
3233
"github.com/coder/coder/v2/coderd/schedule/cron"
@@ -593,8 +594,7 @@ func createWorkspace(
593594
}},
594595
})
595596
return
596-
}
597-
iferr!=nil&&!errors.Is(err,sql.ErrNoRows) {
597+
}elseif!errors.Is(err,sql.ErrNoRows) {
598598
httpapi.Write(ctx,rw,http.StatusInternalServerError, codersdk.Response{
599599
Message:fmt.Sprintf("Internal error fetching workspace by name %q.",req.Name),
600600
Detail:err.Error(),
@@ -603,8 +603,10 @@ func createWorkspace(
603603
}
604604

605605
var (
606-
provisionerJob*database.ProvisionerJob
607-
workspaceBuild*database.WorkspaceBuild
606+
provisionerJob*database.ProvisionerJob
607+
workspaceBuild*database.WorkspaceBuild
608+
provisionerDaemons []database.ProvisionerDaemon
609+
matchedProvisioners codersdk.MatchedProvisioners
608610
)
609611
err=api.Database.InTx(func(db database.Store)error {
610612
now:=dbtime.Now()
@@ -645,7 +647,7 @@ func createWorkspace(
645647
builder=builder.VersionID(req.TemplateVersionID)
646648
}
647649

648-
workspaceBuild,provisionerJob,err=builder.Build(
650+
workspaceBuild,provisionerJob,provisionerDaemons,err=builder.Build(
649651
ctx,
650652
db,
651653
func(action policy.Action,object rbac.Objecter)bool {
@@ -655,6 +657,7 @@ func createWorkspace(
655657
)
656658
returnerr
657659
},nil)
660+
658661
varbldErr wsbuilder.BuildError
659662
ifxerrors.As(err,&bldErr) {
660663
httpapi.Write(ctx,rw,bldErr.Status, codersdk.Response{
@@ -675,6 +678,10 @@ func createWorkspace(
675678
// Client probably doesn't care about this error, so just log it.
676679
api.Logger.Error(ctx,"failed to post provisioner job to pubsub",slog.Error(err))
677680
}
681+
ifprovisionerJob!=nil {
682+
matchedProvisioners=db2sdk.MatchedProvisioners(provisionerDaemons,provisionerJob.CreatedAt,provisionerdserver.StaleInterval)
683+
}
684+
678685
auditReq.New=workspace.WorkspaceTable()
679686

680687
api.Telemetry.Report(&telemetry.Snapshot{
@@ -696,6 +703,7 @@ func createWorkspace(
696703
[]database.WorkspaceAgentScript{},
697704
[]database.WorkspaceAgentLogSource{},
698705
database.TemplateVersion{},
706+
&matchedProvisioners,
699707
)
700708
iferr!=nil {
701709
httpapi.Write(ctx,rw,http.StatusInternalServerError, codersdk.Response{

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp