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  }