Files
grafana/pkg/services/secrets/kvstore/migrations/migrator.go
lean.dev e1785f4eb4 Secret migration from Sql KV Store to Secret Plugin (#52191)
* Created PluginSecretMigrationService to be able to migrate from the secrets table from the database to the secret plugin. Added migration which takes all the secrets at the sql store and stores it in the plugin. Then deletes all the secrets from the sql
* Added secretsKVStoreSQL.GetAll() method to return all the secrets at the sql table
* Renaming kvstore_test.go as sql_test.go, adding GetAll test case. Fixing decryption of keys
2022-07-19 14:42:23 -03:00

57 lines
1.9 KiB
Go

package migrations
import (
"context"
"reflect"
"time"
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/infra/serverlock"
datasources "github.com/grafana/grafana/pkg/services/datasources/service"
"github.com/grafana/grafana/pkg/services/secrets/kvstore"
)
var logger = log.New("secret.migration")
// SecretMigrationService is used to migrate legacy secrets to new unified secrets.
type SecretMigrationService interface {
Migrate(ctx context.Context) error
}
type SecretMigrationServiceImpl struct {
Services []SecretMigrationService
ServerLockService *serverlock.ServerLockService
}
func ProvideSecretMigrationService(
serverLockService *serverlock.ServerLockService,
dataSourceSecretMigrationService *datasources.DataSourceSecretMigrationService,
pluginSecretMigrationService *kvstore.PluginSecretMigrationService,
) *SecretMigrationServiceImpl {
services := make([]SecretMigrationService, 0)
services = append(services, dataSourceSecretMigrationService)
// pluginMigrationService should always be the last one
services = append(services, pluginSecretMigrationService)
return &SecretMigrationServiceImpl{
ServerLockService: serverLockService,
Services: services,
}
}
// Migrate Run migration services. This will block until all services have exited.
func (s *SecretMigrationServiceImpl) Migrate(ctx context.Context) error {
// Start migration services.
return s.ServerLockService.LockAndExecute(ctx, "migrate secrets to unified secrets", time.Minute*10, func(context.Context) {
for _, service := range s.Services {
serviceName := reflect.TypeOf(service).String()
logger.Debug("Starting secret migration service", "service", serviceName)
err := service.Migrate(ctx)
if err != nil {
logger.Error("Stopped secret migration service", "service", serviceName, "reason", err)
}
logger.Debug("Finished secret migration service", "service", serviceName)
}
})
}