func()

in pkg/controller/service/capture.go [131:196]


func (c *controller) Capture(ctx context.Context, capture *CaptureArgs) (int, error) {
	taskID := int(getTaskIdx())

	var tasksToCommit []*rpc.CaptureInfo
	for _, captureItem := range capture.CaptureList {
		task := &rpc.CaptureInfo{
			CaptureDurationSeconds: int32(capture.CaptureDurationSeconds),
			Filter:                 capture.Filter,
		}
		switch captureItem.Type {
		case typePod:
			var err error
			task.Pod, task.Node, _, err = c.getPodInfo(ctx, captureItem.Namespace, captureItem.Name)
			if err != nil {
				return 0, err
			}
			task.CaptureType = typePod
		case typeNode:
			task.Node = &rpc.NodeInfo{
				Name: captureItem.Name,
			}
			task.CaptureType = typeNode
		default:
			return 0, fmt.Errorf("invalid capture type: %v", captureItem.Type)
		}
		tasksToCommit = append(tasksToCommit, task)
	}

	var resultList []*CaptureTaskResult
	for _, captureInfo := range tasksToCommit {
		_, err := c.commitTask(captureInfo.Node.Name, &rpc.Task{
			Type: rpc.TaskType_Capture,
			Id:   strconv.Itoa(taskID),
			TaskInfo: &rpc.Task_Capture{
				Capture: captureInfo,
			},
		})
		if err != nil {
			return 0, err
		}
		var spec *TaskSpec
		if captureInfo.GetCaptureType() == typePod {
			spec = &TaskSpec{
				TaskType:  captureInfo.CaptureType,
				Name:      captureInfo.GetPod().Name,
				Namespace: captureInfo.GetPod().Namespace,
			}
		} else {
			spec = &TaskSpec{
				TaskType: captureInfo.CaptureType,
				Name:     captureInfo.GetNode().Name,
			}
		}
		resultList = append(resultList, &CaptureTaskResult{
			TaskID:  taskID,
			Spec:    spec,
			Status:  "running",
			Result:  "",
			Message: "",
		})
	}

	captureTasks.Store(taskID, resultList)

	return taskID, nil
}