Fix pause module timing
This commit is contained in:
parent
39d4de9e8f
commit
1581046a5c
2 changed files with 38 additions and 33 deletions
52
modules.go
52
modules.go
|
|
@ -8,6 +8,7 @@ import (
|
|||
"path/filepath"
|
||||
"sort"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
coreio "dappco.re/go/core/io"
|
||||
coreerr "dappco.re/go/core/log"
|
||||
|
|
@ -1129,53 +1130,38 @@ func (e *Executor) moduleGroupBy(host string, args map[string]any) (*TaskResult,
|
|||
}
|
||||
|
||||
func (e *Executor) modulePause(ctx context.Context, args map[string]any) (*TaskResult, error) {
|
||||
seconds := 0
|
||||
duration := time.Duration(0)
|
||||
if s, ok := args["seconds"].(int); ok {
|
||||
seconds = s
|
||||
duration += time.Duration(s) * time.Second
|
||||
}
|
||||
if s, ok := args["seconds"].(string); ok {
|
||||
seconds, _ = strconv.Atoi(s)
|
||||
if seconds, err := strconv.Atoi(s); err == nil {
|
||||
duration += time.Duration(seconds) * time.Second
|
||||
}
|
||||
}
|
||||
if m, ok := args["minutes"].(int); ok {
|
||||
duration += time.Duration(m) * time.Minute
|
||||
}
|
||||
if s, ok := args["minutes"].(string); ok {
|
||||
if minutes, err := strconv.Atoi(s); err == nil {
|
||||
duration += time.Duration(minutes) * time.Minute
|
||||
}
|
||||
}
|
||||
|
||||
if seconds > 0 {
|
||||
if duration > 0 {
|
||||
timer := time.NewTimer(duration)
|
||||
defer timer.Stop()
|
||||
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return nil, ctx.Err()
|
||||
case <-ctxSleep(ctx, seconds):
|
||||
case <-timer.C:
|
||||
}
|
||||
}
|
||||
|
||||
return &TaskResult{Changed: false}, nil
|
||||
}
|
||||
|
||||
func ctxSleep(ctx context.Context, seconds int) <-chan struct{} {
|
||||
ch := make(chan struct{})
|
||||
go func() {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
case <-sleepChan(seconds):
|
||||
}
|
||||
close(ch)
|
||||
}()
|
||||
return ch
|
||||
}
|
||||
|
||||
func sleepChan(seconds int) <-chan struct{} {
|
||||
ch := make(chan struct{})
|
||||
go func() {
|
||||
for range seconds {
|
||||
select {
|
||||
case <-ch:
|
||||
return
|
||||
default:
|
||||
// Sleep 1 second at a time
|
||||
}
|
||||
}
|
||||
close(ch)
|
||||
}()
|
||||
return ch
|
||||
}
|
||||
|
||||
func normalizeStringList(value any) []string {
|
||||
switch v := value.(type) {
|
||||
case nil:
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
package ansible
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
|
@ -702,6 +704,23 @@ func TestModulesAdv_ModuleUnarchive_Bad_LocalFileNotFound(t *testing.T) {
|
|||
assert.Contains(t, err.Error(), "read src")
|
||||
}
|
||||
|
||||
// --- pause module ---
|
||||
|
||||
func TestModulesAdv_ModulePause_Good_WaitsForSeconds(t *testing.T) {
|
||||
e := NewExecutor("/tmp")
|
||||
|
||||
start := time.Now()
|
||||
result, err := e.modulePause(context.Background(), map[string]any{
|
||||
"seconds": 1,
|
||||
})
|
||||
elapsed := time.Since(start)
|
||||
|
||||
require.NoError(t, err)
|
||||
assert.NotNil(t, result)
|
||||
assert.False(t, result.Changed)
|
||||
assert.GreaterOrEqual(t, elapsed, 900*time.Millisecond)
|
||||
}
|
||||
|
||||
// --- include_vars module ---
|
||||
|
||||
func TestModulesAdv_ModuleIncludeVars_Good_LoadSingleFile(t *testing.T) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue