Skip to content

Commit

Permalink
feat: propagate function failure
Browse files Browse the repository at this point in the history
Signed-off-by: Guilhem Barthes <[email protected]>
  • Loading branch information
guilhem-barthes committed Sep 5, 2023
1 parent bf13ecf commit a3f4d96
Showing 1 changed file with 61 additions and 30 deletions.
91 changes: 61 additions & 30 deletions lib/service/failure_report.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,44 +35,25 @@ func NewFailureReportService(provider FailureReportDependencyProvider) *FailureR
return &FailureReportService{provider}
}


func (s *FailureReportService) RegisterFailureReport(newFailureReport *asset.NewFailureReport, requester string) (*asset.FailureReport, error) {
s.GetLogger().Debug().Interface("failureReport", newFailureReport).Str("requester", requester).Msg("Registering new failure report")

err := newFailureReport.Validate()
if err != nil {
return nil, errors.FromValidationError(asset.FailureReportKind, err)
}

switch newFailureReport.AssetType {
case asset.FailedAssetKind_FAILED_ASSET_COMPUTE_TASK:
task, err := s.GetComputeTaskService().GetTask(newFailureReport.AssetKey)
if err != nil {
return nil, err
}

if task.Worker != requester {
return nil, errors.NewPermissionDenied(fmt.Sprintf("only %q worker can register failure report for compute task", task.Worker))
}

if task.Status != asset.ComputeTaskStatus_STATUS_DOING {
return nil, errors.NewBadRequest(fmt.Sprintf("cannot register failure report for task with status %q", task.Status.String()))
}

err = s.GetComputeTaskService().ApplyTaskAction(task.Key, asset.ComputeTaskAction_TASK_ACTION_FAILED, "failure report registered", requester)
if err != nil {
return nil, err
}
case asset.FailedAssetKind_FAILED_ASSET_FUNCTION:
function, err := s.GetFunctionService().GetFunction(newFailureReport.AssetKey)
if err != nil {
return nil, err
}

if function.Owner != requester {
return nil, errors.NewPermissionDenied(fmt.Sprintf("only %q owner can register failure report for function", function.Owner))
}
default:
return nil, errors.NewBadRequest("can only register failure for asset_kind values function and compute task")
case asset.FailedAssetKind_FAILED_ASSET_COMPUTE_TASK:
err = s.processTaskFailure(newFailureReport.AssetKey, requester)
case asset.FailedAssetKind_FAILED_ASSET_FUNCTION:
err = s.processFunctionFailure(newFailureReport.AssetKey, requester)
default:
return nil, errors.NewBadRequest("can only register failure for asset_kind values function and compute task")
}

if err != nil {
return nil, err
}

failureReport := &asset.FailureReport{
Expand Down Expand Up @@ -107,3 +88,53 @@ func (s *FailureReportService) GetFailureReport(assetKey string) (*asset.Failure
s.GetLogger().Debug().Str("assetKey", assetKey).Msg("Get failure report")
return s.GetFailureReportDBAL().GetFailureReport(assetKey)
}


func checkTaskPermissions(task *asset.ComputeTask, requester string) error {
if task.Worker != requester {
return errors.NewPermissionDenied(fmt.Sprintf("only %q worker can register failure report for compute task", task.Worker))
}

if task.Status != asset.ComputeTaskStatus_STATUS_DOING {
return errors.NewBadRequest(fmt.Sprintf("cannot register failure report for task with status %q", task.Status.String()))
}

return nil
}

func (s *FailureReportService) processTaskFailure(taskKey string, requester string) error {
task, err := s.GetComputeTaskService().GetTask(taskKey)
if err != nil {
return err
}

err = checkTaskPermissions(task, requester)
if err != nil {
return err
}

return s.GetComputeTaskService().ApplyTaskAction(taskKey, asset.ComputeTaskAction_TASK_ACTION_FAILED, "failure report registered", requester)
}

func checkFunctionPermissions(function *asset.Function, requester string) error {
if function.Owner != requester {
return errors.NewPermissionDenied(fmt.Sprintf("only %q owner can register failure report for function", function.Owner))
}

return nil
}

func (s *FailureReportService) processFunctionFailure(functionKey string, requester string) error {
function, err := s.GetFunctionService().GetFunction(functionKey)
if err != nil {
return err
}

err = checkFunctionPermissions(function, requester)

if err != nil {
return err
}

return s.GetFunctionService().ApplyFunctionAction(functionKey, asset.FunctionAction_FUNCTION_ACTION_FAILED, "failure report registered", requester)
}

0 comments on commit a3f4d96

Please sign in to comment.