Skip to content

Commit 62bf15a

Browse files
committed
Added - Adding Json format to error message
1 parent ddc9e12 commit 62bf15a

File tree

2 files changed

+59
-22
lines changed

2 files changed

+59
-22
lines changed

internal/tfresource/errors.go

Lines changed: 46 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@
44
package tfresource
55

66
import (
7+
"encoding/json"
78
"fmt"
89
"log"
910
"reflect"
1011
"regexp"
12+
"strconv"
1113
"strings"
1214
"time"
1315

16+
"github.com/oracle/terraform-provider-oci/internal/utils"
17+
1418
oci_common "github.com/oracle/oci-go-sdk/v65/common"
1519

1620
"github.com/oracle/terraform-provider-oci/internal/globalvar"
@@ -23,29 +27,31 @@ var serviceErrorCheck = func(err error) (failure oci_common.ServiceErrorLocaliza
2327
}
2428

2529
const (
30+
JsonErrorEnable = "PROVIDER_JSON_ERROR"
2631
ServiceError errorTypeEnum = "ServiceError"
2732
TimeoutError errorTypeEnum = "TimeoutError"
2833
UnexpectedStateError errorTypeEnum = "UnexpectedStateError"
2934
WorkRequestError errorTypeEnum = "WorkRequestError"
3035
)
3136

3237
type customError struct {
33-
TypeOfError errorTypeEnum
34-
ErrorCode int
35-
ErrorCodeName string
36-
Service string
37-
Message string
38-
OriginalMessage string
39-
OriginalMessageTemplate string
40-
MessageArgument map[string]string
41-
OpcRequestID string
42-
ResourceOCID string
43-
OperationName string
44-
RequestTarget string
45-
Suggestion string
46-
VersionError string
47-
ResourceDocs string
48-
SdkApiDocs string
38+
TypeOfError errorTypeEnum `json:"type_of_error"`
39+
ErrorCode int `json:"error_code"`
40+
ErrorCodeName string `json:"error_code_name"`
41+
Service string `json:"service"`
42+
Message string `json:"message"`
43+
OriginalMessage string `json:"original_message"`
44+
OriginalMessageTemplate string `json:"original_message_template"`
45+
MessageArgument map[string]string `json:"message_argument"`
46+
OpcRequestID string `json:"opc_request_id"`
47+
ResourceOCID string `json:"resource_ocid"`
48+
OperationName string `json:"operation_name"`
49+
RequestTarget string `json:"request_target"`
50+
Suggestion string `json:"suggestion"`
51+
VersionError string `json:"version_error"`
52+
ResourceDocs string `json:"resource_docs"`
53+
SdkApiDocs string `json:"sdk_api_docs"`
54+
JsonError string `json:"-"`
4955
}
5056

5157
// Create new error format for Terraform output
@@ -102,10 +108,20 @@ func newCustomError(sync interface{}, err error) error {
102108

103109
tfError.VersionError = GetVersionAndDateError()
104110
tfError.Suggestion = getSuggestionFromError(tfError)
111+
tfError.JsonError = getJsonError(tfError)
112+
105113
return tfError.Error()
106114
}
107-
115+
func getJsonError(tfError customError) string {
116+
errByte, err := json.Marshal(tfError)
117+
if err != nil {
118+
log.Printf("[ERROR] Fail to marshal error: %v", err)
119+
return ""
120+
}
121+
return string(errByte)
122+
}
108123
func (tfE customError) Error() error {
124+
var finalError error
109125
switch tfE.TypeOfError {
110126
case ServiceError:
111127
var serviceError string
@@ -129,33 +145,41 @@ func (tfE customError) Error() error {
129145
// For compute out of host capacity error support
130146
serviceError = shortErrorDescription + furtherInfo + detailedDescription
131147
}
132-
return fmt.Errorf(serviceError)
148+
finalError = fmt.Errorf(serviceError)
133149
case TimeoutError:
134-
return fmt.Errorf("%s \n"+
150+
finalError = fmt.Errorf("%s \n"+
135151
"%s \n"+
136152
"Service: %s \n"+
137153
"Error Message: %s \n"+
138154
"Suggestion: %s\n",
139155
tfE.ErrorCodeName, tfE.VersionError, tfE.Service, tfE.Message, tfE.Suggestion)
140156
case UnexpectedStateError:
141-
return fmt.Errorf("%s \n"+
157+
finalError = fmt.Errorf("%s \n"+
142158
"%s \n"+
143159
"Service: %s \n"+
144160
"Error Message: %s \n"+
145161
"Resource OCID: %s \n"+
146162
"Suggestion: %s\n",
147163
tfE.ErrorCodeName, tfE.VersionError, tfE.Service, tfE.Message, tfE.ResourceOCID, tfE.Suggestion)
148164
case WorkRequestError:
149-
return fmt.Errorf("%s \n"+
165+
finalError = fmt.Errorf("%s \n"+
150166
"%s \n"+
151167
"Service: %s \n"+
152168
"Error Message: %s \n"+
153169
"Resource OCID: %s \n"+
154170
"Suggestion: %s\n",
155171
tfE.ErrorCodeName, tfE.VersionError, tfE.Service, tfE.Message, tfE.ResourceOCID, tfE.Suggestion)
156172
default:
157-
return fmt.Errorf(tfE.Message)
173+
finalError = fmt.Errorf(tfE.Message)
174+
}
175+
if isJsonErrorEnable, _ := strconv.ParseBool(utils.GetEnvSettingWithDefault(JsonErrorEnable, "false")); isJsonErrorEnable {
176+
finalError = fmt.Errorf("%s \n"+
177+
"JSON Error: %s \n",
178+
finalError, tfE.JsonError)
158179
}
180+
181+
return finalError
182+
159183
}
160184

161185
func handleMissingResourceError(sync ResourceVoider, err *error) {

internal/tfresource/errors_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,3 +236,16 @@ func TestUnitHandleError(t *testing.T) {
236236
assert.Contains(t, response.Error(), "Request a service limit increase for this resource")
237237

238238
}
239+
240+
func TestUnitGetJsonError(t *testing.T) {
241+
var jsonError customError
242+
jsonError.ErrorCodeName = "NOT FOUND"
243+
jsonError.ErrorCode = 404
244+
jsonError.Message = "Not found error"
245+
246+
wantError := getJsonError(jsonError)
247+
assert.Contains(t, wantError, "NOT FOUND")
248+
assert.Contains(t, wantError, "404")
249+
assert.Contains(t, wantError, "Not found error")
250+
251+
}

0 commit comments

Comments
 (0)