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 }