Skip to content

Commit 5480be0

Browse files
committed
Add reference link to error message
1 parent b8178dc commit 5480be0

File tree

5 files changed

+64
-10
lines changed

5 files changed

+64
-10
lines changed

internal/globalvar/constants.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,3 +73,5 @@ const (
7373
TfEnvPrefix = "TF_VAR_"
7474
OciEnvPrefix = "OCI_"
7575
)
76+
77+
const TerraformDocumentLink = "https://registry.terraform.io/providers/oracle/oci/latest/docs/"

internal/tfresource/errors.go

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ type customError struct {
4141
RequestTarget string
4242
Suggestion string
4343
VersionError string
44+
ResourceDocs string
4445
}
4546

4647
// Create new error format for Terraform output
@@ -59,6 +60,7 @@ func newCustomError(sync interface{}, err error) error {
5960
OperationName: failure.GetOperationName(),
6061
RequestTarget: failure.GetRequestTarget(),
6162
Service: getServiceName(sync),
63+
ResourceDocs: getResourceDocsURL(sync),
6264
}
6365
} else if strings.Contains(errorMessage, "timeout while waiting for state") {
6466
// Timeout error
@@ -98,15 +100,16 @@ func newCustomError(sync interface{}, err error) error {
98100
func (tfE customError) Error() error {
99101
switch tfE.TypeOfError {
100102
case ServiceError:
101-
return fmt.Errorf("%d-%s \n"+
103+
return fmt.Errorf("%d-%s, %s \n"+
104+
"Suggestion: %s\n"+
105+
"Documentation: %s \n"+
106+
"Request Target: %s \n"+
102107
"%s \n"+
103108
"Service: %s \n"+
104109
"Operation Name: %s \n"+
105-
"Request Target: %s \n"+
106-
"Error Message: %s \n"+
107-
"OPC request ID: %s \n"+
108-
"Suggestion: %s\n",
109-
tfE.ErrorCode, tfE.ErrorCodeName, tfE.VersionError, tfE.Service, tfE.OperationName, tfE.RequestTarget, tfE.Message, tfE.OpcRequestID, tfE.Suggestion)
110+
"OPC request ID: %s \n",
111+
tfE.ErrorCode, tfE.ErrorCodeName, tfE.Message, tfE.Suggestion, tfE.ResourceDocs, tfE.RequestTarget,
112+
tfE.VersionError, tfE.Service, tfE.OperationName, tfE.OpcRequestID)
110113
case TimeoutError:
111114
return fmt.Errorf("%s \n"+
112115
"%s \n"+
@@ -183,6 +186,42 @@ func getServiceName(sync interface{}) string {
183186
return ""
184187
}
185188

189+
// Return the Terraform document for the resource/datasource
190+
func getResourceDocsURL(sync interface{}) string {
191+
baseURL := globalvar.TerraformDocumentLink
192+
var result = baseURL
193+
syncTypeName := reflect.TypeOf(sync).String()
194+
if strings.Contains(syncTypeName, "ResourceCrud") {
195+
result += "resources/"
196+
resourceName := syncTypeName[strings.Index(syncTypeName, ".")+1 : strings.Index(syncTypeName, "ResourceCrud")]
197+
result += toSnakeCase(resourceName)
198+
return result
199+
}
200+
if strings.Contains(syncTypeName, "DataSourcesCrud") {
201+
result += "data-sources/"
202+
datasourceName := syncTypeName[strings.Index(syncTypeName, ".")+1 : strings.Index(syncTypeName, "DataSourcesCrud")]
203+
result += toSnakeCase(datasourceName)
204+
return result
205+
}
206+
if strings.Contains(syncTypeName, "DataSourceCrud") {
207+
result += "data-sources/"
208+
datasourceName := syncTypeName[strings.Index(syncTypeName, ".")+1 : strings.Index(syncTypeName, "DataSourceCrud")]
209+
result += toSnakeCase(datasourceName)
210+
return result
211+
}
212+
log.Printf("[DEBUG] Can't get the resource name for: %v", syncTypeName)
213+
return ""
214+
}
215+
216+
// CoreBootVolume -> core_boot_volume
217+
func toSnakeCase(name string) string {
218+
var matchFirstCap = regexp.MustCompile("(.)([A-Z][a-z]+)")
219+
var matchAllCap = regexp.MustCompile("([a-z0-9])([A-Z])")
220+
snake := matchFirstCap.ReplaceAllString(name, "${1}_${2}")
221+
snake = matchAllCap.ReplaceAllString(snake, "${1}_${2}")
222+
return strings.ToLower(snake)
223+
}
224+
186225
func removeDuplicate(name string) string {
187226
re := regexp.MustCompile(`[A-Z][^A-Z]*`)
188227
subMatchAll := re.FindAllString(name, -1)

internal/tfresource/errors_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,19 @@ func TestUnitGetServiceName(t *testing.T) {
8585
assert.EqualValues(t, expectedOutput, getServiceName(test))
8686
}
8787

88+
func TestUnitGetResourceDocsURL(t *testing.T) {
89+
expectedOutput := globalvar.TerraformDocumentLink
90+
resourceCrud := TestResourceCrud{}
91+
assert.EqualValues(t, expectedOutput+"resources/test", getResourceDocsURL(resourceCrud))
92+
dataSourceCrud := TestDataSourceCrud{}
93+
assert.EqualValues(t, expectedOutput+"data-sources/test", getResourceDocsURL(dataSourceCrud))
94+
dataSourcesCrud := TestDataSourcesCrud{}
95+
assert.EqualValues(t, expectedOutput+"data-sources/test", getResourceDocsURL(dataSourcesCrud))
96+
test := Test{}
97+
expectedOutput = ""
98+
assert.EqualValues(t, expectedOutput, getResourceDocsURL(test))
99+
}
100+
88101
func TestUnitGetResourceOCID(t *testing.T) {
89102
temp := &MockStatefulResource{false}
90103
assert.EqualValues(t, "dummyId", getResourceOCID(temp))

internal/tfresource/suggestions.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ func getSuggestionForServiceError(tfError customError) string {
3838
func getSuggestionFor400(tfError customError) string {
3939
switch tfError.ErrorCodeName {
4040
case "InvalidParameter":
41-
return fmt.Sprintf("Please Update the parameter(s) in the Terraform config as per error message %s", tfError.Message)
41+
return fmt.Sprintf("Please update the parameter(s) in the Terraform config as per error message %s", tfError.Message)
4242
case "LimitExceeded":
4343
return fmt.Sprintf("Request a service limit increase for this resource %s", tfError.Service)
4444
case "QuotaExceeded":

internal/tfresource/suggestions_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ func TestUnit_getSuggestionFor400(t *testing.T) {
2020
Message: "testMessage",
2121
},
2222
},
23-
want: "Please Update the parameter(s) in the Terraform config as per error message testMessage",
23+
want: "Please update the parameter(s) in the Terraform config as per error message testMessage",
2424
},
2525
{
2626
name: "Test returned value is as expected for LimitExceeded",
@@ -85,7 +85,7 @@ func TestUnit_getSuggestionForServiceError(t *testing.T) {
8585
Message: "testMessage",
8686
},
8787
},
88-
want: "Please Update the parameter(s) in the Terraform config as per error message testMessage",
88+
want: "Please update the parameter(s) in the Terraform config as per error message testMessage",
8989
},
9090
{
9191
name: "Test returned value is as expected for 404 code",
@@ -168,7 +168,7 @@ func TestUnit_getSuggestionFromError(t *testing.T) {
168168
Message: "testMessage",
169169
},
170170
},
171-
want: "Please Update the parameter(s) in the Terraform config as per error message testMessage",
171+
want: "Please update the parameter(s) in the Terraform config as per error message testMessage",
172172
},
173173
{
174174
name: "Test returned value is as expected for TimeoutError",

0 commit comments

Comments
 (0)