create token tests

This commit is contained in:
Alex Dadgar 2016-08-19 14:46:51 -07:00
parent 909f552d9e
commit c394a45b72
2 changed files with 121 additions and 7 deletions

View File

@ -12,12 +12,20 @@ import (
"golang.org/x/time/rate" "golang.org/x/time/rate"
"github.com/hashicorp/nomad/nomad/mock"
"github.com/hashicorp/nomad/nomad/structs" "github.com/hashicorp/nomad/nomad/structs"
"github.com/hashicorp/nomad/nomad/structs/config" "github.com/hashicorp/nomad/nomad/structs/config"
"github.com/hashicorp/nomad/testutil" "github.com/hashicorp/nomad/testutil"
vapi "github.com/hashicorp/vault/api" vapi "github.com/hashicorp/vault/api"
) )
const (
// authPolicy is a policy that allows token creation operations
authPolicy = `path "auth/token/create/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}`
)
func TestVaultClient_BadConfig(t *testing.T) { func TestVaultClient_BadConfig(t *testing.T) {
conf := &config.VaultConfig{} conf := &config.VaultConfig{}
logger := log.New(os.Stderr, "", log.LstdFlags) logger := log.New(os.Stderr, "", log.LstdFlags)
@ -78,15 +86,20 @@ func TestVaultClient_EstablishConnection(t *testing.T) {
} }
} }
func TestVaultClient_RenewalLoop(t *testing.T) { // testVaultRoleAndToken creates a test Vault role where children are created
v := testutil.NewTestVault(t).Start() // with the passed period. A token created in that role is returned
defer v.Stop() func testVaultRoleAndToken(v *testutil.TestVault, t *testing.T, rolePeriod int) string {
// Build the auth policy
sys := v.Client.Sys()
if err := sys.PutPolicy("auth", authPolicy); err != nil {
t.Fatalf("failed to create auth policy: %v", err)
}
// Build a role // Build a role
l := v.Client.Logical() l := v.Client.Logical()
d := make(map[string]interface{}, 2) d := make(map[string]interface{}, 2)
d["allowed_policies"] = "default" d["allowed_policies"] = "default,auth"
d["period"] = 5 d["period"] = rolePeriod
l.Write("auth/token/roles/test", d) l.Write("auth/token/roles/test", d)
// Create a new token with the role // Create a new token with the role
@ -102,8 +115,15 @@ func TestVaultClient_RenewalLoop(t *testing.T) {
t.Fatalf("bad secret response: %+v", s) t.Fatalf("bad secret response: %+v", s)
} }
// Set the configs token return s.Auth.ClientToken
v.Config.Token = s.Auth.ClientToken }
func TestVaultClient_RenewalLoop(t *testing.T) {
v := testutil.NewTestVault(t).Start()
defer v.Stop()
// Set the configs token in a new test role
v.Config.Token = testVaultRoleAndToken(v, t, 5)
// Start the client // Start the client
logger := log.New(os.Stderr, "", log.LstdFlags) logger := log.New(os.Stderr, "", log.LstdFlags)
@ -117,6 +137,7 @@ func TestVaultClient_RenewalLoop(t *testing.T) {
time.Sleep(8 * time.Second) time.Sleep(8 * time.Second)
// Get the current TTL // Get the current TTL
a := v.Client.Auth().Token()
s2, err := a.Lookup(v.Config.Token) s2, err := a.Lookup(v.Config.Token)
if err != nil { if err != nil {
t.Fatalf("failed to lookup token: %v", err) t.Fatalf("failed to lookup token: %v", err)
@ -303,3 +324,90 @@ func TestVaultClient_LookupToken_RateLimit(t *testing.T) {
t.Fatalf("Incorrect number of cancels; got %d; want %d", cancels, desired) t.Fatalf("Incorrect number of cancels; got %d; want %d", cancels, desired)
} }
} }
func TestVaultClient_CreateToken_Root(t *testing.T) {
v := testutil.NewTestVault(t).Start()
defer v.Stop()
logger := log.New(os.Stderr, "", log.LstdFlags)
client, err := NewVaultClient(v.Config, logger)
if err != nil {
t.Fatalf("failed to build vault client: %v", err)
}
waitForConnection(client, t)
// Create an allocation that requires a Vault policy
a := mock.Alloc()
task := a.Job.TaskGroups[0].Tasks[0]
task.Vault = &structs.Vault{Policies: []string{"default"}}
s, err := client.CreateToken(context.Background(), a, task.Name)
if err != nil {
t.Fatalf("CreateToken failed: %v", err)
}
// Ensure that created secret is a wrapped token
if s == nil || s.WrapInfo == nil {
t.Fatalf("Bad secret: %#v", s)
}
d, err := time.ParseDuration(vaultTokenCreateTTL)
if err != nil {
t.Fatalf("bad: %v", err)
}
if s.WrapInfo.WrappedAccessor == "" {
t.Fatalf("Bad accessor: %v", s.WrapInfo.WrappedAccessor)
} else if s.WrapInfo.Token == "" {
t.Fatalf("Bad token: %v", s.WrapInfo.WrappedAccessor)
} else if s.WrapInfo.TTL != int(d.Seconds()) {
t.Fatalf("Bad ttl: %v", s.WrapInfo.WrappedAccessor)
}
}
func TestVaultClient_CreateToken_Role(t *testing.T) {
v := testutil.NewTestVault(t).Start()
defer v.Stop()
// Set the configs token in a new test role
v.Config.Token = testVaultRoleAndToken(v, t, 5)
//testVaultRoleAndToken(v, t, 5)
// Start the client
logger := log.New(os.Stderr, "", log.LstdFlags)
client, err := NewVaultClient(v.Config, logger)
if err != nil {
t.Fatalf("failed to build vault client: %v", err)
}
defer client.Stop()
waitForConnection(client, t)
// Create an allocation that requires a Vault policy
a := mock.Alloc()
task := a.Job.TaskGroups[0].Tasks[0]
task.Vault = &structs.Vault{Policies: []string{"default"}}
s, err := client.CreateToken(context.Background(), a, task.Name)
if err != nil {
t.Fatalf("CreateToken failed: %v", err)
}
// Ensure that created secret is a wrapped token
if s == nil || s.WrapInfo == nil {
t.Fatalf("Bad secret: %#v", s)
}
d, err := time.ParseDuration(vaultTokenCreateTTL)
if err != nil {
t.Fatalf("bad: %v", err)
}
if s.WrapInfo.WrappedAccessor == "" {
t.Fatalf("Bad accessor: %v", s.WrapInfo.WrappedAccessor)
} else if s.WrapInfo.Token == "" {
t.Fatalf("Bad token: %v", s.WrapInfo.WrappedAccessor)
} else if s.WrapInfo.TTL != int(d.Seconds()) {
t.Fatalf("Bad ttl: %v", s.WrapInfo.WrappedAccessor)
}
}

6
vendor/vendor.json vendored
View File

@ -833,6 +833,12 @@
"revision": "30db96677b74e24b967e23f911eb3364fc61a011", "revision": "30db96677b74e24b967e23f911eb3364fc61a011",
"revisionTime": "2016-05-25T13:11:03Z" "revisionTime": "2016-05-25T13:11:03Z"
}, },
{
"checksumSHA1": "S0DP7Pn7sZUmXc55IzZnNvERu6s=",
"path": "golang.org/x/sync/errgroup",
"revision": "316e794f7b5e3df4e95175a45a5fb8b12f85cb4f",
"revisionTime": "2016-07-15T18:54:39Z"
},
{ {
"path": "golang.org/x/sys/unix", "path": "golang.org/x/sys/unix",
"revision": "50c6bc5e4292a1d4e65c6e9be5f53be28bcbe28e" "revision": "50c6bc5e4292a1d4e65c6e9be5f53be28bcbe28e"