-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patherrors.go
236 lines (206 loc) · 5.27 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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
// 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 okms
import (
"encoding/json"
"errors"
"fmt"
"github.com/ovh/okms-sdk-go/internal/utils"
"github.com/ovh/okms-sdk-go/types"
)
type Major byte
const (
MajorUndefined Major = iota
MajorCCM
MajorSSM
MajorREST
MajorKMIP
MajorDB
MajorXLIB
)
func (m Major) String() string {
if s, ok := majorStr[m]; ok {
return s
}
return fmt.Sprintf("Unknown (%d)", m)
}
var majorStr = map[Major]string{
MajorUndefined: "Undefined",
MajorCCM: "CCM",
MajorSSM: "SSM",
MajorREST: "REST",
MajorKMIP: "KMIP",
MajorDB: "DB",
MajorXLIB: "XLIB",
}
type Minor byte
const (
MinorGeneral Minor = iota + 1
)
const (
MinorCCMIAM Minor = iota + 2
MinorCCMDomain
MinorCCMDskManager
MinorCCMSecretManager
MinorCCMMobManager
MinorCCMAdminProvider
MinorCCMAdminAuthProvider
MinorCCMUserAuthProvider
MinorCCMSsmProvider
)
const (
MinorDBFile Minor = iota + 2
MinorDBS3Provider
MinorDBNPgSqlProvider
)
const (
MinorRESTAuthProvider Minor = iota + 2
MinorRESTServicekeysApi
MinorRESTSecretsApi
)
const (
MinorXlibHttpHelper Minor = iota + 2
MinorXlibIamProvider
MinorXlibCertProvider
)
func (m Minor) StringFor(major Major) string {
if m == 0 {
return "Unspecified"
} else if m == 1 {
return "General"
}
if majMap, ok := minorStr[major]; ok {
if s, ok := majMap[m]; ok {
return s
}
}
return fmt.Sprintf("Unknown (%d)", m)
}
var minorStr = map[Major]map[Minor]string{
MajorCCM: {
MinorCCMIAM: "IAM",
MinorCCMDomain: "Domain",
MinorCCMDskManager: "DSK Manager",
MinorCCMSecretManager: "Secret Manager",
MinorCCMMobManager: "MOB Manager",
MinorCCMAdminProvider: "Admin Provider",
MinorCCMAdminAuthProvider: "Admin Auth Provider",
MinorCCMUserAuthProvider: "User Auth provider",
MinorCCMSsmProvider: "SSM Provider",
},
MajorDB: {
MinorDBFile: "File System DB",
MinorDBS3Provider: "S3",
MinorDBNPgSqlProvider: "Postgres",
},
MajorREST: {
MinorRESTAuthProvider: "Authentication Provider",
MinorRESTServicekeysApi: "Service Keys API",
MinorRESTSecretsApi: "Secrets API",
},
MajorXLIB: {
MinorXlibHttpHelper: "HTTP Provider",
MinorXlibIamProvider: "IAM Provider",
MinorXlibCertProvider: "Certificate Provider",
},
MajorSSM: {},
}
type Category byte
const (
CategoryUnspecified Category = iota
CategoryInternal
CategoryArgument
CategoryAuthentication
CategoryAuthorization
CategoryNotFound
CategoryDatabase
CategoryUnavailable
CategoryBadArgument
)
func (c Category) String() string {
if s, ok := categoryStr[c]; ok {
return s
}
return fmt.Sprintf("Unknown (%d)", c)
}
var categoryStr = map[Category]string{
CategoryUnspecified: "Unspecified",
CategoryInternal: "Internal",
CategoryArgument: "Argument",
CategoryAuthentication: "Authentication",
CategoryAuthorization: "Authorization",
CategoryNotFound: "Not Found",
CategoryDatabase: "Database",
CategoryUnavailable: "Unavailable",
CategoryBadArgument: "Bad Argument",
}
type ErrorCode uint32
func (code ErrorCode) Major() Major {
return Major((code >> 24) & 0xff)
}
func (code ErrorCode) Minor() Minor {
return Minor((code >> 16) & 0xff)
}
func (code ErrorCode) Category() Category {
return Category((code >> 12) & 0x0f)
}
func (code ErrorCode) AppSpecificCode() uint16 {
//nolint:gosec // No integer overflow possible as we mask it with 0x0fff
return uint16(code & 0x0fff)
}
func (code ErrorCode) String() string {
major := code.Major()
return fmt.Sprintf("Code=%d, System=%s, Component=%s, Category=%s", uint32(code), major, code.Minor().StringFor(major), code.Category())
}
type KmsError struct {
ErrorCode ErrorCode
ErrorId string
Errors []error
RequestId string
}
func NewKmsErrorFromBytes(sbody []byte) *KmsError {
var errResp types.ErrorResponse
if e := json.Unmarshal(sbody, &errResp); e == nil {
return newKmsErrorFromRestResponse(errResp)
}
return nil
}
func newKmsErrorFromRestResponse(resp types.ErrorResponse) *KmsError {
kmsErr := &KmsError{}
if resp.ErrorId != nil {
kmsErr.ErrorId = *resp.ErrorId
}
if resp.ErrorCode != nil {
kmsErr.ErrorCode = ErrorCode(utils.ToUint32(*resp.ErrorCode))
}
if resp.Errors != nil {
for _, er := range *resp.Errors {
kmsErr.Errors = append(kmsErr.Errors, errors.New(er))
}
}
if resp.RequestId != nil {
kmsErr.RequestId = *resp.RequestId
}
return kmsErr
}
func (err *KmsError) Error() string {
errs := make([]error, 0, len(err.Errors)+1)
errs = append(errs, err.Errors...)
errs = append(errs, fmt.Errorf("ID=%q, Request-ID:%q, %s", err.ErrorId, err.RequestId, err.ErrorCode))
return errors.Join(errs...).Error()
}
func AsKmsError(err error) *KmsError {
if err != nil {
var e *KmsError
if errors.As(err, &e) {
return e
}
}
return nil
}