diff --git a/manager/workflow_manager.go b/manager/workflow_manager.go index 4a329ce..d242311 100644 --- a/manager/workflow_manager.go +++ b/manager/workflow_manager.go @@ -3,6 +3,7 @@ package manager import ( "github.com/onepanelio/core/argo" "github.com/onepanelio/core/model" + "github.com/onepanelio/core/util" ) func (r *ResourceManager) CreateWorkflow(namespace string, workflow *model.Workflow) (createdWorkflow *model.Workflow, err error) { @@ -28,5 +29,10 @@ func (r *ResourceManager) CreateWorkflow(namespace string, workflow *model.Workf } func (r *ResourceManager) CreateWorkflowTemplate(namespace string, workflowTemplate *model.WorkflowTemplate) (createdWorkflowTemplate *model.WorkflowTemplate, err error) { - return r.workflowRepository.CreateWorkflowTemplate(workflowTemplate) + createdWorkflowTemplate, err = r.workflowRepository.CreateWorkflowTemplate(workflowTemplate) + if err != nil { + return nil, util.UserErrorWrap(err, "Workflow template") + } + + return } diff --git a/server/workflow_server.go b/server/workflow_server.go index 4ac6c32..11dd038 100644 --- a/server/workflow_server.go +++ b/server/workflow_server.go @@ -2,13 +2,19 @@ package server import ( "context" + "errors" "github.com/onepanelio/core/api" "github.com/onepanelio/core/manager" "github.com/onepanelio/core/model" + "github.com/onepanelio/core/util" "github.com/onepanelio/core/util/ptr" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) +var userError *util.UserError + type WorkflowServer struct { resourceManager *manager.ResourceManager } @@ -48,10 +54,14 @@ func (s *WorkflowServer) CreateWorkflowTemplate(ctx context.Context, req *api.Cr Manifest: req.WorkflowTemplate.Manifest, } workflowTemplate, err := s.resourceManager.CreateWorkflowTemplate(req.Namespace, workflowTemplate) - if err != nil { - return nil, err + if errors.As(err, &userError) { + if userError.Code == 409 { + return nil, status.Errorf(codes.Aborted, err.Error()) + } + return nil, status.Errorf(codes.Unknown, err.Error()) } req.WorkflowTemplate.Uid = workflowTemplate.UID + req.WorkflowTemplate.Version = workflowTemplate.Version.String() return req.WorkflowTemplate, nil } diff --git a/util/error.go b/util/error.go new file mode 100644 index 0000000..656a77f --- /dev/null +++ b/util/error.go @@ -0,0 +1,54 @@ +package util + +import ( + "errors" + "fmt" + + "github.com/lib/pq" +) + +type UserError struct { + Code int + Message string +} + +func NewUserError(code int, message string) *UserError { + return &UserError{ + Code: code, + Message: message, + } +} + +func pqError(err *pq.Error) (code int) { + switch err.Code { + case "23505": + code = 409 + default: + code = 500 + } + return +} + +func UserErrorWrap(err error, entity string) *UserError { + var ( + code int + message string + pqErr *pq.Error + ) + if errors.As(err, &pqErr) { + code = pqError(pqErr) + message = fmt.Sprintf("%v already exists.", entity) + } else { + code = 500 + message = "Unknown error." + } + + return &UserError{ + Code: code, + Message: message, + } +} + +func (e *UserError) Error() string { + return e.Message +}