in pkg/inspection/runner.go [190:266]
func (i *InspectionTaskRunner) Run(ctx context.Context, req *inspection_task.InspectionRequest) error {
defer i.runnerLock.Unlock()
i.runnerLock.Lock()
if i.runner != nil {
return fmt.Errorf("this task is already started")
}
currentInspectionType := i.inspectionServer.GetInspectionType(i.currentInspectionType)
runnableTaskGraph, err := i.resolveTaskGraph()
if err != nil {
return err
}
runCtx := i.withRunContextValues(ctx, inspection_task_interface.TaskModeRun, req.Values)
runMetadata := i.generateMetadataForRun(runCtx, &header.Header{
InspectTimeUnixSeconds: time.Now().Unix(),
InspectionType: currentInspectionType.Name,
InspectionTypeIconPath: currentInspectionType.Icon,
SuggestedFileName: "unnamed.khi",
}, runnableTaskGraph)
runCtx = khictx.WithValue(runCtx, inspection_task_contextkey.InspectionRunMetadata, runMetadata)
cancelableCtx, cancel := context.WithCancel(runCtx)
i.cancel = cancel
runner, err := task.NewLocalRunner(runnableTaskGraph)
if err != nil {
return err
}
i.runner = runner
i.metadata = runMetadata
lifecycle.Default.NotifyInspectionStart(khictx.MustGetValue(runCtx, inspection_task_contextkey.InspectionTaskRunID), currentInspectionType.Name)
err = i.runner.Run(cancelableCtx)
if err != nil {
return err
}
go func() {
<-i.runner.Wait()
progress, found := typedmap.Get(i.metadata, progress.ProgressMetadataKey)
if !found {
slog.ErrorContext(runCtx, "progress metadata was not found")
}
status := ""
resultSize := 0
if result, err := i.runner.Result(); err != nil {
if errors.Is(cancelableCtx.Err(), context.Canceled) {
progress.Cancel()
status = "cancel"
} else {
progress.Error()
status = "error"
}
slog.WarnContext(runCtx, fmt.Sprintf("task %s was finished with an error\n%s", i.ID, err))
} else {
progress.Done()
status = "done"
history, found := typedmap.Get(result, typedmap.NewTypedKey[inspectiondata.Store](serializer.SerializerTaskID.ReferenceIDString()))
if !found {
slog.ErrorContext(runCtx, fmt.Sprintf("Failed to get generated history after the completion\n%s", err))
}
if history == nil {
slog.ErrorContext(runCtx, "Failed to get the serializer result. Result is nil!")
} else {
resultSize, err = history.GetInspectionResultSizeInBytes()
if err != nil {
slog.ErrorContext(runCtx, fmt.Sprintf("Failed to get the serialized result size\n%s", err))
}
}
}
lifecycle.Default.NotifyInspectionEnd(khictx.MustGetValue(runCtx, inspection_task_contextkey.InspectionTaskRunID), currentInspectionType.Name, status, resultSize)
}()
return nil
}