mirror of
				https://github.com/optim-enterprises-bv/vault.git
				synced 2025-10-31 18:48:08 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			172 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			172 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package aws
 | |
| 
 | |
| import (
 | |
| 	"bytes"
 | |
| 	"encoding/json"
 | |
| 	"fmt"
 | |
| 	"log"
 | |
| 	"os"
 | |
| 	"testing"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/hashicorp/aws-sdk-go/aws"
 | |
| 	"github.com/hashicorp/aws-sdk-go/gen/ec2"
 | |
| 	"github.com/hashicorp/vault/logical"
 | |
| 	logicaltest "github.com/hashicorp/vault/logical/testing"
 | |
| 	"github.com/mitchellh/mapstructure"
 | |
| )
 | |
| 
 | |
| func TestBackend_basic(t *testing.T) {
 | |
| 	logicaltest.Test(t, logicaltest.TestCase{
 | |
| 		PreCheck: func() { testAccPreCheck(t) },
 | |
| 		Backend:  Backend(),
 | |
| 		Steps: []logicaltest.TestStep{
 | |
| 			testAccStepConfig(t),
 | |
| 			testAccStepWritePolicy(t, "test", testPolicy),
 | |
| 			testAccStepReadUser(t, "test"),
 | |
| 		},
 | |
| 	})
 | |
| }
 | |
| 
 | |
| func TestBackend_policyCrud(t *testing.T) {
 | |
| 	var compacted bytes.Buffer
 | |
| 	if err := json.Compact(&compacted, []byte(testPolicy)); err != nil {
 | |
| 		t.Fatalf("bad: %s", err)
 | |
| 	}
 | |
| 
 | |
| 	logicaltest.Test(t, logicaltest.TestCase{
 | |
| 		Backend: Backend(),
 | |
| 		Steps: []logicaltest.TestStep{
 | |
| 			testAccStepConfig(t),
 | |
| 			testAccStepWritePolicy(t, "test", testPolicy),
 | |
| 			testAccStepReadPolicy(t, "test", compacted.String()),
 | |
| 			testAccStepDeletePolicy(t, "test"),
 | |
| 			testAccStepReadPolicy(t, "test", ""),
 | |
| 		},
 | |
| 	})
 | |
| }
 | |
| 
 | |
| func testAccPreCheck(t *testing.T) {
 | |
| 	if v := os.Getenv("AWS_ACCESS_KEY_ID"); v == "" {
 | |
| 		t.Fatal("AWS_ACCESS_KEY_ID must be set for acceptance tests")
 | |
| 	}
 | |
| 
 | |
| 	if v := os.Getenv("AWS_SECRET_ACCESS_KEY"); v == "" {
 | |
| 		t.Fatal("AWS_SECRET_ACCESS_KEY must be set for acceptance tests")
 | |
| 	}
 | |
| 
 | |
| 	if v := os.Getenv("AWS_DEFAULT_REGION"); v == "" {
 | |
| 		log.Println("[INFO] Test: Using us-west-2 as test region")
 | |
| 		os.Setenv("AWS_DEFAULT_REGION", "us-west-2")
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func testAccStepConfig(t *testing.T) logicaltest.TestStep {
 | |
| 	return logicaltest.TestStep{
 | |
| 		Operation: logical.WriteOperation,
 | |
| 		Path:      "config/root",
 | |
| 		Data: map[string]interface{}{
 | |
| 			"access_key": os.Getenv("AWS_ACCESS_KEY_ID"),
 | |
| 			"secret_key": os.Getenv("AWS_SECRET_ACCESS_KEY"),
 | |
| 			"region":     os.Getenv("AWS_DEFAULT_REGION"),
 | |
| 		},
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func testAccStepReadUser(t *testing.T, name string) logicaltest.TestStep {
 | |
| 	return logicaltest.TestStep{
 | |
| 		Operation: logical.ReadOperation,
 | |
| 		Path:      "creds/" + name,
 | |
| 		Check: func(resp *logical.Response) error {
 | |
| 			var d struct {
 | |
| 				AccessKey string `mapstructure:"access_key"`
 | |
| 				SecretKey string `mapstructure:"secret_key"`
 | |
| 			}
 | |
| 			if err := mapstructure.Decode(resp.Data, &d); err != nil {
 | |
| 				return err
 | |
| 			}
 | |
| 			log.Printf("[WARN] Generated credentials: %v", d)
 | |
| 
 | |
| 			// Sleep sometime because AWS is eventually consistent
 | |
| 			log.Println("[WARN] Sleeping for 10 seconds waiting for AWS...")
 | |
| 			time.Sleep(10 * time.Second)
 | |
| 
 | |
| 			// Build a client and verify that the credentials work
 | |
| 			creds := aws.Creds(d.AccessKey, d.SecretKey, "")
 | |
| 			client := ec2.New(creds, "us-east-1", nil)
 | |
| 
 | |
| 			log.Printf("[WARN] Verifying that the generated credentials work...")
 | |
| 			_, err := client.DescribeInstances(&ec2.DescribeInstancesRequest{})
 | |
| 			if err != nil {
 | |
| 				return err
 | |
| 			}
 | |
| 
 | |
| 			return nil
 | |
| 		},
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func testAccStepWritePolicy(t *testing.T, name string, policy string) logicaltest.TestStep {
 | |
| 	return logicaltest.TestStep{
 | |
| 		Operation: logical.WriteOperation,
 | |
| 		Path:      "roles/" + name,
 | |
| 		Data: map[string]interface{}{
 | |
| 			"policy": testPolicy,
 | |
| 		},
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func testAccStepDeletePolicy(t *testing.T, n string) logicaltest.TestStep {
 | |
| 	return logicaltest.TestStep{
 | |
| 		Operation: logical.DeleteOperation,
 | |
| 		Path:      "roles/" + n,
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func testAccStepReadPolicy(t *testing.T, name string, value string) logicaltest.TestStep {
 | |
| 	return logicaltest.TestStep{
 | |
| 		Operation: logical.ReadOperation,
 | |
| 		Path:      "roles/" + name,
 | |
| 		Check: func(resp *logical.Response) error {
 | |
| 			if resp == nil {
 | |
| 				if value == "" {
 | |
| 					return nil
 | |
| 				}
 | |
| 
 | |
| 				return fmt.Errorf("bad: %#v", resp)
 | |
| 			}
 | |
| 
 | |
| 			var d struct {
 | |
| 				Policy string `mapstructure:"policy"`
 | |
| 			}
 | |
| 			if err := mapstructure.Decode(resp.Data, &d); err != nil {
 | |
| 				return err
 | |
| 			}
 | |
| 
 | |
| 			if d.Policy != value {
 | |
| 				return fmt.Errorf("bad: %#v", resp)
 | |
| 			}
 | |
| 
 | |
| 			return nil
 | |
| 		},
 | |
| 	}
 | |
| }
 | |
| 
 | |
| const testPolicy = `
 | |
| {
 | |
|     "Version": "2012-10-17",
 | |
|     "Statement": [
 | |
|         {
 | |
|             "Sid": "Stmt1426528957000",
 | |
|             "Effect": "Allow",
 | |
|             "Action": [
 | |
|                 "ec2:*"
 | |
|             ],
 | |
|             "Resource": [
 | |
|                 "*"
 | |
|             ]
 | |
|         }
 | |
|     ]
 | |
| }
 | |
| `
 | 
