mirror of
https://github.com/coder/coder.git
synced 2025-07-15 22:20:27 +00:00
fix: avoid emitting version warning when connection error encountered (#3082)
This commit is contained in:
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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
65
codersdk/error_test.go
Normal 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))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
@ -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
|
||||||
|
Reference in New Issue
Block a user