github.com/iqoqo/nomad@v0.11.3-0.20200911112621-d7021c74d101/client/allocrunner/taskrunner/logmon_hook_test.go (about) 1 package taskrunner 2 3 import ( 4 "context" 5 "encoding/json" 6 "io/ioutil" 7 "net" 8 "os" 9 "testing" 10 11 plugin "github.com/hashicorp/go-plugin" 12 "github.com/hashicorp/nomad/client/allocrunner/interfaces" 13 "github.com/hashicorp/nomad/helper" 14 "github.com/hashicorp/nomad/helper/testlog" 15 "github.com/hashicorp/nomad/nomad/mock" 16 pstructs "github.com/hashicorp/nomad/plugins/shared/structs" 17 "github.com/stretchr/testify/require" 18 ) 19 20 // Statically assert the logmon hook implements the expected interfaces 21 var _ interfaces.TaskPrestartHook = (*logmonHook)(nil) 22 var _ interfaces.TaskStopHook = (*logmonHook)(nil) 23 24 // TestTaskRunner_LogmonHook_LoadReattach unit tests loading logmon reattach 25 // config from persisted hook state. 26 func TestTaskRunner_LogmonHook_LoadReattach(t *testing.T) { 27 t.Parallel() 28 29 // No hook data should return nothing 30 cfg, err := reattachConfigFromHookData(nil) 31 require.Nil(t, cfg) 32 require.NoError(t, err) 33 34 // Hook data without the appropriate key should return nothing 35 cfg, err = reattachConfigFromHookData(map[string]string{"foo": "bar"}) 36 require.Nil(t, cfg) 37 require.NoError(t, err) 38 39 // Create a realistic reattach config and roundtrip it 40 addr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:0") 41 require.NoError(t, err) 42 43 orig := &plugin.ReattachConfig{ 44 Protocol: plugin.ProtocolGRPC, 45 Addr: addr, 46 Pid: 4, 47 } 48 origJSON, err := json.Marshal(pstructs.ReattachConfigFromGoPlugin(orig)) 49 require.NoError(t, err) 50 51 cfg, err = reattachConfigFromHookData(map[string]string{ 52 logmonReattachKey: string(origJSON), 53 }) 54 require.NoError(t, err) 55 56 require.Equal(t, orig, cfg) 57 } 58 59 // TestTaskRunner_LogmonHook_StartStop asserts that a new logmon is created the 60 // first time Prestart is called, reattached to on subsequent restarts, and 61 // killed on Stop. 62 func TestTaskRunner_LogmonHook_StartStop(t *testing.T) { 63 t.Parallel() 64 65 alloc := mock.BatchAlloc() 66 task := alloc.Job.TaskGroups[0].Tasks[0] 67 68 dir, err := ioutil.TempDir("", "nomadtest") 69 require.NoError(t, err) 70 defer func() { 71 require.NoError(t, os.RemoveAll(dir)) 72 }() 73 74 hookConf := newLogMonHookConfig(task.Name, dir) 75 runner := &TaskRunner{logmonHookConfig: hookConf} 76 hook := newLogMonHook(runner, testlog.HCLogger(t)) 77 78 req := interfaces.TaskPrestartRequest{ 79 Task: task, 80 } 81 resp := interfaces.TaskPrestartResponse{} 82 83 // First prestart should set reattach key but never be Done as it needs 84 // to rerun on agent restarts to reattach. 85 require.NoError(t, hook.Prestart(context.Background(), &req, &resp)) 86 defer hook.Stop(context.Background(), nil, nil) 87 88 require.False(t, resp.Done) 89 origHookData := resp.State[logmonReattachKey] 90 require.NotEmpty(t, origHookData) 91 92 // Running prestart again should effectively noop as it reattaches to 93 // the running logmon. 94 req.PreviousState = map[string]string{ 95 logmonReattachKey: origHookData, 96 } 97 require.NoError(t, hook.Prestart(context.Background(), &req, &resp)) 98 require.False(t, resp.Done) 99 origHookData = resp.State[logmonReattachKey] 100 require.Equal(t, origHookData, req.PreviousState[logmonReattachKey]) 101 102 // Running stop should shutdown logmon 103 stopReq := interfaces.TaskStopRequest{ 104 ExistingState: helper.CopyMapStringString(resp.State), 105 } 106 require.NoError(t, hook.Stop(context.Background(), &stopReq, nil)) 107 }