99 "github.com/grafana/grafana/pkg/infra/db"
1010 "github.com/grafana/grafana/pkg/services/cloudmigration"
1111 "github.com/grafana/grafana/pkg/services/secrets"
12+ secretskv "github.com/grafana/grafana/pkg/services/secrets/kvstore"
1213 "github.com/grafana/grafana/pkg/services/sqlstore"
1314 "github.com/grafana/grafana/pkg/util"
1415)
@@ -17,11 +18,13 @@ var _ store = (*sqlStore)(nil)
1718
1819type sqlStore struct {
1920 db db.DB
21+ secretsStore secretskv.SecretsKVStore
2022 secretsService secrets.Service
2123}
2224
2325const (
24- tableName = "cloud_migration_resource"
26+ tableName = "cloud_migration_resource"
27+ secretType = "cloudmigration-snapshot-encryption-key"
2528)
2629
2730func (ss * sqlStore ) GetMigrationSessionByUID (ctx context.Context , uid string ) (* cloudmigration.CloudMigrationSession , error ) {
@@ -157,14 +160,14 @@ func (ss *sqlStore) GetMigrationStatusList(ctx context.Context, migrationUID str
157160}
158161
159162func (ss * sqlStore ) CreateSnapshot (ctx context.Context , snapshot cloudmigration.CloudMigrationSnapshot ) (string , error ) {
160- if err := ss .encryptKey (ctx , & snapshot ); err != nil {
161- return "" , err
162- }
163-
164163 if snapshot .UID == "" {
165164 snapshot .UID = util .GenerateShortUID ()
166165 }
167166
167+ if err := ss .secretsStore .Set (ctx , secretskv .AllOrganizations , snapshot .UID , secretType , string (snapshot .EncryptionKey )); err != nil {
168+ return "" , err
169+ }
170+
168171 err := ss .db .WithDbSession (ctx , func (sess * sqlstore.DBSession ) error {
169172 snapshot .Created = time .Now ()
170173 snapshot .Updated = time .Now ()
@@ -228,8 +231,12 @@ func (ss *sqlStore) GetSnapshotByUID(ctx context.Context, uid string, resultPage
228231 return nil , err
229232 }
230233
231- if err := ss .decryptKey (ctx , & snapshot ); err != nil {
234+ if secret , found , err := ss .secretsStore . Get (ctx , secretskv . AllOrganizations , snapshot . UID , secretType ); err != nil {
232235 return & snapshot , err
236+ } else if ! found {
237+ return & snapshot , fmt .Errorf ("encryption key not found for snapshot with UID %s" , snapshot .UID )
238+ } else {
239+ snapshot .EncryptionKey = []byte (secret )
233240 }
234241
235242 resources , err := ss .GetSnapshotResources (ctx , uid , resultPage , resultLimit )
@@ -259,8 +266,12 @@ func (ss *sqlStore) GetSnapshotList(ctx context.Context, query cloudmigration.Li
259266 return nil , err
260267 }
261268 for i , snapshot := range snapshots {
262- if err := ss .decryptKey (ctx , & snapshot ); err != nil {
269+ if secret , found , err := ss .secretsStore . Get (ctx , secretskv . AllOrganizations , snapshot . UID , secretType ); err != nil {
263270 return nil , err
271+ } else if ! found {
272+ return nil , fmt .Errorf ("encryption key not found for snapshot with UID %s" , snapshot .UID )
273+ } else {
274+ snapshot .EncryptionKey = []byte (secret )
264275 }
265276
266277 if stats , err := ss .GetSnapshotResourceStats (ctx , snapshot .UID ); err != nil {
@@ -346,14 +357,14 @@ func (ss *sqlStore) GetSnapshotResourceStats(ctx context.Context, snapshotUid st
346357 } else {
347358 total = int (t )
348359 }
349- sess .Select ("count(uid) as ' count' , resource_type as ' type' " ).
360+ sess .Select ("count(uid) as \" count\" , resource_type as \" type\" " ).
350361 Table (tableName ).
351362 GroupBy ("type" ).
352363 Where ("snapshot_uid = ?" , snapshotUid )
353364 if err := sess .Find (& typeCounts ); err != nil {
354365 return err
355366 }
356- sess .Select ("count(uid) as ' count' , status" ).
367+ sess .Select ("count(uid) as \" count\" , status" ).
357368 Table (tableName ).
358369 GroupBy ("status" ).
359370 Where ("snapshot_uid = ?" , snapshotUid )
@@ -411,24 +422,3 @@ func (ss *sqlStore) decryptToken(ctx context.Context, cm *cloudmigration.CloudMi
411422
412423 return nil
413424}
414-
415- func (ss * sqlStore ) encryptKey (ctx context.Context , snapshot * cloudmigration.CloudMigrationSnapshot ) error {
416- s , err := ss .secretsService .Encrypt (ctx , snapshot .EncryptionKey , secrets .WithoutScope ())
417- if err != nil {
418- return fmt .Errorf ("encrypting key: %w" , err )
419- }
420-
421- snapshot .EncryptionKey = s
422-
423- return nil
424- }
425-
426- func (ss * sqlStore ) decryptKey (ctx context.Context , snapshot * cloudmigration.CloudMigrationSnapshot ) error {
427- t , err := ss .secretsService .Decrypt (ctx , snapshot .EncryptionKey )
428- if err != nil {
429- return fmt .Errorf ("decrypting key: %w" , err )
430- }
431- snapshot .EncryptionKey = t
432-
433- return nil
434- }
0 commit comments