From 1e4c20686ec54f6212a30f80d64bd28abf2b7933 Mon Sep 17 00:00:00 2001 From: Sander van Harmelen Date: Wed, 23 Jan 2019 15:09:42 +0100 Subject: [PATCH] backend/remote: make sure we show the correct error Previously we would show two errors when there was a version constraint error. But of course one is enough. --- backend/remote/backend.go | 46 ++++++++++++++++++++------------------- svchost/disco/host.go | 2 +- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/backend/remote/backend.go b/backend/remote/backend.go index 655931b9c..b8d08ebbb 100644 --- a/backend/remote/backend.go +++ b/backend/remote/backend.go @@ -214,6 +214,17 @@ func (b *Remote) Configure(obj cty.Value) tfdiags.Diagnostics { // Discover the service URL for this host to confirm that it provides // a remote backend API and to get the version constraints. service, constraints, err := b.discover() + + // First check any contraints we might have received. + if constraints != nil { + diags = diags.Append(b.checkConstraints(constraints)) + if diags.HasErrors() { + return diags + } + } + + // When we don't have any constraints errors, also check for discovery + // errors before we continue. if err != nil { diags = diags.Append(tfdiags.AttributeValue( tfdiags.Error, @@ -221,15 +232,6 @@ func (b *Remote) Configure(obj cty.Value) tfdiags.Diagnostics { "", // no description is needed here, the error is clear cty.Path{cty.GetAttrStep{Name: "hostname"}}, )) - } - - // Check any retrieved constraints to make sure we are compatible. - if constraints != nil { - diags = diags.Append(b.checkConstraints(constraints)) - } - - // Return if we have any discovery of version constraints errors. - if diags.HasErrors() { return diags } @@ -391,8 +393,19 @@ func (b *Remote) checkConstraints(c *disco.Constraints) tfdiags.Diagnostics { return diags.Append(checkConstraintsWarning(err)) } - var action, toVersion string var excludes []*version.Version + for _, exclude := range c.Excluding { + v, err := version.NewVersion(exclude) + if err != nil { + return diags.Append(checkConstraintsWarning(err)) + } + excludes = append(excludes, v) + } + + // Sort all the excludes. + sort.Sort(version.Collection(excludes)) + + var action, toVersion string switch { case minimum.GreaterThan(v): action = "upgrade" @@ -400,18 +413,7 @@ func (b *Remote) checkConstraints(c *disco.Constraints) tfdiags.Diagnostics { case maximum.LessThan(v): action = "downgrade" toVersion = "<= " + maximum.String() - case len(c.Excluding) > 0: - for _, exclude := range c.Excluding { - v, err := version.NewVersion(exclude) - if err != nil { - return diags.Append(checkConstraintsWarning(err)) - } - excludes = append(excludes, v) - } - - // Sort all the excludes. - sort.Sort(version.Collection(excludes)) - + case len(excludes) > 0: // Get the latest excluded version. action = "upgrade" toVersion = "> " + excludes[len(excludes)-1].String() diff --git a/svchost/disco/host.go b/svchost/disco/host.go index 7602e3f2d..524b2813b 100644 --- a/svchost/disco/host.go +++ b/svchost/disco/host.go @@ -30,8 +30,8 @@ type Constraints struct { Service string `json:"service"` Product string `json:"product"` Minimum string `json:"minimum"` - Excluding []string `json:"excluding"` Maximum string `json:"maximum"` + Excluding []string `json:"excluding"` } // ErrServiceNotProvided is returned when the service is not provided.