CloudMigration: Provide a stats rollup in the GetSnapshot response (#90252)

* order session list descending

* add snapshot status method to store

* query stats while retrieving snapshot

* return stats in dto

* swagger

* fix tests

* commit results of bingo get

* fix swagger

* minor improvement

* fix typo

* forgot a file
This commit is contained in:
Michael Mandrus
2024-07-10 08:46:38 -04:00
committed by GitHub
parent a3dfc894f7
commit 317da43a84
11 changed files with 190 additions and 25 deletions
@@ -332,7 +332,7 @@ func (s *Service) GetSession(ctx context.Context, uid string) (*cloudmigration.C
}
func (s *Service) GetSessionList(ctx context.Context) (*cloudmigration.CloudMigrationSessionListResponse, error) {
values, err := s.store.GetAllCloudMigrationSessions(ctx)
values, err := s.store.GetCloudMigrationSessionList(ctx)
if err != nil {
return nil, err
}
@@ -9,7 +9,7 @@ import (
type store interface {
CreateMigrationSession(ctx context.Context, session cloudmigration.CloudMigrationSession) (*cloudmigration.CloudMigrationSession, error)
GetMigrationSessionByUID(ctx context.Context, uid string) (*cloudmigration.CloudMigrationSession, error)
GetAllCloudMigrationSessions(ctx context.Context) ([]*cloudmigration.CloudMigrationSession, error)
GetCloudMigrationSessionList(ctx context.Context) ([]*cloudmigration.CloudMigrationSession, error)
DeleteMigrationSessionByUID(ctx context.Context, uid string) (*cloudmigration.CloudMigrationSession, error)
CreateMigrationRun(ctx context.Context, cmr cloudmigration.CloudMigrationSnapshot) (string, error)
@@ -23,5 +23,6 @@ type store interface {
CreateUpdateSnapshotResources(ctx context.Context, snapshotUid string, resources []cloudmigration.CloudMigrationResource) error
GetSnapshotResources(ctx context.Context, snapshotUid string, page int, limit int) ([]cloudmigration.CloudMigrationResource, error)
GetSnapshotResourceStats(ctx context.Context, snapshotUid string) (*cloudmigration.SnapshotResourceStats, error)
DeleteSnapshotResources(ctx context.Context, snapshotUid string) error
}
@@ -20,6 +20,10 @@ type sqlStore struct {
secretsService secrets.Service
}
const (
tableName = "cloud_migration_resource"
)
func (ss *sqlStore) GetMigrationSessionByUID(ctx context.Context, uid string) (*cloudmigration.CloudMigrationSession, error) {
var cm cloudmigration.CloudMigrationSession
err := ss.db.WithDbSession(ctx, func(sess *db.Session) error {
@@ -78,9 +82,12 @@ func (ss *sqlStore) CreateMigrationSession(ctx context.Context, migration cloudm
return &migration, nil
}
func (ss *sqlStore) GetAllCloudMigrationSessions(ctx context.Context) ([]*cloudmigration.CloudMigrationSession, error) {
func (ss *sqlStore) GetCloudMigrationSessionList(ctx context.Context) ([]*cloudmigration.CloudMigrationSession, error) {
var migrations = make([]*cloudmigration.CloudMigrationSession, 0)
err := ss.db.WithDbSession(ctx, func(sess *db.Session) error { return sess.Find(&migrations) })
err := ss.db.WithDbSession(ctx, func(sess *db.Session) error {
sess.OrderBy("created DESC")
return sess.Find(&migrations)
})
if err != nil {
return nil, err
}
@@ -227,6 +234,10 @@ func (ss *sqlStore) GetSnapshotByUID(ctx context.Context, uid string, resultPage
if err == nil {
snapshot.Resources = resources
}
stats, err := ss.GetSnapshotResourceStats(ctx, uid)
if err == nil {
snapshot.StatsRollup = *stats
}
return &snapshot, err
}
@@ -249,6 +260,12 @@ func (ss *sqlStore) GetSnapshotList(ctx context.Context, query cloudmigration.Li
if err := ss.decryptKey(ctx, &snapshot); err != nil {
return nil, err
}
if stats, err := ss.GetSnapshotResourceStats(ctx, snapshot.UID); err != nil {
return nil, err
} else {
snapshot.StatsRollup = *stats
}
snapshots[i] = snapshot
}
return snapshots, nil
@@ -309,6 +326,46 @@ func (ss *sqlStore) GetSnapshotResources(ctx context.Context, snapshotUid string
return resources, nil
}
func (ss *sqlStore) GetSnapshotResourceStats(ctx context.Context, snapshotUid string) (*cloudmigration.SnapshotResourceStats, error) {
typeCounts := make([]struct {
Count int `json:"count"`
Type string `json:"type"`
}, 0)
statusCounts := make([]struct {
Count int `json:"count"`
Status string `json:"status"`
}, 0)
err := ss.db.WithDbSession(ctx, func(sess *sqlstore.DBSession) error {
sess.Select("count(uid) as 'count', resource_type as 'type'").
Table(tableName).
GroupBy("type").
Where("snapshot_uid = ?", snapshotUid)
if err := sess.Find(&typeCounts); err != nil {
return err
}
sess.Select("count(uid) as 'count', status").
Table(tableName).
GroupBy("status").
Where("snapshot_uid = ?", snapshotUid)
return sess.Find(&statusCounts)
})
if err != nil {
return nil, err
}
stats := &cloudmigration.SnapshotResourceStats{
CountsByType: make(map[cloudmigration.MigrateDataType]int, len(typeCounts)),
CountsByStatus: make(map[cloudmigration.ItemStatus]int, len(statusCounts)),
}
for _, c := range typeCounts {
stats.CountsByType[cloudmigration.MigrateDataType(c.Type)] = c.Count
}
for _, c := range statusCounts {
stats.CountsByStatus[cloudmigration.ItemStatus(c.Status)] = c.Count
}
return stats, nil
}
func (ss *sqlStore) DeleteSnapshotResources(ctx context.Context, snapshotUid string) error {
return ss.db.WithDbSession(ctx, func(sess *sqlstore.DBSession) error {
_, err := sess.Delete(cloudmigration.CloudMigrationResource{
@@ -25,7 +25,7 @@ func Test_GetAllCloudMigrationSessions(t *testing.T) {
ctx := context.Background()
t.Run("get all cloud_migration_session entries", func(t *testing.T) {
value, err := s.GetAllCloudMigrationSessions(ctx)
value, err := s.GetCloudMigrationSessionList(ctx)
require.NoError(t, err)
require.Equal(t, 3, len(value))
for _, m := range value {
@@ -245,6 +245,19 @@ func Test_SnapshotResources(t *testing.T) {
}
}
// check stats
stats, err := s.GetSnapshotResourceStats(ctx, "poiuy")
assert.NoError(t, err)
assert.Equal(t, map[cloudmigration.MigrateDataType]int{
cloudmigration.DatasourceDataType: 2,
cloudmigration.DashboardDataType: 1,
cloudmigration.FolderDataType: 1,
}, stats.CountsByType)
assert.Equal(t, map[cloudmigration.ItemStatus]int{
cloudmigration.ItemStatusOK: 3,
cloudmigration.ItemStatusPending: 1,
}, stats.CountsByStatus)
// delete snapshot resources
err = s.DeleteSnapshotResources(ctx, "poiuy")
assert.NoError(t, err)