fix: avoid emitting version warning when connection error encountered (#3082)

This commit is contained in:
Jon Ayers
2022-07-21 14:28:24 -05:00
committed by GitHub
parent 5b78251592
commit e01905821f
4 changed files with 91 additions and 2 deletions

View File

@ -455,6 +455,11 @@ func checkVersions(cmd *cobra.Command, client *codersdk.Client) error {
clientVersion := buildinfo.Version() clientVersion := buildinfo.Version()
info, err := client.BuildInfo(cmd.Context()) info, err := client.BuildInfo(cmd.Context())
// Avoid printing errors that are connection-related.
if codersdk.IsConnectionErr(err) {
return nil
}
if err != nil { if err != nil {
return xerrors.Errorf("build info: %w", err) return xerrors.Errorf("build info: %w", err)
} }

View File

@ -1,5 +1,11 @@
package codersdk package codersdk
import (
"net"
"golang.org/x/xerrors"
)
// Response represents a generic HTTP response. // Response represents a generic HTTP response.
type Response struct { type Response struct {
// Message is an actionable message that depicts actions the request took. // Message is an actionable message that depicts actions the request took.
@ -25,3 +31,16 @@ type ValidationError struct {
Field string `json:"field" validate:"required"` Field string `json:"field" validate:"required"`
Detail string `json:"detail" validate:"required"` Detail string `json:"detail" validate:"required"`
} }
// IsConnectionErr is a convenience function for checking if the source of an
// error is due to a 'connection refused', 'no such host', etc.
func IsConnectionErr(err error) bool {
var (
// E.g. no such host
dnsErr *net.DNSError
// Eg. connection refused
opErr *net.OpError
)
return xerrors.As(err, &dnsErr) || xerrors.As(err, &opErr)
}

65
codersdk/error_test.go Normal file
View File

@ -0,0 +1,65 @@
package codersdk_test
import (
"net"
"os"
"testing"
"github.com/stretchr/testify/require"
"golang.org/x/xerrors"
"github.com/coder/coder/codersdk"
)
func TestIsConnectionErr(t *testing.T) {
t.Parallel()
type tc = struct {
name string
err error
expectedResult bool
}
cases := []tc{
{
// E.g. "no such host"
name: "DNSError",
err: &net.DNSError{
Err: "no such host",
Name: "foofoo",
Server: "1.1.1.1:53",
IsTimeout: false,
IsTemporary: false,
IsNotFound: true,
},
expectedResult: true,
},
{
// E.g. "connection refused"
name: "OpErr",
err: &net.OpError{
Op: "dial",
Net: "tcp",
Source: nil,
Addr: nil,
Err: &os.SyscallError{},
},
expectedResult: true,
},
{
name: "OpaqueError",
err: xerrors.Errorf("I'm opaque!"),
expectedResult: false,
},
}
for _, c := range cases {
c := c
t.Run(c.name, func(t *testing.T) {
t.Parallel()
require.Equal(t, c.expectedResult, codersdk.IsConnectionErr(c.err))
})
}
}

View File

@ -250,7 +250,7 @@ export interface PutExtendWorkspaceRequest {
readonly deadline: string readonly deadline: string
} }
// From codersdk/error.go:4:6 // From codersdk/error.go:10:6
export interface Response { export interface Response {
readonly message: string readonly message: string
readonly detail?: string readonly detail?: string
@ -386,7 +386,7 @@ export interface UsersRequest extends Pagination {
readonly q?: string readonly q?: string
} }
// From codersdk/error.go:24:6 // From codersdk/error.go:30:6
export interface ValidationError { export interface ValidationError {
readonly field: string readonly field: string
readonly detail: string readonly detail: string