2021-06-02 16:11:30 +00:00
|
|
|
package expiration
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"reflect"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/hashicorp/vault/helper/namespace"
|
|
|
|
vaulthttp "github.com/hashicorp/vault/http"
|
|
|
|
"github.com/hashicorp/vault/vault"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestExpiration_irrevocableLeaseCountsAPI(t *testing.T) {
|
|
|
|
cluster := vault.NewTestCluster(t, nil, &vault.TestClusterOptions{
|
|
|
|
HandlerFunc: vaulthttp.Handler,
|
|
|
|
NumCores: 1,
|
|
|
|
})
|
|
|
|
cluster.Start()
|
|
|
|
defer cluster.Cleanup()
|
|
|
|
|
|
|
|
client := cluster.Cores[0].Client
|
|
|
|
core := cluster.Cores[0].Core
|
|
|
|
|
|
|
|
params := make(map[string][]string)
|
|
|
|
params["type"] = []string{"irrevocable"}
|
2022-04-07 19:12:58 +00:00
|
|
|
resp, err := client.Logical().ReadWithData("sys/leases/count", params)
|
2021-06-02 16:11:30 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
if resp == nil {
|
|
|
|
t.Fatal("response is nil")
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(resp.Warnings) > 0 {
|
|
|
|
t.Errorf("expected no warnings, got: %v", resp.Warnings)
|
|
|
|
}
|
|
|
|
|
|
|
|
totalLeaseCountRaw, ok := resp.Data["lease_count"]
|
|
|
|
if !ok {
|
|
|
|
t.Fatalf("expected 'lease_count' response, got: %#v", resp.Data)
|
|
|
|
}
|
|
|
|
|
|
|
|
totalLeaseCount, err := totalLeaseCountRaw.(json.Number).Int64()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("error extracting lease count: %v", err)
|
|
|
|
}
|
|
|
|
if totalLeaseCount != 0 {
|
|
|
|
t.Errorf("expected no leases, got %d", totalLeaseCount)
|
|
|
|
}
|
|
|
|
|
|
|
|
countPerMountRaw, ok := resp.Data["counts"]
|
|
|
|
if !ok {
|
|
|
|
t.Fatalf("expected 'counts' response, got %#v", resp.Data)
|
|
|
|
}
|
|
|
|
countPerMount := countPerMountRaw.(map[string]interface{})
|
|
|
|
if len(countPerMount) != 0 {
|
|
|
|
t.Errorf("expected no mounts with counts, got %#v", countPerMount)
|
|
|
|
}
|
|
|
|
|
|
|
|
expectedNumLeases := 50
|
2021-06-29 21:02:30 +00:00
|
|
|
expectedCountPerMount, err := core.InjectIrrevocableLeases(namespace.RootContext(nil), expectedNumLeases)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2021-06-02 16:11:30 +00:00
|
|
|
|
2022-04-07 19:12:58 +00:00
|
|
|
resp, err = client.Logical().ReadWithData("sys/leases/count", params)
|
2021-06-02 16:11:30 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
if resp == nil {
|
|
|
|
t.Fatal("response is nil")
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(resp.Warnings) > 0 {
|
|
|
|
t.Errorf("expected no warnings, got: %v", resp.Warnings)
|
|
|
|
}
|
|
|
|
|
|
|
|
totalLeaseCountRaw, ok = resp.Data["lease_count"]
|
|
|
|
if !ok {
|
|
|
|
t.Fatalf("expected 'lease_count' response, got: %#v", resp.Data)
|
|
|
|
}
|
|
|
|
|
|
|
|
totalLeaseCount, err = totalLeaseCountRaw.(json.Number).Int64()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("error extracting lease count: %v", err)
|
|
|
|
}
|
|
|
|
if totalLeaseCount != int64(expectedNumLeases) {
|
|
|
|
t.Errorf("expected %d leases, got %d", expectedNumLeases, totalLeaseCount)
|
|
|
|
}
|
|
|
|
|
|
|
|
countPerMountRaw, ok = resp.Data["counts"]
|
|
|
|
if !ok {
|
|
|
|
t.Fatalf("expected 'counts' response, got %#v", resp.Data)
|
|
|
|
}
|
|
|
|
|
|
|
|
countPerMount = countPerMountRaw.(map[string]interface{})
|
|
|
|
if len(countPerMount) != len(expectedCountPerMount) {
|
|
|
|
t.Fatalf("expected %d mounts, got %d: %#v", len(expectedCountPerMount), len(countPerMount), countPerMount)
|
|
|
|
}
|
|
|
|
|
|
|
|
for mount, expectedCount := range expectedCountPerMount {
|
|
|
|
gotCountRaw, ok := countPerMount[mount]
|
|
|
|
if !ok {
|
|
|
|
t.Errorf("missing mount %q", mount)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
gotCount, err := gotCountRaw.(json.Number).Int64()
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("error extracting lease count for mount %q: %v", mount, err)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
if gotCount != int64(expectedCount) {
|
|
|
|
t.Errorf("bad count for mount %q: expected: %d, got: %d", mount, expectedCount, gotCount)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestExpiration_irrevocableLeaseListAPI(t *testing.T) {
|
|
|
|
cluster := vault.NewTestCluster(t, nil, &vault.TestClusterOptions{
|
|
|
|
HandlerFunc: vaulthttp.Handler,
|
|
|
|
NumCores: 1,
|
|
|
|
})
|
|
|
|
cluster.Start()
|
|
|
|
defer cluster.Cleanup()
|
|
|
|
|
|
|
|
client := cluster.Cores[0].Client
|
|
|
|
core := cluster.Cores[0].Core
|
|
|
|
|
|
|
|
params := make(map[string][]string)
|
|
|
|
params["type"] = []string{"irrevocable"}
|
2022-04-07 19:12:58 +00:00
|
|
|
resp, err := client.Logical().ReadWithData("sys/leases", params)
|
2021-06-02 16:11:30 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
if resp == nil {
|
|
|
|
t.Fatal("response is nil")
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(resp.Warnings) > 0 {
|
|
|
|
t.Errorf("expected no warnings, got: %v", resp.Warnings)
|
|
|
|
}
|
|
|
|
|
|
|
|
totalLeaseCountRaw, ok := resp.Data["lease_count"]
|
|
|
|
if !ok {
|
|
|
|
t.Fatalf("expected 'lease_count' response, got: %#v", resp.Data)
|
|
|
|
}
|
|
|
|
|
|
|
|
totalLeaseCount, err := totalLeaseCountRaw.(json.Number).Int64()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("error extracting lease count: %v", err)
|
|
|
|
}
|
|
|
|
if totalLeaseCount != 0 {
|
|
|
|
t.Errorf("expected no leases, got %d", totalLeaseCount)
|
|
|
|
}
|
|
|
|
|
|
|
|
leasesRaw, ok := resp.Data["leases"]
|
|
|
|
if !ok {
|
|
|
|
t.Fatalf("expected 'leases' response, got %#v", resp.Data)
|
|
|
|
}
|
|
|
|
leases := leasesRaw.([]interface{})
|
|
|
|
if len(leases) != 0 {
|
|
|
|
t.Errorf("expected no mounts with leases, got %#v", leases)
|
|
|
|
}
|
|
|
|
|
|
|
|
// test with a low enough number to not give an error without limit set to none
|
|
|
|
expectedNumLeases := 50
|
2021-06-29 21:02:30 +00:00
|
|
|
expectedCountPerMount, err := core.InjectIrrevocableLeases(namespace.RootContext(nil), expectedNumLeases)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2021-06-02 16:11:30 +00:00
|
|
|
|
2022-04-07 19:12:58 +00:00
|
|
|
resp, err = client.Logical().ReadWithData("sys/leases", params)
|
2021-06-02 16:11:30 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
if resp == nil {
|
|
|
|
t.Fatal("response is nil")
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(resp.Warnings) > 0 {
|
|
|
|
t.Errorf("expected no warnings, got: %v", resp.Warnings)
|
|
|
|
}
|
|
|
|
|
|
|
|
totalLeaseCountRaw, ok = resp.Data["lease_count"]
|
|
|
|
if !ok {
|
|
|
|
t.Fatalf("expected 'lease_count' response, got: %#v", resp.Data)
|
|
|
|
}
|
|
|
|
|
|
|
|
totalLeaseCount, err = totalLeaseCountRaw.(json.Number).Int64()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("error extracting lease count: %v", err)
|
|
|
|
}
|
|
|
|
if totalLeaseCount != int64(expectedNumLeases) {
|
|
|
|
t.Errorf("expected %d leases, got %d", expectedNumLeases, totalLeaseCount)
|
|
|
|
}
|
|
|
|
|
|
|
|
leasesRaw, ok = resp.Data["leases"]
|
|
|
|
if !ok {
|
|
|
|
t.Fatalf("expected 'leases' response, got %#v", resp.Data)
|
|
|
|
}
|
|
|
|
|
|
|
|
leases = leasesRaw.([]interface{})
|
|
|
|
countPerMount := make(map[string]int)
|
|
|
|
for _, leaseRaw := range leases {
|
|
|
|
lease := leaseRaw.(map[string]interface{})
|
|
|
|
mount := lease["mount_id"].(string)
|
|
|
|
|
|
|
|
if _, ok := countPerMount[mount]; !ok {
|
|
|
|
countPerMount[mount] = 0
|
|
|
|
}
|
|
|
|
|
|
|
|
countPerMount[mount]++
|
|
|
|
}
|
|
|
|
|
|
|
|
if !reflect.DeepEqual(countPerMount, expectedCountPerMount) {
|
|
|
|
t.Errorf("bad mount count. expected %v, got %v", expectedCountPerMount, countPerMount)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestExpiration_irrevocableLeaseListAPI_includeAll(t *testing.T) {
|
|
|
|
cluster := vault.NewTestCluster(t, nil, &vault.TestClusterOptions{
|
|
|
|
HandlerFunc: vaulthttp.Handler,
|
|
|
|
NumCores: 1,
|
|
|
|
})
|
|
|
|
cluster.Start()
|
|
|
|
defer cluster.Cleanup()
|
|
|
|
|
|
|
|
client := cluster.Cores[0].Client
|
|
|
|
core := cluster.Cores[0].Core
|
|
|
|
|
|
|
|
// test with a low enough number to not give an error with the default limit
|
|
|
|
expectedNumLeases := vault.MaxIrrevocableLeasesToReturn + 50
|
2021-06-29 21:02:30 +00:00
|
|
|
expectedCountPerMount, err := core.InjectIrrevocableLeases(namespace.RootContext(nil), expectedNumLeases)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2021-06-02 16:11:30 +00:00
|
|
|
|
|
|
|
params := make(map[string][]string)
|
|
|
|
params["type"] = []string{"irrevocable"}
|
|
|
|
|
2022-04-07 19:12:58 +00:00
|
|
|
resp, err := client.Logical().ReadWithData("sys/leases", params)
|
2021-06-02 16:11:30 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("unexpected error: %v", err)
|
|
|
|
}
|
|
|
|
if resp == nil {
|
|
|
|
t.Fatal("unexpected nil response")
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(resp.Warnings) != 1 {
|
|
|
|
t.Errorf("expected one warning (%q), got: %v", vault.MaxIrrevocableLeasesWarning, resp.Warnings)
|
|
|
|
}
|
|
|
|
|
|
|
|
// now try it with the no limit on return size - we expect no errors and many results
|
|
|
|
params["limit"] = []string{"none"}
|
2022-04-07 19:12:58 +00:00
|
|
|
resp, err = client.Logical().ReadWithData("sys/leases", params)
|
2021-06-02 16:11:30 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("unexpected error when using limit=none: %v", err)
|
|
|
|
}
|
|
|
|
if resp == nil {
|
|
|
|
t.Fatal("response is nil")
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(resp.Warnings) > 0 {
|
|
|
|
t.Errorf("expected no warnings, got: %v", resp.Warnings)
|
|
|
|
}
|
|
|
|
|
|
|
|
totalLeaseCountRaw, ok := resp.Data["lease_count"]
|
|
|
|
if !ok {
|
|
|
|
t.Fatalf("expected 'lease_count' response, got: %#v", resp.Data)
|
|
|
|
}
|
|
|
|
|
|
|
|
totalLeaseCount, err := totalLeaseCountRaw.(json.Number).Int64()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("error extracting lease count: %v", err)
|
|
|
|
}
|
|
|
|
if totalLeaseCount != int64(expectedNumLeases) {
|
|
|
|
t.Errorf("expected %d leases, got %d", expectedNumLeases, totalLeaseCount)
|
|
|
|
}
|
|
|
|
|
|
|
|
leasesRaw, ok := resp.Data["leases"]
|
|
|
|
if !ok {
|
|
|
|
t.Fatalf("expected 'leases' response, got %#v", resp.Data)
|
|
|
|
}
|
|
|
|
|
|
|
|
leases := leasesRaw.([]interface{})
|
|
|
|
countPerMount := make(map[string]int)
|
|
|
|
for _, leaseRaw := range leases {
|
|
|
|
lease := leaseRaw.(map[string]interface{})
|
|
|
|
mount := lease["mount_id"].(string)
|
|
|
|
|
|
|
|
if _, ok := countPerMount[mount]; !ok {
|
|
|
|
countPerMount[mount] = 0
|
|
|
|
}
|
|
|
|
|
|
|
|
countPerMount[mount]++
|
|
|
|
}
|
|
|
|
|
|
|
|
if !reflect.DeepEqual(countPerMount, expectedCountPerMount) {
|
|
|
|
t.Errorf("bad mount count. expected %v, got %v", expectedCountPerMount, countPerMount)
|
|
|
|
}
|
|
|
|
}
|