diff --git a/modules.go b/modules.go index 06769ce..6124298 100644 --- a/modules.go +++ b/modules.go @@ -1690,24 +1690,25 @@ func (e *Executor) moduleWaitFor(ctx context.Context, client sshExecutorClient, } } - if port > 0 && state == "started" { - cmd := sprintf("timeout %d bash -c 'until nc -z %s %d; do sleep 1; done'", - timeout, host, port) - stdout, stderr, rc, err := client.Run(ctx, cmd) - if err != nil || rc != 0 { - return &TaskResult{Failed: true, Msg: stderr, Stdout: stdout, RC: rc}, nil + if port > 0 { + switch state { + case "started", "present": + cmd := sprintf("timeout %d bash -c 'until nc -z %s %d; do sleep 1; done'", + timeout, host, port) + stdout, stderr, rc, err := client.Run(ctx, cmd) + if err != nil || rc != 0 { + return &TaskResult{Failed: true, Msg: stderr, Stdout: stdout, RC: rc}, nil + } + return &TaskResult{Changed: false}, nil + case "stopped", "absent": + cmd := sprintf("timeout %d bash -c 'until ! nc -z %s %d; do sleep 1; done'", + timeout, host, port) + stdout, stderr, rc, err := client.Run(ctx, cmd) + if err != nil || rc != 0 { + return &TaskResult{Failed: true, Msg: stderr, Stdout: stdout, RC: rc}, nil + } + return &TaskResult{Changed: false}, nil } - return &TaskResult{Changed: false}, nil - } - - if port > 0 && state == "absent" { - cmd := sprintf("timeout %d bash -c 'until ! nc -z %s %d; do sleep 1; done'", - timeout, host, port) - stdout, stderr, rc, err := client.Run(ctx, cmd) - if err != nil || rc != 0 { - return &TaskResult{Failed: true, Msg: stderr, Stdout: stdout, RC: rc}, nil - } - return &TaskResult{Changed: false}, nil } return &TaskResult{Changed: false}, nil diff --git a/modules_adv_test.go b/modules_adv_test.go index 75f45cf..34aa190 100644 --- a/modules_adv_test.go +++ b/modules_adv_test.go @@ -909,6 +909,24 @@ func TestModulesAdv_ModuleWaitFor_Good_WaitsForPortAbsent(t *testing.T) { assert.True(t, mock.hasExecuted(`until ! nc -z 127.0.0.1 8080`)) } +func TestModulesAdv_ModuleWaitFor_Good_WaitsForPortStopped(t *testing.T) { + e, mock := newTestExecutorWithMock("host1") + mock.expectCommand(`timeout 2 bash -c 'until ! nc -z 127.0.0.1 8080; do sleep 1; done'`, "", "", 0) + + result, err := e.moduleWaitFor(context.Background(), mock, map[string]any{ + "host": "127.0.0.1", + "port": 8080, + "state": "stopped", + "timeout": 2, + }) + + require.NoError(t, err) + assert.NotNil(t, result) + assert.False(t, result.Failed) + assert.False(t, result.Changed) + assert.True(t, mock.hasExecuted(`until ! nc -z 127.0.0.1 8080`)) +} + // --- include_vars module --- func TestModulesAdv_ModuleIncludeVars_Good_LoadSingleFile(t *testing.T) {