mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
* start on tokens * more error messages * more handling * rephrased with suggestions from Daniel * separate gms parse method * use translation * refactor initial idea to use error obj * use error dto result * handle gms client * clean logs and comments * fix tests * tests for gms * test and lint * lint * one more handling from gms * typing in fe * use error interface * use validation error * remove unused gms error * use errorlib and helper function in fe * regen api * use same error util * one more error to handle
267 lines
9.1 KiB
Go
267 lines
9.1 KiB
Go
package cloudmigration
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/grafana/grafana/pkg/apimachinery/errutil"
|
|
)
|
|
|
|
var (
|
|
ErrInternalNotImplementedError = errutil.Internal("cloudmigrations.notImplemented").Errorf("Internal server error")
|
|
ErrFeatureDisabledError = errutil.Internal("cloudmigrations.disabled").Errorf("Cloud migrations are disabled on this instance")
|
|
ErrMigrationNotFound = errutil.NotFound("cloudmigrations.sessionNotFound").Errorf("Session not found")
|
|
ErrMigrationRunNotFound = errutil.NotFound("cloudmigrations.migrationRunNotFound").Errorf("Migration run not found")
|
|
ErrMigrationNotDeleted = errutil.Internal("cloudmigrations.sessionNotDeleted").Errorf("Session not deleted")
|
|
ErrTokenNotFound = errutil.NotFound("cloudmigrations.tokenNotFound").Errorf("Token not found")
|
|
ErrSnapshotNotFound = errutil.NotFound("cloudmigrations.snapshotNotFound").Errorf("Snapshot not found")
|
|
)
|
|
|
|
// CloudMigration domain structs
|
|
|
|
// CloudMigrationSession represents a configured migration token
|
|
type CloudMigrationSession struct {
|
|
ID int64 `xorm:"pk autoincr 'id'"`
|
|
UID string `xorm:"uid"`
|
|
AuthToken string
|
|
Slug string
|
|
StackID int `xorm:"stack_id"`
|
|
RegionSlug string
|
|
ClusterSlug string
|
|
Created time.Time
|
|
Updated time.Time
|
|
}
|
|
|
|
// CloudMigrationSnapshot contains all of the metadata about a snapshot
|
|
type CloudMigrationSnapshot struct {
|
|
ID int64 `xorm:"pk autoincr 'id'"`
|
|
UID string `xorm:"uid"`
|
|
SessionUID string `xorm:"session_uid"`
|
|
Status SnapshotStatus
|
|
EncryptionKey []byte `xorm:"-"` // stored in the unified secrets table
|
|
LocalDir string `xorm:"local_directory"`
|
|
GMSSnapshotUID string `xorm:"gms_snapshot_uid"`
|
|
ErrorString string `xorm:"error_string"`
|
|
Created time.Time
|
|
Updated time.Time
|
|
Finished time.Time
|
|
|
|
// Stored in the cloud_migration_resource table
|
|
Resources []CloudMigrationResource `xorm:"-"`
|
|
// Derived by querying the cloud_migration_resource table
|
|
StatsRollup SnapshotResourceStats `xorm:"-"`
|
|
}
|
|
|
|
type SnapshotStatus string
|
|
|
|
const (
|
|
SnapshotStatusCreating SnapshotStatus = "creating"
|
|
SnapshotStatusPendingUpload SnapshotStatus = "pending_upload"
|
|
SnapshotStatusUploading SnapshotStatus = "uploading"
|
|
SnapshotStatusPendingProcessing SnapshotStatus = "pending_processing"
|
|
SnapshotStatusProcessing SnapshotStatus = "processing"
|
|
SnapshotStatusFinished SnapshotStatus = "finished"
|
|
SnapshotStatusCanceled SnapshotStatus = "canceled"
|
|
SnapshotStatusError SnapshotStatus = "error"
|
|
)
|
|
|
|
type CloudMigrationResource struct {
|
|
ID int64 `xorm:"pk autoincr 'id'"`
|
|
UID string `xorm:"uid"`
|
|
|
|
Name string `xorm:"name" json:"name"`
|
|
Type MigrateDataType `xorm:"resource_type" json:"type"`
|
|
RefID string `xorm:"resource_uid" json:"refId"`
|
|
Status ItemStatus `xorm:"status" json:"status"`
|
|
Error string `xorm:"error_string" json:"error"`
|
|
ErrorCode ResourceErrorCode `xorm:"error_code" json:"error_code"`
|
|
|
|
SnapshotUID string `xorm:"snapshot_uid"`
|
|
ParentName string `xorm:"parent_name" json:"parentName"`
|
|
}
|
|
|
|
type MigrateDataType string
|
|
|
|
const (
|
|
DashboardDataType MigrateDataType = "DASHBOARD"
|
|
DatasourceDataType MigrateDataType = "DATASOURCE"
|
|
FolderDataType MigrateDataType = "FOLDER"
|
|
LibraryElementDataType MigrateDataType = "LIBRARY_ELEMENT"
|
|
AlertRuleType MigrateDataType = "ALERT_RULE"
|
|
ContactPointType MigrateDataType = "CONTACT_POINT"
|
|
NotificationPolicyType MigrateDataType = "NOTIFICATION_POLICY"
|
|
NotificationTemplateType MigrateDataType = "NOTIFICATION_TEMPLATE"
|
|
MuteTimingType MigrateDataType = "MUTE_TIMING"
|
|
)
|
|
|
|
type ItemStatus string
|
|
|
|
const (
|
|
ItemStatusOK ItemStatus = "OK"
|
|
ItemStatusWarning ItemStatus = "WARNING"
|
|
ItemStatusError ItemStatus = "ERROR"
|
|
ItemStatusPending ItemStatus = "PENDING"
|
|
)
|
|
|
|
type ResourceErrorCode string
|
|
|
|
const (
|
|
ErrDatasourceNameConflict ResourceErrorCode = "DATASOURCE_NAME_CONFLICT"
|
|
ErrDashboardAlreadyManaged ResourceErrorCode = "DASHBOARD_ALREADY_MANAGED"
|
|
ErrLibraryElementNameConflict ResourceErrorCode = "LIBRARY_ELEMENT_NAME_CONFLICT"
|
|
ErrUnsupportedDataType ResourceErrorCode = "UNSUPPORTED_DATA_TYPE"
|
|
ErrResourceConflict ResourceErrorCode = "RESOURCE_CONFLICT"
|
|
ErrUnexpectedStatus ResourceErrorCode = "UNEXPECTED_STATUS_CODE"
|
|
ErrInternalServiceError ResourceErrorCode = "INTERNAL_SERVICE_ERROR"
|
|
ErrOnlyCoreDataSources ResourceErrorCode = "ONLY_CORE_DATA_SOURCES"
|
|
ErrGeneric ResourceErrorCode = "GENERIC_ERROR"
|
|
)
|
|
|
|
type SnapshotResourceStats struct {
|
|
CountsByType map[MigrateDataType]int
|
|
CountsByStatus map[ItemStatus]int
|
|
Total int
|
|
}
|
|
|
|
// Deprecated, use GetSnapshotResult for the async workflow
|
|
func (s CloudMigrationSnapshot) GetResult() (*MigrateDataResponse, error) {
|
|
result := MigrateDataResponse{
|
|
RunUID: s.UID,
|
|
Items: s.Resources,
|
|
}
|
|
return &result, nil
|
|
}
|
|
|
|
func (s CloudMigrationSnapshot) ShouldQueryGMS() bool {
|
|
return s.Status == SnapshotStatusPendingProcessing || s.Status == SnapshotStatusProcessing
|
|
}
|
|
|
|
type CloudMigrationRunList struct {
|
|
Runs []MigrateDataResponseList
|
|
}
|
|
|
|
type CloudMigrationSessionRequest struct {
|
|
AuthToken string
|
|
}
|
|
|
|
type CloudMigrationSessionResponse struct {
|
|
UID string
|
|
Slug string
|
|
Created time.Time
|
|
Updated time.Time
|
|
}
|
|
|
|
type CloudMigrationSessionListResponse struct {
|
|
Sessions []CloudMigrationSessionResponse
|
|
}
|
|
|
|
type GetSnapshotsQuery struct {
|
|
SnapshotUID string
|
|
SessionUID string
|
|
ResultPage int
|
|
ResultLimit int
|
|
}
|
|
|
|
type ListSnapshotsQuery struct {
|
|
SessionUID string
|
|
Page int
|
|
Limit int
|
|
Sort string
|
|
}
|
|
|
|
type UpdateSnapshotCmd struct {
|
|
UID string
|
|
SessionID string
|
|
Status SnapshotStatus
|
|
Resources []CloudMigrationResource
|
|
}
|
|
|
|
// access token
|
|
|
|
type CreateAccessTokenResponse struct {
|
|
Token string
|
|
}
|
|
|
|
type Base64EncodedTokenPayload struct {
|
|
Token string
|
|
Instance Base64HGInstance
|
|
}
|
|
|
|
func (p Base64EncodedTokenPayload) ToMigration() CloudMigrationSession {
|
|
return CloudMigrationSession{
|
|
AuthToken: p.Token,
|
|
Slug: p.Instance.Slug,
|
|
StackID: p.Instance.StackID,
|
|
RegionSlug: p.Instance.RegionSlug,
|
|
ClusterSlug: p.Instance.ClusterSlug,
|
|
}
|
|
}
|
|
|
|
type Base64HGInstance struct {
|
|
StackID int
|
|
Slug string
|
|
RegionSlug string
|
|
ClusterSlug string
|
|
}
|
|
|
|
// GMS domain structs
|
|
|
|
type MigrateDataRequest struct {
|
|
Items []MigrateDataRequestItem
|
|
ItemParentNames map[MigrateDataType]map[string](string)
|
|
}
|
|
|
|
type MigrateDataRequestItem struct {
|
|
Type MigrateDataType
|
|
RefID string
|
|
Name string
|
|
Data interface{}
|
|
}
|
|
|
|
type MigrateDataResponse struct {
|
|
RunUID string
|
|
Items []CloudMigrationResource
|
|
}
|
|
|
|
type MigrateDataResponseList struct {
|
|
RunUID string
|
|
}
|
|
|
|
type CreateSessionResponse struct {
|
|
SnapshotUid string
|
|
}
|
|
|
|
type StartSnapshotResponse struct {
|
|
SnapshotID string `json:"snapshotID"`
|
|
MaxItemsPerPartition uint32 `json:"maxItemsPerPartition"`
|
|
Algo string `json:"algo"`
|
|
EncryptionKey []byte `json:"encryptionKey"`
|
|
Metadata []byte `json:"metadata"`
|
|
}
|
|
|
|
// Based on Grafana Migration Service DTOs
|
|
type GetSnapshotStatusResponse struct {
|
|
State SnapshotState `json:"state"`
|
|
Results []CloudMigrationResource `json:"results"`
|
|
}
|
|
|
|
type SnapshotState string
|
|
|
|
const (
|
|
SnapshotStateInitialized SnapshotState = "INITIALIZED"
|
|
SnapshotStateProcessing SnapshotState = "PROCESSING"
|
|
SnapshotStateFinished SnapshotState = "FINISHED"
|
|
SnapshotStateCanceled SnapshotState = "CANCELED"
|
|
SnapshotStateError SnapshotState = "ERROR"
|
|
SnapshotStateUnknown SnapshotState = "UNKNOWN"
|
|
)
|
|
|
|
var (
|
|
ErrTokenInvalid = errutil.Internal("cloudmigrations.createMigration.tokenInvalid", errutil.WithPublicMessage("Token is not valid. Generate a new token on your cloud instance and try again."))
|
|
ErrTokenRequestError = errutil.Internal("cloudmigrations.createMigration.tokenRequestError", errutil.WithPublicMessage("An error occurred while validating the token. Please check the Grafana instance logs."))
|
|
ErrTokenValidationFailure = errutil.Internal("cloudmigrations.createMigration.tokenValidationFailure", errutil.WithPublicMessage("Token is not valid. Please ensure the token matches the migration token on your cloud instance."))
|
|
ErrInstanceUnreachable = errutil.Internal("cloudmigrations.createMigration.instanceUnreachable", errutil.WithPublicMessage("The cloud instance cannot be reached. Make sure the instance is running and try again."))
|
|
ErrInstanceRequestError = errutil.Internal("cloudmigrations.createMigration.instanceRequestError", errutil.WithPublicMessage("An error occurred while attempting to verify the cloud instance's connectivity. Please check the network settings or cloud instance status."))
|
|
ErrSessionCreationFailure = errutil.Internal("cloudmigrations.createMigration.sessionCreationFailure", errutil.WithPublicMessage("There was an error creating the migration. Please try again."))
|
|
ErrMigrationDisabled = errutil.Internal("cloudmigrations.createMigration.migrationDisabled", errutil.WithPublicMessage("Cloud migrations are disabled on this instance."))
|
|
)
|