go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/providers-sdk/v1/vault/hashivault/hashivault_test.go (about)

     1  // Copyright (c) Mondoo, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  //go:build debugtest
     5  // +build debugtest
     6  
     7  package hashivault
     8  
     9  import (
    10  	"context"
    11  	"encoding/json"
    12  	"testing"
    13  
    14  	"github.com/hashicorp/vault/api"
    15  	"github.com/stretchr/testify/assert"
    16  	"github.com/stretchr/testify/require"
    17  	"go.mondoo.com/cnquery/providers-sdk/v1/vault"
    18  )
    19  
    20  func TestHashiVault(t *testing.T) {
    21  	endpoint := "http://127.0.0.1:8200"
    22  	token := "secretgoeshere"
    23  
    24  	// store secret
    25  	c, err := client(endpoint, token)
    26  	require.NoError(t, err)
    27  	ctx := context.Background()
    28  
    29  	key := "test-key"
    30  	fields := map[string]string{
    31  		"key":  "value",
    32  		"key2": "value2",
    33  	}
    34  	id, err := set(c, key, fields)
    35  	require.NoError(t, err)
    36  
    37  	// get secret
    38  	v := New(endpoint, token)
    39  	newCred, err := v.Get(ctx, id)
    40  	require.NoError(t, err)
    41  
    42  	jsonSecret := make(map[string]string)
    43  	err = json.Unmarshal(newCred.Data, &jsonSecret)
    44  	require.NoError(t, err)
    45  
    46  	assert.Equal(t, jsonSecret, fields)
    47  }
    48  
    49  func client(endpoint string, token string) (*api.Client, error) {
    50  	c, err := api.NewClient(&api.Config{
    51  		Address: endpoint,
    52  	})
    53  	if err != nil {
    54  		return nil, err
    55  	}
    56  	if token != "" {
    57  		c.SetToken(token)
    58  	}
    59  	return c, nil
    60  }
    61  
    62  func set(c *api.Client, key string, fields map[string]string) (*vault.SecretID, error) {
    63  	err := validKey(key)
    64  	if err != nil {
    65  		return nil, err
    66  	}
    67  
    68  	// convert creds fields to vault struct
    69  	// TODO: we could store labels as part of the content fields, may not look as nice
    70  	// see https://github.com/hashicorp/vault/issues/7905
    71  	data := map[string]interface{}{}
    72  	for k, v := range fields {
    73  		data[k] = v
    74  	}
    75  
    76  	// encapsulate data into v2 secrets api
    77  	secretData := map[string]interface{}{
    78  		"data": data,
    79  	}
    80  
    81  	// store secret
    82  	_, err = c.Logical().Write(vaultSecretId(key), secretData)
    83  	if err != nil {
    84  		return nil, err
    85  	}
    86  
    87  	return &vault.SecretID{Key: key}, nil
    88  }