forked from openshift/origin
-
Notifications
You must be signed in to change notification settings - Fork 1
/
error_translation.go
83 lines (70 loc) · 2.59 KB
/
error_translation.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package login
import (
"crypto/x509"
"errors"
"fmt"
"strings"
)
const (
unknownReason = iota
noServerFoundReason
certificateAuthorityUnknownReason
certificateHostnameErrorReason
certificateInvalidReason
tlsOversizedRecordReason
certificateAuthorityUnknownMsg = "The server uses a certificate signed by unknown authority. You may need to use the --certificate-authority flag to provide the path to a certificate file for the certificate authority, or --insecure-skip-tls-verify to bypass the certificate check and use insecure connections."
notConfiguredMsg = `The client is not configured. You need to run the login command in order to create a default config for your server and credentials:
oc login
You can also run this command again providing the path to a config file directly, either through the --config flag of the KUBECONFIG environment variable.
`
tlsOversizedRecordMsg = `Unable to connect to %[2]s using TLS: %[1]s.
Ensure the specified server supports HTTPS.`
)
// GetPrettyMessageForServer prettifys the message of the provided error
func getPrettyMessageForServer(err error, serverName string) string {
if err == nil {
return ""
}
reason := detectReason(err)
switch reason {
case noServerFoundReason:
return notConfiguredMsg
case certificateAuthorityUnknownReason:
return certificateAuthorityUnknownMsg
case tlsOversizedRecordReason:
if len(serverName) == 0 {
serverName = "server"
}
return fmt.Sprintf(tlsOversizedRecordMsg, err, serverName)
case certificateHostnameErrorReason:
return fmt.Sprintf("The server is using a certificate that does not match its hostname: %s", err)
case certificateInvalidReason:
return fmt.Sprintf("The server is using an invalid certificate: %s", err)
}
return err.Error()
}
// GetPrettyErrorForServer prettifys the message of the provided error
func getPrettyErrorForServer(err error, serverName string) error {
return errors.New(getPrettyMessageForServer(err, serverName))
}
func detectReason(err error) int {
if err != nil {
switch {
case strings.Contains(err.Error(), "certificate signed by unknown authority"):
return certificateAuthorityUnknownReason
case strings.Contains(err.Error(), "no server defined"):
return noServerFoundReason
case strings.Contains(err.Error(), "tls: oversized record received"):
return tlsOversizedRecordReason
}
switch err.(type) {
case x509.UnknownAuthorityError:
return certificateAuthorityUnknownReason
case x509.HostnameError:
return certificateHostnameErrorReason
case x509.CertificateInvalidError:
return certificateInvalidReason
}
}
return unknownReason
}