/
errors.go
92 lines (77 loc) · 2.47 KB
/
errors.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
84
85
86
87
88
89
90
91
92
/*
Copyright 2018 Pressinfra SRL
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package orchestrator
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"strings"
)
// Error contains orchestrator error details
type Error struct {
HTTPStatus int
Path string
Message string
Details interface{}
}
func (e Error) Error() string {
return fmt.Sprintf("[orc]: status: %d path: %s msg: %s, details: %v",
e.HTTPStatus, e.Path, e.Message, e.Details)
}
// NewError returns a specific orchestrator error with extra details
func NewError(resp *http.Response, path string, details interface{}) *Error {
rsp := &Error{
HTTPStatus: resp.StatusCode,
Path: path,
Details: details,
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
rsp.Message = "<<Can't read body>>"
return rsp
}
if err = json.Unmarshal(body, rsp); err != nil {
log.V(-1).Info("error when unmarhal error data", "body", string(body))
rsp.Message = fmt.Sprintf("<<can't get more details, in error: error: %s, body: %s>>", err, body)
return rsp
}
return rsp
}
// NewErrorMsg returns an orchestrator error with extra msg
func NewErrorMsg(msg string, path string) *Error {
return &Error{
HTTPStatus: 0,
Message: msg,
Path: path,
}
}
// IsNotFound checks if the given error is orchestrator error and it's cluster not found.
func IsNotFound(err error) bool {
if orcErr, ok := err.(*Error); ok {
if strings.Contains(orcErr.Message, "Unable to determine cluster name") {
return true
}
// When querying for instances orchestrator returns the following error message when the
// replica cannot be reached.
// https://github.com/github/orchestrator/blob/151029a103429fe16123b9842d1a5b4b175bd5d5/go/http/api.go#L184
if strings.Contains(orcErr.Message, "Cannot read instance") {
return true
}
// https://github.com/github/orchestrator/blob/7bef26f042aafbd956daeaede0cd4aab2ba46e65/go/http/api.go#L1949
if strings.Contains(orcErr.Message, "No masters found") {
return true
}
}
return false
}