Skip to content

Commit a2529f7

Browse files
committed
fix(cli): handle version mismatch re MatchedProvisioners response
1 parent 56c792a commit a2529f7

File tree

5 files changed

+45
-30
lines changed

5 files changed

+45
-30
lines changed

cli/templatepush.go

+38-23
Original file line numberDiff line numberDiff line change
@@ -416,29 +416,6 @@ func createValidTemplateVersion(inv *serpent.Invocation, args createValidTemplat
416416
if err != nil {
417417
return nil, err
418418
}
419-
var tagsJSON strings.Builder
420-
if err := json.NewEncoder(&tagsJSON).Encode(version.Job.Tags); err != nil {
421-
// Fall back to the less-pretty string representation.
422-
tagsJSON.Reset()
423-
_, _ = tagsJSON.WriteString(fmt.Sprintf("%v", version.Job.Tags))
424-
}
425-
if version.MatchedProvisioners.Count == 0 {
426-
cliui.Warnf(inv.Stderr, `No provisioners are available to handle the job!
427-
Please contact your deployment administrator for assistance.
428-
Details:
429-
Provisioner job ID : %s
430-
Requested tags : %s
431-
`, version.Job.ID, tagsJSON.String())
432-
} else if version.MatchedProvisioners.Available == 0 {
433-
cliui.Warnf(inv.Stderr, `All available provisioner daemons have been silent for a while.
434-
Your build will proceed once they become available.
435-
If this persists, please contact your deployment administrator for assistance.
436-
Details:
437-
Provisioner job ID : %s
438-
Requested tags : %s
439-
Most recently seen : %s
440-
`, version.Job.ID, strings.TrimSpace(tagsJSON.String()), version.MatchedProvisioners.MostRecentlySeen.Time)
441-
}
442419

443420
err = cliui.ProvisionerJob(inv.Context(), inv.Stdout, cliui.ProvisionerJobOptions{
444421
Fetch: func() (codersdk.ProvisionerJob, error) {
@@ -505,6 +482,44 @@ func ParseProvisionerTags(rawTags []string) (map[string]string, error) {
505482
return tags, nil
506483
}
507484

485+
var (
486+
warnNoMatchedProvisioners = `No provisioners are available to handle the job!
487+
Please contact your deployment administrator for assistance.
488+
Details:
489+
Provisioner job ID : %s
490+
Requested tags : %s
491+
`
492+
warnNoAvailableProvisioners = `All available provisioner daemons have been silent for a while.
493+
Your build will proceed once they become available.
494+
If this persists, please contact your deployment administrator for assistance.
495+
Details:
496+
Provisioner job ID : %s
497+
Requested tags : %s
498+
Most recently seen : %s
499+
`
500+
)
501+
502+
func WarnMatchedProvisioners(inv *serpent.Invocation, tv codersdk.TemplateVersion) {
503+
var tagsJSON strings.Builder
504+
if err := json.NewEncoder(&tagsJSON).Encode(tv.Job.Tags); err != nil {
505+
// Fall back to the less-pretty string representation.
506+
tagsJSON.Reset()
507+
_, _ = tagsJSON.WriteString(fmt.Sprintf("%v", tv.Job.Tags))
508+
}
509+
if tv.MatchedProvisioners == nil {
510+
// Nothing in the response, nothing to do here!
511+
return
512+
}
513+
if tv.MatchedProvisioners.Count == 0 {
514+
cliui.Warnf(inv.Stderr, warnNoMatchedProvisioners, tv.Job.ID, tagsJSON.String())
515+
return
516+
}
517+
if tv.MatchedProvisioners.Available == 0 {
518+
cliui.Warnf(inv.Stderr, warnNoAvailableProvisioners, tv.Job.ID, strings.TrimSpace(tagsJSON.String()), tv.MatchedProvisioners.MostRecentlySeen.Time)
519+
return
520+
}
521+
}
522+
508523
// prettyDirectoryPath returns a prettified path when inside the users
509524
// home directory. Falls back to dir if the users home directory cannot
510525
// discerned. This function calls filepath.Clean on the result.

coderd/templateversions.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1719,7 +1719,7 @@ func convertTemplateVersion(version database.TemplateVersion, job codersdk.Provi
17191719
},
17201720
Archived: version.Archived,
17211721
Warnings: warnings,
1722-
MatchedProvisioners: matchedProvisioners,
1722+
MatchedProvisioners: &matchedProvisioners,
17231723
}
17241724
}
17251725

coderd/templateversions_test.go

+4-5
Original file line numberDiff line numberDiff line change
@@ -471,14 +471,13 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) {
471471
pj, err := store.GetProvisionerJobByID(ctx, tv.Job.ID)
472472
require.NoError(t, err)
473473
require.EqualValues(t, tt.wantTags, pj.Tags)
474+
// Also assert that we get the expected information back from the API endpoint
475+
require.Zero(t, tv.MatchedProvisioners.Count)
476+
require.Zero(t, tv.MatchedProvisioners.Available)
477+
require.Zero(t, tv.MatchedProvisioners.MostRecentlySeen.Time)
474478
} else {
475479
require.ErrorContains(t, err, tt.expectError)
476480
}
477-
478-
// Also assert that we get the expected information back from the API endpoint
479-
require.Zero(t, tv.MatchedProvisioners.Count)
480-
require.Zero(t, tv.MatchedProvisioners.Available)
481-
require.Zero(t, tv.MatchedProvisioners.MostRecentlySeen.Time)
482481
})
483482
}
484483
})

codersdk/provisionerdaemons.go

+1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ type ProvisionerDaemon struct {
5353

5454
// MatchedProvisioners represents the number of provisioner daemons
5555
// available to take a job at a specific point in time.
56+
// Introduced in Coder version 2.18.0.
5657
type MatchedProvisioners struct {
5758
// Count is the number of provisioner daemons that matched the given
5859
// tags. If the count is 0, it means no provisioner daemons matched the

codersdk/templateversions.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ type TemplateVersion struct {
3232
Archived bool `json:"archived"`
3333

3434
Warnings []TemplateVersionWarning `json:"warnings,omitempty" enums:"DEPRECATED_PARAMETERS"`
35-
MatchedProvisioners MatchedProvisioners `json:"matched_provisioners,omitempty"`
35+
MatchedProvisioners *MatchedProvisioners `json:"matched_provisioners,omitempty"`
3636
}
3737

3838
type TemplateVersionExternalAuth struct {

0 commit comments

Comments
 (0)