ad2fb4b297
In order to minimize this change while keeping a simple version of the behavior, we set `lastOk` to the current time less the intial server connection timeout. If the client starts and never contacts the server, it will stop all configured tasks after the initial server connection grace period, on the assumption that we've been out of touch longer than any configured `stop_after_client_disconnect`. The more complex state behavior might be justified later, but we should learn about failure modes first.
66 lines
1.4 KiB
Go
66 lines
1.4 KiB
Go
package client
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/hashicorp/nomad/client/config"
|
|
"github.com/hashicorp/nomad/helper/uuid"
|
|
"github.com/hashicorp/nomad/nomad/structs"
|
|
"github.com/hashicorp/nomad/testutil"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestHearbeatStop_allocHook(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
server, _, cleanupS1 := testServer(t, nil)
|
|
defer cleanupS1()
|
|
testutil.WaitForLeader(t, server.RPC)
|
|
|
|
client, cleanupC1 := TestClient(t, func(c *config.Config) {
|
|
c.RPCHandler = server
|
|
})
|
|
defer cleanupC1()
|
|
|
|
// an allocation, with a tiny lease
|
|
d := 1 * time.Microsecond
|
|
alloc := &structs.Allocation{
|
|
ID: uuid.Generate(),
|
|
TaskGroup: "foo",
|
|
Job: &structs.Job{
|
|
TaskGroups: []*structs.TaskGroup{
|
|
{
|
|
Name: "foo",
|
|
StopAfterClientDisconnect: &d,
|
|
},
|
|
},
|
|
},
|
|
Resources: &structs.Resources{
|
|
CPU: 100,
|
|
MemoryMB: 100,
|
|
DiskMB: 0,
|
|
},
|
|
}
|
|
|
|
// alloc added to heartbeatStop.allocs
|
|
err := client.addAlloc(alloc, "")
|
|
require.NoError(t, err)
|
|
testutil.WaitForResult(func() (bool, error) {
|
|
_, ok := client.heartbeatStop.allocInterval[alloc.ID]
|
|
return ok, nil
|
|
}, func(err error) {
|
|
require.NoError(t, err)
|
|
})
|
|
|
|
// the tiny lease causes the watch loop to destroy it
|
|
testutil.WaitForResult(func() (bool, error) {
|
|
_, ok := client.heartbeatStop.allocInterval[alloc.ID]
|
|
return !ok, nil
|
|
}, func(err error) {
|
|
require.NoError(t, err)
|
|
})
|
|
|
|
require.Empty(t, client.allocs[alloc.ID])
|
|
}
|