blob: 4bb049068957edb2a657329840cfb0cf8bce97bf [file] [log] [blame]
/*
* Copyright 2022-present Open Networking Foundation
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Package errorcodes provides constants that are commonly used by RWcore and adapters.
package errorcodes
import (
"net/http"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
// NBErrorCode represents the error code for the error.
type NBErrorCode int
const (
// VolthaErrorMessageFormat represents the format in which the Voltha accepts the errors.
VolthaErrorMessageFormat = "code = %d, desc = %s"
)
// List of error messages returned to Voltha.
var (
// ErrUnimplementedRPC is returned when the RPC is not implemented
ErrUnimplementedRPC = status.Errorf(codes.Unimplemented, VolthaErrorMessageFormat, UnsupportedOperation, "Operation not implemented")
// ErrOperationNotSupported is returned when the operation is not supported
ErrOperationNotSupported = status.Errorf(codes.Unimplemented, VolthaErrorMessageFormat, UnsupportedOperation, "Operation not supported")
// ErrFailedRequest is returned when the component fails to send any request to other component
ErrFailedRequest = status.Errorf(codes.Internal, VolthaErrorMessageFormat, UnsuccessfulOperation, "Failed to send request")
// ErrFailedToEncodeConfig is returned when the data json marshal fails
ErrFailedToEncodeConfig = status.Errorf(codes.Internal, VolthaErrorMessageFormat, MessageEncodeFailed, "Failed to encode data")
// ErrFailedToDecodeConfig is returned when the data json unmarshal fails
ErrFailedToDecodeConfig = status.Errorf(codes.Internal, VolthaErrorMessageFormat, MessageDecodeFailed, "Failed to decode data")
// ErrFailedToUpdateDB is returned when update of data in KV store fails
ErrFailedToUpdateDB = status.Errorf(codes.Internal, VolthaErrorMessageFormat, DBOperationFailed, "Failed to update DB")
// ErrFailedToGetFromDB is returned when get data from KV store fails
ErrFailedToGetFromDB = status.Errorf(codes.Internal, VolthaErrorMessageFormat, DBOperationFailed, "Failed to fetch from DB")
// ErrFailedToDeleteFromDB is returned when delete data from KV store fails
ErrFailedToDeleteFromDB = status.Errorf(codes.Internal, VolthaErrorMessageFormat, DBOperationFailed, "Failed to delete from DB")
// ErrDeviceNotFound is returned when the handler for the device is not present in VOLTHA
ErrDeviceNotFound = status.Errorf(codes.NotFound, VolthaErrorMessageFormat, ResourceNotFound, "Device not found")
// ErrDeviceNotReachable is returned when the connection between adapter and agent is broken
ErrDeviceNotReachable = status.Errorf(codes.Unavailable, VolthaErrorMessageFormat, DeviceUnreachable, "Device is not reachable")
// ErrWrongDevice is returned when the received request has wrong device (parent/child)
ErrWrongDevice = status.Errorf(codes.FailedPrecondition, VolthaErrorMessageFormat, PrerequisiteNotMet, "Wrong device in request")
// ErrDeviceNotEnabledAndUp is returned when the state of the device is neither enabled nor active
ErrDeviceNotEnabledAndUp = status.Errorf(codes.FailedPrecondition, VolthaErrorMessageFormat, ResourceInImproperState, "Device is not enabled and up")
// ErrDeviceDeleted is returned when the state of the device is DELETED
ErrDeviceDeleted = status.Errorf(codes.FailedPrecondition, VolthaErrorMessageFormat, ResourceInImproperState, "Device is deleted")
// ErrPortNotFound is returned when the port is not present in VOLTHA
ErrPortNotFound = status.Errorf(codes.NotFound, VolthaErrorMessageFormat, ResourceNotFound, "Port not found")
// ErrPortIsInInvalidState is returned when the port is in an invalid state
ErrPortIsInInvalidState = status.Errorf(codes.Internal, VolthaErrorMessageFormat, ResourceInImproperState, "Port is in an invalid state")
// ErrInvalidParamInRequest is returned when the request contains invalid configuration
ErrInvalidParamInRequest = status.Errorf(codes.InvalidArgument, VolthaErrorMessageFormat, InvalidArgument, "Received invalid configuration in request")
// ErrImageNotRegistered is returned when the image is not registered
ErrImageNotRegistered = status.Errorf(codes.FailedPrecondition, VolthaErrorMessageFormat, PrerequisiteNotMet, "Image is not registered")
// ErrImageDownloadInProgress is returned when the image download is in progress
ErrImageDownloadInProgress = status.Errorf(codes.FailedPrecondition, VolthaErrorMessageFormat, MethodNotAllowed, "Image download is in progress")
)
// ConvertToVolthaErrorFormat converts the error to Voltha error format
func ConvertToVolthaErrorFormat(err error) error {
st, ok := status.FromError(err)
if !ok {
return err
}
return status.Errorf(st.Code(), VolthaErrorMessageFormat, GrpcToVolthaErrorCodeMap[st.Code()], st.Message())
}
const (
//Success is returned when there is no error - 0
Success NBErrorCode = iota
//InvalidURL is returned when the URL specified for the request is invalid - 1
InvalidURL
//MissingArgument is returned when the mandatory/conditionally mandatory argument is missing - 2
MissingArgument
//RequestTimeout is returned when the request timed out. - 3
RequestTimeout
//ResourceAlreadyExists is returned when the resource already exists and create for the same is not allowed - 4
ResourceAlreadyExists
//ResourceInImproperState is returned when the resource is in improper state to process the request. - 5
ResourceInImproperState
//DeviceUnreachable is returned when the device is not reachable - 6
DeviceUnreachable
//OperationAlreadyInProgress is returned when the requested operation is already in progress - 7
OperationAlreadyInProgress
//InvalidConfig is returned when the configuration provided is invalid - 8
InvalidConfig
//ResourceNotFound is returned when the resource is not found - 9
ResourceNotFound
//MethodNotAllowed is returned when the requested method is not allowed - 10
MethodNotAllowed
//ResourceInUse is returned when the resource is in use, the delete of the resource is not allowed when in use - 11
ResourceInUse
//JobIDNotFound is returned when the Job ID not found - 12
JobIDNotFound
//JobIDAlreadyInUse is returned when the Job ID already in use - 13
JobIDAlreadyInUse
//PeerUnreachable is returned when the peer is unreachable -14
PeerUnreachable
//InvalidPatchOperation is returned when the parameter(s) mentioned in the patch operation are invalid - 15
InvalidPatchOperation
//OLTUnreachable is returned when the OLT is not reachable - 16
OLTUnreachable
//PrerequisiteNotMet is returned when the required prerequisite is not met to execute the requested procedure - 17
PrerequisiteNotMet
//MessageEncodeFailed is returned when Message encoding failed - 18
MessageEncodeFailed
//MessageDecodeFailed is returned when Message decoding failed - 19
MessageDecodeFailed
//ONTInternalError is returned when Internal error is reported by the ONT - 20
ONTInternalError
//OLTInternalError is returned when Internal error is reported by the OLT - 21
OLTInternalError
//VolthaInternalError is returned when Internal error occurred at Voltha - 22
VolthaInternalError
//ConfigMismatch is returned when the configuration does not match - 23
ConfigMismatch
//DBOperationFailed is returned when the database operation failed for the key - 24
DBOperationFailed
//ResourceLimitExceeded is returned when the resource limit exceeded the allowed limit - 25
ResourceLimitExceeded
//UndefinedEnv is returned when the required environment variable is not defined - 26
UndefinedEnv
//InvalidArgument is returned when the argument provided is invalid - 27
InvalidArgument
//InvalidPayload is returned when the configuration payload is invalid - 28
InvalidPayload
//DuplicateKey is returned when the duplicate entry for the key - 29
DuplicateKey
//DuplicateValue is returned when the duplicate entry for the value - 30
DuplicateValue
//UnsupportedOperation is returned when the request operation is not supported - 31
UnsupportedOperation
//UserUnauthorized is returned when the user is unauthorized to perform the requested operation - 32
UserUnauthorized
//LiveKPISubscriptionExists is returned when the live KPI subscription exists already for the requested resource - 33
LiveKPISubscriptionExists
//UnsuccessfulOperation is returned when the requested operation is unsuccessful - 34
UnsuccessfulOperation
//ResourceInDisabledStateAlready is returned when the resource is in disabled state already - 35
ResourceInDisabledStateAlready
//ResourceInEnabledStateAlready is returned when the resource is in enabled state already - 36
ResourceInEnabledStateAlready
//ResourceNotDiscoveredYet is returned when the resource is not discovered yet - 37
ResourceNotDiscoveredYet
//HighDiskUtilization is returned when the disk utilization is high, consider the disk cleanup. - 38
HighDiskUtilization
//KafkaError is returned when there is a kafka error - 39
KafkaError
//ResourceBusy is returned when the component/resource is busy. - 40
ResourceBusy
// UnsupportedParameter is returned when un supported field is provided in request. -41
UnsupportedParameter
//JobIDAlreadyExists is returned when the Job ID is already there in DB. -42
JobIDAlreadyExists
//LiveKPISubscriptionNotFound is returned when the live KPI subscription not found for the requested resource. -42
LiveKPISubscriptionNotFound
// HostUnreachable is returned when failed to establish the SFTP connection. -44
HostUnreachable
// DHCPServerUnreachable is returned when dhcp server is unreachable. -45
DHCPServerUnreachable
// SessionExpired is returned when user session is expired/timeout - 46
SessionExpired
// AccessDenied is returned when user operation is forbidden - 47
AccessDenied
// PasswordUpdateRequired is returned when password for the user is about to expire - 48
PasswordUpdateRequired
// InvalidMessageHeader is returned when token in security request is invalid/nil - 49
InvalidMessageHeader
// UserAccountBlocked is returned when user account gets blocked after multiple invalid attempts - 50
UserAccountBlocked
// UserAccountExpired is returned when user account gets expired - 51
UserAccountExpired
// UserAccountDormant is returned when user account gets dormant - 52
UserAccountDormant
// InvalidCredentials is returned when credentials are invalid in login request - 53
InvalidCredentials
// ConcurrentAccessFromMultipleIPs when multiple sessions gets established from same ip - 54
ConcurrentAccessFromMultipleIPs
// KPIThresholdCrossed when KPI threshold is crossed - 55
KPIThresholdCrossed
// ONTUnreachable is returned when the ONT is not reachable - 56
ONTUnreachable
// ResourceUnreachable is returned when the resource is not reachable -57
ResourceUnreachable
// ONTProcessingError is returned when onu returns processing error for omci message - 58
ONTProcessingError
// ONTResourceBusy is returned when onu returns device busy error for omci message - 59
ONTResourceBusy
// ONTMEInstanceExists is returned when onu returns OMCI ME instance exists error for omci message - 60
ONTMEInstanceExists
// ONTUnknownMEInstance is returned when onu returns OMCI ME Unknown Instance error for omci message - 61
ONTUnknownMEInstance
// JoinUnsuccessful is returned when an IGMP Join request is unsuccessful - 62
JoinUnsuccessful
// QueryExpired is returned when there is no response to IGMP Queries from the controller - 63
QueryExpired
// AvailableBwValidationErr is returned when requested bandwidth is not available on the pon port - 64
AvailableBwValidationErr
)
//NBErrorCodeMap converts error code to error description string
var NBErrorCodeMap = map[NBErrorCode]string{
Success: "Success",
InvalidURL: "INVALID_URL",
RequestTimeout: "REQUEST_TIMEOUT",
MissingArgument: "MISSING_ARGUMENT",
ResourceAlreadyExists: "RESOURCE_ALREADY_EXISTS",
ResourceInImproperState: "RESOURCE_IN_IMPROPER_STATE",
DeviceUnreachable: "DEVICE_UNREACHABLE",
OperationAlreadyInProgress: "OPERATION_ALREADY_IN_PROGRESS",
InvalidConfig: "INVALID_CONFIG",
ResourceNotFound: "RESOURCE_NOT_FOUND",
MethodNotAllowed: "METHOD_NOT_ALLOWED",
ResourceInUse: "RESOURCE_IN_USE",
JobIDNotFound: "JOB_ID_NOT_FOUND",
JobIDAlreadyInUse: "JOB_ID_ALREADY_IN_USE",
PeerUnreachable: "PEER_UNREACHABLE",
InvalidPatchOperation: "INVALID_PATCH_OPERATION",
OLTUnreachable: "OLT_UNREACHABLE",
PrerequisiteNotMet: "PREREQUISITE_NOT_MET",
MessageEncodeFailed: "MESSAGE_ENCODE_FAILED",
MessageDecodeFailed: "MESSAGE_DECODE_FAILED",
ONTInternalError: "ONT_INTERNAL_ERROR",
OLTInternalError: "OLT_INTERNAL_ERROR",
VolthaInternalError: "Voltha_INTERNAL_ERROR",
ConfigMismatch: "CONFIG_MISMATCH",
DBOperationFailed: "DB_OPERATION_FAILED",
ResourceLimitExceeded: "RESOURCE_LIMIT_EXCEEDED",
UndefinedEnv: "UNDEFINED_ENV",
InvalidArgument: "INVALID_ARGUMENT",
InvalidPayload: "INVALID_PAYLOAD",
DuplicateKey: "DUPLICATE_KEY",
DuplicateValue: "DUPLICATE_VALUE",
UnsupportedOperation: "UNSUPPORTED_OPERATION",
UserUnauthorized: "USER_UNAUTHORIZED",
LiveKPISubscriptionExists: "LIVE_KPI_SUBSCRIPTION_EXISTS",
UnsuccessfulOperation: "UNSUCCESSFUL_OPERATION",
ResourceInDisabledStateAlready: "RESOURCE_IN_DISABLED_STATE_ALREADY",
ResourceInEnabledStateAlready: "RESOURCE_IN_ENABLED_STATE_ALREADY",
ResourceNotDiscoveredYet: "RESOURCE_NOT_DISCOVERED_YET",
HighDiskUtilization: "HIGH_DISK_UTILIZATION",
KafkaError: "KAFKA_ERROR",
LiveKPISubscriptionNotFound: "LIVE_KPI_SUBSCRIPTION_NOT_FOUND",
ResourceBusy: "RESOURCE_BUSY",
UnsupportedParameter: "UNSUPPORTED_PARAMETER",
JobIDAlreadyExists: "JOB_ID_ALREADY_EXISTS",
HostUnreachable: "HOST_UNREACHABLE",
DHCPServerUnreachable: "DHCP_SERVER_UNREACHABLE",
InvalidMessageHeader: "INVALID_MESSAGE_HEADER",
SessionExpired: "SESSION_EXPIRED",
AccessDenied: "ACCESS_DENIED",
PasswordUpdateRequired: "PASSWORD_UPDATE_REQUIRED",
InvalidCredentials: "INVALID_CREDENTIALS",
UserAccountBlocked: "USER_ACCOUNT_BLOCKED",
UserAccountExpired: "USER_ACCOUNT_EXPIRED",
ConcurrentAccessFromMultipleIPs: "CONCURRENT_ACCESS_FROM_MULTIPLE_IPS",
KPIThresholdCrossed: "KPI_THRESHOLD_CROSSED",
ONTUnreachable: "ONT_UNREACHABLE",
ONTProcessingError: "ONT_PROCESSING_ERROR",
ONTResourceBusy: "ONT_RESOURCE_BUSY",
ONTMEInstanceExists: "ONT_ME_INSTANCE_ALREADY_EXISTS",
ONTUnknownMEInstance: "ONT_UNKNOWN_ME_INSTANCE",
JoinUnsuccessful: "JOIN_UNSUCCESSFUL",
QueryExpired: "QUERY_EXPIRED",
}
// GrpcToVolthaErrorCodeMap contains mapping of grpc error code coming from OpenOLT-Agent to Voltha error codes.
var GrpcToVolthaErrorCodeMap = map[codes.Code]NBErrorCode{
codes.OK: Success,
codes.Canceled: UnsuccessfulOperation,
codes.Unknown: OLTInternalError,
codes.InvalidArgument: InvalidArgument,
codes.DeadlineExceeded: RequestTimeout,
codes.NotFound: ResourceNotFound,
codes.AlreadyExists: ResourceAlreadyExists,
codes.PermissionDenied: UserUnauthorized,
codes.ResourceExhausted: ResourceLimitExceeded,
codes.FailedPrecondition: PrerequisiteNotMet,
codes.Aborted: UnsuccessfulOperation,
codes.OutOfRange: InvalidArgument,
codes.Unimplemented: UnsupportedOperation,
codes.Internal: OLTInternalError,
codes.Unavailable: ResourceBusy,
codes.DataLoss: OLTInternalError,
codes.Unauthenticated: UserUnauthorized,
}
// HTTPStatusCodeToVolthaErrorCodeMap contains mapping of http status code coming from VGC to Voltha error codes.
var HTTPStatusCodeToVolthaErrorCodeMap = map[int]NBErrorCode{
http.StatusOK: Success,
http.StatusCreated: Success,
http.StatusAccepted: Success,
http.StatusBadRequest: InvalidPayload,
http.StatusConflict: ResourceInImproperState,
http.StatusInternalServerError: VolthaInternalError,
}
// GetErrorInfo - parses the error details from err structure response from voltha
// Return statusCode (uint32) - Error code [0 - Success]
// status Msg (string) - Error Msg
func GetErrorInfo(err error) (uint32, string) {
var statusCode uint32
var statusMsg string
if status, _ := status.FromError(err); status != nil {
statusCode = uint32(status.Code())
statusMsg = status.Message()
} else {
statusCode = 0
}
return statusCode, statusMsg
}