create token tests
This commit is contained in:
parent
909f552d9e
commit
c394a45b72
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Loading…
Reference in New Issue