github.com/hashicorp/vault/sdk@v0.13.0/plugin/mock/path_kv.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: MPL-2.0 3 4 package mock 5 6 import ( 7 "context" 8 9 "github.com/hashicorp/errwrap" 10 "github.com/hashicorp/vault/sdk/framework" 11 "github.com/hashicorp/vault/sdk/logical" 12 ) 13 14 // kvPaths is used to test CRUD and List operations. It is a simplified 15 // version of the passthrough backend that only accepts string values. 16 func kvPaths(b *backend) []*framework.Path { 17 return []*framework.Path{ 18 { 19 Pattern: "kv/?", 20 Callbacks: map[logical.Operation]framework.OperationFunc{ 21 logical.ListOperation: b.pathKVList, 22 }, 23 }, 24 { 25 Pattern: "kv/" + framework.GenericNameRegex("key"), 26 Fields: map[string]*framework.FieldSchema{ 27 "key": {Type: framework.TypeString}, 28 "value": {Type: framework.TypeString}, 29 "version": {Type: framework.TypeInt}, 30 }, 31 ExistenceCheck: b.pathExistenceCheck, 32 Callbacks: map[logical.Operation]framework.OperationFunc{ 33 logical.ReadOperation: b.pathKVRead, 34 logical.CreateOperation: b.pathKVCreateUpdate, 35 logical.UpdateOperation: b.pathKVCreateUpdate, 36 logical.DeleteOperation: b.pathKVDelete, 37 }, 38 }, 39 } 40 } 41 42 func (b *backend) pathExistenceCheck(ctx context.Context, req *logical.Request, data *framework.FieldData) (bool, error) { 43 out, err := req.Storage.Get(ctx, req.Path) 44 if err != nil { 45 return false, errwrap.Wrapf("existence check failed: {{err}}", err) 46 } 47 48 return out != nil, nil 49 } 50 51 func (b *backend) pathKVRead(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { 52 version := data.Get("version").(int) 53 54 entry, err := req.Storage.Get(ctx, req.Path) 55 if err != nil { 56 return nil, err 57 } 58 59 if entry == nil { 60 return nil, nil 61 } 62 63 value := string(entry.Value) 64 65 b.Logger().Info("reading value", "key", req.Path, "value", value) 66 // Return the secret 67 resp := &logical.Response{ 68 Data: map[string]interface{}{ 69 "value": value, 70 "version": version, 71 }, 72 } 73 if version != 0 { 74 resp.Data["version"] = version 75 } 76 return resp, nil 77 } 78 79 func (b *backend) pathKVCreateUpdate(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { 80 value := data.Get("value").(string) 81 82 b.Logger().Info("storing value", "key", req.Path, "value", value) 83 entry := &logical.StorageEntry{ 84 Key: req.Path, 85 Value: []byte(value), 86 } 87 88 s := req.Storage 89 err := s.Put(ctx, entry) 90 if err != nil { 91 return nil, err 92 } 93 94 return &logical.Response{ 95 Data: map[string]interface{}{ 96 "value": value, 97 }, 98 }, nil 99 } 100 101 func (b *backend) pathKVDelete(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { 102 if err := req.Storage.Delete(ctx, req.Path); err != nil { 103 return nil, err 104 } 105 106 return nil, nil 107 } 108 109 func (b *backend) pathKVList(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) { 110 vals, err := req.Storage.List(ctx, "kv/") 111 if err != nil { 112 return nil, err 113 } 114 return logical.ListResponse(vals), nil 115 }