mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
feat(coderd): add filters and fix template for provisioner daemons (#16558)
This change adds provisioner daemon ID filter to the provisioner daemons endpoint, and also implements the limiting to 50 results. Test coverage is greatly improved and template information for jobs associated to the daemon was also fixed. Updates #15084 Updates #15192 Related #16532
This commit is contained in:
@@ -3931,7 +3931,7 @@ func (q *FakeQuerier) GetProvisionerDaemonsByOrganization(_ context.Context, arg
|
||||
return daemons, nil
|
||||
}
|
||||
|
||||
func (q *FakeQuerier) GetProvisionerDaemonsWithStatusByOrganization(_ context.Context, arg database.GetProvisionerDaemonsWithStatusByOrganizationParams) ([]database.GetProvisionerDaemonsWithStatusByOrganizationRow, error) {
|
||||
func (q *FakeQuerier) GetProvisionerDaemonsWithStatusByOrganization(ctx context.Context, arg database.GetProvisionerDaemonsWithStatusByOrganizationParams) ([]database.GetProvisionerDaemonsWithStatusByOrganizationRow, error) {
|
||||
err := validateDatabaseType(arg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -3981,6 +3981,31 @@ func (q *FakeQuerier) GetProvisionerDaemonsWithStatusByOrganization(_ context.Co
|
||||
status = database.ProvisionerDaemonStatusIdle
|
||||
}
|
||||
}
|
||||
var currentTemplate database.Template
|
||||
if currentJob.ID != uuid.Nil {
|
||||
var input codersdk.ProvisionerJobInput
|
||||
err := json.Unmarshal(currentJob.Input, &input)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if input.WorkspaceBuildID != nil {
|
||||
b, err := q.getWorkspaceBuildByIDNoLock(ctx, *input.WorkspaceBuildID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
input.TemplateVersionID = &b.TemplateVersionID
|
||||
}
|
||||
if input.TemplateVersionID != nil {
|
||||
v, err := q.getTemplateVersionByIDNoLock(ctx, *input.TemplateVersionID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
currentTemplate, err = q.getTemplateByIDNoLock(ctx, v.TemplateID.UUID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var previousJob database.ProvisionerJob
|
||||
for _, job := range q.provisionerJobs {
|
||||
@@ -3997,6 +4022,31 @@ func (q *FakeQuerier) GetProvisionerDaemonsWithStatusByOrganization(_ context.Co
|
||||
}
|
||||
}
|
||||
}
|
||||
var previousTemplate database.Template
|
||||
if previousJob.ID != uuid.Nil {
|
||||
var input codersdk.ProvisionerJobInput
|
||||
err := json.Unmarshal(previousJob.Input, &input)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if input.WorkspaceBuildID != nil {
|
||||
b, err := q.getWorkspaceBuildByIDNoLock(ctx, *input.WorkspaceBuildID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
input.TemplateVersionID = &b.TemplateVersionID
|
||||
}
|
||||
if input.TemplateVersionID != nil {
|
||||
v, err := q.getTemplateVersionByIDNoLock(ctx, *input.TemplateVersionID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
previousTemplate, err = q.getTemplateByIDNoLock(ctx, v.TemplateID.UUID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get the provisioner key name
|
||||
var keyName string
|
||||
@@ -4008,13 +4058,19 @@ func (q *FakeQuerier) GetProvisionerDaemonsWithStatusByOrganization(_ context.Co
|
||||
}
|
||||
|
||||
rows = append(rows, database.GetProvisionerDaemonsWithStatusByOrganizationRow{
|
||||
ProvisionerDaemon: daemon,
|
||||
Status: status,
|
||||
KeyName: keyName,
|
||||
CurrentJobID: uuid.NullUUID{UUID: currentJob.ID, Valid: currentJob.ID != uuid.Nil},
|
||||
CurrentJobStatus: database.NullProvisionerJobStatus{ProvisionerJobStatus: currentJob.JobStatus, Valid: currentJob.ID != uuid.Nil},
|
||||
PreviousJobID: uuid.NullUUID{UUID: previousJob.ID, Valid: previousJob.ID != uuid.Nil},
|
||||
PreviousJobStatus: database.NullProvisionerJobStatus{ProvisionerJobStatus: previousJob.JobStatus, Valid: previousJob.ID != uuid.Nil},
|
||||
ProvisionerDaemon: daemon,
|
||||
Status: status,
|
||||
KeyName: keyName,
|
||||
CurrentJobID: uuid.NullUUID{UUID: currentJob.ID, Valid: currentJob.ID != uuid.Nil},
|
||||
CurrentJobStatus: database.NullProvisionerJobStatus{ProvisionerJobStatus: currentJob.JobStatus, Valid: currentJob.ID != uuid.Nil},
|
||||
CurrentJobTemplateName: currentTemplate.Name,
|
||||
CurrentJobTemplateDisplayName: currentTemplate.DisplayName,
|
||||
CurrentJobTemplateIcon: currentTemplate.Icon,
|
||||
PreviousJobID: uuid.NullUUID{UUID: previousJob.ID, Valid: previousJob.ID != uuid.Nil},
|
||||
PreviousJobStatus: database.NullProvisionerJobStatus{ProvisionerJobStatus: previousJob.JobStatus, Valid: previousJob.ID != uuid.Nil},
|
||||
PreviousJobTemplateName: previousTemplate.Name,
|
||||
PreviousJobTemplateDisplayName: previousTemplate.DisplayName,
|
||||
PreviousJobTemplateIcon: previousTemplate.Icon,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -4022,6 +4078,10 @@ func (q *FakeQuerier) GetProvisionerDaemonsWithStatusByOrganization(_ context.Co
|
||||
return a.ProvisionerDaemon.CreatedAt.Compare(b.ProvisionerDaemon.CreatedAt)
|
||||
})
|
||||
|
||||
if arg.Limit.Valid && arg.Limit.Int32 > 0 && len(rows) > int(arg.Limit.Int32) {
|
||||
rows = rows[:arg.Limit.Int32]
|
||||
}
|
||||
|
||||
return rows, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -208,6 +208,8 @@ type sqlcQuerier interface {
|
||||
GetPreviousTemplateVersion(ctx context.Context, arg GetPreviousTemplateVersionParams) (TemplateVersion, error)
|
||||
GetProvisionerDaemons(ctx context.Context) ([]ProvisionerDaemon, error)
|
||||
GetProvisionerDaemonsByOrganization(ctx context.Context, arg GetProvisionerDaemonsByOrganizationParams) ([]ProvisionerDaemon, error)
|
||||
// Current job information.
|
||||
// Previous job information.
|
||||
GetProvisionerDaemonsWithStatusByOrganization(ctx context.Context, arg GetProvisionerDaemonsWithStatusByOrganizationParams) ([]GetProvisionerDaemonsWithStatusByOrganizationRow, error)
|
||||
GetProvisionerJobByID(ctx context.Context, id uuid.UUID) (ProvisionerJob, error)
|
||||
GetProvisionerJobTimingsByJobID(ctx context.Context, jobID uuid.UUID) ([]ProvisionerJobTiming, error)
|
||||
|
||||
@@ -5743,9 +5743,12 @@ SELECT
|
||||
current_job.job_status AS current_job_status,
|
||||
previous_job.id AS previous_job_id,
|
||||
previous_job.job_status AS previous_job_status,
|
||||
COALESCE(tmpl.name, ''::text) AS current_job_template_name,
|
||||
COALESCE(tmpl.display_name, ''::text) AS current_job_template_display_name,
|
||||
COALESCE(tmpl.icon, ''::text) AS current_job_template_icon
|
||||
COALESCE(current_template.name, ''::text) AS current_job_template_name,
|
||||
COALESCE(current_template.display_name, ''::text) AS current_job_template_display_name,
|
||||
COALESCE(current_template.icon, ''::text) AS current_job_template_icon,
|
||||
COALESCE(previous_template.name, ''::text) AS previous_job_template_name,
|
||||
COALESCE(previous_template.display_name, ''::text) AS previous_job_template_display_name,
|
||||
COALESCE(previous_template.icon, ''::text) AS previous_job_template_icon
|
||||
FROM
|
||||
provisioner_daemons pd
|
||||
JOIN
|
||||
@@ -5771,43 +5774,62 @@ LEFT JOIN
|
||||
)
|
||||
)
|
||||
LEFT JOIN
|
||||
template_versions version ON version.id = (current_job.input->>'template_version_id')::uuid
|
||||
workspace_builds current_build ON current_build.id = CASE WHEN current_job.input ? 'workspace_build_id' THEN (current_job.input->>'workspace_build_id')::uuid END
|
||||
LEFT JOIN
|
||||
templates tmpl ON tmpl.id = version.template_id
|
||||
-- We should always have a template version, either explicitly or implicitly via workspace build.
|
||||
template_versions current_version ON current_version.id = CASE WHEN current_job.input ? 'template_version_id' THEN (current_job.input->>'template_version_id')::uuid ELSE current_build.template_version_id END
|
||||
LEFT JOIN
|
||||
templates current_template ON current_template.id = current_version.template_id
|
||||
LEFT JOIN
|
||||
workspace_builds previous_build ON previous_build.id = CASE WHEN previous_job.input ? 'workspace_build_id' THEN (previous_job.input->>'workspace_build_id')::uuid END
|
||||
LEFT JOIN
|
||||
-- We should always have a template version, either explicitly or implicitly via workspace build.
|
||||
template_versions previous_version ON previous_version.id = CASE WHEN previous_job.input ? 'template_version_id' THEN (previous_job.input->>'template_version_id')::uuid ELSE previous_build.template_version_id END
|
||||
LEFT JOIN
|
||||
templates previous_template ON previous_template.id = previous_version.template_id
|
||||
WHERE
|
||||
pd.organization_id = $2::uuid
|
||||
AND (COALESCE(array_length($3::uuid[], 1), 0) = 0 OR pd.id = ANY($3::uuid[]))
|
||||
AND ($4::tagset = 'null'::tagset OR provisioner_tagset_contains(pd.tags::tagset, $4::tagset))
|
||||
ORDER BY
|
||||
pd.created_at ASC
|
||||
LIMIT
|
||||
$5::int
|
||||
`
|
||||
|
||||
type GetProvisionerDaemonsWithStatusByOrganizationParams struct {
|
||||
StaleIntervalMS int64 `db:"stale_interval_ms" json:"stale_interval_ms"`
|
||||
OrganizationID uuid.UUID `db:"organization_id" json:"organization_id"`
|
||||
IDs []uuid.UUID `db:"ids" json:"ids"`
|
||||
Tags StringMap `db:"tags" json:"tags"`
|
||||
StaleIntervalMS int64 `db:"stale_interval_ms" json:"stale_interval_ms"`
|
||||
OrganizationID uuid.UUID `db:"organization_id" json:"organization_id"`
|
||||
IDs []uuid.UUID `db:"ids" json:"ids"`
|
||||
Tags StringMap `db:"tags" json:"tags"`
|
||||
Limit sql.NullInt32 `db:"limit" json:"limit"`
|
||||
}
|
||||
|
||||
type GetProvisionerDaemonsWithStatusByOrganizationRow struct {
|
||||
ProvisionerDaemon ProvisionerDaemon `db:"provisioner_daemon" json:"provisioner_daemon"`
|
||||
Status ProvisionerDaemonStatus `db:"status" json:"status"`
|
||||
KeyName string `db:"key_name" json:"key_name"`
|
||||
CurrentJobID uuid.NullUUID `db:"current_job_id" json:"current_job_id"`
|
||||
CurrentJobStatus NullProvisionerJobStatus `db:"current_job_status" json:"current_job_status"`
|
||||
PreviousJobID uuid.NullUUID `db:"previous_job_id" json:"previous_job_id"`
|
||||
PreviousJobStatus NullProvisionerJobStatus `db:"previous_job_status" json:"previous_job_status"`
|
||||
CurrentJobTemplateName string `db:"current_job_template_name" json:"current_job_template_name"`
|
||||
CurrentJobTemplateDisplayName string `db:"current_job_template_display_name" json:"current_job_template_display_name"`
|
||||
CurrentJobTemplateIcon string `db:"current_job_template_icon" json:"current_job_template_icon"`
|
||||
ProvisionerDaemon ProvisionerDaemon `db:"provisioner_daemon" json:"provisioner_daemon"`
|
||||
Status ProvisionerDaemonStatus `db:"status" json:"status"`
|
||||
KeyName string `db:"key_name" json:"key_name"`
|
||||
CurrentJobID uuid.NullUUID `db:"current_job_id" json:"current_job_id"`
|
||||
CurrentJobStatus NullProvisionerJobStatus `db:"current_job_status" json:"current_job_status"`
|
||||
PreviousJobID uuid.NullUUID `db:"previous_job_id" json:"previous_job_id"`
|
||||
PreviousJobStatus NullProvisionerJobStatus `db:"previous_job_status" json:"previous_job_status"`
|
||||
CurrentJobTemplateName string `db:"current_job_template_name" json:"current_job_template_name"`
|
||||
CurrentJobTemplateDisplayName string `db:"current_job_template_display_name" json:"current_job_template_display_name"`
|
||||
CurrentJobTemplateIcon string `db:"current_job_template_icon" json:"current_job_template_icon"`
|
||||
PreviousJobTemplateName string `db:"previous_job_template_name" json:"previous_job_template_name"`
|
||||
PreviousJobTemplateDisplayName string `db:"previous_job_template_display_name" json:"previous_job_template_display_name"`
|
||||
PreviousJobTemplateIcon string `db:"previous_job_template_icon" json:"previous_job_template_icon"`
|
||||
}
|
||||
|
||||
// Current job information.
|
||||
// Previous job information.
|
||||
func (q *sqlQuerier) GetProvisionerDaemonsWithStatusByOrganization(ctx context.Context, arg GetProvisionerDaemonsWithStatusByOrganizationParams) ([]GetProvisionerDaemonsWithStatusByOrganizationRow, error) {
|
||||
rows, err := q.db.QueryContext(ctx, getProvisionerDaemonsWithStatusByOrganization,
|
||||
arg.StaleIntervalMS,
|
||||
arg.OrganizationID,
|
||||
pq.Array(arg.IDs),
|
||||
arg.Tags,
|
||||
arg.Limit,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -5837,6 +5859,9 @@ func (q *sqlQuerier) GetProvisionerDaemonsWithStatusByOrganization(ctx context.C
|
||||
&i.CurrentJobTemplateName,
|
||||
&i.CurrentJobTemplateDisplayName,
|
||||
&i.CurrentJobTemplateIcon,
|
||||
&i.PreviousJobTemplateName,
|
||||
&i.PreviousJobTemplateDisplayName,
|
||||
&i.PreviousJobTemplateIcon,
|
||||
); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -45,9 +45,12 @@ SELECT
|
||||
current_job.job_status AS current_job_status,
|
||||
previous_job.id AS previous_job_id,
|
||||
previous_job.job_status AS previous_job_status,
|
||||
COALESCE(tmpl.name, ''::text) AS current_job_template_name,
|
||||
COALESCE(tmpl.display_name, ''::text) AS current_job_template_display_name,
|
||||
COALESCE(tmpl.icon, ''::text) AS current_job_template_icon
|
||||
COALESCE(current_template.name, ''::text) AS current_job_template_name,
|
||||
COALESCE(current_template.display_name, ''::text) AS current_job_template_display_name,
|
||||
COALESCE(current_template.icon, ''::text) AS current_job_template_icon,
|
||||
COALESCE(previous_template.name, ''::text) AS previous_job_template_name,
|
||||
COALESCE(previous_template.display_name, ''::text) AS previous_job_template_display_name,
|
||||
COALESCE(previous_template.icon, ''::text) AS previous_job_template_icon
|
||||
FROM
|
||||
provisioner_daemons pd
|
||||
JOIN
|
||||
@@ -72,16 +75,30 @@ LEFT JOIN
|
||||
LIMIT 1
|
||||
)
|
||||
)
|
||||
-- Current job information.
|
||||
LEFT JOIN
|
||||
template_versions version ON version.id = (current_job.input->>'template_version_id')::uuid
|
||||
workspace_builds current_build ON current_build.id = CASE WHEN current_job.input ? 'workspace_build_id' THEN (current_job.input->>'workspace_build_id')::uuid END
|
||||
LEFT JOIN
|
||||
templates tmpl ON tmpl.id = version.template_id
|
||||
-- We should always have a template version, either explicitly or implicitly via workspace build.
|
||||
template_versions current_version ON current_version.id = CASE WHEN current_job.input ? 'template_version_id' THEN (current_job.input->>'template_version_id')::uuid ELSE current_build.template_version_id END
|
||||
LEFT JOIN
|
||||
templates current_template ON current_template.id = current_version.template_id
|
||||
-- Previous job information.
|
||||
LEFT JOIN
|
||||
workspace_builds previous_build ON previous_build.id = CASE WHEN previous_job.input ? 'workspace_build_id' THEN (previous_job.input->>'workspace_build_id')::uuid END
|
||||
LEFT JOIN
|
||||
-- We should always have a template version, either explicitly or implicitly via workspace build.
|
||||
template_versions previous_version ON previous_version.id = CASE WHEN previous_job.input ? 'template_version_id' THEN (previous_job.input->>'template_version_id')::uuid ELSE previous_build.template_version_id END
|
||||
LEFT JOIN
|
||||
templates previous_template ON previous_template.id = previous_version.template_id
|
||||
WHERE
|
||||
pd.organization_id = @organization_id::uuid
|
||||
AND (COALESCE(array_length(@ids::uuid[], 1), 0) = 0 OR pd.id = ANY(@ids::uuid[]))
|
||||
AND (@tags::tagset = 'null'::tagset OR provisioner_tagset_contains(pd.tags::tagset, @tags::tagset))
|
||||
ORDER BY
|
||||
pd.created_at ASC;
|
||||
pd.created_at ASC
|
||||
LIMIT
|
||||
sqlc.narg('limit')::int;
|
||||
|
||||
-- name: DeleteOldProvisionerDaemons :exec
|
||||
-- Delete provisioner daemons that have been created at least a week ago
|
||||
|
||||
Reference in New Issue
Block a user