mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
feat: integrate Acquirer for provisioner jobs (#9717)
* chore: add Acquirer to provisionerdserver pkg Signed-off-by: Spike Curtis <spike@coder.com> * code review improvements & fixes Signed-off-by: Spike Curtis <spike@coder.com> * feat: integrate Acquirer for provisioner jobs Signed-off-by: Spike Curtis <spike@coder.com> * Fix imports, whitespace Signed-off-by: Spike Curtis <spike@coder.com> * provisionerdserver always closes; remove poll interval from playwright Signed-off-by: Spike Curtis <spike@coder.com> * post jobs outside transactions Signed-off-by: Spike Curtis <spike@coder.com> * graceful shutdown in test Signed-off-by: Spike Curtis <spike@coder.com> * Mark AcquireJob deprecated Signed-off-by: Spike Curtis <spike@coder.com> * Graceful shutdown on all provisionerd tests Signed-off-by: Spike Curtis <spike@coder.com> * Deprecate, not remove CLI flags Signed-off-by: Spike Curtis <spike@coder.com> --------- Signed-off-by: Spike Curtis <spike@coder.com>
This commit is contained in:
@@ -136,11 +136,9 @@ func (r *RootCmd) provisionerDaemonStart() *clibase.Cmd {
|
||||
PreSharedKey: preSharedKey,
|
||||
})
|
||||
}, &provisionerd.Options{
|
||||
Logger: logger,
|
||||
JobPollInterval: pollInterval,
|
||||
JobPollJitter: pollJitter,
|
||||
UpdateInterval: 500 * time.Millisecond,
|
||||
Connector: connector,
|
||||
Logger: logger,
|
||||
UpdateInterval: 500 * time.Millisecond,
|
||||
Connector: connector,
|
||||
})
|
||||
|
||||
var exitErr error
|
||||
@@ -189,13 +187,13 @@ func (r *RootCmd) provisionerDaemonStart() *clibase.Cmd {
|
||||
Flag: "poll-interval",
|
||||
Env: "CODER_PROVISIONERD_POLL_INTERVAL",
|
||||
Default: time.Second.String(),
|
||||
Description: "How often to poll for provisioner jobs.",
|
||||
Description: "Deprecated and ignored.",
|
||||
Value: clibase.DurationOf(&pollInterval),
|
||||
},
|
||||
{
|
||||
Flag: "poll-jitter",
|
||||
Env: "CODER_PROVISIONERD_POLL_JITTER",
|
||||
Description: "How much to jitter the poll interval by.",
|
||||
Description: "Deprecated and ignored.",
|
||||
Default: (100 * time.Millisecond).String(),
|
||||
Value: clibase.DurationOf(&pollJitter),
|
||||
},
|
||||
|
||||
@@ -10,10 +10,10 @@ OPTIONS:
|
||||
Directory to store cached data.
|
||||
|
||||
--poll-interval duration, $CODER_PROVISIONERD_POLL_INTERVAL (default: 1s)
|
||||
How often to poll for provisioner jobs.
|
||||
Deprecated and ignored.
|
||||
|
||||
--poll-jitter duration, $CODER_PROVISIONERD_POLL_JITTER (default: 100ms)
|
||||
How much to jitter the poll interval by.
|
||||
Deprecated and ignored.
|
||||
|
||||
--psk string, $CODER_PROVISIONER_DAEMON_PSK
|
||||
Pre-shared key to authenticate with Coder server.
|
||||
|
||||
+2
-2
@@ -394,10 +394,10 @@ updating, and deleting workspace resources.
|
||||
Time to force cancel provisioning tasks that are stuck.
|
||||
|
||||
--provisioner-daemon-poll-interval duration, $CODER_PROVISIONER_DAEMON_POLL_INTERVAL (default: 1s)
|
||||
Time to wait before polling for a new job.
|
||||
Deprecated and ignored.
|
||||
|
||||
--provisioner-daemon-poll-jitter duration, $CODER_PROVISIONER_DAEMON_POLL_JITTER (default: 100ms)
|
||||
Random jitter added to the poll interval.
|
||||
Deprecated and ignored.
|
||||
|
||||
--provisioner-daemon-psk string, $CODER_PROVISIONER_DAEMON_PSK
|
||||
Pre-shared key to authenticate external provisioner daemons to Coder
|
||||
|
||||
@@ -4,14 +4,12 @@ import (
|
||||
"context"
|
||||
"crypto/subtle"
|
||||
"database/sql"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/hashicorp/yamux"
|
||||
@@ -180,6 +178,15 @@ func (api *API) provisionerDaemonServe(rw http.ResponseWriter, r *http.Request)
|
||||
return
|
||||
}
|
||||
api.Logger.Debug(ctx, "provisioner authorized", slog.F("tags", tags))
|
||||
if err := provisionerdserver.Tags(tags).Valid(); err != nil {
|
||||
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
|
||||
Message: "Given tags are not acceptable to the service",
|
||||
Validations: []codersdk.ValidationError{
|
||||
{Field: "tags", Detail: err.Error()},
|
||||
},
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
provisioners := make([]database.ProvisionerType, 0)
|
||||
for p := range provisionersMap {
|
||||
@@ -197,17 +204,6 @@ func (api *API) provisionerDaemonServe(rw http.ResponseWriter, r *http.Request)
|
||||
slog.F("provisioners", provisioners),
|
||||
slog.F("tags", tags),
|
||||
)
|
||||
rawTags, err := json.Marshal(tags)
|
||||
if err != nil {
|
||||
if !xerrors.Is(err, context.Canceled) {
|
||||
log.Error(ctx, "marshal provisioner tags", slog.Error(err))
|
||||
}
|
||||
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
|
||||
Message: "Internal error marshaling daemon tags.",
|
||||
Detail: err.Error(),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
api.AGPL.WebsocketWaitMutex.Lock()
|
||||
api.AGPL.WebsocketWaitGroup.Add(1)
|
||||
@@ -251,9 +247,10 @@ func (api *API) provisionerDaemonServe(rw http.ResponseWriter, r *http.Request)
|
||||
uuid.New(),
|
||||
logger,
|
||||
provisioners,
|
||||
rawTags,
|
||||
tags,
|
||||
api.Database,
|
||||
api.Pubsub,
|
||||
api.AGPL.Acquirer,
|
||||
api.Telemetry,
|
||||
trace.NewNoopTracerProvider().Tracer("noop"),
|
||||
&api.AGPL.QuotaCommitter,
|
||||
@@ -261,8 +258,6 @@ func (api *API) provisionerDaemonServe(rw http.ResponseWriter, r *http.Request)
|
||||
api.AGPL.TemplateScheduleStore,
|
||||
api.AGPL.UserQuietHoursScheduleStore,
|
||||
api.DeploymentValues,
|
||||
// TODO(spikecurtis) - fix debounce to not cause flaky tests.
|
||||
time.Duration(0),
|
||||
provisionerdserver.Options{
|
||||
GitAuthConfigs: api.GitAuthConfigs,
|
||||
OIDCConfig: api.OIDCConfig,
|
||||
|
||||
@@ -31,7 +31,7 @@ func TestTemplateUpdateBuildDeadlines(t *testing.T) {
|
||||
file = dbgen.File(t, db, database.File{
|
||||
CreatedBy: user.ID,
|
||||
})
|
||||
templateJob = dbgen.ProvisionerJob(t, db, database.ProvisionerJob{
|
||||
templateJob = dbgen.ProvisionerJob(t, db, nil, database.ProvisionerJob{
|
||||
OrganizationID: org.ID,
|
||||
FileID: file.ID,
|
||||
InitiatorID: user.ID,
|
||||
@@ -149,7 +149,7 @@ func TestTemplateUpdateBuildDeadlines(t *testing.T) {
|
||||
OwnerID: user.ID,
|
||||
TemplateID: template.ID,
|
||||
})
|
||||
job = dbgen.ProvisionerJob(t, db, database.ProvisionerJob{
|
||||
job = dbgen.ProvisionerJob(t, db, nil, database.ProvisionerJob{
|
||||
OrganizationID: org.ID,
|
||||
FileID: file.ID,
|
||||
InitiatorID: user.ID,
|
||||
@@ -255,7 +255,7 @@ func TestTemplateUpdateBuildDeadlinesSkip(t *testing.T) {
|
||||
file = dbgen.File(t, db, database.File{
|
||||
CreatedBy: user.ID,
|
||||
})
|
||||
templateJob = dbgen.ProvisionerJob(t, db, database.ProvisionerJob{
|
||||
templateJob = dbgen.ProvisionerJob(t, db, nil, database.ProvisionerJob{
|
||||
OrganizationID: org.ID,
|
||||
FileID: file.ID,
|
||||
InitiatorID: user.ID,
|
||||
@@ -405,7 +405,7 @@ func TestTemplateUpdateBuildDeadlinesSkip(t *testing.T) {
|
||||
})
|
||||
wsID = ws.ID
|
||||
}
|
||||
job := dbgen.ProvisionerJob(t, db, database.ProvisionerJob{
|
||||
job := dbgen.ProvisionerJob(t, db, nil, database.ProvisionerJob{
|
||||
OrganizationID: org.ID,
|
||||
FileID: file.ID,
|
||||
InitiatorID: user.ID,
|
||||
|
||||
Reference in New Issue
Block a user