input required handling

main
alex 2023-05-07 21:57:29 +02:00
parent 557134276a
commit eeefb79f7b
3 changed files with 123 additions and 35 deletions

View File

@ -73,7 +73,13 @@ type RunGroupTaskArgs struct {
GroupId string GroupId string
Step uint8 Step uint8
TaskStepId string TaskStepId string
GlobalInputs []interface{} GlobalInputs string
Parameters string
}
type GlobalInputParameters struct {
ParameterName string `json:"parameterName"`
Value string `json:"value"`
} }
func RunGroupTask(args RunGroupTaskArgs) { func RunGroupTask(args RunGroupTaskArgs) {
@ -82,7 +88,6 @@ func RunGroupTask(args RunGroupTaskArgs) {
categoryGroup := GetCategoryGroupTaskByCategoryAndGroupId(args.Category, args.GroupId) categoryGroup := GetCategoryGroupTaskByCategoryAndGroupId(args.Category, args.GroupId)
log.Debug().Msgf("RunGroupTask %s", categoryGroup) log.Debug().Msgf("RunGroupTask %s", categoryGroup)
log.Debug().Msgf("script path %s", root+categoryGroup.Id+"/"+categoryGroup.Tasks[args.Step-1].ScriptPath) log.Debug().Msgf("script path %s", root+categoryGroup.Id+"/"+categoryGroup.Tasks[args.Step-1].ScriptPath)
groupTaskStep := structs.GroupTaskSteps{ groupTaskStep := structs.GroupTaskSteps{
@ -104,27 +109,67 @@ func RunGroupTask(args RunGroupTaskArgs) {
} else if args.StartType == RunGroupTaskStartTypeTryAgain { } else if args.StartType == RunGroupTaskStartTypeTryAgain {
groupTaskStep.Id = args.TaskStepId groupTaskStep.Id = args.TaskStepId
database.DB.Model(&structs.GroupTaskSteps{}).Where("id = ?", groupTaskStep.Id).Updates(groupTaskStep) updateGroupTaskSteps(groupTaskStep)
socketclients.BroadcastMessage(structs.SendSocketMessage{ /*
Cmd: utils.SentCmdUpdateGroupTaskStep, database.DB.Model(&structs.GroupTaskSteps{}).Where("id = ?", groupTaskStep.Id).Updates(groupTaskStep)
Body: groupTaskStep,
}) socketclients.BroadcastMessage(structs.SendSocketMessage{
Cmd: utils.SentCmdUpdateGroupTaskStep,
Body: groupTaskStep,
}) */
} }
// set group task to running // set group task to running
database.DB.Model(&structs.GroupTasks{}).Where("id = ?", groupTaskStep.GroupTasksId).Updates(structs.GroupTasks{ dbGroupTask := updateGroupTask(groupTaskStep.GroupTasksId, structs.GroupTasks{
Status: structs.GroupTasksStatusRunning, Status: structs.GroupTasksStatusRunning,
}) })
/*
database.DB.Model(&structs.GroupTasks{}).Where("id = ?", groupTaskStep.GroupTasksId).Updates(structs.GroupTasks{
Status: structs.GroupTasksStatusRunning,
})
var dbGroupTask structs.GroupTasks var dbGroupTask structs.GroupTasks
database.DB.First(&dbGroupTask, "id = ?", groupTaskStep.GroupTasksId) database.DB.First(&dbGroupTask, "id = ?", groupTaskStep.GroupTasksId)
socketclients.BroadcastMessage(structs.SendSocketMessage{ socketclients.BroadcastMessage(structs.SendSocketMessage{
Cmd: utils.SentCmdUpdateGroupTask, Cmd: utils.SentCmdUpdateGroupTask,
Body: dbGroupTask, Body: dbGroupTask,
}) })*/
// check task parameters
var globalInputParameters []GlobalInputParameters
if len(args.GlobalInputs) > 0 { // global inputs given in args because the group task was just created
log.Info().Msgf("global inputs given %s", args.GlobalInputs)
if err := json.Unmarshal([]byte(args.GlobalInputs), &globalInputParameters); err != nil {
log.Error().Msgf("err unmarshalling global inputs %s", err.Error())
}
} else { // global inputs not given in args - fetch it from the database
log.Info().Msgf("global inputs not given in args %s", dbGroupTask.GlobalInputs)
if err := json.Unmarshal([]byte(dbGroupTask.GlobalInputs), &globalInputParameters); err != nil {
log.Error().Msgf("err unmarshalling global inputs %s", err.Error())
}
}
log.Info().Msgf("unmarshalled global inputs %s", globalInputParameters)
log.Info().Msgf("task parameters %s", categoryGroup.Tasks[args.Step-1].Parameters)
if len(categoryGroup.Tasks[args.Step-1].Parameters) != 0 && len(args.Parameters) == 0 {
log.Error().Msg("task parameters not specified")
updateGroupTask(groupTaskStep.GroupTasksId, structs.GroupTasks{
Status: structs.GroupTasksStatusInputRequired,
})
groupTaskStep.Status = structs.GroupTasksStatusInputRequired
updateGroupTaskSteps(groupTaskStep)
return
}
// execute script // execute script
cmd, err := exec.Command("python3", root+categoryGroup.Id+"/"+categoryGroup.Tasks[args.Step-1].ScriptPath).Output() cmd, err := exec.Command("python3", root+categoryGroup.Id+"/"+categoryGroup.Tasks[args.Step-1].ScriptPath).Output()
@ -149,19 +194,22 @@ func RunGroupTask(args RunGroupTaskArgs) {
groupTaskStep.Log = cmdLog groupTaskStep.Log = cmdLog
groupTaskStep.EndedAt = time.Now() groupTaskStep.EndedAt = time.Now()
database.DB.Model(&structs.GroupTaskSteps{}).Where("id = ?", groupTaskStep.Id).Updates(groupTaskStep) updateGroupTaskSteps(groupTaskStep)
socketclients.BroadcastMessage(structs.SendSocketMessage{ /*
Cmd: utils.SentCmdUpdateGroupTaskStep, database.DB.Model(&structs.GroupTaskSteps{}).Where("id = ?", groupTaskStep.Id).Updates(groupTaskStep)
Body: groupTaskStep,
}) socketclients.BroadcastMessage(structs.SendSocketMessage{
Cmd: utils.SentCmdUpdateGroupTaskStep,
Body: groupTaskStep,
}) */
log.Info().Msgf("run next task") log.Info().Msgf("run next task")
if int(args.Step) < len(categoryGroup.Tasks) { if int(args.Step) < len(categoryGroup.Tasks) {
if groupTaskStep.Status == structs.GroupTasksStatusFailed { if groupTaskStep.Status == structs.GroupTasksStatusFailed {
// set group task to failed // set group task to failed
database.DB.Model(&structs.GroupTasks{}).Where("id = ?", groupTaskStep.GroupTasksId).Updates(structs.GroupTasks{ /*database.DB.Model(&structs.GroupTasks{}).Where("id = ?", groupTaskStep.GroupTasksId).Updates(structs.GroupTasks{
Status: structs.GroupTasksStatusFailed, Status: structs.GroupTasksStatusFailed,
}) })
@ -172,12 +220,20 @@ func RunGroupTask(args RunGroupTaskArgs) {
socketclients.BroadcastMessage(structs.SendSocketMessage{ socketclients.BroadcastMessage(structs.SendSocketMessage{
Cmd: utils.SentCmdUpdateGroupTask, Cmd: utils.SentCmdUpdateGroupTask,
Body: dbGroupTask, Body: dbGroupTask,
}) */
updateGroupTask(groupTaskStep.GroupTasksId, structs.GroupTasks{
Status: structs.GroupTasksStatusFailed,
}) })
} else { } else {
args.StartType = RunGroupTaskStartTypeNormal args.StartType = RunGroupTaskStartTypeNormal
args.Step = args.Step + 1 args.Step = args.Step + 1
database.DB.Model(&structs.GroupTasks{}).Where("id = ?", groupTaskStep.GroupTasksId).Updates(structs.GroupTasks{ updateGroupTask(groupTaskStep.GroupTasksId, structs.GroupTasks{
CurrentTasksStep: args.Step,
})
/*database.DB.Model(&structs.GroupTasks{}).Where("id = ?", groupTaskStep.GroupTasksId).Updates(structs.GroupTasks{
CurrentTasksStep: args.Step, CurrentTasksStep: args.Step,
}) })
@ -188,31 +244,63 @@ func RunGroupTask(args RunGroupTaskArgs) {
socketclients.BroadcastMessage(structs.SendSocketMessage{ socketclients.BroadcastMessage(structs.SendSocketMessage{
Cmd: utils.SentCmdUpdateGroupTask, Cmd: utils.SentCmdUpdateGroupTask,
Body: dbGroupTask, Body: dbGroupTask,
}) })*/
log.Debug().Msgf("RUN NEXT TASK %s", groupTaskStep) log.Debug().Msgf("RUN NEXT TASK %s", groupTaskStep)
RunGroupTask(args) RunGroupTask(args)
} }
} else { } else {
// set group task to finished // set group task to finished
database.DB.Model(&structs.GroupTasks{}).Where("id = ?", groupTaskStep.GroupTasksId).Updates(structs.GroupTasks{ updateGroupTask(groupTaskStep.GroupTasksId, structs.GroupTasks{
Status: structs.GroupTasksStatusFinished, Status: structs.GroupTasksStatusFinished,
EndedAt: time.Now(), EndedAt: time.Now(),
}) })
var dbGroupTask structs.GroupTasks /*
database.DB.Model(&structs.GroupTasks{}).Where("id = ?", groupTaskStep.GroupTasksId).Updates(structs.GroupTasks{
Status: structs.GroupTasksStatusFinished,
EndedAt: time.Now(),
})
database.DB.First(&dbGroupTask, "id = ?", groupTaskStep.GroupTasksId) var dbGroupTask structs.GroupTasks
socketclients.BroadcastMessage(structs.SendSocketMessage{ database.DB.First(&dbGroupTask, "id = ?", groupTaskStep.GroupTasksId)
Cmd: utils.SentCmdUpdateGroupTask,
Body: dbGroupTask, socketclients.BroadcastMessage(structs.SendSocketMessage{
}) Cmd: utils.SentCmdUpdateGroupTask,
Body: dbGroupTask,
})*/
log.Info().Msg("SET TO FINISHED") log.Info().Msg("SET TO FINISHED")
} }
} }
// Updates group task and send it to websocket users
func updateGroupTask(groupTasksId string, updates structs.GroupTasks) structs.GroupTasks {
database.DB.Model(&structs.GroupTasks{}).Where("id = ?", groupTasksId).Updates(updates)
var dbGroupTask structs.GroupTasks
database.DB.First(&dbGroupTask, "id = ?", groupTasksId)
socketclients.BroadcastMessage(structs.SendSocketMessage{
Cmd: utils.SentCmdUpdateGroupTask,
Body: dbGroupTask,
})
return dbGroupTask
}
// Updates group task steps and send it to websocket users
func updateGroupTaskSteps(groupTaskStep structs.GroupTaskSteps) {
database.DB.Model(&structs.GroupTaskSteps{}).Where("id = ?", groupTaskStep.Id).Updates(groupTaskStep)
socketclients.BroadcastMessage(structs.SendSocketMessage{
Cmd: utils.SentCmdUpdateGroupTaskStep,
Body: groupTaskStep,
})
}
func GetAllGroupTasks() []structs.GroupTasks { func GetAllGroupTasks() []structs.GroupTasks {
var groupTasks []structs.GroupTasks var groupTasks []structs.GroupTasks

View File

@ -7,11 +7,11 @@ import (
// structure for database // structure for database
const ( const (
GroupTasksStatusFinished uint8 = 1 GroupTasksStatusFinished uint8 = 1
GroupTasksStatusRunning uint8 = 2 GroupTasksStatusRunning uint8 = 2
GroupTasksStatusCanceled uint8 = 3 GroupTasksStatusCanceled uint8 = 3
GroupTasksStatusFailed uint8 = 4 GroupTasksStatusFailed uint8 = 4
GroupTasksInputRequired uint8 = 5 GroupTasksStatusInputRequired uint8 = 5
) )
type GroupTasks struct { type GroupTasks struct {

View File

@ -120,7 +120,7 @@ func RunHub() {
GroupId: groupId, GroupId: groupId,
Step: 1, Step: 1,
TaskStepId: "", TaskStepId: "",
GlobalInputs: globalInputs.([]interface{}), GlobalInputs: globalInputsJsonString,
}) })
break break
case utils.ReceivedCmdTaskFailedTryAgainRunTaskStep: case utils.ReceivedCmdTaskFailedTryAgainRunTaskStep: