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 }