github.com/ncodes/nomad@v0.5.7-0.20170403112158-97adf4a74fb3/client/vaultclient/vaultclient_test.go (about)

     1  package vaultclient
     2  
     3  import (
     4  	"log"
     5  	"os"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/ncodes/nomad/client/config"
    10  	"github.com/ncodes/nomad/testutil"
    11  	vaultapi "github.com/hashicorp/vault/api"
    12  )
    13  
    14  func TestVaultClient_TokenRenewals(t *testing.T) {
    15  	v := testutil.NewTestVault(t).Start()
    16  	defer v.Stop()
    17  
    18  	logger := log.New(os.Stderr, "TEST: ", log.Lshortfile|log.LstdFlags)
    19  	v.Config.ConnectionRetryIntv = 100 * time.Millisecond
    20  	v.Config.TaskTokenTTL = "10s"
    21  	c, err := NewVaultClient(v.Config, logger, nil)
    22  	if err != nil {
    23  		t.Fatalf("failed to build vault client: %v", err)
    24  	}
    25  
    26  	c.Start()
    27  	defer c.Stop()
    28  
    29  	// Sleep a little while to ensure that the renewal loop is active
    30  	time.Sleep(3 * time.Second)
    31  
    32  	tcr := &vaultapi.TokenCreateRequest{
    33  		Policies:    []string{"foo", "bar"},
    34  		TTL:         "2s",
    35  		DisplayName: "derived-for-task",
    36  		Renewable:   new(bool),
    37  	}
    38  	*tcr.Renewable = true
    39  
    40  	num := 5
    41  	tokens := make([]string, num)
    42  	for i := 0; i < num; i++ {
    43  		c.client.SetToken(v.Config.Token)
    44  
    45  		if err := c.client.SetAddress(v.Config.Addr); err != nil {
    46  			t.Fatal(err)
    47  		}
    48  
    49  		secret, err := c.client.Auth().Token().Create(tcr)
    50  		if err != nil {
    51  			t.Fatalf("failed to create vault token: %v", err)
    52  		}
    53  
    54  		if secret == nil || secret.Auth == nil || secret.Auth.ClientToken == "" {
    55  			t.Fatal("failed to derive a wrapped vault token")
    56  		}
    57  
    58  		tokens[i] = secret.Auth.ClientToken
    59  
    60  		errCh, err := c.RenewToken(tokens[i], secret.Auth.LeaseDuration)
    61  		if err != nil {
    62  			t.Fatalf("Unexpected error: %v", err)
    63  		}
    64  
    65  		go func(errCh <-chan error) {
    66  			for {
    67  				select {
    68  				case err := <-errCh:
    69  					t.Fatalf("error while renewing the token: %v", err)
    70  				}
    71  			}
    72  		}(errCh)
    73  	}
    74  
    75  	if c.heap.Length() != num {
    76  		t.Fatalf("bad: heap length: expected: %d, actual: %d", num, c.heap.Length())
    77  	}
    78  
    79  	time.Sleep(time.Duration(5*testutil.TestMultiplier()) * time.Second)
    80  
    81  	for i := 0; i < num; i++ {
    82  		if err := c.StopRenewToken(tokens[i]); err != nil {
    83  			t.Fatal(err)
    84  		}
    85  	}
    86  
    87  	if c.heap.Length() != 0 {
    88  		t.Fatalf("bad: heap length: expected: 0, actual: %d", c.heap.Length())
    89  	}
    90  }
    91  
    92  func TestVaultClient_Heap(t *testing.T) {
    93  	tr := true
    94  	conf := config.DefaultConfig()
    95  	conf.VaultConfig.Enabled = &tr
    96  	conf.VaultConfig.Token = "testvaulttoken"
    97  	conf.VaultConfig.TaskTokenTTL = "10s"
    98  
    99  	logger := log.New(os.Stderr, "TEST: ", log.Lshortfile|log.LstdFlags)
   100  	c, err := NewVaultClient(conf.VaultConfig, logger, nil)
   101  	if err != nil {
   102  		t.Fatal(err)
   103  	}
   104  	if c == nil {
   105  		t.Fatal("failed to create vault client")
   106  	}
   107  
   108  	now := time.Now()
   109  
   110  	renewalReq1 := &vaultClientRenewalRequest{
   111  		errCh:     make(chan error, 1),
   112  		id:        "id1",
   113  		increment: 10,
   114  	}
   115  	if err := c.heap.Push(renewalReq1, now.Add(50*time.Second)); err != nil {
   116  		t.Fatal(err)
   117  	}
   118  	if !c.isTracked("id1") {
   119  		t.Fatalf("id1 should have been tracked")
   120  	}
   121  
   122  	renewalReq2 := &vaultClientRenewalRequest{
   123  		errCh:     make(chan error, 1),
   124  		id:        "id2",
   125  		increment: 10,
   126  	}
   127  	if err := c.heap.Push(renewalReq2, now.Add(40*time.Second)); err != nil {
   128  		t.Fatal(err)
   129  	}
   130  	if !c.isTracked("id2") {
   131  		t.Fatalf("id2 should have been tracked")
   132  	}
   133  
   134  	renewalReq3 := &vaultClientRenewalRequest{
   135  		errCh:     make(chan error, 1),
   136  		id:        "id3",
   137  		increment: 10,
   138  	}
   139  	if err := c.heap.Push(renewalReq3, now.Add(60*time.Second)); err != nil {
   140  		t.Fatal(err)
   141  	}
   142  	if !c.isTracked("id3") {
   143  		t.Fatalf("id3 should have been tracked")
   144  	}
   145  
   146  	// Reading elements should yield id2, id1 and id3 in order
   147  	req, _ := c.nextRenewal()
   148  	if req != renewalReq2 {
   149  		t.Fatalf("bad: expected: %#v, actual: %#v", renewalReq2, req)
   150  	}
   151  	if err := c.heap.Update(req, now.Add(70*time.Second)); err != nil {
   152  		t.Fatal(err)
   153  	}
   154  
   155  	req, _ = c.nextRenewal()
   156  	if req != renewalReq1 {
   157  		t.Fatalf("bad: expected: %#v, actual: %#v", renewalReq1, req)
   158  	}
   159  	if err := c.heap.Update(req, now.Add(80*time.Second)); err != nil {
   160  		t.Fatal(err)
   161  	}
   162  
   163  	req, _ = c.nextRenewal()
   164  	if req != renewalReq3 {
   165  		t.Fatalf("bad: expected: %#v, actual: %#v", renewalReq3, req)
   166  	}
   167  	if err := c.heap.Update(req, now.Add(90*time.Second)); err != nil {
   168  		t.Fatal(err)
   169  	}
   170  
   171  	if err := c.StopRenewToken("id1"); err != nil {
   172  		t.Fatal(err)
   173  	}
   174  
   175  	if err := c.StopRenewToken("id2"); err != nil {
   176  		t.Fatal(err)
   177  	}
   178  
   179  	if err := c.StopRenewToken("id3"); err != nil {
   180  		t.Fatal(err)
   181  	}
   182  
   183  	if c.isTracked("id1") {
   184  		t.Fatalf("id1 should not have been tracked")
   185  	}
   186  
   187  	if c.isTracked("id1") {
   188  		t.Fatalf("id1 should not have been tracked")
   189  	}
   190  
   191  	if c.isTracked("id1") {
   192  		t.Fatalf("id1 should not have been tracked")
   193  	}
   194  
   195  }