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

Lines changed: 38 additions & 23 deletions
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 4 additions & 5 deletions
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 1 addition & 1 deletion
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy