44package tfresource
55
66import (
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
2529const (
30+ JsonErrorEnable = "PROVIDER_JSON_ERROR"
2631 ServiceError errorTypeEnum = "ServiceError"
2732 TimeoutError errorTypeEnum = "TimeoutError"
2833 UnexpectedStateError errorTypeEnum = "UnexpectedStateError"
2934 WorkRequestError errorTypeEnum = "WorkRequestError"
3035)
3136
3237type 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+ }
108123func (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
161185func handleMissingResourceError (sync ResourceVoider , err * error ) {
0 commit comments