62 lines
1.5 KiB
Go
62 lines
1.5 KiB
Go
package cmd
|
|
|
|
import (
|
|
"github.com/spf13/cobra"
|
|
"hotalert/logging"
|
|
"hotalert/task/executor"
|
|
"hotalert/workload"
|
|
"os"
|
|
"sync"
|
|
)
|
|
|
|
// The file command executes a tasks from a single file only.
|
|
var fileCmd = &cobra.Command{
|
|
Use: "file",
|
|
Short: "execute tasks from a single file",
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
var isRunning = true
|
|
var fileName = args[0]
|
|
data, err := os.ReadFile(fileName)
|
|
if err != nil {
|
|
logging.SugaredLogger.Fatalf("Failed to read file %s exiting!", fileName)
|
|
return
|
|
}
|
|
workload, err := workload.FromYamlContent(data)
|
|
if err != nil {
|
|
logging.SugaredLogger.Fatalf("Failed to parse file %s exiting!", fileName)
|
|
return
|
|
}
|
|
|
|
var waitGroup = sync.WaitGroup{}
|
|
var defaultExecutor = executor.NewDefaultExecutor()
|
|
taskResultChan := defaultExecutor.Start()
|
|
defer defaultExecutor.Shutdown()
|
|
|
|
// Function that logs task results and marks the task executed in the waitGroup
|
|
go func() {
|
|
for isRunning {
|
|
select {
|
|
case result := <-taskResultChan:
|
|
waitGroup.Done()
|
|
if result.Error() != nil {
|
|
logging.SugaredLogger.Errorf("Failed to execute task %v got: %s", result.InitialTask, result.Error())
|
|
}
|
|
}
|
|
}
|
|
}()
|
|
|
|
// Add tasks
|
|
waitGroup.Add(workload.GetTasksLen())
|
|
for _, task := range workload.GetTasks() {
|
|
defaultExecutor.AddTask(task)
|
|
}
|
|
|
|
// Wait for tasks to be executed
|
|
waitGroup.Wait()
|
|
|
|
// Turn off logging goroutine
|
|
isRunning = false
|
|
|
|
logging.SugaredLogger.Infof("Done")
|
|
},
|
|
}
|