github.com/hhrutter/nomad@v0.6.0-rc2.0.20170723054333-80c4b03f0705/client/task_runner_unix_test.go (about)

     1  // +build !windows
     2  
     3  package client
     4  
     5  import (
     6  	"syscall"
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/hashicorp/nomad/client/vaultclient"
    11  	"github.com/hashicorp/nomad/nomad/mock"
    12  	"github.com/hashicorp/nomad/nomad/structs"
    13  )
    14  
    15  // This test is just to make sure we are resilient to failures when a restart or
    16  // signal is triggered and the task is not running.
    17  func TestTaskRunner_RestartSignalTask_NotRunning(t *testing.T) {
    18  	alloc := mock.Alloc()
    19  	task := alloc.Job.TaskGroups[0].Tasks[0]
    20  	task.Driver = "mock_driver"
    21  	task.Config = map[string]interface{}{
    22  		"exit_code": "0",
    23  		"run_for":   "100s",
    24  	}
    25  
    26  	// Use vault to block the start
    27  	task.Vault = &structs.Vault{Policies: []string{"default"}}
    28  
    29  	ctx := testTaskRunnerFromAlloc(t, true, alloc)
    30  	ctx.tr.MarkReceived()
    31  	defer ctx.Cleanup()
    32  
    33  	// Control when we get a Vault token
    34  	token := "1234"
    35  	waitCh := make(chan struct{})
    36  	defer close(waitCh)
    37  	handler := func(*structs.Allocation, []string) (map[string]string, error) {
    38  		<-waitCh
    39  		return map[string]string{task.Name: token}, nil
    40  	}
    41  	ctx.tr.vaultClient.(*vaultclient.MockVaultClient).DeriveTokenFn = handler
    42  	go ctx.tr.Run()
    43  
    44  	select {
    45  	case <-ctx.tr.WaitCh():
    46  		t.Fatalf("premature exit")
    47  	case <-time.After(1 * time.Second):
    48  	}
    49  
    50  	// Send a signal and restart
    51  	if err := ctx.tr.Signal("test", "don't panic", syscall.SIGCHLD); err != nil {
    52  		t.Fatalf("Signalling errored: %v", err)
    53  	}
    54  
    55  	// Send a restart
    56  	ctx.tr.Restart("test", "don't panic")
    57  
    58  	if len(ctx.upd.events) != 2 {
    59  		t.Fatalf("should have 2 ctx.updates: %#v", ctx.upd.events)
    60  	}
    61  
    62  	if ctx.upd.state != structs.TaskStatePending {
    63  		t.Fatalf("TaskState %v; want %v", ctx.upd.state, structs.TaskStatePending)
    64  	}
    65  
    66  	if ctx.upd.events[0].Type != structs.TaskReceived {
    67  		t.Fatalf("First Event was %v; want %v", ctx.upd.events[0].Type, structs.TaskReceived)
    68  	}
    69  
    70  	if ctx.upd.events[1].Type != structs.TaskSetup {
    71  		t.Fatalf("Second Event was %v; want %v", ctx.upd.events[1].Type, structs.TaskSetup)
    72  	}
    73  }