зеркало из https://github.com/Azure/ARO-RP.git
Adding segregation of resultType for CloudError (#3396)
* Adding segragation of resultType for CloudError * Fixing lint issues * Adding test coverage * Fixing lint issue * Uncommit unwanted commit * Fixing test cases
This commit is contained in:
Родитель
730651374c
Коммит
8b523d1d2f
|
@ -345,9 +345,16 @@ func (ocb *openShiftClusterBackend) asyncOperationResultLog(log *logrus.Entry, i
|
|||
"properties.servicePrincipalProfile", "The Azure Red Hat Openshift resource provider service principal has been removed from your tenant. To restore, please unregister and then re-register the Azure Red Hat OpenShift resource provider.")
|
||||
}
|
||||
|
||||
_, ok := backendErr.(*api.CloudError)
|
||||
err, ok := backendErr.(*api.CloudError)
|
||||
if ok {
|
||||
log = log.WithField("resultType", utillog.UserErrorResultType)
|
||||
if err.StatusCode < 300 && err.StatusCode >= 200 {
|
||||
log.Info("long running operation succeeded")
|
||||
return
|
||||
} else if err.StatusCode < 500 {
|
||||
log = log.WithField("resultType", utillog.UserErrorResultType)
|
||||
} else {
|
||||
log = log.WithField("resultType", utillog.ServerErrorResultType)
|
||||
}
|
||||
} else {
|
||||
log = log.WithField("resultType", utillog.ServerErrorResultType)
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ import (
|
|||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
|
@ -22,10 +23,12 @@ import (
|
|||
"github.com/Azure/ARO-RP/pkg/metrics/noop"
|
||||
"github.com/Azure/ARO-RP/pkg/util/billing"
|
||||
"github.com/Azure/ARO-RP/pkg/util/encryption"
|
||||
utillog "github.com/Azure/ARO-RP/pkg/util/log"
|
||||
mock_cluster "github.com/Azure/ARO-RP/pkg/util/mocks/cluster"
|
||||
mock_env "github.com/Azure/ARO-RP/pkg/util/mocks/env"
|
||||
testdatabase "github.com/Azure/ARO-RP/test/database"
|
||||
"github.com/Azure/ARO-RP/test/util/deterministicuuid"
|
||||
testlog "github.com/Azure/ARO-RP/test/util/log"
|
||||
"github.com/Azure/ARO-RP/test/util/testliveconfig"
|
||||
)
|
||||
|
||||
|
@ -341,3 +344,82 @@ func TestBackendTry(t *testing.T) {
|
|||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestAsyncOperationResultLog(t *testing.T) {
|
||||
for _, tt := range []struct {
|
||||
name string
|
||||
initialProvisioningState api.ProvisioningState
|
||||
backendErr error
|
||||
wantData logrus.Fields
|
||||
}{
|
||||
{
|
||||
name: "Success Status Code",
|
||||
initialProvisioningState: api.ProvisioningStateSucceeded,
|
||||
backendErr: &api.CloudError{
|
||||
StatusCode: http.StatusNoContent,
|
||||
CloudErrorBody: &api.CloudErrorBody{
|
||||
Code: api.CloudErrorCodeResourceNotFound,
|
||||
Message: "This is not a real error",
|
||||
Target: "target",
|
||||
},
|
||||
},
|
||||
wantData: logrus.Fields{
|
||||
"LOGKIND": "asyncqos",
|
||||
"operationType": "Succeeded",
|
||||
"resultType": utillog.SuccessResultType,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "User Error Status Code",
|
||||
initialProvisioningState: api.ProvisioningStateFailed,
|
||||
backendErr: &api.CloudError{
|
||||
StatusCode: http.StatusBadRequest,
|
||||
CloudErrorBody: &api.CloudErrorBody{
|
||||
Code: api.CloudErrorCodeResourceNotFound,
|
||||
Message: "This is an user error result type",
|
||||
Target: "target",
|
||||
},
|
||||
},
|
||||
wantData: logrus.Fields{
|
||||
"LOGKIND": "asyncqos",
|
||||
"operationType": "Failed",
|
||||
"resultType": utillog.UserErrorResultType,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Server Error Status Code",
|
||||
initialProvisioningState: api.ProvisioningStateFailed,
|
||||
backendErr: &api.CloudError{
|
||||
StatusCode: http.StatusInternalServerError,
|
||||
CloudErrorBody: &api.CloudErrorBody{
|
||||
Code: api.CloudErrorCodeInternalServerError,
|
||||
Message: "This is a server error result type",
|
||||
Target: "target",
|
||||
},
|
||||
},
|
||||
wantData: logrus.Fields{
|
||||
"LOGKIND": "asyncqos",
|
||||
"operationType": "Failed",
|
||||
"resultType": utillog.ServerErrorResultType,
|
||||
},
|
||||
},
|
||||
} {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
h, log := testlog.New()
|
||||
|
||||
ocb := &openShiftClusterBackend{}
|
||||
ocb.asyncOperationResultLog(log, tt.initialProvisioningState, tt.backendErr)
|
||||
|
||||
entry := h.LastEntry()
|
||||
if entry == nil {
|
||||
t.Fatal("Expected log entry, got nil")
|
||||
}
|
||||
|
||||
for key, value := range tt.wantData {
|
||||
if entry.Data[key] != value {
|
||||
t.Errorf("Unexpected value for key %s, got %v, want %v", key, entry.Data[key], value)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -476,7 +476,14 @@ func frontendOperationResultLog(log *logrus.Entry, method string, err error) {
|
|||
|
||||
switch err := err.(type) {
|
||||
case *api.CloudError:
|
||||
log = log.WithField("resultType", utillog.UserErrorResultType)
|
||||
if err.StatusCode < 300 && err.StatusCode >= 200 {
|
||||
log.Info("front end operation succeeded")
|
||||
return
|
||||
} else if err.StatusCode < 500 {
|
||||
log = log.WithField("resultType", utillog.UserErrorResultType)
|
||||
} else {
|
||||
log = log.WithField("resultType", utillog.ServerErrorResultType)
|
||||
}
|
||||
case statusCodeError:
|
||||
if int(err) < 300 && int(err) >= 200 {
|
||||
log.Info("front end operation succeeded")
|
||||
|
|
|
@ -24,6 +24,7 @@ import (
|
|||
|
||||
"github.com/Azure/ARO-RP/pkg/api"
|
||||
"github.com/Azure/ARO-RP/pkg/env"
|
||||
utillog "github.com/Azure/ARO-RP/pkg/util/log"
|
||||
mock_env "github.com/Azure/ARO-RP/pkg/util/mocks/env"
|
||||
testlog "github.com/Azure/ARO-RP/test/util/log"
|
||||
)
|
||||
|
@ -170,6 +171,80 @@ func TestAdminReply(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestFrontendOperationResultLog(t *testing.T) {
|
||||
for _, tt := range []struct {
|
||||
name string
|
||||
err error
|
||||
wantData logrus.Fields
|
||||
}{
|
||||
{
|
||||
name: "Success Status Code",
|
||||
err: &api.CloudError{
|
||||
StatusCode: http.StatusNoContent,
|
||||
CloudErrorBody: &api.CloudErrorBody{
|
||||
Code: api.CloudErrorCodeResourceNotFound,
|
||||
Message: "This is not a real error",
|
||||
Target: "target",
|
||||
},
|
||||
},
|
||||
wantData: logrus.Fields{
|
||||
"LOGKIND": "frontendqos",
|
||||
"operationType": "method",
|
||||
"resultType": utillog.SuccessResultType,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "User Error Status Code",
|
||||
err: &api.CloudError{
|
||||
StatusCode: http.StatusBadRequest,
|
||||
CloudErrorBody: &api.CloudErrorBody{
|
||||
Code: api.CloudErrorCodeResourceNotFound,
|
||||
Message: "This is an user error result type",
|
||||
Target: "target",
|
||||
},
|
||||
},
|
||||
wantData: logrus.Fields{
|
||||
"LOGKIND": "frontendqos",
|
||||
"operationType": "method",
|
||||
"resultType": utillog.UserErrorResultType,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Server Error Status Code",
|
||||
err: &api.CloudError{
|
||||
StatusCode: http.StatusInternalServerError,
|
||||
CloudErrorBody: &api.CloudErrorBody{
|
||||
Code: api.CloudErrorCodeInternalServerError,
|
||||
Message: "This is a server error result type",
|
||||
Target: "target",
|
||||
},
|
||||
},
|
||||
wantData: logrus.Fields{
|
||||
"LOGKIND": "frontendqos",
|
||||
"operationType": "method",
|
||||
"resultType": utillog.ServerErrorResultType,
|
||||
},
|
||||
},
|
||||
} {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
h, log := testlog.New()
|
||||
|
||||
frontendOperationResultLog(log, "method", tt.err)
|
||||
|
||||
entry := h.LastEntry()
|
||||
if entry == nil {
|
||||
t.Fatal("Expected log entry, got nil")
|
||||
}
|
||||
|
||||
for key, value := range tt.wantData {
|
||||
if entry.Data[key] != value {
|
||||
t.Errorf("Unexpected value for key %s, got %v, want %v", key, entry.Data[key], value)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestRoutesAreNamedWithLowerCasePaths(t *testing.T) {
|
||||
controller := gomock.NewController(t)
|
||||
defer controller.Finish()
|
||||
|
|
Загрузка…
Ссылка в новой задаче