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:
Ankur Singh 2024-02-22 08:41:14 +05:30 коммит произвёл GitHub
Родитель 730651374c
Коммит 8b523d1d2f
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
4 изменённых файлов: 174 добавлений и 3 удалений

Просмотреть файл

@ -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()