get.porter.sh/porter@v1.3.0/pkg/storage/parameter_store_test.go (about)

     1  package storage
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  	"time"
     7  
     8  	"get.porter.sh/porter/pkg/secrets"
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  func TestParameterStore_CRUD(t *testing.T) {
    13  	paramStore := NewTestParameterProvider(t)
    14  	defer paramStore.Close()
    15  
    16  	ctx := context.Background()
    17  	params, err := paramStore.ListParameterSets(ctx, ListOptions{Namespace: "dev"})
    18  	require.NoError(t, err)
    19  	require.Empty(t, params, "Find should return no entries")
    20  
    21  	myParamSet := NewParameterSet("dev", "myparams",
    22  		secrets.SourceMap{
    23  			Name: "myparam",
    24  			Source: secrets.Source{
    25  				Strategy: "value",
    26  				Hint:     "myparamvalue",
    27  			},
    28  		})
    29  	myParamSet.Status.Created = time.Date(2020, 1, 1, 12, 0, 0, 0, time.UTC)
    30  	myParamSet.Status.Modified = myParamSet.Status.Created
    31  
    32  	err = paramStore.InsertParameterSet(ctx, myParamSet)
    33  	require.NoError(t, err, "Insert should successfully save")
    34  
    35  	params, err = paramStore.ListParameterSets(ctx, ListOptions{Namespace: "dev"})
    36  	require.NoError(t, err)
    37  	require.Len(t, params, 1, "expected 1 parameter set")
    38  	require.Equal(t, myParamSet.Name, params[0].Name, "expected to retrieve myparam")
    39  
    40  	params, err = paramStore.ListParameterSets(ctx, ListOptions{})
    41  	require.NoError(t, err)
    42  	require.Len(t, params, 0, "expected no global parameter sets")
    43  
    44  	params, err = paramStore.ListParameterSets(ctx, ListOptions{Namespace: "*"})
    45  	require.NoError(t, err)
    46  	require.Len(t, params, 1, "expected 1 parameter set defined in all namespaces")
    47  
    48  	pset, err := paramStore.GetParameterSet(ctx, myParamSet.Namespace, myParamSet.Name)
    49  	require.NoError(t, err)
    50  	require.Equal(t, myParamSet, pset, "Get should return the saved parameter set")
    51  
    52  	myParamSet2 := NewParameterSet("dev", "myparams2",
    53  		secrets.SourceMap{
    54  			Name: "myparam2",
    55  			Source: secrets.Source{
    56  				Strategy: "value2",
    57  				Hint:     "myparamvalue2",
    58  			},
    59  		})
    60  	myParamSet2.Status.Created = time.Date(2020, 1, 1, 12, 0, 0, 0, time.UTC)
    61  	myParamSet2.Status.Modified = myParamSet2.Status.Created
    62  
    63  	err = paramStore.InsertParameterSet(ctx, myParamSet2)
    64  	require.NoError(t, err, "Insert should successfully save")
    65  
    66  	params, err = paramStore.ListParameterSets(ctx, ListOptions{Namespace: "dev", Skip: 1})
    67  	require.NoError(t, err)
    68  	require.Len(t, params, 1, "expected 1 parameter set")
    69  	require.Equal(t, myParamSet2.Name, params[0].Name, "expected to retrieve myparam2")
    70  
    71  	params, err = paramStore.ListParameterSets(ctx, ListOptions{Namespace: "dev", Limit: 1})
    72  	require.NoError(t, err)
    73  	require.Len(t, params, 1, "expected 1 parameter set")
    74  	require.Equal(t, myParamSet.Name, params[0].Name, "expected to retrieve myparam")
    75  
    76  	err = paramStore.RemoveParameterSet(ctx, myParamSet.Namespace, myParamSet.Name)
    77  	require.NoError(t, err, "Remove should successfully delete the parameter set")
    78  
    79  	err = paramStore.RemoveParameterSet(ctx, myParamSet2.Namespace, myParamSet2.Name)
    80  	require.NoError(t, err, "Remove should successfully delete the parameter set")
    81  
    82  	params, err = paramStore.ListParameterSets(ctx, ListOptions{Namespace: "dev"})
    83  	require.NoError(t, err)
    84  	require.Empty(t, params, "List should return no entries")
    85  
    86  	_, err = paramStore.GetParameterSet(ctx, "", myParamSet.Name)
    87  	require.ErrorIs(t, err, ErrNotFound{})
    88  
    89  	_, err = paramStore.GetParameterSet(ctx, "", myParamSet2.Name)
    90  	require.ErrorIs(t, err, ErrNotFound{})
    91  }
    92  
    93  func TestParameterStorage_ResolveNonSecret(t *testing.T) {
    94  	testParameterSet := NewParameterSet("", "myparamset",
    95  		secrets.SourceMap{
    96  			Name: "param1",
    97  			Source: secrets.Source{
    98  				Strategy: "secret",
    99  				Hint:     "param1",
   100  			},
   101  		},
   102  		secrets.SourceMap{
   103  			Name: "param2",
   104  			Source: secrets.Source{
   105  				Strategy: "value",
   106  				Hint:     "param2_value",
   107  			},
   108  		})
   109  
   110  	paramStore := NewTestParameterProvider(t)
   111  	defer paramStore.Close()
   112  
   113  	paramStore.AddSecret("param1", "param1_value")
   114  
   115  	expected := secrets.Set{
   116  		"param1": "param1_value",
   117  		"param2": "param2_value",
   118  	}
   119  
   120  	resolved, err := paramStore.ResolveAll(context.Background(), testParameterSet, testParameterSet.Keys())
   121  	require.NoError(t, err)
   122  	require.Equal(t, expected, resolved)
   123  }
   124  
   125  func TestParameterStorage_ResolveAll(t *testing.T) {
   126  	// The inmemory secret store currently only supports secret sources
   127  	// So all of these have this same source
   128  	testParameterSet := NewParameterSet("", "myparamset",
   129  		secrets.SourceMap{
   130  			Name: "param1",
   131  			Source: secrets.Source{
   132  				Strategy: "secret",
   133  				Hint:     "param1",
   134  			},
   135  		},
   136  		secrets.SourceMap{
   137  			Name: "param2",
   138  			Source: secrets.Source{
   139  				Strategy: "secret",
   140  				Hint:     "param2",
   141  			},
   142  		})
   143  
   144  	t.Run("resolve params success", func(t *testing.T) {
   145  		paramStore := NewTestParameterProvider(t)
   146  		defer paramStore.Close()
   147  
   148  		paramStore.AddSecret("param1", "param1_value")
   149  		paramStore.AddSecret("param2", "param2_value")
   150  
   151  		expected := secrets.Set{
   152  			"param1": "param1_value",
   153  			"param2": "param2_value",
   154  		}
   155  
   156  		resolved, err := paramStore.ResolveAll(context.Background(), testParameterSet, testParameterSet.Keys())
   157  		require.NoError(t, err)
   158  		require.Equal(t, expected, resolved)
   159  	})
   160  
   161  	t.Run("resolve params only resolves the requested keys", func(t *testing.T) {
   162  		paramStore := NewTestParameterProvider(t)
   163  		defer paramStore.Close()
   164  
   165  		paramStore.AddSecret("param1", "param1_value")
   166  		paramStore.AddSecret("param2", "param2_value")
   167  
   168  		expected := secrets.Set{
   169  			"param1": "param1_value",
   170  		}
   171  
   172  		resolved, err := paramStore.ResolveAll(context.Background(), testParameterSet, []string{"param1"})
   173  		require.NoError(t, err)
   174  		require.Equal(t, expected, resolved)
   175  	})
   176  
   177  	t.Run("resolve params failure", func(t *testing.T) {
   178  		paramStore := NewTestParameterProvider(t)
   179  		defer paramStore.Close()
   180  
   181  		// Purposefully only adding one secret
   182  		paramStore.AddSecret("param1", "param1_value")
   183  
   184  		expected := secrets.Set{
   185  			"param1": "param1_value",
   186  			"param2": "",
   187  		}
   188  
   189  		resolved, err := paramStore.ResolveAll(context.Background(), testParameterSet, testParameterSet.Keys())
   190  		require.EqualError(t, err, "1 error occurred:\n\t* unable to resolve parameter myparamset.param2 from secret param2: secret not found\n\n")
   191  		require.Equal(t, expected, resolved)
   192  	})
   193  }
   194  
   195  func TestParameterStorage_Validate(t *testing.T) {
   196  	t.Run("valid sources", func(t *testing.T) {
   197  		s := ParameterStore{}
   198  
   199  		testParameterSet := NewParameterSet("", "myparams",
   200  			secrets.SourceMap{
   201  				Source: secrets.Source{
   202  					Strategy: "env",
   203  					Hint:     "SOME_ENV",
   204  				},
   205  			},
   206  			secrets.SourceMap{
   207  				Source: secrets.Source{
   208  					Strategy: "value",
   209  					Hint:     "somevalue",
   210  				},
   211  			},
   212  			secrets.SourceMap{
   213  				Source: secrets.Source{
   214  					Strategy: "path",
   215  					Hint:     "/some/path",
   216  				},
   217  			},
   218  			secrets.SourceMap{
   219  				Source: secrets.Source{
   220  					Strategy: "command",
   221  					Hint:     "some command",
   222  				},
   223  			},
   224  			secrets.SourceMap{
   225  				Source: secrets.Source{
   226  					Strategy: "secret",
   227  					Hint:     "secret",
   228  				},
   229  			})
   230  
   231  		err := s.Validate(context.Background(), testParameterSet)
   232  		require.NoError(t, err, "Validate did not return errors")
   233  	})
   234  
   235  	t.Run("invalid sources", func(t *testing.T) {
   236  		s := ParameterStore{}
   237  		testParameterSet := NewParameterSet("", "myparams",
   238  			secrets.SourceMap{
   239  				Source: secrets.Source{
   240  					Strategy: "wrongthing",
   241  					Hint:     "SOME_ENV",
   242  				},
   243  			},
   244  			secrets.SourceMap{
   245  				Source: secrets.Source{
   246  					Strategy: "anotherwrongthing",
   247  					Hint:     "somevalue",
   248  				},
   249  			})
   250  
   251  		err := s.Validate(context.Background(), testParameterSet)
   252  		require.Error(t, err, "Validate returned errors")
   253  	})
   254  }