mirror of
https://github.com/SigNoz/signoz.git
synced 2025-12-19 16:36:45 +00:00
feat(sqlmigration): squash all migrations into one
This commit is contained in:
parent
6afdecbd0f
commit
8a3929f68b
@ -29,7 +29,7 @@ func (formatter Formatter) DataTypeOf(dataType string) sqlschema.DataType {
|
|||||||
case "BOOL", "BOOLEAN":
|
case "BOOL", "BOOLEAN":
|
||||||
return sqlschema.DataTypeBoolean
|
return sqlschema.DataTypeBoolean
|
||||||
case "VARCHAR", "CHARACTER VARYING", "CHARACTER":
|
case "VARCHAR", "CHARACTER VARYING", "CHARACTER":
|
||||||
return sqlschema.DataTypeText
|
return sqlschema.DataTypeVarchar
|
||||||
}
|
}
|
||||||
|
|
||||||
return formatter.Formatter.DataTypeOf(dataType)
|
return formatter.Formatter.DataTypeOf(dataType)
|
||||||
|
|||||||
@ -3,6 +3,7 @@ package postgressqlschema
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
|
"github.com/SigNoz/signoz/pkg/errors"
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
"github.com/SigNoz/signoz/pkg/factory"
|
||||||
"github.com/SigNoz/signoz/pkg/sqlschema"
|
"github.com/SigNoz/signoz/pkg/sqlschema"
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
"github.com/SigNoz/signoz/pkg/sqlstore"
|
||||||
@ -31,9 +32,12 @@ func New(ctx context.Context, providerSettings factory.ProviderSettings, config
|
|||||||
fmter: fmter,
|
fmter: fmter,
|
||||||
settings: settings,
|
settings: settings,
|
||||||
operator: sqlschema.NewOperator(fmter, sqlschema.OperatorSupport{
|
operator: sqlschema.NewOperator(fmter, sqlschema.OperatorSupport{
|
||||||
|
CreateConstraint: true,
|
||||||
DropConstraint: true,
|
DropConstraint: true,
|
||||||
ColumnIfNotExistsExists: true,
|
ColumnIfNotExistsExists: true,
|
||||||
AlterColumnSetNotNull: true,
|
AlterColumnSetNotNull: true,
|
||||||
|
AlterColumnSetDefault: true,
|
||||||
|
AlterColumnSetDataType: true,
|
||||||
}),
|
}),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
@ -61,7 +65,7 @@ FROM
|
|||||||
WHERE
|
WHERE
|
||||||
c.table_name = ?`, string(tableName))
|
c.table_name = ?`, string(tableName))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, provider.sqlstore.WrapNotFoundErrf(err, errors.CodeNotFound, "table (%s) not found", tableName)
|
||||||
}
|
}
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
|
|||||||
@ -8,7 +8,10 @@ import (
|
|||||||
"github.com/SigNoz/signoz/pkg/factory"
|
"github.com/SigNoz/signoz/pkg/factory"
|
||||||
"github.com/SigNoz/signoz/pkg/factory/factorytest"
|
"github.com/SigNoz/signoz/pkg/factory/factorytest"
|
||||||
"github.com/SigNoz/signoz/pkg/sqlmigration"
|
"github.com/SigNoz/signoz/pkg/sqlmigration"
|
||||||
|
"github.com/SigNoz/signoz/pkg/sqlmigration/s100sqlmigration"
|
||||||
"github.com/SigNoz/signoz/pkg/sqlmigrator"
|
"github.com/SigNoz/signoz/pkg/sqlmigrator"
|
||||||
|
"github.com/SigNoz/signoz/pkg/sqlschema"
|
||||||
|
"github.com/SigNoz/signoz/pkg/sqlschema/sqlitesqlschema"
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
"github.com/SigNoz/signoz/pkg/sqlstore"
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore/sqlitesqlstore"
|
"github.com/SigNoz/signoz/pkg/sqlstore/sqlitesqlstore"
|
||||||
"github.com/SigNoz/signoz/pkg/types"
|
"github.com/SigNoz/signoz/pkg/types"
|
||||||
@ -30,48 +33,17 @@ func NewTestSqliteDB(t *testing.T) (sqlStore sqlstore.SQLStore, testDBFilePath s
|
|||||||
t.Fatalf("could not create test db sqlite store: %v", err)
|
t.Fatalf("could not create test db sqlite store: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sqlSchema, err := sqlitesqlschema.New(context.Background(), factorytest.NewSettings(), sqlschema.Config{}, sqlStore)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("could not create test db sqlite schema: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
sqlmigrations, err := sqlmigration.New(
|
sqlmigrations, err := sqlmigration.New(
|
||||||
context.Background(),
|
context.Background(),
|
||||||
factorytest.NewSettings(),
|
factorytest.NewSettings(),
|
||||||
sqlmigration.Config{},
|
sqlmigration.Config{},
|
||||||
factory.MustNewNamedMap(
|
factory.MustNewNamedMap(
|
||||||
sqlmigration.NewAddDataMigrationsFactory(),
|
s100sqlmigration.NewV100Factory(sqlStore, sqlSchema),
|
||||||
sqlmigration.NewAddOrganizationFactory(),
|
|
||||||
sqlmigration.NewAddPreferencesFactory(),
|
|
||||||
sqlmigration.NewAddDashboardsFactory(),
|
|
||||||
sqlmigration.NewAddSavedViewsFactory(),
|
|
||||||
sqlmigration.NewAddAgentsFactory(),
|
|
||||||
sqlmigration.NewAddPipelinesFactory(),
|
|
||||||
sqlmigration.NewAddIntegrationsFactory(),
|
|
||||||
sqlmigration.NewAddLicensesFactory(),
|
|
||||||
sqlmigration.NewAddPatsFactory(),
|
|
||||||
sqlmigration.NewModifyDatetimeFactory(),
|
|
||||||
sqlmigration.NewModifyOrgDomainFactory(),
|
|
||||||
sqlmigration.NewUpdateOrganizationFactory(sqlStore),
|
|
||||||
sqlmigration.NewAddAlertmanagerFactory(sqlStore),
|
|
||||||
sqlmigration.NewUpdateDashboardAndSavedViewsFactory(sqlStore),
|
|
||||||
sqlmigration.NewUpdatePatAndOrgDomainsFactory(sqlStore),
|
|
||||||
sqlmigration.NewUpdatePipelines(sqlStore),
|
|
||||||
sqlmigration.NewDropLicensesSitesFactory(sqlStore),
|
|
||||||
sqlmigration.NewUpdateInvitesFactory(sqlStore),
|
|
||||||
sqlmigration.NewUpdatePatFactory(sqlStore),
|
|
||||||
sqlmigration.NewUpdateAlertmanagerFactory(sqlStore),
|
|
||||||
sqlmigration.NewUpdatePreferencesFactory(sqlStore),
|
|
||||||
sqlmigration.NewUpdateApdexTtlFactory(sqlStore),
|
|
||||||
sqlmigration.NewUpdateResetPasswordFactory(sqlStore),
|
|
||||||
sqlmigration.NewUpdateRulesFactory(sqlStore),
|
|
||||||
sqlmigration.NewAddVirtualFieldsFactory(),
|
|
||||||
sqlmigration.NewUpdateIntegrationsFactory(sqlStore),
|
|
||||||
sqlmigration.NewUpdateOrganizationsFactory(sqlStore),
|
|
||||||
sqlmigration.NewDropGroupsFactory(sqlStore),
|
|
||||||
sqlmigration.NewCreateQuickFiltersFactory(sqlStore),
|
|
||||||
sqlmigration.NewUpdateQuickFiltersFactory(sqlStore),
|
|
||||||
sqlmigration.NewAuthRefactorFactory(sqlStore),
|
|
||||||
sqlmigration.NewMigratePATToFactorAPIKey(sqlStore),
|
|
||||||
sqlmigration.NewUpdateApiMonitoringFiltersFactory(sqlStore),
|
|
||||||
sqlmigration.NewAddKeyOrganizationFactory(sqlStore),
|
|
||||||
sqlmigration.NewUpdateDashboardFactory(sqlStore),
|
|
||||||
sqlmigration.NewUpdateAgentsFactory(sqlStore),
|
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@ -26,6 +26,7 @@ import (
|
|||||||
"github.com/SigNoz/signoz/pkg/sharder/noopsharder"
|
"github.com/SigNoz/signoz/pkg/sharder/noopsharder"
|
||||||
"github.com/SigNoz/signoz/pkg/sharder/singlesharder"
|
"github.com/SigNoz/signoz/pkg/sharder/singlesharder"
|
||||||
"github.com/SigNoz/signoz/pkg/sqlmigration"
|
"github.com/SigNoz/signoz/pkg/sqlmigration"
|
||||||
|
"github.com/SigNoz/signoz/pkg/sqlmigration/s100sqlmigration"
|
||||||
"github.com/SigNoz/signoz/pkg/sqlschema"
|
"github.com/SigNoz/signoz/pkg/sqlschema"
|
||||||
"github.com/SigNoz/signoz/pkg/sqlschema/sqlitesqlschema"
|
"github.com/SigNoz/signoz/pkg/sqlschema/sqlitesqlschema"
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
"github.com/SigNoz/signoz/pkg/sqlstore"
|
||||||
@ -79,51 +80,7 @@ func NewSQLSchemaProviderFactories(sqlstore sqlstore.SQLStore) factory.NamedMap[
|
|||||||
|
|
||||||
func NewSQLMigrationProviderFactories(sqlstore sqlstore.SQLStore, sqlschema sqlschema.SQLSchema) factory.NamedMap[factory.ProviderFactory[sqlmigration.SQLMigration, sqlmigration.Config]] {
|
func NewSQLMigrationProviderFactories(sqlstore sqlstore.SQLStore, sqlschema sqlschema.SQLSchema) factory.NamedMap[factory.ProviderFactory[sqlmigration.SQLMigration, sqlmigration.Config]] {
|
||||||
return factory.MustNewNamedMap(
|
return factory.MustNewNamedMap(
|
||||||
sqlmigration.NewAddDataMigrationsFactory(),
|
s100sqlmigration.NewV100Factory(sqlstore, sqlschema),
|
||||||
sqlmigration.NewAddOrganizationFactory(),
|
|
||||||
sqlmigration.NewAddPreferencesFactory(),
|
|
||||||
sqlmigration.NewAddDashboardsFactory(),
|
|
||||||
sqlmigration.NewAddSavedViewsFactory(),
|
|
||||||
sqlmigration.NewAddAgentsFactory(),
|
|
||||||
sqlmigration.NewAddPipelinesFactory(),
|
|
||||||
sqlmigration.NewAddIntegrationsFactory(),
|
|
||||||
sqlmigration.NewAddLicensesFactory(),
|
|
||||||
sqlmigration.NewAddPatsFactory(),
|
|
||||||
sqlmigration.NewModifyDatetimeFactory(),
|
|
||||||
sqlmigration.NewModifyOrgDomainFactory(),
|
|
||||||
sqlmigration.NewUpdateOrganizationFactory(sqlstore),
|
|
||||||
sqlmigration.NewAddAlertmanagerFactory(sqlstore),
|
|
||||||
sqlmigration.NewUpdateDashboardAndSavedViewsFactory(sqlstore),
|
|
||||||
sqlmigration.NewUpdatePatAndOrgDomainsFactory(sqlstore),
|
|
||||||
sqlmigration.NewUpdatePipelines(sqlstore),
|
|
||||||
sqlmigration.NewDropLicensesSitesFactory(sqlstore),
|
|
||||||
sqlmigration.NewUpdateInvitesFactory(sqlstore),
|
|
||||||
sqlmigration.NewUpdatePatFactory(sqlstore),
|
|
||||||
sqlmigration.NewUpdateAlertmanagerFactory(sqlstore),
|
|
||||||
sqlmigration.NewUpdatePreferencesFactory(sqlstore),
|
|
||||||
sqlmigration.NewUpdateApdexTtlFactory(sqlstore),
|
|
||||||
sqlmigration.NewUpdateResetPasswordFactory(sqlstore),
|
|
||||||
sqlmigration.NewUpdateRulesFactory(sqlstore),
|
|
||||||
sqlmigration.NewAddVirtualFieldsFactory(),
|
|
||||||
sqlmigration.NewUpdateIntegrationsFactory(sqlstore),
|
|
||||||
sqlmigration.NewUpdateOrganizationsFactory(sqlstore),
|
|
||||||
sqlmigration.NewDropGroupsFactory(sqlstore),
|
|
||||||
sqlmigration.NewCreateQuickFiltersFactory(sqlstore),
|
|
||||||
sqlmigration.NewUpdateQuickFiltersFactory(sqlstore),
|
|
||||||
sqlmigration.NewAuthRefactorFactory(sqlstore),
|
|
||||||
sqlmigration.NewUpdateLicenseFactory(sqlstore),
|
|
||||||
sqlmigration.NewMigratePATToFactorAPIKey(sqlstore),
|
|
||||||
sqlmigration.NewUpdateApiMonitoringFiltersFactory(sqlstore),
|
|
||||||
sqlmigration.NewAddKeyOrganizationFactory(sqlstore),
|
|
||||||
sqlmigration.NewAddTraceFunnelsFactory(sqlstore),
|
|
||||||
sqlmigration.NewUpdateDashboardFactory(sqlstore),
|
|
||||||
sqlmigration.NewDropFeatureSetFactory(),
|
|
||||||
sqlmigration.NewDropDeprecatedTablesFactory(),
|
|
||||||
sqlmigration.NewUpdateAgentsFactory(sqlstore),
|
|
||||||
sqlmigration.NewUpdateUsersFactory(sqlstore, sqlschema),
|
|
||||||
sqlmigration.NewUpdateUserInviteFactory(sqlstore, sqlschema),
|
|
||||||
sqlmigration.NewUpdateOrgDomainFactory(sqlstore, sqlschema),
|
|
||||||
sqlmigration.NewAddFactorIndexesFactory(sqlstore, sqlschema),
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,49 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type addDataMigrations struct{}
|
|
||||||
|
|
||||||
func NewAddDataMigrationsFactory() factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("add_data_migrations"), newAddDataMigrations)
|
|
||||||
}
|
|
||||||
|
|
||||||
func newAddDataMigrations(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) {
|
|
||||||
return &addDataMigrations{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addDataMigrations) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addDataMigrations) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
// table:data_migrations
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:data_migrations"`
|
|
||||||
ID int `bun:"id,pk,autoincrement"`
|
|
||||||
Version string `bun:"version,unique,notnull,type:VARCHAR(255)"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,notnull,default:current_timestamp"`
|
|
||||||
Succeeded bool `bun:"succeeded,notnull,default:false"`
|
|
||||||
}{}).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addDataMigrations) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,158 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type addOrganization struct{}
|
|
||||||
|
|
||||||
func NewAddOrganizationFactory() factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("add_organization"), newAddOrganization)
|
|
||||||
}
|
|
||||||
|
|
||||||
func newAddOrganization(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) {
|
|
||||||
return &addOrganization{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addOrganization) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addOrganization) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
|
|
||||||
// table:organizations
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:organizations"`
|
|
||||||
ID string `bun:"id,pk,type:text"`
|
|
||||||
Name string `bun:"name,type:text,notnull"`
|
|
||||||
CreatedAt int `bun:"created_at,notnull"`
|
|
||||||
IsAnonymous int `bun:"is_anonymous,notnull,default:0"`
|
|
||||||
HasOptedUpdates int `bun:"has_opted_updates,notnull,default:1"`
|
|
||||||
}{}).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// table:groups
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:groups"`
|
|
||||||
ID string `bun:"id,pk,type:text"`
|
|
||||||
Name string `bun:"name,type:text,notnull,unique"`
|
|
||||||
}{}).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// table:users
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:users"`
|
|
||||||
ID string `bun:"id,pk,type:text"`
|
|
||||||
Name string `bun:"name,type:text,notnull"`
|
|
||||||
Email string `bun:"email,type:text,notnull,unique"`
|
|
||||||
Password string `bun:"password,type:text,notnull"`
|
|
||||||
CreatedAt int `bun:"created_at,notnull"`
|
|
||||||
ProfilePictureURL string `bun:"profile_picture_url,type:text"`
|
|
||||||
GroupID string `bun:"group_id,type:text,notnull"`
|
|
||||||
OrgID string `bun:"org_id,type:text,notnull"`
|
|
||||||
}{}).
|
|
||||||
ForeignKey(`("org_id") REFERENCES "organizations" ("id")`).
|
|
||||||
ForeignKey(`("group_id") REFERENCES "groups" ("id")`).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// table:invites
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:invites"`
|
|
||||||
ID int `bun:"id,pk,autoincrement"`
|
|
||||||
Name string `bun:"name,type:text,notnull"`
|
|
||||||
Email string `bun:"email,type:text,notnull,unique"`
|
|
||||||
Token string `bun:"token,type:text,notnull"`
|
|
||||||
CreatedAt int `bun:"created_at,notnull"`
|
|
||||||
Role string `bun:"role,type:text,notnull"`
|
|
||||||
OrgID string `bun:"org_id,type:text,notnull"`
|
|
||||||
}{}).
|
|
||||||
ForeignKey(`("org_id") REFERENCES "organizations" ("id")`).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// table:reset_password_request
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:reset_password_request"`
|
|
||||||
ID int `bun:"id,pk,autoincrement"`
|
|
||||||
Token string `bun:"token,type:text,notnull"`
|
|
||||||
UserID string `bun:"user_id,type:text,notnull"`
|
|
||||||
}{}).
|
|
||||||
ForeignKey(`("user_id") REFERENCES "users" ("id")`).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// table:user_flags
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:user_flags"`
|
|
||||||
UserID string `bun:"user_id,pk,type:text,notnull"`
|
|
||||||
Flags string `bun:"flags,type:text"`
|
|
||||||
}{}).
|
|
||||||
ForeignKey(`("user_id") REFERENCES "users" ("id")`).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// table:apdex_settings
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:apdex_settings"`
|
|
||||||
ServiceName string `bun:"service_name,pk,type:text"`
|
|
||||||
Threshold float64 `bun:"threshold,type:float,notnull"`
|
|
||||||
ExcludeStatusCodes string `bun:"exclude_status_codes,type:text,notnull"`
|
|
||||||
}{}).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// table:ingestion_keys
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:ingestion_keys"`
|
|
||||||
KeyId string `bun:"key_id,pk,type:text"`
|
|
||||||
Name string `bun:"name,type:text"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,default:current_timestamp"`
|
|
||||||
IngestionKey string `bun:"ingestion_key,type:text,notnull"`
|
|
||||||
IngestionURL string `bun:"ingestion_url,type:text,notnull"`
|
|
||||||
DataRegion string `bun:"data_region,type:text,notnull"`
|
|
||||||
}{}).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addOrganization) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,63 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type addPreferences struct{}
|
|
||||||
|
|
||||||
func NewAddPreferencesFactory() factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("add_preferences"), newAddPreferences)
|
|
||||||
}
|
|
||||||
|
|
||||||
func newAddPreferences(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) {
|
|
||||||
return &addPreferences{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addPreferences) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addPreferences) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
// table:user_preference
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:user_preference"`
|
|
||||||
PreferenceID string `bun:"preference_id,type:text,pk"`
|
|
||||||
PreferenceValue string `bun:"preference_value,type:text"`
|
|
||||||
UserID string `bun:"user_id,type:text,pk"`
|
|
||||||
}{}).
|
|
||||||
IfNotExists().
|
|
||||||
ForeignKey(`("user_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE CASCADE`).
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// table:org_preference
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:org_preference"`
|
|
||||||
PreferenceID string `bun:"preference_id,pk,type:text,notnull"`
|
|
||||||
PreferenceValue string `bun:"preference_value,type:text,notnull"`
|
|
||||||
OrgID string `bun:"org_id,pk,type:text,notnull"`
|
|
||||||
}{}).
|
|
||||||
ForeignKey(`("org_id") REFERENCES "organizations" ("id") ON DELETE CASCADE ON UPDATE CASCADE`).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addPreferences) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,125 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type addDashboards struct{}
|
|
||||||
|
|
||||||
func NewAddDashboardsFactory() factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("add_dashboards"), newAddDashboards)
|
|
||||||
}
|
|
||||||
|
|
||||||
func newAddDashboards(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) {
|
|
||||||
return &addDashboards{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addDashboards) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addDashboards) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
// table:dashboards
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:dashboards"`
|
|
||||||
ID int `bun:"id,pk,autoincrement"`
|
|
||||||
UUID string `bun:"uuid,type:text,notnull,unique"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,notnull"`
|
|
||||||
CreatedBy string `bun:"created_by,type:text,notnull"`
|
|
||||||
UpdatedAt time.Time `bun:"updated_at,notnull"`
|
|
||||||
UpdatedBy string `bun:"updated_by,type:text,notnull"`
|
|
||||||
Data string `bun:"data,type:text,notnull"`
|
|
||||||
Locked int `bun:"locked,notnull,default:0"`
|
|
||||||
}{}).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// table:rules
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:rules"`
|
|
||||||
ID int `bun:"id,pk,autoincrement"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,notnull"`
|
|
||||||
CreatedBy string `bun:"created_by,type:text,notnull"`
|
|
||||||
UpdatedAt time.Time `bun:"updated_at,notnull"`
|
|
||||||
UpdatedBy string `bun:"updated_by,type:text,notnull"`
|
|
||||||
Deleted int `bun:"deleted,notnull,default:0"`
|
|
||||||
Data string `bun:"data,type:text,notnull"`
|
|
||||||
}{}).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// table:notification_channels
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:notification_channels"`
|
|
||||||
ID int `bun:"id,pk,autoincrement"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,notnull"`
|
|
||||||
UpdatedAt time.Time `bun:"updated_at,notnull"`
|
|
||||||
Name string `bun:"name,type:text,notnull,unique"`
|
|
||||||
Type string `bun:"type,type:text,notnull"`
|
|
||||||
Deleted int `bun:"deleted,notnull,default:0"`
|
|
||||||
Data string `bun:"data,type:text,notnull"`
|
|
||||||
}{}).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// table:planned_maintenance
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:planned_maintenance"`
|
|
||||||
ID int `bun:"id,pk,autoincrement"`
|
|
||||||
Name string `bun:"name,type:text,notnull"`
|
|
||||||
Description string `bun:"description,type:text"`
|
|
||||||
AlertIDs string `bun:"alert_ids,type:text"`
|
|
||||||
Schedule string `bun:"schedule,type:text,notnull"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,notnull"`
|
|
||||||
CreatedBy string `bun:"created_by,type:text,notnull"`
|
|
||||||
UpdatedAt time.Time `bun:"updated_at,notnull"`
|
|
||||||
UpdatedBy string `bun:"updated_by,type:text,notnull"`
|
|
||||||
}{}).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// table:ttl_status
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:ttl_status"`
|
|
||||||
ID int `bun:"id,pk,autoincrement"`
|
|
||||||
TransactionID string `bun:"transaction_id,type:text,notnull"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,notnull"`
|
|
||||||
UpdatedAt time.Time `bun:"updated_at,notnull"`
|
|
||||||
TableName string `bun:"table_name,type:text,notnull"`
|
|
||||||
TTL int `bun:"ttl,notnull,default:0"`
|
|
||||||
ColdStorageTTL int `bun:"cold_storage_ttl,notnull,default:0"`
|
|
||||||
Status string `bun:"status,type:text,notnull"`
|
|
||||||
}{}).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addDashboards) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,57 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type addSavedViews struct{}
|
|
||||||
|
|
||||||
func NewAddSavedViewsFactory() factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("add_saved_views"), newAddSavedViews)
|
|
||||||
}
|
|
||||||
|
|
||||||
func newAddSavedViews(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) {
|
|
||||||
return &addSavedViews{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addSavedViews) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addSavedViews) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
// table:saved_views op:create
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:saved_views"`
|
|
||||||
UUID string `bun:"uuid,pk,type:text"`
|
|
||||||
Name string `bun:"name,type:text,notnull"`
|
|
||||||
Category string `bun:"category,type:text,notnull"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,notnull"`
|
|
||||||
CreatedBy string `bun:"created_by,type:text"`
|
|
||||||
UpdatedAt time.Time `bun:"updated_at,notnull"`
|
|
||||||
UpdatedBy string `bun:"updated_by,type:text"`
|
|
||||||
SourcePage string `bun:"source_page,type:text,notnull"`
|
|
||||||
Tags string `bun:"tags,type:text"`
|
|
||||||
Data string `bun:"data,type:text,notnull"`
|
|
||||||
ExtraData string `bun:"extra_data,type:text"`
|
|
||||||
}{}).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addSavedViews) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,102 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type addAgents struct{}
|
|
||||||
|
|
||||||
func NewAddAgentsFactory() factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("add_agents"), newAddAgents)
|
|
||||||
}
|
|
||||||
|
|
||||||
func newAddAgents(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) {
|
|
||||||
return &addAgents{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addAgents) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addAgents) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:agents"`
|
|
||||||
AgentID string `bun:"agent_id,pk,type:text,unique"`
|
|
||||||
StartedAt time.Time `bun:"started_at,notnull"`
|
|
||||||
TerminatedAt time.Time `bun:"terminated_at"`
|
|
||||||
CurrentStatus string `bun:"current_status,type:text,notnull"`
|
|
||||||
EffectiveConfig string `bun:"effective_config,type:text,notnull"`
|
|
||||||
}{}).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:agent_config_versions"`
|
|
||||||
ID string `bun:"id,pk,type:text"`
|
|
||||||
CreatedBy string `bun:"created_by,type:text"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,default:CURRENT_TIMESTAMP"`
|
|
||||||
UpdatedBy string `bun:"updated_by,type:text"`
|
|
||||||
UpdatedAt time.Time `bun:"updated_at,default:CURRENT_TIMESTAMP"`
|
|
||||||
Version int `bun:"version,default:1,unique:element_version_idx"`
|
|
||||||
Active int `bun:"active"`
|
|
||||||
IsValid int `bun:"is_valid"`
|
|
||||||
Disabled int `bun:"disabled"`
|
|
||||||
ElementType string `bun:"element_type,notnull,type:varchar(120),unique:element_version_idx"`
|
|
||||||
DeployStatus string `bun:"deploy_status,notnull,type:varchar(80),default:'DIRTY'"`
|
|
||||||
DeploySequence int `bun:"deploy_sequence"`
|
|
||||||
DeployResult string `bun:"deploy_result,type:text"`
|
|
||||||
LastHash string `bun:"last_hash,type:text"`
|
|
||||||
LastConfig string `bun:"last_config,type:text"`
|
|
||||||
}{}).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// add an index on the last_hash column
|
|
||||||
if _, err := db.NewCreateIndex().
|
|
||||||
Table("agent_config_versions").
|
|
||||||
Column("last_hash").
|
|
||||||
Index("idx_agent_config_versions_last_hash").
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:agent_config_elements"`
|
|
||||||
|
|
||||||
ID string `bun:"id,pk,type:text"`
|
|
||||||
CreatedBy string `bun:"created_by,type:text"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,default:CURRENT_TIMESTAMP"`
|
|
||||||
UpdatedBy string `bun:"updated_by,type:text"`
|
|
||||||
UpdatedAt time.Time `bun:"updated_at,default:CURRENT_TIMESTAMP"`
|
|
||||||
ElementID string `bun:"element_id,type:text,notnull,unique:agent_config_elements_u1"`
|
|
||||||
ElementType string `bun:"element_type,type:varchar(120),notnull,unique:agent_config_elements_u1"`
|
|
||||||
VersionID string `bun:"version_id,type:text,notnull,unique:agent_config_elements_u1"`
|
|
||||||
}{}).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addAgents) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,55 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type addPipelines struct{}
|
|
||||||
|
|
||||||
func NewAddPipelinesFactory() factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("add_pipelines"), newAddPipelines)
|
|
||||||
}
|
|
||||||
|
|
||||||
func newAddPipelines(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) {
|
|
||||||
return &addPipelines{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addPipelines) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addPipelines) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:pipelines"`
|
|
||||||
ID string `bun:"id,pk,type:text"`
|
|
||||||
OrderID int `bun:"order_id"`
|
|
||||||
Enabled bool `bun:"enabled"`
|
|
||||||
CreatedBy string `bun:"created_by,type:text"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,default:current_timestamp"`
|
|
||||||
Name string `bun:"name,type:varchar(400),notnull"`
|
|
||||||
Alias string `bun:"alias,type:varchar(20),notnull"`
|
|
||||||
Description string `bun:"description,type:text"`
|
|
||||||
Filter string `bun:"filter,type:text,notnull"`
|
|
||||||
ConfigJSON string `bun:"config_json,type:text"`
|
|
||||||
}{}).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addPipelines) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,79 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type addIntegrations struct{}
|
|
||||||
|
|
||||||
func NewAddIntegrationsFactory() factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("add_integrations"), newAddIntegrations)
|
|
||||||
}
|
|
||||||
|
|
||||||
func newAddIntegrations(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) {
|
|
||||||
return &addIntegrations{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addIntegrations) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addIntegrations) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:integrations_installed"`
|
|
||||||
|
|
||||||
IntegrationID string `bun:"integration_id,pk,type:text"`
|
|
||||||
ConfigJSON string `bun:"config_json,type:text"`
|
|
||||||
InstalledAt time.Time `bun:"installed_at,default:current_timestamp"`
|
|
||||||
}{}).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:cloud_integrations_accounts"`
|
|
||||||
CloudProvider string `bun:"cloud_provider,type:text,unique:cloud_provider_id"`
|
|
||||||
ID string `bun:"id,type:text,notnull,unique:cloud_provider_id"`
|
|
||||||
ConfigJSON string `bun:"config_json,type:text"`
|
|
||||||
CloudAccountID string `bun:"cloud_account_id,type:text"`
|
|
||||||
LastAgentReportJSON string `bun:"last_agent_report_json,type:text"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,notnull,default:current_timestamp"`
|
|
||||||
RemovedAt time.Time `bun:"removed_at,type:timestamp"`
|
|
||||||
}{}).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:cloud_integrations_service_configs"`
|
|
||||||
CloudProvider string `bun:"cloud_provider,type:text,notnull,unique:service_cloud_provider_account"`
|
|
||||||
CloudAccountID string `bun:"cloud_account_id,type:text,notnull,unique:service_cloud_provider_account"`
|
|
||||||
ServiceID string `bun:"service_id,type:text,notnull,unique:service_cloud_provider_account"`
|
|
||||||
ConfigJSON string `bun:"config_json,type:text"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,default:current_timestamp"`
|
|
||||||
}{}).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addIntegrations) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,92 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type addLicenses struct{}
|
|
||||||
|
|
||||||
func NewAddLicensesFactory() factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("add_licenses"), newAddLicenses)
|
|
||||||
}
|
|
||||||
|
|
||||||
func newAddLicenses(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) {
|
|
||||||
return &addLicenses{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addLicenses) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addLicenses) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:licenses"`
|
|
||||||
Key string `bun:"key,pk,type:text"`
|
|
||||||
CreatedAt time.Time `bun:"createdAt,default:current_timestamp"`
|
|
||||||
UpdatedAt time.Time `bun:"updatedAt,default:current_timestamp"`
|
|
||||||
PlanDetails string `bun:"planDetails,type:text"`
|
|
||||||
ActivationID string `bun:"activationId,type:text"`
|
|
||||||
ValidationMessage string `bun:"validationMessage,type:text"`
|
|
||||||
LastValidated time.Time `bun:"lastValidated,default:current_timestamp"`
|
|
||||||
}{}).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:sites"`
|
|
||||||
|
|
||||||
UUID string `bun:"uuid,pk,type:text"`
|
|
||||||
Alias string `bun:"alias,type:varchar(180),default:'PROD'"`
|
|
||||||
URL string `bun:"url,type:varchar(300)"`
|
|
||||||
CreatedAt time.Time `bun:"createdAt,default:current_timestamp"`
|
|
||||||
}{}).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:feature_status"`
|
|
||||||
Name string `bun:"name,pk,type:text"`
|
|
||||||
Active bool `bun:"active"`
|
|
||||||
Usage int `bun:"usage,default:0"`
|
|
||||||
UsageLimit int `bun:"usage_limit,default:0"`
|
|
||||||
Route string `bun:"route,type:text"`
|
|
||||||
}{}).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:licenses_v3"`
|
|
||||||
ID string `bun:"id,pk,type:text"`
|
|
||||||
Key string `bun:"key,type:text,notnull,unique"`
|
|
||||||
Data string `bun:"data,type:text"`
|
|
||||||
}{}).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addLicenses) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,74 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type addPats struct{}
|
|
||||||
|
|
||||||
func NewAddPatsFactory() factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("add_pats"), newAddPats)
|
|
||||||
}
|
|
||||||
|
|
||||||
func newAddPats(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) {
|
|
||||||
return &addPats{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addPats) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addPats) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:org_domains"`
|
|
||||||
|
|
||||||
ID string `bun:"id,pk,type:text"`
|
|
||||||
OrgID string `bun:"org_id,type:text,notnull"`
|
|
||||||
Name string `bun:"name,type:varchar(50),notnull,unique"`
|
|
||||||
CreatedAt int `bun:"created_at,notnull"`
|
|
||||||
UpdatedAt int `bun:"updated_at"`
|
|
||||||
Data string `bun:"data,type:text,notnull"`
|
|
||||||
}{}).
|
|
||||||
ForeignKey(`("org_id") REFERENCES "organizations" ("id")`).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:personal_access_tokens"`
|
|
||||||
|
|
||||||
ID int `bun:"id,pk,autoincrement"`
|
|
||||||
Role string `bun:"role,type:text,notnull,default:'ADMIN'"`
|
|
||||||
UserID string `bun:"user_id,type:text,notnull"`
|
|
||||||
Token string `bun:"token,type:text,notnull,unique"`
|
|
||||||
Name string `bun:"name,type:text,notnull"`
|
|
||||||
CreatedAt int `bun:"created_at,notnull,default:0"`
|
|
||||||
ExpiresAt int `bun:"expires_at,notnull,default:0"`
|
|
||||||
UpdatedAt int `bun:"updated_at,notnull,default:0"`
|
|
||||||
LastUsed int `bun:"last_used,notnull,default:0"`
|
|
||||||
Revoked bool `bun:"revoked,notnull,default:false"`
|
|
||||||
UpdatedByUserID string `bun:"updated_by_user_id,type:text,notnull,default:''"`
|
|
||||||
}{}).
|
|
||||||
ForeignKey(`("user_id") REFERENCES "users" ("id")`).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addPats) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,93 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type modifyDatetime struct{}
|
|
||||||
|
|
||||||
func NewModifyDatetimeFactory() factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("modify_datetime"), newModifyDatetime)
|
|
||||||
}
|
|
||||||
|
|
||||||
func newModifyDatetime(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) {
|
|
||||||
return &modifyDatetime{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *modifyDatetime) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *modifyDatetime) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
// only run this for old sqlite db
|
|
||||||
if db.Dialect().Name().String() != "sqlite" {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// begin transaction
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
tables := []string{"dashboards", "rules", "planned_maintenance", "ttl_status", "saved_views"}
|
|
||||||
columns := []string{"created_at", "updated_at"}
|
|
||||||
for _, table := range tables {
|
|
||||||
for _, column := range columns {
|
|
||||||
if err := modifyColumn(ctx, tx, table, column); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, column := range []string{"started_at", "terminated_at"} {
|
|
||||||
if err := modifyColumn(ctx, tx, "agents", column); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := tx.Commit(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func modifyColumn(ctx context.Context, tx bun.Tx, table string, column string) error {
|
|
||||||
// rename old column
|
|
||||||
if _, err := tx.ExecContext(ctx, `ALTER TABLE `+table+` RENAME COLUMN `+column+` TO `+column+`_old`); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// cannot add not null constraint to the column
|
|
||||||
if _, err := tx.ExecContext(ctx, `ALTER TABLE `+table+` ADD COLUMN `+column+` TIMESTAMP`); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// update the new column with the value of the old column
|
|
||||||
if _, err := tx.ExecContext(ctx, `UPDATE `+table+` SET `+column+` = `+column+`_old`); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// drop the old column
|
|
||||||
if _, err := tx.ExecContext(ctx, `ALTER TABLE `+table+` DROP COLUMN `+column+`_old`); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *modifyDatetime) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,73 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/dialect"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type modifyOrgDomain struct{}
|
|
||||||
|
|
||||||
func NewModifyOrgDomainFactory() factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("modify_org_domain"), newModifyOrgDomain)
|
|
||||||
}
|
|
||||||
|
|
||||||
func newModifyOrgDomain(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) {
|
|
||||||
return &modifyOrgDomain{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *modifyOrgDomain) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *modifyOrgDomain) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
// only run this for old sqlite db
|
|
||||||
if db.Dialect().Name() != dialect.SQLite {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// begin transaction
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
// rename old column
|
|
||||||
if _, err := tx.ExecContext(ctx, `ALTER TABLE org_domains RENAME COLUMN updated_at TO updated_at_old`); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := tx.ExecContext(ctx, `ALTER TABLE org_domains ADD COLUMN updated_at INTEGER`); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := tx.ExecContext(ctx, `UPDATE org_domains SET updated_at = CAST(updated_at_old AS INTEGER)`); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// drop the old column
|
|
||||||
if _, err := tx.ExecContext(ctx, `ALTER TABLE org_domains DROP COLUMN updated_at_old`); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := tx.Commit(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *modifyOrgDomain) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,153 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"database/sql"
|
|
||||||
"errors"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type updateOrganization struct {
|
|
||||||
store sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUpdateOrganizationFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("update_organization"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return newUpdateOrganization(ctx, ps, c, sqlstore)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newUpdateOrganization(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &updateOrganization{
|
|
||||||
store: store,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateOrganization) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateOrganization) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
// update apdex settings table
|
|
||||||
if err := updateApdexSettings(ctx, tx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// drop user_flags table
|
|
||||||
if _, err := tx.NewDropTable().IfExists().Table("user_flags").Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// add org id to groups table
|
|
||||||
if exists, err := migration.store.Dialect().ColumnExists(ctx, tx, "groups", "org_id"); err != nil {
|
|
||||||
return err
|
|
||||||
} else if !exists {
|
|
||||||
if _, err := tx.NewAddColumn().Table("groups").ColumnExpr("org_id TEXT").Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// add created_at to groups table
|
|
||||||
for _, table := range []string{"groups"} {
|
|
||||||
if exists, err := migration.store.Dialect().ColumnExists(ctx, tx, table, "created_at"); err != nil {
|
|
||||||
return err
|
|
||||||
} else if !exists {
|
|
||||||
if _, err := tx.NewAddColumn().Table(table).ColumnExpr("created_at TIMESTAMP").Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// add updated_at to organizations, users, groups table
|
|
||||||
for _, table := range []string{"organizations", "users", "groups"} {
|
|
||||||
if exists, err := migration.store.Dialect().ColumnExists(ctx, tx, table, "updated_at"); err != nil {
|
|
||||||
return err
|
|
||||||
} else if !exists {
|
|
||||||
if _, err := tx.NewAddColumn().Table(table).ColumnExpr("updated_at TIMESTAMP").Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// since organizations, users has created_at as integer instead of timestamp
|
|
||||||
for _, table := range []string{"organizations", "users", "invites"} {
|
|
||||||
if err := migration.store.Dialect().IntToTimestamp(ctx, tx, table, "created_at"); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// migrate is_anonymous and has_opted_updates to boolean from int
|
|
||||||
for _, column := range []string{"is_anonymous", "has_opted_updates"} {
|
|
||||||
if err := migration.store.Dialect().IntToBoolean(ctx, tx, "organizations", column); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := tx.Commit(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateOrganization) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func updateApdexSettings(ctx context.Context, tx bun.Tx) error {
|
|
||||||
if _, err := tx.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:apdex_settings_new"`
|
|
||||||
OrgID string `bun:"org_id,pk,type:text"`
|
|
||||||
ServiceName string `bun:"service_name,pk,type:text"`
|
|
||||||
Threshold float64 `bun:"threshold,type:float,notnull"`
|
|
||||||
ExcludeStatusCodes string `bun:"exclude_status_codes,type:text,notnull"`
|
|
||||||
}{}).
|
|
||||||
ForeignKey(`("org_id") REFERENCES "organizations" ("id")`).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// get org id from organizations table
|
|
||||||
var orgID string
|
|
||||||
if err := tx.QueryRowContext(ctx, `SELECT id FROM organizations LIMIT 1`).Scan(&orgID); err != nil && !errors.Is(err, sql.ErrNoRows) {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if orgID != "" {
|
|
||||||
// copy old data
|
|
||||||
if _, err := tx.ExecContext(ctx, `INSERT INTO apdex_settings_new (org_id, service_name, threshold, exclude_status_codes) SELECT ?, service_name, threshold, exclude_status_codes FROM apdex_settings`, orgID); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// drop old table
|
|
||||||
if _, err := tx.NewDropTable().IfExists().Table("apdex_settings").Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// rename new table to old table
|
|
||||||
if _, err := tx.ExecContext(ctx, `ALTER TABLE apdex_settings_new RENAME TO apdex_settings`); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,293 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"database/sql"
|
|
||||||
"encoding/json"
|
|
||||||
"strconv"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/alertmanager/alertmanagerserver"
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types/alertmanagertypes"
|
|
||||||
"github.com/prometheus/alertmanager/config"
|
|
||||||
"github.com/tidwall/gjson"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type addAlertmanager struct {
|
|
||||||
store sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewAddAlertmanagerFactory(store sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("add_alertmanager"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return newAddAlertmanager(ctx, ps, c, store)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newAddAlertmanager(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &addAlertmanager{
|
|
||||||
store: store,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addAlertmanager) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addAlertmanager) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
if exists, err := migration.store.Dialect().ColumnExists(ctx, tx, "notification_channels", "deleted"); err != nil {
|
|
||||||
return err
|
|
||||||
} else if exists {
|
|
||||||
if _, err := tx.
|
|
||||||
NewDropColumn().
|
|
||||||
Table("notification_channels").
|
|
||||||
ColumnExpr("deleted").
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if exists, err := migration.store.Dialect().ColumnExists(ctx, tx, "notification_channels", "org_id"); err != nil {
|
|
||||||
return err
|
|
||||||
} else if !exists {
|
|
||||||
if _, err := tx.
|
|
||||||
NewAddColumn().
|
|
||||||
Table("notification_channels").
|
|
||||||
ColumnExpr("org_id TEXT REFERENCES organizations(id) ON DELETE CASCADE").
|
|
||||||
Exec(ctx); err != nil && err != ErrNoExecute {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := tx.
|
|
||||||
NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:alertmanager_config"`
|
|
||||||
ID uint64 `bun:"id,pk,autoincrement"`
|
|
||||||
Config string `bun:"config,notnull,type:text"`
|
|
||||||
Hash string `bun:"hash,notnull,type:text"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,notnull"`
|
|
||||||
UpdatedAt time.Time `bun:"updated_at,notnull"`
|
|
||||||
OrgID string `bun:"org_id,notnull,unique"`
|
|
||||||
}{}).
|
|
||||||
ForeignKey(`("org_id") REFERENCES "organizations" ("id")`).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := tx.
|
|
||||||
NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:alertmanager_state"`
|
|
||||||
ID uint64 `bun:"id,pk,autoincrement"`
|
|
||||||
Silences string `bun:"silences,nullzero,type:text"`
|
|
||||||
NFLog string `bun:"nflog,nullzero,type:text"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,notnull"`
|
|
||||||
UpdatedAt time.Time `bun:"updated_at,notnull"`
|
|
||||||
OrgID string `bun:"org_id,notnull,unique"`
|
|
||||||
}{}).
|
|
||||||
ForeignKey(`("org_id") REFERENCES "organizations" ("id")`).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
var orgID string
|
|
||||||
err = tx.
|
|
||||||
NewSelect().
|
|
||||||
ColumnExpr("id").
|
|
||||||
Table("organizations").
|
|
||||||
Limit(1).
|
|
||||||
Scan(ctx, &orgID)
|
|
||||||
if err != nil {
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err == nil {
|
|
||||||
if err := migration.populateOrgIDInChannels(ctx, tx, orgID); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := migration.populateAlertmanagerConfig(ctx, tx, orgID); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := tx.Commit(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addAlertmanager) populateOrgIDInChannels(ctx context.Context, tx bun.Tx, orgID string) error {
|
|
||||||
if _, err := tx.
|
|
||||||
NewUpdate().
|
|
||||||
Table("notification_channels").
|
|
||||||
Set("org_id = ?", orgID).
|
|
||||||
Where("org_id IS NULL").
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addAlertmanager) populateAlertmanagerConfig(ctx context.Context, tx bun.Tx, orgID string) error {
|
|
||||||
var channels []*alertmanagertypes.Channel
|
|
||||||
|
|
||||||
err := tx.
|
|
||||||
NewSelect().
|
|
||||||
Model(&channels).
|
|
||||||
Where("org_id = ?", orgID).
|
|
||||||
Scan(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
var receiversFromChannels []string
|
|
||||||
for _, channel := range channels {
|
|
||||||
receiversFromChannels = append(receiversFromChannels, channel.Name)
|
|
||||||
}
|
|
||||||
|
|
||||||
type matcher struct {
|
|
||||||
bun.BaseModel `bun:"table:rules"`
|
|
||||||
ID int `bun:"id,pk"`
|
|
||||||
Data string `bun:"data"`
|
|
||||||
}
|
|
||||||
|
|
||||||
matchers := []matcher{}
|
|
||||||
|
|
||||||
err = tx.
|
|
||||||
NewSelect().
|
|
||||||
Column("id", "data").
|
|
||||||
Model(&matchers).
|
|
||||||
Scan(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
matchersMap := make(map[string][]string)
|
|
||||||
for _, matcher := range matchers {
|
|
||||||
receivers := gjson.Get(matcher.Data, "preferredChannels").Array()
|
|
||||||
for _, receiver := range receivers {
|
|
||||||
matchersMap[strconv.Itoa(matcher.ID)] = append(matchersMap[strconv.Itoa(matcher.ID)], receiver.String())
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(receivers) == 0 {
|
|
||||||
matchersMap[strconv.Itoa(matcher.ID)] = append(matchersMap[strconv.Itoa(matcher.ID)], receiversFromChannels...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, channel := range channels {
|
|
||||||
if err := migration.msTeamsChannelToMSTeamsV2Channel(channel); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
config, err := alertmanagertypes.NewConfigFromChannels(alertmanagerserver.NewConfig().Global, alertmanagerserver.NewConfig().Route, channels, orgID)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
for ruleID, receivers := range matchersMap {
|
|
||||||
err = config.CreateRuleIDMatcher(ruleID, receivers)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := tx.
|
|
||||||
NewInsert().
|
|
||||||
Model(config.StoreableConfig()).
|
|
||||||
On("CONFLICT (org_id) DO UPDATE").
|
|
||||||
Set("config = ?", config.StoreableConfig().Config).
|
|
||||||
Set("hash = ?", config.StoreableConfig().Hash).
|
|
||||||
Set("updated_at = ?", config.StoreableConfig().UpdatedAt).
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, channel := range channels {
|
|
||||||
if channel.Type == "msteamsv2" {
|
|
||||||
if _, err := tx.
|
|
||||||
NewUpdate().
|
|
||||||
Model(channel).
|
|
||||||
WherePK().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addAlertmanager) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addAlertmanager) msTeamsChannelToMSTeamsV2Channel(c *alertmanagertypes.Channel) error {
|
|
||||||
if c.Type != "msteams" {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
receiver, err := alertmanagertypes.NewReceiver(c.Data)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
receiver = migration.msTeamsReceiverToMSTeamsV2Receiver(receiver)
|
|
||||||
data, err := json.Marshal(receiver)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
c.Type = "msteamsv2"
|
|
||||||
c.Data = string(data)
|
|
||||||
c.UpdatedAt = time.Now()
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addAlertmanager) msTeamsReceiverToMSTeamsV2Receiver(receiver alertmanagertypes.Receiver) alertmanagertypes.Receiver {
|
|
||||||
if receiver.MSTeamsConfigs == nil {
|
|
||||||
return receiver
|
|
||||||
}
|
|
||||||
|
|
||||||
var msTeamsV2Configs []*config.MSTeamsV2Config
|
|
||||||
for _, cfg := range receiver.MSTeamsConfigs {
|
|
||||||
msTeamsV2Configs = append(msTeamsV2Configs, &config.MSTeamsV2Config{
|
|
||||||
NotifierConfig: cfg.NotifierConfig,
|
|
||||||
HTTPConfig: cfg.HTTPConfig,
|
|
||||||
WebhookURL: cfg.WebhookURL,
|
|
||||||
WebhookURLFile: cfg.WebhookURLFile,
|
|
||||||
Title: cfg.Title,
|
|
||||||
Text: cfg.Text,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
receiver.MSTeamsConfigs = nil
|
|
||||||
receiver.MSTeamsV2Configs = msTeamsV2Configs
|
|
||||||
|
|
||||||
return receiver
|
|
||||||
}
|
|
||||||
@ -1,81 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type updateDashboardAndSavedViews struct {
|
|
||||||
store sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUpdateDashboardAndSavedViewsFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("update_group"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return newUpdateDashboardAndSavedViews(ctx, ps, c, sqlstore)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newUpdateDashboardAndSavedViews(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &updateDashboardAndSavedViews{
|
|
||||||
store: store,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateDashboardAndSavedViews) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateDashboardAndSavedViews) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
// get all org ids
|
|
||||||
var orgIDs []string
|
|
||||||
if err := migration.store.BunDB().NewSelect().Model((*types.Organization)(nil)).Column("id").Scan(ctx, &orgIDs); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// add org id to dashboards table
|
|
||||||
for _, table := range []string{"dashboards", "saved_views"} {
|
|
||||||
if exists, err := migration.store.Dialect().ColumnExists(ctx, tx, table, "org_id"); err != nil {
|
|
||||||
return err
|
|
||||||
} else if !exists {
|
|
||||||
if _, err := tx.NewAddColumn().Table(table).ColumnExpr("org_id TEXT REFERENCES organizations(id) ON DELETE CASCADE").Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if there is one org ID if yes then set it to all dashboards.
|
|
||||||
if len(orgIDs) == 1 {
|
|
||||||
orgID := orgIDs[0]
|
|
||||||
if _, err := tx.NewUpdate().Table(table).Set("org_id = ?", orgID).Where("org_id IS NULL").Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := tx.Commit(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateDashboardAndSavedViews) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,133 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type updatePatAndOrgDomains struct {
|
|
||||||
store sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUpdatePatAndOrgDomainsFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("update_pat_and_org_domains"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return newUpdatePatAndOrgDomains(ctx, ps, c, sqlstore)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newUpdatePatAndOrgDomains(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &updatePatAndOrgDomains{
|
|
||||||
store: store,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updatePatAndOrgDomains) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updatePatAndOrgDomains) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
// begin transaction
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
// get all org ids
|
|
||||||
var orgIDs []string
|
|
||||||
if err := tx.NewSelect().Model((*types.Organization)(nil)).Column("id").Scan(ctx, &orgIDs); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// add org id to pat and org_domains table
|
|
||||||
if exists, err := migration.store.Dialect().ColumnExists(ctx, tx, "personal_access_tokens", "org_id"); err != nil {
|
|
||||||
return err
|
|
||||||
} else if !exists {
|
|
||||||
if _, err := tx.NewAddColumn().Table("personal_access_tokens").ColumnExpr("org_id TEXT REFERENCES organizations(id) ON DELETE CASCADE").Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if there is one org ID if yes then set it to all personal_access_tokens.
|
|
||||||
if len(orgIDs) == 1 {
|
|
||||||
orgID := orgIDs[0]
|
|
||||||
if _, err := tx.NewUpdate().Table("personal_access_tokens").Set("org_id = ?", orgID).Where("org_id IS NULL").Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := updateOrgId(ctx, tx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// change created_at and updated_at from integer to timestamp
|
|
||||||
for _, table := range []string{"personal_access_tokens", "org_domains"} {
|
|
||||||
if err := migration.store.Dialect().IntToTimestamp(ctx, tx, table, "created_at"); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := migration.store.Dialect().IntToTimestamp(ctx, tx, table, "updated_at"); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// drop table if exists ingestion_keys
|
|
||||||
if _, err := tx.NewDropTable().IfExists().Table("ingestion_keys").Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := tx.Commit(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updatePatAndOrgDomains) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func updateOrgId(ctx context.Context, tx bun.Tx) error {
|
|
||||||
if _, err := tx.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:org_domains_new"`
|
|
||||||
|
|
||||||
ID string `bun:"id,pk,type:text"`
|
|
||||||
OrgID string `bun:"org_id,type:text,notnull"`
|
|
||||||
Name string `bun:"name,type:varchar(50),notnull,unique"`
|
|
||||||
CreatedAt int `bun:"created_at,notnull"`
|
|
||||||
UpdatedAt int `bun:"updated_at"`
|
|
||||||
Data string `bun:"data,type:text,notnull"`
|
|
||||||
}{}).
|
|
||||||
ForeignKey(`("org_id") REFERENCES "organizations" ("id") ON DELETE CASCADE`).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// copy data from org_domains to org_domains_new
|
|
||||||
if _, err := tx.ExecContext(ctx, `INSERT INTO org_domains_new (id, org_id, name, created_at, updated_at, data) SELECT id, org_id, name, created_at, updated_at, data FROM org_domains`); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// delete old table
|
|
||||||
if _, err := tx.NewDropTable().IfExists().Table("org_domains").Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// rename new table to org_domains
|
|
||||||
if _, err := tx.ExecContext(ctx, `ALTER TABLE org_domains_new RENAME TO org_domains`); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,97 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type updatePipelines struct {
|
|
||||||
store sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUpdatePipelines(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("update_pipelines"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return newUpdatePipelines(ctx, ps, c, sqlstore)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newUpdatePipelines(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &updatePipelines{
|
|
||||||
store: store,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updatePipelines) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updatePipelines) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
// get all org ids
|
|
||||||
var orgIDs []string
|
|
||||||
if err := migration.store.BunDB().NewSelect().Model((*types.Organization)(nil)).Column("id").Scan(ctx, &orgIDs); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// add org id to pipelines table
|
|
||||||
if exists, err := migration.store.Dialect().ColumnExists(ctx, tx, "pipelines", "org_id"); err != nil {
|
|
||||||
return err
|
|
||||||
} else if !exists {
|
|
||||||
if _, err := tx.NewAddColumn().Table("pipelines").ColumnExpr("org_id TEXT REFERENCES organizations(id) ON DELETE CASCADE").Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if there is one org ID if yes then set it to all pipelines.
|
|
||||||
if len(orgIDs) == 1 {
|
|
||||||
orgID := orgIDs[0]
|
|
||||||
if _, err := tx.NewUpdate().Table("pipelines").Set("org_id = ?", orgID).Where("org_id IS NULL").Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// add updated_by to pipelines table
|
|
||||||
if exists, err := migration.store.Dialect().ColumnExists(ctx, tx, "pipelines", "updated_by"); err != nil {
|
|
||||||
return err
|
|
||||||
} else if !exists {
|
|
||||||
if _, err := tx.NewAddColumn().Table("pipelines").ColumnExpr("updated_by TEXT").Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// add updated_at to pipelines table
|
|
||||||
if exists, err := migration.store.Dialect().ColumnExists(ctx, tx, "pipelines", "updated_at"); err != nil {
|
|
||||||
return err
|
|
||||||
} else if !exists {
|
|
||||||
if _, err := tx.NewAddColumn().Table("pipelines").ColumnExpr("updated_at TIMESTAMP").Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := tx.Commit(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updatePipelines) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,77 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type dropLicensesSites struct {
|
|
||||||
store sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewDropLicensesSitesFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("drop_licenses_sites"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return newDropLicensesSites(ctx, ps, c, sqlstore)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newDropLicensesSites(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &dropLicensesSites{store: store}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *dropLicensesSites) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *dropLicensesSites) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
if _, err := tx.
|
|
||||||
NewDropTable().
|
|
||||||
IfExists().
|
|
||||||
Table("sites").
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := tx.
|
|
||||||
NewDropTable().
|
|
||||||
IfExists().
|
|
||||||
Table("licenses").
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
RenameColumn(ctx, tx, "saved_views", "uuid", "id")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := tx.Commit(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *dropLicensesSites) Down(context.Context, *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,135 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"database/sql"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types"
|
|
||||||
"github.com/SigNoz/signoz/pkg/valuer"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type updateInvites struct {
|
|
||||||
store sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
type existingInvite struct {
|
|
||||||
bun.BaseModel `bun:"table:invites"`
|
|
||||||
|
|
||||||
OrgID string `bun:"org_id,type:text,notnull" json:"orgId"`
|
|
||||||
ID int `bun:"id,pk,autoincrement" json:"id"`
|
|
||||||
Name string `bun:"name,type:text,notnull" json:"name"`
|
|
||||||
Email string `bun:"email,type:text,notnull,unique" json:"email"`
|
|
||||||
Token string `bun:"token,type:text,notnull" json:"token"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,notnull" json:"createdAt"`
|
|
||||||
Role string `bun:"role,type:text,notnull" json:"role"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type newInvite struct {
|
|
||||||
bun.BaseModel `bun:"table:user_invite"`
|
|
||||||
|
|
||||||
types.Identifiable
|
|
||||||
types.TimeAuditable
|
|
||||||
Name string `bun:"name,type:text,notnull" json:"name"`
|
|
||||||
Email string `bun:"email,type:text,notnull,unique" json:"email"`
|
|
||||||
Token string `bun:"token,type:text,notnull" json:"token"`
|
|
||||||
Role string `bun:"role,type:text,notnull" json:"role"`
|
|
||||||
OrgID string `bun:"org_id,type:text,notnull" json:"orgId"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUpdateInvitesFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("update_invites"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return newUpdateInvites(ctx, ps, c, sqlstore)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newUpdateInvites(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &updateInvites{store: store}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateInvites) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateInvites) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
err = migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
RenameTableAndModifyModel(ctx, tx, new(existingInvite), new(newInvite), []string{OrgReference}, func(ctx context.Context) error {
|
|
||||||
existingInvites := make([]*existingInvite, 0)
|
|
||||||
err = tx.
|
|
||||||
NewSelect().
|
|
||||||
Model(&existingInvites).
|
|
||||||
Scan(ctx)
|
|
||||||
if err != nil {
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err == nil && len(existingInvites) > 0 {
|
|
||||||
newInvites := migration.CopyOldInvitesToNewInvites(existingInvites)
|
|
||||||
_, err = tx.
|
|
||||||
NewInsert().
|
|
||||||
Model(&newInvites).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = tx.Commit()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateInvites) Down(context.Context, *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateInvites) CopyOldInvitesToNewInvites(existingInvites []*existingInvite) []*newInvite {
|
|
||||||
newInvites := make([]*newInvite, 0)
|
|
||||||
for _, invite := range existingInvites {
|
|
||||||
newInvites = append(newInvites, &newInvite{
|
|
||||||
Identifiable: types.Identifiable{
|
|
||||||
ID: valuer.GenerateUUID(),
|
|
||||||
},
|
|
||||||
TimeAuditable: types.TimeAuditable{
|
|
||||||
CreatedAt: invite.CreatedAt,
|
|
||||||
UpdatedAt: time.Now(),
|
|
||||||
},
|
|
||||||
Name: invite.Name,
|
|
||||||
Email: invite.Email,
|
|
||||||
Token: invite.Token,
|
|
||||||
Role: invite.Role,
|
|
||||||
OrgID: invite.OrgID,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return newInvites
|
|
||||||
}
|
|
||||||
@ -1,76 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type updatePat struct {
|
|
||||||
store sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUpdatePatFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("update_pat"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return newUpdatePat(ctx, ps, c, sqlstore)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newUpdatePat(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &updatePat{store: store}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updatePat) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updatePat) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
for _, column := range []string{"last_used", "expires_at"} {
|
|
||||||
if err := migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
AddNotNullDefaultToColumn(ctx, tx, "personal_access_tokens", column, "INTEGER", "0"); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
AddNotNullDefaultToColumn(ctx, tx, "personal_access_tokens", "revoked", "BOOLEAN", "false"); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
AddNotNullDefaultToColumn(ctx, tx, "personal_access_tokens", "updated_by_user_id", "TEXT", "''"); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := tx.Commit(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updatePat) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,274 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"database/sql"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types"
|
|
||||||
"github.com/SigNoz/signoz/pkg/valuer"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type updateAlertmanager struct {
|
|
||||||
store sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
type existingChannel struct {
|
|
||||||
bun.BaseModel `bun:"table:notification_channels"`
|
|
||||||
ID int `json:"id" bun:"id,pk,autoincrement"`
|
|
||||||
Name string `json:"name" bun:"name"`
|
|
||||||
Type string `json:"type" bun:"type"`
|
|
||||||
Data string `json:"data" bun:"data"`
|
|
||||||
CreatedAt time.Time `json:"created_at" bun:"created_at"`
|
|
||||||
UpdatedAt time.Time `json:"updated_at" bun:"updated_at"`
|
|
||||||
OrgID string `json:"org_id" bun:"org_id"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type newChannel struct {
|
|
||||||
bun.BaseModel `bun:"table:notification_channel"`
|
|
||||||
types.Identifiable
|
|
||||||
types.TimeAuditable
|
|
||||||
Name string `json:"name" bun:"name"`
|
|
||||||
Type string `json:"type" bun:"type"`
|
|
||||||
Data string `json:"data" bun:"data"`
|
|
||||||
OrgID string `json:"org_id" bun:"org_id"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type existingAlertmanagerConfig struct {
|
|
||||||
bun.BaseModel `bun:"table:alertmanager_config"`
|
|
||||||
ID uint64 `bun:"id,pk,autoincrement"`
|
|
||||||
Config string `bun:"config,notnull,type:text"`
|
|
||||||
Hash string `bun:"hash,notnull,type:text"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,notnull"`
|
|
||||||
UpdatedAt time.Time `bun:"updated_at,notnull"`
|
|
||||||
OrgID string `bun:"org_id,notnull,unique"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type newAlertmanagerConfig struct {
|
|
||||||
bun.BaseModel `bun:"table:alertmanager_config_new"`
|
|
||||||
types.Identifiable
|
|
||||||
types.TimeAuditable
|
|
||||||
Config string `bun:"config,notnull,type:text"`
|
|
||||||
Hash string `bun:"hash,notnull,type:text"`
|
|
||||||
OrgID string `bun:"org_id,notnull,unique"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type existingAlertmanagerState struct {
|
|
||||||
bun.BaseModel `bun:"table:alertmanager_state"`
|
|
||||||
ID uint64 `bun:"id,pk,autoincrement"`
|
|
||||||
Silences string `bun:"silences,nullzero,type:text"`
|
|
||||||
NFLog string `bun:"nflog,nullzero,type:text"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,notnull"`
|
|
||||||
UpdatedAt time.Time `bun:"updated_at,notnull"`
|
|
||||||
OrgID string `bun:"org_id,notnull,unique"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type newAlertmanagerState struct {
|
|
||||||
bun.BaseModel `bun:"table:alertmanager_state_new"`
|
|
||||||
types.Identifiable
|
|
||||||
types.TimeAuditable
|
|
||||||
Silences string `bun:"silences,nullzero,type:text"`
|
|
||||||
NFLog string `bun:"nflog,nullzero,type:text"`
|
|
||||||
OrgID string `bun:"org_id,notnull,unique"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUpdateAlertmanagerFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("update_alertmanager"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return newUpdateAlertmanager(ctx, ps, c, sqlstore)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newUpdateAlertmanager(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &updateAlertmanager{store: store}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateAlertmanager) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateAlertmanager) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
err = migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
RenameTableAndModifyModel(ctx, tx, new(existingChannel), new(newChannel), []string{OrgReference}, func(ctx context.Context) error {
|
|
||||||
existingChannels := make([]*existingChannel, 0)
|
|
||||||
err = tx.
|
|
||||||
NewSelect().
|
|
||||||
Model(&existingChannels).
|
|
||||||
Scan(ctx)
|
|
||||||
if err != nil {
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err == nil && len(existingChannels) > 0 {
|
|
||||||
newChannels := migration.
|
|
||||||
CopyOldChannelToNewChannel(existingChannels)
|
|
||||||
_, err = tx.
|
|
||||||
NewInsert().
|
|
||||||
Model(&newChannels).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
UpdatePrimaryKey(ctx, tx, new(existingAlertmanagerConfig), new(newAlertmanagerConfig), OrgReference, func(ctx context.Context) error {
|
|
||||||
existingAlertmanagerConfigs := make([]*existingAlertmanagerConfig, 0)
|
|
||||||
err = tx.
|
|
||||||
NewSelect().
|
|
||||||
Model(&existingAlertmanagerConfigs).
|
|
||||||
Scan(ctx)
|
|
||||||
if err != nil {
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err == nil && len(existingAlertmanagerConfigs) > 0 {
|
|
||||||
newAlertmanagerConfigs := migration.
|
|
||||||
CopyOldConfigToNewConfig(existingAlertmanagerConfigs)
|
|
||||||
_, err = tx.
|
|
||||||
NewInsert().
|
|
||||||
Model(&newAlertmanagerConfigs).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
UpdatePrimaryKey(ctx, tx, new(existingAlertmanagerState), new(newAlertmanagerState), OrgReference, func(ctx context.Context) error {
|
|
||||||
existingAlertmanagerStates := make([]*existingAlertmanagerState, 0)
|
|
||||||
err = tx.
|
|
||||||
NewSelect().
|
|
||||||
Model(&existingAlertmanagerStates).
|
|
||||||
Scan(ctx)
|
|
||||||
if err != nil {
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err == nil && len(existingAlertmanagerStates) > 0 {
|
|
||||||
newAlertmanagerStates := migration.
|
|
||||||
CopyOldStateToNewState(existingAlertmanagerStates)
|
|
||||||
_, err = tx.
|
|
||||||
NewInsert().
|
|
||||||
Model(&newAlertmanagerStates).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = tx.Commit()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateAlertmanager) Down(context.Context, *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateAlertmanager) CopyOldChannelToNewChannel(existingChannels []*existingChannel) []*newChannel {
|
|
||||||
newChannels := make([]*newChannel, 0)
|
|
||||||
for _, channel := range existingChannels {
|
|
||||||
newChannels = append(newChannels, &newChannel{
|
|
||||||
Identifiable: types.Identifiable{
|
|
||||||
ID: valuer.GenerateUUID(),
|
|
||||||
},
|
|
||||||
TimeAuditable: types.TimeAuditable{
|
|
||||||
CreatedAt: channel.CreatedAt,
|
|
||||||
UpdatedAt: channel.UpdatedAt,
|
|
||||||
},
|
|
||||||
Name: channel.Name,
|
|
||||||
Type: channel.Type,
|
|
||||||
Data: channel.Data,
|
|
||||||
OrgID: channel.OrgID,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return newChannels
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateAlertmanager) CopyOldConfigToNewConfig(existingAlertmanagerConfigs []*existingAlertmanagerConfig) []*newAlertmanagerConfig {
|
|
||||||
newAlertmanagerConfigs := make([]*newAlertmanagerConfig, 0)
|
|
||||||
for _, config := range existingAlertmanagerConfigs {
|
|
||||||
newAlertmanagerConfigs = append(newAlertmanagerConfigs, &newAlertmanagerConfig{
|
|
||||||
Identifiable: types.Identifiable{
|
|
||||||
ID: valuer.GenerateUUID(),
|
|
||||||
},
|
|
||||||
TimeAuditable: types.TimeAuditable{
|
|
||||||
CreatedAt: config.CreatedAt,
|
|
||||||
UpdatedAt: config.UpdatedAt,
|
|
||||||
},
|
|
||||||
Config: config.Config,
|
|
||||||
Hash: config.Hash,
|
|
||||||
OrgID: config.OrgID,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return newAlertmanagerConfigs
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateAlertmanager) CopyOldStateToNewState(existingAlertmanagerStates []*existingAlertmanagerState) []*newAlertmanagerState {
|
|
||||||
newAlertmanagerStates := make([]*newAlertmanagerState, 0)
|
|
||||||
for _, state := range existingAlertmanagerStates {
|
|
||||||
newAlertmanagerStates = append(newAlertmanagerStates, &newAlertmanagerState{
|
|
||||||
Identifiable: types.Identifiable{
|
|
||||||
ID: valuer.GenerateUUID(),
|
|
||||||
},
|
|
||||||
TimeAuditable: types.TimeAuditable{
|
|
||||||
CreatedAt: state.CreatedAt,
|
|
||||||
UpdatedAt: state.UpdatedAt,
|
|
||||||
},
|
|
||||||
Silences: state.Silences,
|
|
||||||
NFLog: state.NFLog,
|
|
||||||
OrgID: state.OrgID,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return newAlertmanagerStates
|
|
||||||
}
|
|
||||||
@ -1,198 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"database/sql"
|
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types"
|
|
||||||
"github.com/SigNoz/signoz/pkg/valuer"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type updatePreferences struct {
|
|
||||||
store sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
type existingOrgPreference struct {
|
|
||||||
bun.BaseModel `bun:"table:org_preference"`
|
|
||||||
PreferenceID string `bun:"preference_id,pk,type:text,notnull"`
|
|
||||||
PreferenceValue string `bun:"preference_value,type:text,notnull"`
|
|
||||||
OrgID string `bun:"org_id,pk,type:text,notnull"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type newOrgPreference struct {
|
|
||||||
bun.BaseModel `bun:"table:org_preference_new"`
|
|
||||||
types.Identifiable
|
|
||||||
PreferenceID string `bun:"preference_id,type:text,notnull"`
|
|
||||||
PreferenceValue string `bun:"preference_value,type:text,notnull"`
|
|
||||||
OrgID string `bun:"org_id,type:text,notnull"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type existingUserPreference struct {
|
|
||||||
bun.BaseModel `bun:"table:user_preference"`
|
|
||||||
PreferenceID string `bun:"preference_id,type:text,pk"`
|
|
||||||
PreferenceValue string `bun:"preference_value,type:text"`
|
|
||||||
UserID string `bun:"user_id,type:text,pk"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type newUserPreference struct {
|
|
||||||
bun.BaseModel `bun:"table:user_preference_new"`
|
|
||||||
types.Identifiable
|
|
||||||
PreferenceID string `bun:"preference_id,type:text,notnull"`
|
|
||||||
PreferenceValue string `bun:"preference_value,type:text,notnull"`
|
|
||||||
UserID string `bun:"user_id,type:text,notnull"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUpdatePreferencesFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("update_preferences"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return newUpdatePreferences(ctx, ps, c, sqlstore)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newUpdatePreferences(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &updatePreferences{store: store}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updatePreferences) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updatePreferences) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
err = migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
AddPrimaryKey(ctx, tx, new(existingOrgPreference), new(newOrgPreference), OrgReference, func(ctx context.Context) error {
|
|
||||||
existingOrgPreferences := make([]*existingOrgPreference, 0)
|
|
||||||
err = tx.
|
|
||||||
NewSelect().
|
|
||||||
Model(&existingOrgPreferences).
|
|
||||||
Scan(ctx)
|
|
||||||
if err != nil {
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err == nil && len(existingOrgPreferences) > 0 {
|
|
||||||
newOrgPreferences := migration.
|
|
||||||
CopyOldOrgPreferencesToNewOrgPreferences(existingOrgPreferences)
|
|
||||||
_, err = tx.
|
|
||||||
NewInsert().
|
|
||||||
Model(&newOrgPreferences).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tableName := tx.Dialect().Tables().Get(reflect.TypeOf(new(existingOrgPreference))).Name
|
|
||||||
_, err = tx.
|
|
||||||
ExecContext(ctx, fmt.Sprintf("CREATE UNIQUE INDEX IF NOT EXISTS %s_unique_idx ON %s (preference_id, org_id)", tableName, fmt.Sprintf("%s_new", tableName)))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
AddPrimaryKey(ctx, tx, new(existingUserPreference), new(newUserPreference), UserReference, func(ctx context.Context) error {
|
|
||||||
existingUserPreferences := make([]*existingUserPreference, 0)
|
|
||||||
err = tx.
|
|
||||||
NewSelect().
|
|
||||||
Model(&existingUserPreferences).
|
|
||||||
Scan(ctx)
|
|
||||||
if err != nil {
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err == nil && len(existingUserPreferences) > 0 {
|
|
||||||
newUserPreferences := migration.CopyOldUserPreferencesToNewUserPreferences(existingUserPreferences)
|
|
||||||
_, err = tx.
|
|
||||||
NewInsert().
|
|
||||||
Model(&newUserPreferences).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tableName := tx.Dialect().Tables().Get(reflect.TypeOf(new(existingUserPreference))).Name
|
|
||||||
_, err = tx.
|
|
||||||
ExecContext(ctx, fmt.Sprintf("CREATE UNIQUE INDEX IF NOT EXISTS %s_unique_idx ON %s (preference_id, user_id)", tableName, fmt.Sprintf("%s_new", tableName)))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = tx.Commit()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updatePreferences) Down(context.Context, *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updatePreferences) CopyOldOrgPreferencesToNewOrgPreferences(existingOrgPreferences []*existingOrgPreference) []*newOrgPreference {
|
|
||||||
newOrgPreferences := make([]*newOrgPreference, 0)
|
|
||||||
for _, preference := range existingOrgPreferences {
|
|
||||||
newOrgPreferences = append(newOrgPreferences, &newOrgPreference{
|
|
||||||
Identifiable: types.Identifiable{
|
|
||||||
ID: valuer.GenerateUUID(),
|
|
||||||
},
|
|
||||||
PreferenceID: preference.PreferenceID,
|
|
||||||
PreferenceValue: preference.PreferenceValue,
|
|
||||||
OrgID: preference.OrgID,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return newOrgPreferences
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updatePreferences) CopyOldUserPreferencesToNewUserPreferences(existingUserPreferences []*existingUserPreference) []*newUserPreference {
|
|
||||||
newUserPreferences := make([]*newUserPreference, 0)
|
|
||||||
for _, preference := range existingUserPreferences {
|
|
||||||
newUserPreferences = append(newUserPreferences, &newUserPreference{
|
|
||||||
Identifiable: types.Identifiable{
|
|
||||||
ID: valuer.GenerateUUID(),
|
|
||||||
},
|
|
||||||
PreferenceID: preference.PreferenceID,
|
|
||||||
PreferenceValue: preference.PreferenceValue,
|
|
||||||
UserID: preference.UserID,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return newUserPreferences
|
|
||||||
}
|
|
||||||
@ -1,229 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"database/sql"
|
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types"
|
|
||||||
"github.com/SigNoz/signoz/pkg/valuer"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type updateApdexTtl struct {
|
|
||||||
store sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
type existingApdexSettings struct {
|
|
||||||
bun.BaseModel `bun:"table:apdex_settings"`
|
|
||||||
OrgID string `bun:"org_id,pk,type:text" json:"orgId"`
|
|
||||||
ServiceName string `bun:"service_name,pk,type:text" json:"serviceName"`
|
|
||||||
Threshold float64 `bun:"threshold,type:float,notnull" json:"threshold"`
|
|
||||||
ExcludeStatusCodes string `bun:"exclude_status_codes,type:text,notnull" json:"excludeStatusCodes"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type newApdexSettings struct {
|
|
||||||
bun.BaseModel `bun:"table:apdex_setting"`
|
|
||||||
types.Identifiable
|
|
||||||
OrgID string `bun:"org_id,type:text" json:"orgId"`
|
|
||||||
ServiceName string `bun:"service_name,type:text" json:"serviceName"`
|
|
||||||
Threshold float64 `bun:"threshold,type:float,notnull" json:"threshold"`
|
|
||||||
ExcludeStatusCodes string `bun:"exclude_status_codes,type:text,notnull" json:"excludeStatusCodes"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type existingTTLStatus struct {
|
|
||||||
bun.BaseModel `bun:"table:ttl_status"`
|
|
||||||
ID int `bun:"id,pk,autoincrement"`
|
|
||||||
TransactionID string `bun:"transaction_id,type:text,notnull"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,type:datetime,notnull"`
|
|
||||||
UpdatedAt time.Time `bun:"updated_at,type:datetime,notnull"`
|
|
||||||
TableName string `bun:"table_name,type:text,notnull"`
|
|
||||||
TTL int `bun:"ttl,notnull,default:0"`
|
|
||||||
ColdStorageTTL int `bun:"cold_storage_ttl,notnull,default:0"`
|
|
||||||
Status string `bun:"status,type:text,notnull"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type newTTLStatus struct {
|
|
||||||
bun.BaseModel `bun:"table:ttl_setting"`
|
|
||||||
types.Identifiable
|
|
||||||
types.TimeAuditable
|
|
||||||
TransactionID string `bun:"transaction_id,type:text,notnull"`
|
|
||||||
TableName string `bun:"table_name,type:text,notnull"`
|
|
||||||
TTL int `bun:"ttl,notnull,default:0"`
|
|
||||||
ColdStorageTTL int `bun:"cold_storage_ttl,notnull,default:0"`
|
|
||||||
Status string `bun:"status,type:text,notnull"`
|
|
||||||
OrgID string `json:"-" bun:"org_id,notnull"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUpdateApdexTtlFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("update_apdex_ttl"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return newUpdateApdexTtl(ctx, ps, c, sqlstore)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newUpdateApdexTtl(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &updateApdexTtl{store: store}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateApdexTtl) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateApdexTtl) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
err = migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
RenameTableAndModifyModel(ctx, tx, new(existingApdexSettings), new(newApdexSettings), []string{OrgReference}, func(ctx context.Context) error {
|
|
||||||
existingApdexSettings := make([]*existingApdexSettings, 0)
|
|
||||||
err = tx.
|
|
||||||
NewSelect().
|
|
||||||
Model(&existingApdexSettings).
|
|
||||||
Scan(ctx)
|
|
||||||
if err != nil {
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err == nil && len(existingApdexSettings) > 0 {
|
|
||||||
newSettings := migration.
|
|
||||||
CopyExistingApdexSettingsToNewApdexSettings(existingApdexSettings)
|
|
||||||
_, err = tx.
|
|
||||||
NewInsert().
|
|
||||||
Model(&newSettings).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tableName := tx.Dialect().Tables().Get(reflect.TypeOf(new(newApdexSettings))).Name
|
|
||||||
_, err = tx.
|
|
||||||
ExecContext(ctx, fmt.Sprintf("CREATE UNIQUE INDEX IF NOT EXISTS %s_unique_idx ON %s (service_name, org_id)", tableName, tableName))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
RenameTableAndModifyModel(ctx, tx, new(existingTTLStatus), new(newTTLStatus), []string{OrgReference}, func(ctx context.Context) error {
|
|
||||||
existingTTLStatus := make([]*existingTTLStatus, 0)
|
|
||||||
err = tx.
|
|
||||||
NewSelect().
|
|
||||||
Model(&existingTTLStatus).
|
|
||||||
Scan(ctx)
|
|
||||||
if err != nil {
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err == nil && len(existingTTLStatus) > 0 {
|
|
||||||
var orgID string
|
|
||||||
err := migration.
|
|
||||||
store.
|
|
||||||
BunDB().
|
|
||||||
NewSelect().
|
|
||||||
Model((*types.Organization)(nil)).
|
|
||||||
Column("id").
|
|
||||||
Scan(ctx, &orgID)
|
|
||||||
if err != nil {
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err == nil {
|
|
||||||
newTTLStatus := migration.CopyExistingTTLStatusToNewTTLStatus(existingTTLStatus, orgID)
|
|
||||||
_, err = tx.
|
|
||||||
NewInsert().
|
|
||||||
Model(&newTTLStatus).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = tx.Commit()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateApdexTtl) Down(context.Context, *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateApdexTtl) CopyExistingApdexSettingsToNewApdexSettings(existingApdexSettings []*existingApdexSettings) []*newApdexSettings {
|
|
||||||
newSettings := make([]*newApdexSettings, 0)
|
|
||||||
for _, apdexSetting := range existingApdexSettings {
|
|
||||||
newSettings = append(newSettings, &newApdexSettings{
|
|
||||||
Identifiable: types.Identifiable{
|
|
||||||
ID: valuer.GenerateUUID(),
|
|
||||||
},
|
|
||||||
ServiceName: apdexSetting.ServiceName,
|
|
||||||
Threshold: apdexSetting.Threshold,
|
|
||||||
ExcludeStatusCodes: apdexSetting.ExcludeStatusCodes,
|
|
||||||
OrgID: apdexSetting.OrgID,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return newSettings
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateApdexTtl) CopyExistingTTLStatusToNewTTLStatus(existingTTLStatus []*existingTTLStatus, orgID string) []*newTTLStatus {
|
|
||||||
newTTLStatuses := make([]*newTTLStatus, 0)
|
|
||||||
|
|
||||||
for _, ttl := range existingTTLStatus {
|
|
||||||
newTTLStatuses = append(newTTLStatuses, &newTTLStatus{
|
|
||||||
Identifiable: types.Identifiable{
|
|
||||||
ID: valuer.GenerateUUID(),
|
|
||||||
},
|
|
||||||
TimeAuditable: types.TimeAuditable{
|
|
||||||
CreatedAt: ttl.CreatedAt,
|
|
||||||
UpdatedAt: ttl.UpdatedAt,
|
|
||||||
},
|
|
||||||
TransactionID: ttl.TransactionID,
|
|
||||||
TTL: ttl.TTL,
|
|
||||||
TableName: ttl.TableName,
|
|
||||||
ColdStorageTTL: ttl.ColdStorageTTL,
|
|
||||||
Status: ttl.Status,
|
|
||||||
OrgID: orgID,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return newTTLStatuses
|
|
||||||
}
|
|
||||||
@ -1,195 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"database/sql"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types"
|
|
||||||
"github.com/SigNoz/signoz/pkg/valuer"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type updateResetPassword struct {
|
|
||||||
store sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
type existingResetPasswordRequest struct {
|
|
||||||
bun.BaseModel `bun:"table:reset_password_request"`
|
|
||||||
ID int `bun:"id,pk,autoincrement" json:"id"`
|
|
||||||
Token string `bun:"token,type:text,notnull" json:"token"`
|
|
||||||
UserID string `bun:"user_id,type:text,notnull" json:"userId"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type newResetPasswordRequest struct {
|
|
||||||
bun.BaseModel `bun:"table:reset_password_request_new"`
|
|
||||||
types.Identifiable
|
|
||||||
Token string `bun:"token,type:text,notnull" json:"token"`
|
|
||||||
UserID string `bun:"user_id,type:text,notnull" json:"userId"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type existingPersonalAccessToken struct {
|
|
||||||
bun.BaseModel `bun:"table:personal_access_tokens"`
|
|
||||||
types.TimeAuditable
|
|
||||||
OrgID string `json:"orgId" bun:"org_id,type:text,notnull"`
|
|
||||||
ID int `json:"id" bun:"id,pk,autoincrement"`
|
|
||||||
Role string `json:"role" bun:"role,type:text,notnull,default:'ADMIN'"`
|
|
||||||
UserID string `json:"userId" bun:"user_id,type:text,notnull"`
|
|
||||||
Token string `json:"token" bun:"token,type:text,notnull,unique"`
|
|
||||||
Name string `json:"name" bun:"name,type:text,notnull"`
|
|
||||||
ExpiresAt int64 `json:"expiresAt" bun:"expires_at,notnull,default:0"`
|
|
||||||
LastUsed int64 `json:"lastUsed" bun:"last_used,notnull,default:0"`
|
|
||||||
Revoked bool `json:"revoked" bun:"revoked,notnull,default:false"`
|
|
||||||
UpdatedByUserID string `json:"updatedByUserId" bun:"updated_by_user_id,type:text,notnull,default:''"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type newPersonalAccessToken struct {
|
|
||||||
bun.BaseModel `bun:"table:personal_access_token"`
|
|
||||||
types.Identifiable
|
|
||||||
types.TimeAuditable
|
|
||||||
OrgID string `json:"orgId" bun:"org_id,type:text,notnull"`
|
|
||||||
Role string `json:"role" bun:"role,type:text,notnull,default:'ADMIN'"`
|
|
||||||
UserID string `json:"userId" bun:"user_id,type:text,notnull"`
|
|
||||||
Token string `json:"token" bun:"token,type:text,notnull,unique"`
|
|
||||||
Name string `json:"name" bun:"name,type:text,notnull"`
|
|
||||||
ExpiresAt int64 `json:"expiresAt" bun:"expires_at,notnull,default:0"`
|
|
||||||
LastUsed int64 `json:"lastUsed" bun:"last_used,notnull,default:0"`
|
|
||||||
Revoked bool `json:"revoked" bun:"revoked,notnull,default:false"`
|
|
||||||
UpdatedByUserID string `json:"updatedByUserId" bun:"updated_by_user_id,type:text,notnull,default:''"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUpdateResetPasswordFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("update_reset_password"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return newUpdateResetPassword(ctx, ps, c, sqlstore)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newUpdateResetPassword(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &updateResetPassword{store: store}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateResetPassword) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateResetPassword) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
err = migration.store.Dialect().UpdatePrimaryKey(ctx, tx, new(existingResetPasswordRequest), new(newResetPasswordRequest), UserReference, func(ctx context.Context) error {
|
|
||||||
existingResetPasswordRequests := make([]*existingResetPasswordRequest, 0)
|
|
||||||
err = tx.
|
|
||||||
NewSelect().
|
|
||||||
Model(&existingResetPasswordRequests).
|
|
||||||
Scan(ctx)
|
|
||||||
if err != nil {
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err == nil && len(existingResetPasswordRequests) > 0 {
|
|
||||||
newResetPasswordRequests := migration.CopyExistingResetPasswordRequestsToNewResetPasswordRequests(existingResetPasswordRequests)
|
|
||||||
_, err = tx.
|
|
||||||
NewInsert().
|
|
||||||
Model(&newResetPasswordRequests).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = migration.store.Dialect().RenameTableAndModifyModel(ctx, tx, new(existingPersonalAccessToken), new(newPersonalAccessToken), []string{OrgReference, UserReference}, func(ctx context.Context) error {
|
|
||||||
existingPersonalAccessTokens := make([]*existingPersonalAccessToken, 0)
|
|
||||||
err = tx.
|
|
||||||
NewSelect().
|
|
||||||
Model(&existingPersonalAccessTokens).
|
|
||||||
Scan(ctx)
|
|
||||||
if err != nil {
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err == nil && len(existingPersonalAccessTokens) > 0 {
|
|
||||||
newPersonalAccessTokens := migration.CopyExistingPATsToNewPATs(existingPersonalAccessTokens)
|
|
||||||
_, err = tx.NewInsert().Model(&newPersonalAccessTokens).Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = tx.Commit()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateResetPassword) Down(context.Context, *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateResetPassword) CopyExistingResetPasswordRequestsToNewResetPasswordRequests(existingPasswordRequests []*existingResetPasswordRequest) []*newResetPasswordRequest {
|
|
||||||
newResetPasswordRequests := make([]*newResetPasswordRequest, 0)
|
|
||||||
for _, request := range existingPasswordRequests {
|
|
||||||
newResetPasswordRequests = append(newResetPasswordRequests, &newResetPasswordRequest{
|
|
||||||
Identifiable: types.Identifiable{
|
|
||||||
ID: valuer.GenerateUUID(),
|
|
||||||
},
|
|
||||||
Token: request.Token,
|
|
||||||
UserID: request.UserID,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return newResetPasswordRequests
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateResetPassword) CopyExistingPATsToNewPATs(existingPATs []*existingPersonalAccessToken) []*newPersonalAccessToken {
|
|
||||||
newPATs := make([]*newPersonalAccessToken, 0)
|
|
||||||
for _, pat := range existingPATs {
|
|
||||||
newPATs = append(newPATs, &newPersonalAccessToken{
|
|
||||||
Identifiable: types.Identifiable{
|
|
||||||
ID: valuer.GenerateUUID(),
|
|
||||||
},
|
|
||||||
TimeAuditable: types.TimeAuditable{
|
|
||||||
CreatedAt: pat.CreatedAt,
|
|
||||||
UpdatedAt: pat.UpdatedAt,
|
|
||||||
},
|
|
||||||
Role: pat.Role,
|
|
||||||
Name: pat.Name,
|
|
||||||
ExpiresAt: pat.ExpiresAt,
|
|
||||||
LastUsed: pat.LastUsed,
|
|
||||||
UserID: pat.UserID,
|
|
||||||
Token: pat.Token,
|
|
||||||
Revoked: pat.Revoked,
|
|
||||||
UpdatedByUserID: pat.UpdatedByUserID,
|
|
||||||
OrgID: pat.OrgID,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return newPATs
|
|
||||||
}
|
|
||||||
@ -1,58 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types/telemetrytypes"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type addVirtualFields struct{}
|
|
||||||
|
|
||||||
func NewAddVirtualFieldsFactory() factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("add_virtual_fields"), newAddVirtualFields)
|
|
||||||
}
|
|
||||||
|
|
||||||
func newAddVirtualFields(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) {
|
|
||||||
return &addVirtualFields{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addVirtualFields) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addVirtualFields) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
// table:virtual_field op:create
|
|
||||||
if _, err := db.NewCreateTable().
|
|
||||||
Model(&struct {
|
|
||||||
bun.BaseModel `bun:"table:virtual_field"`
|
|
||||||
|
|
||||||
types.Identifiable
|
|
||||||
types.TimeAuditable
|
|
||||||
types.UserAuditable
|
|
||||||
|
|
||||||
Name string `bun:"name,type:text,notnull"`
|
|
||||||
Expression string `bun:"expression,type:text,notnull"`
|
|
||||||
Description string `bun:"description,type:text"`
|
|
||||||
Signal telemetrytypes.Signal `bun:"signal,type:text,notnull"`
|
|
||||||
OrgID string `bun:"org_id,type:text,notnull"`
|
|
||||||
}{}).
|
|
||||||
ForeignKey(`("org_id") REFERENCES "organizations" ("id") ON DELETE CASCADE`).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addVirtualFields) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,446 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"database/sql"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types"
|
|
||||||
"github.com/SigNoz/signoz/pkg/valuer"
|
|
||||||
"github.com/google/uuid"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type updateIntegrations struct {
|
|
||||||
store sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUpdateIntegrationsFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("update_integrations"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return newUpdateIntegrations(ctx, ps, c, sqlstore)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newUpdateIntegrations(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &updateIntegrations{store: store}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateIntegrations) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type existingInstalledIntegration struct {
|
|
||||||
bun.BaseModel `bun:"table:integrations_installed"`
|
|
||||||
|
|
||||||
IntegrationID string `bun:"integration_id,pk,type:text"`
|
|
||||||
ConfigJSON string `bun:"config_json,type:text"`
|
|
||||||
InstalledAt time.Time `bun:"installed_at,default:current_timestamp"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type newInstalledIntegration struct {
|
|
||||||
bun.BaseModel `bun:"table:installed_integration"`
|
|
||||||
|
|
||||||
types.Identifiable
|
|
||||||
Type string `json:"type" bun:"type,type:text,unique:org_id_type"`
|
|
||||||
Config string `json:"config" bun:"config,type:text"`
|
|
||||||
InstalledAt time.Time `json:"installed_at" bun:"installed_at,default:current_timestamp"`
|
|
||||||
OrgID string `json:"org_id" bun:"org_id,type:text,unique:org_id_type"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type existingCloudIntegration struct {
|
|
||||||
bun.BaseModel `bun:"table:cloud_integrations_accounts"`
|
|
||||||
|
|
||||||
CloudProvider string `bun:"cloud_provider,type:text,unique:cloud_provider_id"`
|
|
||||||
ID string `bun:"id,type:text,notnull,unique:cloud_provider_id"`
|
|
||||||
ConfigJSON string `bun:"config_json,type:text"`
|
|
||||||
CloudAccountID string `bun:"cloud_account_id,type:text"`
|
|
||||||
LastAgentReportJSON string `bun:"last_agent_report_json,type:text"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,notnull,default:current_timestamp"`
|
|
||||||
RemovedAt *time.Time `bun:"removed_at,type:timestamp"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type newCloudIntegration struct {
|
|
||||||
bun.BaseModel `bun:"table:cloud_integration"`
|
|
||||||
|
|
||||||
types.Identifiable
|
|
||||||
types.TimeAuditable
|
|
||||||
Provider string `json:"provider" bun:"provider,type:text"`
|
|
||||||
Config string `json:"config" bun:"config,type:text"`
|
|
||||||
AccountID string `json:"account_id" bun:"account_id,type:text"`
|
|
||||||
LastAgentReport string `json:"last_agent_report" bun:"last_agent_report,type:text"`
|
|
||||||
RemovedAt *time.Time `json:"removed_at" bun:"removed_at,type:timestamp"`
|
|
||||||
OrgID string `json:"org_id" bun:"org_id,type:text"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type existingCloudIntegrationService struct {
|
|
||||||
bun.BaseModel `bun:"table:cloud_integrations_service_configs,alias:c1"`
|
|
||||||
|
|
||||||
CloudProvider string `bun:"cloud_provider,type:text,notnull,unique:service_cloud_provider_account"`
|
|
||||||
CloudAccountID string `bun:"cloud_account_id,type:text,notnull,unique:service_cloud_provider_account"`
|
|
||||||
ServiceID string `bun:"service_id,type:text,notnull,unique:service_cloud_provider_account"`
|
|
||||||
ConfigJSON string `bun:"config_json,type:text"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,default:current_timestamp"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type newCloudIntegrationService struct {
|
|
||||||
bun.BaseModel `bun:"table:cloud_integration_service,alias:cis"`
|
|
||||||
|
|
||||||
types.Identifiable
|
|
||||||
types.TimeAuditable
|
|
||||||
Type string `bun:"type,type:text,notnull,unique:cloud_integration_id_type"`
|
|
||||||
Config string `bun:"config,type:text"`
|
|
||||||
CloudIntegrationID string `bun:"cloud_integration_id,type:text,notnull,unique:cloud_integration_id_type"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type StorablePersonalAccessToken struct {
|
|
||||||
bun.BaseModel `bun:"table:personal_access_token"`
|
|
||||||
types.Identifiable
|
|
||||||
types.TimeAuditable
|
|
||||||
OrgID string `json:"orgId" bun:"org_id,type:text,notnull"`
|
|
||||||
Role string `json:"role" bun:"role,type:text,notnull,default:'ADMIN'"`
|
|
||||||
UserID string `json:"userId" bun:"user_id,type:text,notnull"`
|
|
||||||
Token string `json:"token" bun:"token,type:text,notnull,unique"`
|
|
||||||
Name string `json:"name" bun:"name,type:text,notnull"`
|
|
||||||
ExpiresAt int64 `json:"expiresAt" bun:"expires_at,notnull,default:0"`
|
|
||||||
LastUsed int64 `json:"lastUsed" bun:"last_used,notnull,default:0"`
|
|
||||||
Revoked bool `json:"revoked" bun:"revoked,notnull,default:false"`
|
|
||||||
UpdatedByUserID string `json:"updatedByUserId" bun:"updated_by_user_id,type:text,notnull,default:''"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateIntegrations) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
|
|
||||||
// begin transaction
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
// don't run the migration if there are multiple org ids
|
|
||||||
orgIDs := make([]string, 0)
|
|
||||||
err = migration.store.BunDB().NewSelect().Model((*types.Organization)(nil)).Column("id").Scan(ctx, &orgIDs)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if len(orgIDs) > 1 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// installed integrations
|
|
||||||
err = migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
RenameTableAndModifyModel(ctx, tx, new(existingInstalledIntegration), new(newInstalledIntegration), []string{OrgReference}, func(ctx context.Context) error {
|
|
||||||
existingIntegrations := make([]*existingInstalledIntegration, 0)
|
|
||||||
err = tx.
|
|
||||||
NewSelect().
|
|
||||||
Model(&existingIntegrations).
|
|
||||||
Scan(ctx)
|
|
||||||
if err != nil {
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err == nil && len(existingIntegrations) > 0 {
|
|
||||||
newIntegrations := migration.
|
|
||||||
CopyOldIntegrationsToNewIntegrations(tx, orgIDs[0], existingIntegrations)
|
|
||||||
_, err = tx.
|
|
||||||
NewInsert().
|
|
||||||
Model(&newIntegrations).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// cloud integrations
|
|
||||||
err = migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
RenameTableAndModifyModel(ctx, tx, new(existingCloudIntegration), new(newCloudIntegration), []string{OrgReference}, func(ctx context.Context) error {
|
|
||||||
existingIntegrations := make([]*existingCloudIntegration, 0)
|
|
||||||
err = tx.
|
|
||||||
NewSelect().
|
|
||||||
Model(&existingIntegrations).
|
|
||||||
Where("removed_at IS NULL"). // we will only copy the accounts that are not removed
|
|
||||||
Scan(ctx)
|
|
||||||
if err != nil {
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err == nil && len(existingIntegrations) > 0 {
|
|
||||||
newIntegrations := migration.
|
|
||||||
CopyOldCloudIntegrationsToNewCloudIntegrations(tx, orgIDs[0], existingIntegrations)
|
|
||||||
_, err = tx.
|
|
||||||
NewInsert().
|
|
||||||
Model(&newIntegrations).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// add unique constraint to cloud_integration table
|
|
||||||
_, err = tx.ExecContext(ctx, `CREATE UNIQUE INDEX IF NOT EXISTS unique_cloud_integration ON cloud_integration (id, provider, org_id)`)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// cloud integration service
|
|
||||||
err = migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
RenameTableAndModifyModel(ctx, tx, new(existingCloudIntegrationService), new(newCloudIntegrationService), []string{CloudIntegrationReference}, func(ctx context.Context) error {
|
|
||||||
existingServices := make([]*existingCloudIntegrationService, 0)
|
|
||||||
|
|
||||||
// only one service per provider,account id and type
|
|
||||||
// so there won't be any duplicates.
|
|
||||||
// just that these will be enabled as soon as the integration for the account is enabled
|
|
||||||
err = tx.
|
|
||||||
NewSelect().
|
|
||||||
Model(&existingServices).
|
|
||||||
Scan(ctx)
|
|
||||||
if err != nil {
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err == nil && len(existingServices) > 0 {
|
|
||||||
newServices := migration.
|
|
||||||
CopyOldCloudIntegrationServicesToNewCloudIntegrationServices(tx, orgIDs[0], existingServices)
|
|
||||||
if len(newServices) > 0 {
|
|
||||||
_, err = tx.
|
|
||||||
NewInsert().
|
|
||||||
Model(&newServices).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(orgIDs) == 0 {
|
|
||||||
err = tx.Commit()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// copy the old aws integration user to the new user
|
|
||||||
err = migration.copyOldAwsIntegrationUser(tx, orgIDs[0])
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = tx.Commit()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateIntegrations) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateIntegrations) CopyOldIntegrationsToNewIntegrations(tx bun.IDB, orgID string, existingIntegrations []*existingInstalledIntegration) []*newInstalledIntegration {
|
|
||||||
newIntegrations := make([]*newInstalledIntegration, 0)
|
|
||||||
|
|
||||||
for _, integration := range existingIntegrations {
|
|
||||||
newIntegrations = append(newIntegrations, &newInstalledIntegration{
|
|
||||||
Identifiable: types.Identifiable{
|
|
||||||
ID: valuer.GenerateUUID(),
|
|
||||||
},
|
|
||||||
Type: integration.IntegrationID,
|
|
||||||
Config: integration.ConfigJSON,
|
|
||||||
InstalledAt: integration.InstalledAt,
|
|
||||||
OrgID: orgID,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return newIntegrations
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateIntegrations) CopyOldCloudIntegrationsToNewCloudIntegrations(tx bun.IDB, orgID string, existingIntegrations []*existingCloudIntegration) []*newCloudIntegration {
|
|
||||||
newIntegrations := make([]*newCloudIntegration, 0)
|
|
||||||
|
|
||||||
for _, integration := range existingIntegrations {
|
|
||||||
newIntegrations = append(newIntegrations, &newCloudIntegration{
|
|
||||||
Identifiable: types.Identifiable{
|
|
||||||
ID: valuer.GenerateUUID(),
|
|
||||||
},
|
|
||||||
TimeAuditable: types.TimeAuditable{
|
|
||||||
CreatedAt: integration.CreatedAt,
|
|
||||||
UpdatedAt: integration.CreatedAt,
|
|
||||||
},
|
|
||||||
Provider: integration.CloudProvider,
|
|
||||||
AccountID: integration.CloudAccountID,
|
|
||||||
Config: integration.ConfigJSON,
|
|
||||||
LastAgentReport: integration.LastAgentReportJSON,
|
|
||||||
RemovedAt: integration.RemovedAt,
|
|
||||||
OrgID: orgID,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return newIntegrations
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateIntegrations) CopyOldCloudIntegrationServicesToNewCloudIntegrationServices(tx bun.IDB, orgID string, existingServices []*existingCloudIntegrationService) []*newCloudIntegrationService {
|
|
||||||
newServices := make([]*newCloudIntegrationService, 0)
|
|
||||||
|
|
||||||
for _, service := range existingServices {
|
|
||||||
var cloudIntegrationID string
|
|
||||||
err := tx.NewSelect().
|
|
||||||
Model((*newCloudIntegration)(nil)).
|
|
||||||
Column("id").
|
|
||||||
Where("account_id = ?", service.CloudAccountID).
|
|
||||||
Where("provider = ?", service.CloudProvider).
|
|
||||||
Where("org_id = ?", orgID).
|
|
||||||
Scan(context.Background(), &cloudIntegrationID)
|
|
||||||
if err != nil {
|
|
||||||
if err == sql.ErrNoRows {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
newServices = append(newServices, &newCloudIntegrationService{
|
|
||||||
Identifiable: types.Identifiable{
|
|
||||||
ID: valuer.GenerateUUID(),
|
|
||||||
},
|
|
||||||
TimeAuditable: types.TimeAuditable{
|
|
||||||
CreatedAt: service.CreatedAt,
|
|
||||||
UpdatedAt: service.CreatedAt,
|
|
||||||
},
|
|
||||||
Type: service.ServiceID,
|
|
||||||
Config: service.ConfigJSON,
|
|
||||||
CloudIntegrationID: cloudIntegrationID,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return newServices
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateIntegrations) copyOldAwsIntegrationUser(tx bun.IDB, orgID string) error {
|
|
||||||
type oldUser struct {
|
|
||||||
bun.BaseModel `bun:"table:users"`
|
|
||||||
|
|
||||||
types.TimeAuditable
|
|
||||||
ID string `bun:"id,pk,type:text" json:"id"`
|
|
||||||
Name string `bun:"name,type:text,notnull" json:"name"`
|
|
||||||
Email string `bun:"email,type:text,notnull,unique" json:"email"`
|
|
||||||
Password string `bun:"password,type:text,notnull" json:"-"`
|
|
||||||
ProfilePictureURL string `bun:"profile_picture_url,type:text" json:"profilePictureURL"`
|
|
||||||
GroupID string `bun:"group_id,type:text,notnull" json:"groupId"`
|
|
||||||
OrgID string `bun:"org_id,type:text,notnull" json:"orgId"`
|
|
||||||
}
|
|
||||||
|
|
||||||
user := &oldUser{}
|
|
||||||
err := tx.NewSelect().Model(user).Where("email = ?", "aws-integration@signoz.io").Scan(context.Background())
|
|
||||||
if err != nil {
|
|
||||||
if err == sql.ErrNoRows {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if the id is already an uuid
|
|
||||||
if _, err := uuid.Parse(user.ID); err == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// new user
|
|
||||||
newUser := &oldUser{
|
|
||||||
ID: uuid.New().String(),
|
|
||||||
TimeAuditable: types.TimeAuditable{
|
|
||||||
CreatedAt: time.Now(),
|
|
||||||
UpdatedAt: time.Now(),
|
|
||||||
},
|
|
||||||
OrgID: orgID,
|
|
||||||
Name: user.Name,
|
|
||||||
Email: user.Email,
|
|
||||||
GroupID: user.GroupID,
|
|
||||||
Password: user.Password,
|
|
||||||
}
|
|
||||||
|
|
||||||
// get the pat for old user
|
|
||||||
pat := &StorablePersonalAccessToken{}
|
|
||||||
err = tx.NewSelect().Model(pat).Where("user_id = ? and revoked = false", "aws-integration").Scan(context.Background())
|
|
||||||
if err != nil {
|
|
||||||
if err == sql.ErrNoRows {
|
|
||||||
// delete the old user
|
|
||||||
_, err = tx.ExecContext(context.Background(), `DELETE FROM users WHERE id = ?`, user.ID)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// new pat
|
|
||||||
newPAT := &StorablePersonalAccessToken{
|
|
||||||
Identifiable: types.Identifiable{ID: valuer.GenerateUUID()},
|
|
||||||
TimeAuditable: types.TimeAuditable{
|
|
||||||
CreatedAt: time.Now(),
|
|
||||||
UpdatedAt: time.Now(),
|
|
||||||
},
|
|
||||||
OrgID: orgID,
|
|
||||||
UserID: newUser.ID,
|
|
||||||
Token: pat.Token,
|
|
||||||
Name: pat.Name,
|
|
||||||
ExpiresAt: pat.ExpiresAt,
|
|
||||||
LastUsed: pat.LastUsed,
|
|
||||||
Revoked: pat.Revoked,
|
|
||||||
Role: pat.Role,
|
|
||||||
}
|
|
||||||
|
|
||||||
// delete old user
|
|
||||||
_, err = tx.ExecContext(context.Background(), `DELETE FROM users WHERE id = ?`, user.ID)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// insert the new user
|
|
||||||
_, err = tx.NewInsert().Model(newUser).Exec(context.Background())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// insert the new pat
|
|
||||||
_, err = tx.NewInsert().Model(newPAT).Exec(context.Background())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,345 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"database/sql"
|
|
||||||
"database/sql/driver"
|
|
||||||
"encoding/json"
|
|
||||||
"strconv"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types"
|
|
||||||
ruletypes "github.com/SigNoz/signoz/pkg/types/ruletypes"
|
|
||||||
"github.com/SigNoz/signoz/pkg/valuer"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type updateRules struct {
|
|
||||||
store sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
type AlertIds []string
|
|
||||||
|
|
||||||
func (a *AlertIds) Scan(src interface{}) error {
|
|
||||||
if data, ok := src.([]byte); ok {
|
|
||||||
return json.Unmarshal(data, a)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *AlertIds) Value() (driver.Value, error) {
|
|
||||||
return json.Marshal(a)
|
|
||||||
}
|
|
||||||
|
|
||||||
type existingRule struct {
|
|
||||||
bun.BaseModel `bun:"table:rules"`
|
|
||||||
ID int `bun:"id,pk,autoincrement"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,type:datetime,notnull"`
|
|
||||||
CreatedBy string `bun:"created_by,type:text,notnull"`
|
|
||||||
UpdatedAt time.Time `bun:"updated_at,type:datetime,notnull"`
|
|
||||||
UpdatedBy string `bun:"updated_by,type:text,notnull"`
|
|
||||||
Deleted int `bun:"deleted,notnull,default:0"`
|
|
||||||
Data string `bun:"data,type:text,notnull"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type newRule struct {
|
|
||||||
bun.BaseModel `bun:"table:rule"`
|
|
||||||
types.Identifiable
|
|
||||||
types.TimeAuditable
|
|
||||||
types.UserAuditable
|
|
||||||
Deleted int `bun:"deleted,notnull,default:0"`
|
|
||||||
Data string `bun:"data,type:text,notnull"`
|
|
||||||
OrgID string `bun:"org_id,type:text"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type existingMaintenance struct {
|
|
||||||
bun.BaseModel `bun:"table:planned_maintenance"`
|
|
||||||
ID int `bun:"id,pk,autoincrement"`
|
|
||||||
Name string `bun:"name,type:text,notnull"`
|
|
||||||
Description string `bun:"description,type:text"`
|
|
||||||
AlertIDs *AlertIds `bun:"alert_ids,type:text"`
|
|
||||||
Schedule *ruletypes.Schedule `bun:"schedule,type:text,notnull"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,type:datetime,notnull"`
|
|
||||||
CreatedBy string `bun:"created_by,type:text,notnull"`
|
|
||||||
UpdatedAt time.Time `bun:"updated_at,type:datetime,notnull"`
|
|
||||||
UpdatedBy string `bun:"updated_by,type:text,notnull"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type newMaintenance struct {
|
|
||||||
bun.BaseModel `bun:"table:planned_maintenance_new"`
|
|
||||||
types.Identifiable
|
|
||||||
types.TimeAuditable
|
|
||||||
types.UserAuditable
|
|
||||||
Name string `bun:"name,type:text,notnull"`
|
|
||||||
Description string `bun:"description,type:text"`
|
|
||||||
Schedule *ruletypes.Schedule `bun:"schedule,type:text,notnull"`
|
|
||||||
OrgID string `bun:"org_id,type:text"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type storablePlannedMaintenanceRule struct {
|
|
||||||
bun.BaseModel `bun:"table:planned_maintenance_rule"`
|
|
||||||
types.Identifiable
|
|
||||||
PlannedMaintenanceID valuer.UUID `bun:"planned_maintenance_id,type:text"`
|
|
||||||
RuleID valuer.UUID `bun:"rule_id,type:text"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type ruleHistory struct {
|
|
||||||
bun.BaseModel `bun:"table:rule_history"`
|
|
||||||
RuleID int `bun:"rule_id"`
|
|
||||||
RuleUUID valuer.UUID `bun:"rule_uuid"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUpdateRulesFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("update_rules"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return newUpdateRules(ctx, ps, c, sqlstore)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newUpdateRules(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &updateRules{store: store}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateRules) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateRules) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
ruleIDToRuleUUIDMap := map[int]valuer.UUID{}
|
|
||||||
err = migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
RenameTableAndModifyModel(ctx, tx, new(existingRule), new(newRule), []string{OrgReference}, func(ctx context.Context) error {
|
|
||||||
existingRules := make([]*existingRule, 0)
|
|
||||||
err := tx.
|
|
||||||
NewSelect().
|
|
||||||
Model(&existingRules).
|
|
||||||
Scan(ctx)
|
|
||||||
if err != nil {
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err == nil && len(existingRules) > 0 {
|
|
||||||
var orgID string
|
|
||||||
err := migration.
|
|
||||||
store.
|
|
||||||
BunDB().
|
|
||||||
NewSelect().
|
|
||||||
Model((*types.Organization)(nil)).
|
|
||||||
Column("id").
|
|
||||||
Scan(ctx, &orgID)
|
|
||||||
if err != nil {
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err == nil {
|
|
||||||
newRules, idUUIDMap := migration.CopyExistingRulesToNewRules(existingRules, orgID)
|
|
||||||
ruleIDToRuleUUIDMap = idUUIDMap
|
|
||||||
_, err = tx.
|
|
||||||
NewInsert().
|
|
||||||
Model(&newRules).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
err = migration.store.Dialect().UpdatePrimaryKey(ctx, tx, new(existingMaintenance), new(newMaintenance), OrgReference, func(ctx context.Context) error {
|
|
||||||
_, err := tx.
|
|
||||||
NewCreateTable().
|
|
||||||
IfNotExists().
|
|
||||||
Model(new(storablePlannedMaintenanceRule)).
|
|
||||||
ForeignKey(`("planned_maintenance_id") REFERENCES "planned_maintenance_new" ("id") ON DELETE CASCADE ON UPDATE CASCADE`).
|
|
||||||
ForeignKey(`("rule_id") REFERENCES "rule" ("id")`).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
existingMaintenances := make([]*existingMaintenance, 0)
|
|
||||||
err = tx.
|
|
||||||
NewSelect().
|
|
||||||
Model(&existingMaintenances).
|
|
||||||
Scan(ctx)
|
|
||||||
if err != nil {
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err == nil && len(existingMaintenances) > 0 {
|
|
||||||
var orgID string
|
|
||||||
err := migration.
|
|
||||||
store.
|
|
||||||
BunDB().
|
|
||||||
NewSelect().
|
|
||||||
Model((*types.Organization)(nil)).
|
|
||||||
Column("id").
|
|
||||||
Scan(ctx, &orgID)
|
|
||||||
if err != nil {
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err == nil {
|
|
||||||
newMaintenances, newMaintenancesRules, err := migration.CopyExistingMaintenancesToNewMaintenancesAndRules(existingMaintenances, orgID, ruleIDToRuleUUIDMap)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = tx.
|
|
||||||
NewInsert().
|
|
||||||
Model(&newMaintenances).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(newMaintenancesRules) > 0 {
|
|
||||||
_, err = tx.
|
|
||||||
NewInsert().
|
|
||||||
Model(&newMaintenancesRules).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
ruleHistories := make([]*ruleHistory, 0)
|
|
||||||
for ruleID, ruleUUID := range ruleIDToRuleUUIDMap {
|
|
||||||
ruleHistories = append(ruleHistories, &ruleHistory{
|
|
||||||
RuleID: ruleID,
|
|
||||||
RuleUUID: ruleUUID,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = tx.
|
|
||||||
NewCreateTable().
|
|
||||||
IfNotExists().
|
|
||||||
Model(&ruleHistories).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if len(ruleHistories) > 0 {
|
|
||||||
_, err = tx.
|
|
||||||
NewInsert().
|
|
||||||
Model(&ruleHistories).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = tx.Commit()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateRules) Down(context.Context, *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateRules) CopyExistingRulesToNewRules(existingRules []*existingRule, orgID string) ([]*newRule, map[int]valuer.UUID) {
|
|
||||||
newRules := make([]*newRule, 0)
|
|
||||||
idUUIDMap := map[int]valuer.UUID{}
|
|
||||||
for _, rule := range existingRules {
|
|
||||||
uuid := valuer.GenerateUUID()
|
|
||||||
idUUIDMap[rule.ID] = uuid
|
|
||||||
newRules = append(newRules, &newRule{
|
|
||||||
Identifiable: types.Identifiable{
|
|
||||||
ID: uuid,
|
|
||||||
},
|
|
||||||
TimeAuditable: types.TimeAuditable{
|
|
||||||
CreatedAt: rule.CreatedAt,
|
|
||||||
UpdatedAt: rule.UpdatedAt,
|
|
||||||
},
|
|
||||||
UserAuditable: types.UserAuditable{
|
|
||||||
CreatedBy: rule.CreatedBy,
|
|
||||||
UpdatedBy: rule.UpdatedBy,
|
|
||||||
},
|
|
||||||
Deleted: rule.Deleted,
|
|
||||||
Data: rule.Data,
|
|
||||||
OrgID: orgID,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return newRules, idUUIDMap
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateRules) CopyExistingMaintenancesToNewMaintenancesAndRules(existingMaintenances []*existingMaintenance, orgID string, ruleIDToRuleUUIDMap map[int]valuer.UUID) ([]*newMaintenance, []*storablePlannedMaintenanceRule, error) {
|
|
||||||
newMaintenances := make([]*newMaintenance, 0)
|
|
||||||
newMaintenanceRules := make([]*storablePlannedMaintenanceRule, 0)
|
|
||||||
|
|
||||||
for _, maintenance := range existingMaintenances {
|
|
||||||
ruleIDs := maintenance.AlertIDs
|
|
||||||
maintenanceUUID := valuer.GenerateUUID()
|
|
||||||
newMaintenance := newMaintenance{
|
|
||||||
Identifiable: types.Identifiable{
|
|
||||||
ID: maintenanceUUID,
|
|
||||||
},
|
|
||||||
TimeAuditable: types.TimeAuditable{
|
|
||||||
CreatedAt: maintenance.CreatedAt,
|
|
||||||
UpdatedAt: maintenance.UpdatedAt,
|
|
||||||
},
|
|
||||||
UserAuditable: types.UserAuditable{
|
|
||||||
CreatedBy: maintenance.CreatedBy,
|
|
||||||
UpdatedBy: maintenance.UpdatedBy,
|
|
||||||
},
|
|
||||||
Name: maintenance.Name,
|
|
||||||
Description: maintenance.Description,
|
|
||||||
Schedule: maintenance.Schedule,
|
|
||||||
OrgID: orgID,
|
|
||||||
}
|
|
||||||
newMaintenances = append(newMaintenances, &newMaintenance)
|
|
||||||
for _, ruleIDStr := range *ruleIDs {
|
|
||||||
ruleID, err := strconv.Atoi(ruleIDStr)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
newMaintenanceRules = append(newMaintenanceRules, &storablePlannedMaintenanceRule{
|
|
||||||
Identifiable: types.Identifiable{
|
|
||||||
ID: valuer.GenerateUUID(),
|
|
||||||
},
|
|
||||||
PlannedMaintenanceID: maintenanceUUID,
|
|
||||||
RuleID: ruleIDToRuleUUIDMap[ruleID],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return newMaintenances, newMaintenanceRules, nil
|
|
||||||
}
|
|
||||||
@ -1,117 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type updateOrganizations struct {
|
|
||||||
store sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUpdateOrganizationsFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("update_organizations"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return newUpdateOrganizations(ctx, ps, c, sqlstore)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newUpdateOrganizations(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &updateOrganizations{store: store}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateOrganizations) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateOrganizations) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
err = migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
DropColumn(ctx, tx, "organizations", "is_anonymous")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
DropColumn(ctx, tx, "organizations", "has_opted_updates")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
RenameColumn(ctx, tx, "organizations", "name", "display_name")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
AddColumn(ctx, tx, "organizations", "name", "TEXT")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = tx.
|
|
||||||
NewCreateIndex().
|
|
||||||
Unique().
|
|
||||||
IfNotExists().
|
|
||||||
Index("idx_unique_name").
|
|
||||||
Table("organizations").
|
|
||||||
Column("name").
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
AddColumn(ctx, tx, "organizations", "alias", "TEXT")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = tx.
|
|
||||||
NewCreateIndex().
|
|
||||||
Unique().
|
|
||||||
IfNotExists().
|
|
||||||
Index("idx_unique_alias").
|
|
||||||
Table("organizations").
|
|
||||||
Column("alias").
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = tx.Commit()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateOrganizations) Down(context.Context, *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,162 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type dropGroups struct {
|
|
||||||
sqlstore sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewDropGroupsFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("drop_groups"), func(ctx context.Context, providerSettings factory.ProviderSettings, config Config) (SQLMigration, error) {
|
|
||||||
return newDropGroups(ctx, providerSettings, config, sqlstore)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newDropGroups(_ context.Context, _ factory.ProviderSettings, _ Config, sqlstore sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &dropGroups{sqlstore: sqlstore}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *dropGroups) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *dropGroups) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
type Group struct {
|
|
||||||
bun.BaseModel `bun:"table:groups"`
|
|
||||||
|
|
||||||
types.TimeAuditable
|
|
||||||
OrgID string `bun:"org_id,type:text"`
|
|
||||||
ID string `bun:"id,pk,type:text" json:"id"`
|
|
||||||
Name string `bun:"name,type:text,notnull,unique" json:"name"`
|
|
||||||
}
|
|
||||||
|
|
||||||
exists, err := migration.sqlstore.Dialect().TableExists(ctx, db, new(Group))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if !exists {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disable foreign keys temporarily
|
|
||||||
if err := migration.sqlstore.Dialect().ToggleForeignKeyConstraint(ctx, db, false); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
type existingUser struct {
|
|
||||||
bun.BaseModel `bun:"table:users"`
|
|
||||||
|
|
||||||
types.TimeAuditable
|
|
||||||
ID string `bun:"id,pk,type:text" json:"id"`
|
|
||||||
Name string `bun:"name,type:text,notnull" json:"name"`
|
|
||||||
Email string `bun:"email,type:text,notnull,unique" json:"email"`
|
|
||||||
Password string `bun:"password,type:text,notnull" json:"-"`
|
|
||||||
ProfilePictureURL string `bun:"profile_picture_url,type:text" json:"profilePictureURL"`
|
|
||||||
GroupID string `bun:"group_id,type:text,notnull" json:"groupId"`
|
|
||||||
OrgID string `bun:"org_id,type:text,notnull" json:"orgId"`
|
|
||||||
}
|
|
||||||
|
|
||||||
var existingUsers []*existingUser
|
|
||||||
if err := tx.
|
|
||||||
NewSelect().
|
|
||||||
Model(&existingUsers).
|
|
||||||
Scan(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
var groups []*Group
|
|
||||||
if err := tx.
|
|
||||||
NewSelect().
|
|
||||||
Model(&groups).
|
|
||||||
Scan(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
groupIDToRoleMap := make(map[string]string)
|
|
||||||
for _, group := range groups {
|
|
||||||
groupIDToRoleMap[group.ID] = group.Name
|
|
||||||
}
|
|
||||||
|
|
||||||
roleToUserIDMap := make(map[string][]string)
|
|
||||||
for _, user := range existingUsers {
|
|
||||||
roleToUserIDMap[groupIDToRoleMap[user.GroupID]] = append(roleToUserIDMap[groupIDToRoleMap[user.GroupID]], user.ID)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := migration.sqlstore.Dialect().DropColumnWithForeignKeyConstraint(ctx, tx, new(struct {
|
|
||||||
bun.BaseModel `bun:"table:users"`
|
|
||||||
|
|
||||||
types.TimeAuditable
|
|
||||||
ID string `bun:"id,pk,type:text"`
|
|
||||||
Name string `bun:"name,type:text,notnull"`
|
|
||||||
Email string `bun:"email,type:text,notnull,unique"`
|
|
||||||
Password string `bun:"password,type:text,notnull"`
|
|
||||||
ProfilePictureURL string `bun:"profile_picture_url,type:text"`
|
|
||||||
OrgID string `bun:"org_id,type:text,notnull"`
|
|
||||||
}), "group_id"); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := migration.sqlstore.Dialect().AddColumn(ctx, tx, "users", "role", "TEXT"); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
for role, userIDs := range roleToUserIDMap {
|
|
||||||
if _, err := tx.
|
|
||||||
NewUpdate().
|
|
||||||
Table("users").
|
|
||||||
Set("role = ?", role).
|
|
||||||
Where("id IN (?)", bun.In(userIDs)).
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := migration.sqlstore.Dialect().AddNotNullDefaultToColumn(ctx, tx, "users", "role", "TEXT", "'VIEWER'"); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := tx.
|
|
||||||
NewDropTable().
|
|
||||||
Table("groups").
|
|
||||||
IfExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := tx.Commit(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enable foreign keys
|
|
||||||
if err := migration.sqlstore.Dialect().ToggleForeignKeyConstraint(ctx, db, true); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *dropGroups) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,103 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"database/sql"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/errors"
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types/quickfiltertypes"
|
|
||||||
"github.com/SigNoz/signoz/pkg/valuer"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type createQuickFilters struct {
|
|
||||||
store sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
type quickFilter struct {
|
|
||||||
bun.BaseModel `bun:"table:quick_filter"`
|
|
||||||
types.Identifiable
|
|
||||||
OrgID string `bun:"org_id,notnull,unique:org_id_signal,type:text"`
|
|
||||||
Filter string `bun:"filter,notnull,type:text"`
|
|
||||||
Signal string `bun:"signal,notnull,unique:org_id_signal,type:text"`
|
|
||||||
types.TimeAuditable
|
|
||||||
types.UserAuditable
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewCreateQuickFiltersFactory(store sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("create_quick_filters"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return &createQuickFilters{store: store}, nil
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *createQuickFilters) Register(migrations *migrate.Migrations) error {
|
|
||||||
return migrations.Register(m.Up, m.Down)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *createQuickFilters) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
// Create table if not exists
|
|
||||||
_, err = tx.NewCreateTable().
|
|
||||||
Model((*quickFilter)(nil)).
|
|
||||||
IfNotExists().
|
|
||||||
ForeignKey(`("org_id") REFERENCES "organizations" ("id") ON DELETE CASCADE ON UPDATE CASCADE`).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get default organization ID
|
|
||||||
var defaultOrg valuer.UUID
|
|
||||||
err = tx.NewSelect().Table("organizations").Column("id").Limit(1).Scan(ctx, &defaultOrg)
|
|
||||||
if err != nil {
|
|
||||||
if err == sql.ErrNoRows {
|
|
||||||
// No organizations found, nothing to insert, commit and return
|
|
||||||
err := tx.Commit()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the default quick filters
|
|
||||||
storableQuickFilters, err := quickfiltertypes.NewDefaultQuickFilter(defaultOrg)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Insert all filters at once
|
|
||||||
_, err = tx.NewInsert().
|
|
||||||
Model(&storableQuickFilters).
|
|
||||||
Exec(ctx)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
if errors.Ast(m.store.WrapAlreadyExistsErrf(err, errors.CodeAlreadyExists, "Quick Filter already exists"), errors.TypeAlreadyExists) {
|
|
||||||
err := tx.Commit()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Commit the transaction
|
|
||||||
return tx.Commit()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *createQuickFilters) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,106 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"database/sql"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/errors"
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types/quickfiltertypes"
|
|
||||||
"github.com/SigNoz/signoz/pkg/valuer"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type updateQuickFilters struct {
|
|
||||||
store sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUpdateQuickFiltersFactory(store sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("update_quick_filters"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return newUpdateQuickFilters(ctx, ps, c, store)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newUpdateQuickFilters(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &updateQuickFilters{
|
|
||||||
store: store,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateQuickFilters) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateQuickFilters) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
// Delete all existing quick filters
|
|
||||||
_, err = tx.NewDelete().
|
|
||||||
Table("quick_filter").
|
|
||||||
Where("1=1"). // Delete all rows
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get all organization IDs as strings
|
|
||||||
var orgIDs []string
|
|
||||||
err = tx.NewSelect().
|
|
||||||
Table("organizations").
|
|
||||||
Column("id").
|
|
||||||
Scan(ctx, &orgIDs)
|
|
||||||
if err != nil {
|
|
||||||
if err == sql.ErrNoRows {
|
|
||||||
// No organizations found, commit the transaction (deletion is done) and return
|
|
||||||
if err := tx.Commit(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// For each organization, create new quick filters with the updated NewDefaultQuickFilter function
|
|
||||||
for _, orgID := range orgIDs {
|
|
||||||
// Get the updated default quick filters
|
|
||||||
storableQuickFilters, err := quickfiltertypes.NewDefaultQuickFilter(valuer.MustNewUUID(orgID))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Insert all filters for this organization
|
|
||||||
_, err = tx.NewInsert().
|
|
||||||
Model(&storableQuickFilters).
|
|
||||||
Exec(ctx)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
if errors.Ast(migration.store.WrapAlreadyExistsErrf(err, errors.CodeAlreadyExists, "Quick Filter already exists"), errors.TypeAlreadyExists) {
|
|
||||||
// Skip if filters already exist for this org
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := tx.Commit(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateQuickFilters) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,235 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"database/sql"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types"
|
|
||||||
"github.com/SigNoz/signoz/pkg/valuer"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type authRefactor struct {
|
|
||||||
store sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewAuthRefactorFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("auth_refactor"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return newAuthRefactor(ctx, ps, c, sqlstore)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newAuthRefactor(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &authRefactor{store: store}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *authRefactor) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type existingUser32 struct {
|
|
||||||
bun.BaseModel `bun:"table:users"`
|
|
||||||
|
|
||||||
types.TimeAuditable
|
|
||||||
ID string `bun:"id,pk,type:text" json:"id"`
|
|
||||||
Name string `bun:"name,type:text,notnull" json:"name"`
|
|
||||||
Email string `bun:"email,type:text,notnull,unique" json:"email"`
|
|
||||||
Password string `bun:"password,type:text,notnull" json:"-"`
|
|
||||||
ProfilePictureURL string `bun:"profile_picture_url,type:text" json:"profilePictureURL"`
|
|
||||||
Role string `bun:"role,type:text,notnull" json:"role"`
|
|
||||||
OrgID string `bun:"org_id,type:text,notnull" json:"orgId"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type factorPassword32 struct {
|
|
||||||
bun.BaseModel `bun:"table:factor_password"`
|
|
||||||
|
|
||||||
types.Identifiable
|
|
||||||
types.TimeAuditable
|
|
||||||
Password string `bun:"password,type:text,notnull" json:"password"`
|
|
||||||
Temporary bool `bun:"temporary,type:boolean,notnull" json:"temporary"`
|
|
||||||
UserID string `bun:"user_id,type:text,notnull" json:"userID"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type existingResetPasswordRequest32 struct {
|
|
||||||
bun.BaseModel `bun:"table:reset_password_request"`
|
|
||||||
|
|
||||||
types.Identifiable
|
|
||||||
Token string `bun:"token,type:text,notnull" json:"token"`
|
|
||||||
UserID string `bun:"user_id,type:text,notnull,unique" json:"userId"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type newResetPasswordRequest32 struct {
|
|
||||||
bun.BaseModel `bun:"table:reset_password_token"`
|
|
||||||
|
|
||||||
types.Identifiable
|
|
||||||
Token string `bun:"token,type:text,notnull" json:"token"`
|
|
||||||
PasswordID string `bun:"password_id,type:text,notnull" json:"passwordID"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *authRefactor) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
if _, err := tx.NewCreateTable().
|
|
||||||
Model(new(factorPassword32)).
|
|
||||||
ForeignKey(`("user_id") REFERENCES "users" ("id")`).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// copy passwords from users table to factor_password table
|
|
||||||
err = migration.CopyOldPasswordToNewPassword(ctx, tx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// delete profile picture url
|
|
||||||
err = migration.store.Dialect().DropColumn(ctx, tx, "users", "profile_picture_url")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// delete password
|
|
||||||
err = migration.store.Dialect().DropColumn(ctx, tx, "users", "password")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// rename name to display name
|
|
||||||
_, err = migration.store.Dialect().RenameColumn(ctx, tx, "users", "name", "display_name")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
RenameTableAndModifyModel(ctx, tx, new(existingResetPasswordRequest32), new(newResetPasswordRequest32), []string{FactorPasswordReference}, func(ctx context.Context) error {
|
|
||||||
existingRequests := make([]*existingResetPasswordRequest32, 0)
|
|
||||||
err = tx.
|
|
||||||
NewSelect().
|
|
||||||
Model(&existingRequests).
|
|
||||||
Scan(ctx)
|
|
||||||
if err != nil {
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err == nil && len(existingRequests) > 0 {
|
|
||||||
// copy users and their passwords to new table
|
|
||||||
newRequests, err := migration.
|
|
||||||
CopyOldResetPasswordToNewResetPassword(ctx, tx, existingRequests)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = tx.
|
|
||||||
NewInsert().
|
|
||||||
Model(&newRequests).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = tx.Commit()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *authRefactor) Down(context.Context, *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *authRefactor) CopyOldPasswordToNewPassword(ctx context.Context, tx bun.IDB) error {
|
|
||||||
// check if data already in factor_password table
|
|
||||||
var count int64
|
|
||||||
err := tx.NewSelect().Model(new(factorPassword32)).ColumnExpr("COUNT(*)").Scan(ctx, &count)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if count > 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if password column exist in the users table.
|
|
||||||
exists, err := migration.store.Dialect().ColumnExists(ctx, tx, "users", "password")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if !exists {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// get all users from users table
|
|
||||||
existingUsers := make([]*existingUser32, 0)
|
|
||||||
err = tx.NewSelect().Model(&existingUsers).Scan(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
newPasswords := make([]*factorPassword32, 0)
|
|
||||||
for _, user := range existingUsers {
|
|
||||||
newPasswords = append(newPasswords, &factorPassword32{
|
|
||||||
Identifiable: types.Identifiable{
|
|
||||||
ID: valuer.GenerateUUID(),
|
|
||||||
},
|
|
||||||
Password: user.Password,
|
|
||||||
Temporary: false,
|
|
||||||
UserID: user.ID,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// insert
|
|
||||||
if len(newPasswords) > 0 {
|
|
||||||
_, err = tx.NewInsert().Model(&newPasswords).Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *authRefactor) CopyOldResetPasswordToNewResetPassword(ctx context.Context, tx bun.IDB, existingRequests []*existingResetPasswordRequest32) ([]*newResetPasswordRequest32, error) {
|
|
||||||
newRequests := make([]*newResetPasswordRequest32, 0)
|
|
||||||
for _, request := range existingRequests {
|
|
||||||
// get password id from user id
|
|
||||||
var passwordID string
|
|
||||||
err := tx.NewSelect().Table("factor_password").Column("id").Where("user_id = ?", request.UserID).Scan(ctx, &passwordID)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
newRequests = append(newRequests, &newResetPasswordRequest32{
|
|
||||||
Identifiable: types.Identifiable{
|
|
||||||
ID: valuer.GenerateUUID(),
|
|
||||||
},
|
|
||||||
Token: request.Token,
|
|
||||||
PasswordID: passwordID,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return newRequests, nil
|
|
||||||
}
|
|
||||||
@ -1,164 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"database/sql"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type migratePATToFactorAPIKey struct {
|
|
||||||
store sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewMigratePATToFactorAPIKey(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("migrate_pat_to_factor_api_key"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return newMigratePATToFactorAPIKey(ctx, ps, c, sqlstore)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newMigratePATToFactorAPIKey(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &migratePATToFactorAPIKey{store: store}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *migratePATToFactorAPIKey) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type existingPersonalAccessToken33 struct {
|
|
||||||
bun.BaseModel `bun:"table:personal_access_token"`
|
|
||||||
|
|
||||||
types.Identifiable
|
|
||||||
types.TimeAuditable
|
|
||||||
OrgID string `json:"orgId" bun:"org_id,type:text,notnull"`
|
|
||||||
Role string `json:"role" bun:"role,type:text,notnull,default:'ADMIN'"`
|
|
||||||
UserID string `json:"userId" bun:"user_id,type:text,notnull"`
|
|
||||||
Token string `json:"token" bun:"token,type:text,notnull,unique"`
|
|
||||||
Name string `json:"name" bun:"name,type:text,notnull"`
|
|
||||||
ExpiresAt int64 `json:"expiresAt" bun:"expires_at,notnull,default:0"`
|
|
||||||
LastUsed int64 `json:"lastUsed" bun:"last_used,notnull,default:0"`
|
|
||||||
Revoked bool `json:"revoked" bun:"revoked,notnull,default:false"`
|
|
||||||
UpdatedByUserID string `json:"updatedByUserId" bun:"updated_by_user_id,type:text,notnull,default:''"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// we are removing the connection with org,
|
|
||||||
// the reason we are doing this is the api keys should just have
|
|
||||||
// one foreign key, we don't want a dangling state where, an API key
|
|
||||||
// belongs to one org and some user which doesn't belong to that org.
|
|
||||||
// so going ahead with directly attaching it to user will help dangling states.
|
|
||||||
type newFactorAPIKey33 struct {
|
|
||||||
bun.BaseModel `bun:"table:factor_api_key"`
|
|
||||||
|
|
||||||
types.Identifiable
|
|
||||||
CreatedAt time.Time `bun:"created_at,notnull,nullzero,type:timestamptz" json:"createdAt"`
|
|
||||||
UpdatedAt time.Time `bun:"updated_at,notnull,nullzero,type:timestamptz" json:"updatedAt"`
|
|
||||||
CreatedBy string `bun:"created_by,notnull" json:"createdBy"`
|
|
||||||
UpdatedBy string `bun:"updated_by,notnull" json:"updatedBy"`
|
|
||||||
Token string `json:"token" bun:"token,type:text,notnull,unique"`
|
|
||||||
Role string `json:"role" bun:"role,type:text,notnull"`
|
|
||||||
Name string `json:"name" bun:"name,type:text,notnull"`
|
|
||||||
ExpiresAt time.Time `json:"expiresAt" bun:"expires_at,notnull,nullzero,type:timestamptz"`
|
|
||||||
LastUsed time.Time `json:"lastUsed" bun:"last_used,notnull,nullzero,type:timestamptz"`
|
|
||||||
Revoked bool `json:"revoked" bun:"revoked,notnull,default:false"`
|
|
||||||
UserID string `json:"userId" bun:"user_id,type:text,notnull"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *migratePATToFactorAPIKey) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
err = migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
RenameTableAndModifyModel(ctx, tx, new(existingPersonalAccessToken33), new(newFactorAPIKey33), []string{UserReferenceNoCascade}, func(ctx context.Context) error {
|
|
||||||
existingAPIKeys := make([]*existingPersonalAccessToken33, 0)
|
|
||||||
err = tx.
|
|
||||||
NewSelect().
|
|
||||||
Model(&existingAPIKeys).
|
|
||||||
Scan(ctx)
|
|
||||||
if err != nil && err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err == nil && len(existingAPIKeys) > 0 {
|
|
||||||
newAPIKeys, err := migration.
|
|
||||||
CopyOldPatToFactorAPIKey(ctx, tx, existingAPIKeys)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = tx.
|
|
||||||
NewInsert().
|
|
||||||
Model(&newAPIKeys).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = tx.Commit()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *migratePATToFactorAPIKey) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *migratePATToFactorAPIKey) CopyOldPatToFactorAPIKey(ctx context.Context, tx bun.IDB, existingAPIKeys []*existingPersonalAccessToken33) ([]*newFactorAPIKey33, error) {
|
|
||||||
newAPIKeys := make([]*newFactorAPIKey33, 0)
|
|
||||||
for _, apiKey := range existingAPIKeys {
|
|
||||||
|
|
||||||
if apiKey.CreatedAt.IsZero() {
|
|
||||||
apiKey.CreatedAt = time.Now()
|
|
||||||
}
|
|
||||||
if apiKey.UpdatedAt.IsZero() {
|
|
||||||
apiKey.UpdatedAt = time.Now()
|
|
||||||
}
|
|
||||||
|
|
||||||
// convert expiresAt and lastUsed to time.Time
|
|
||||||
expiresAt := time.Unix(apiKey.ExpiresAt, 0)
|
|
||||||
lastUsed := time.Unix(apiKey.LastUsed, 0)
|
|
||||||
if apiKey.LastUsed == 0 {
|
|
||||||
lastUsed = apiKey.CreatedAt
|
|
||||||
}
|
|
||||||
|
|
||||||
newAPIKeys = append(newAPIKeys, &newFactorAPIKey33{
|
|
||||||
Identifiable: apiKey.Identifiable,
|
|
||||||
CreatedAt: apiKey.CreatedAt,
|
|
||||||
UpdatedAt: apiKey.UpdatedAt,
|
|
||||||
CreatedBy: apiKey.UserID,
|
|
||||||
UpdatedBy: apiKey.UpdatedByUserID,
|
|
||||||
Token: apiKey.Token,
|
|
||||||
Role: apiKey.Role,
|
|
||||||
Name: apiKey.Name,
|
|
||||||
ExpiresAt: expiresAt,
|
|
||||||
LastUsed: lastUsed,
|
|
||||||
Revoked: apiKey.Revoked,
|
|
||||||
UserID: apiKey.UserID,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return newAPIKeys, nil
|
|
||||||
}
|
|
||||||
@ -1,149 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"database/sql"
|
|
||||||
"encoding/json"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/errors"
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types"
|
|
||||||
"github.com/SigNoz/signoz/pkg/valuer"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type updateLicense struct {
|
|
||||||
store sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
type existingLicense34 struct {
|
|
||||||
bun.BaseModel `bun:"table:licenses_v3"`
|
|
||||||
|
|
||||||
ID string `bun:"id,pk,type:text"`
|
|
||||||
Key string `bun:"key,type:text,notnull,unique"`
|
|
||||||
Data string `bun:"data,type:text"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type newLicense34 struct {
|
|
||||||
bun.BaseModel `bun:"table:license"`
|
|
||||||
|
|
||||||
types.Identifiable
|
|
||||||
types.TimeAuditable
|
|
||||||
Key string `bun:"key,type:text,notnull,unique"`
|
|
||||||
Data map[string]any `bun:"data,type:text"`
|
|
||||||
LastValidatedAt time.Time `bun:"last_validated_at,notnull"`
|
|
||||||
OrgID string `bun:"org_id,type:text,notnull" json:"orgID"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUpdateLicenseFactory(store sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("update_license"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return newUpdateLicense(ctx, ps, c, store)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newUpdateLicense(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &updateLicense{store: store}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateLicense) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateLicense) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
err = migration.store.Dialect().RenameTableAndModifyModel(ctx, tx, new(existingLicense34), new(newLicense34), []string{OrgReference}, func(ctx context.Context) error {
|
|
||||||
existingLicenses := make([]*existingLicense34, 0)
|
|
||||||
err = tx.NewSelect().Model(&existingLicenses).Scan(ctx)
|
|
||||||
if err != nil {
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err == nil && len(existingLicenses) > 0 {
|
|
||||||
var orgID string
|
|
||||||
err := migration.
|
|
||||||
store.
|
|
||||||
BunDB().
|
|
||||||
NewSelect().
|
|
||||||
Model((*types.Organization)(nil)).
|
|
||||||
Column("id").
|
|
||||||
Scan(ctx, &orgID)
|
|
||||||
if err != nil {
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err == nil {
|
|
||||||
newLicenses, err := migration.CopyExistingLicensesToNewLicenses(existingLicenses, orgID)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = tx.
|
|
||||||
NewInsert().
|
|
||||||
Model(&newLicenses).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
err = tx.Commit()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateLicense) Down(context.Context, *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateLicense) CopyExistingLicensesToNewLicenses(existingLicenses []*existingLicense34, orgID string) ([]*newLicense34, error) {
|
|
||||||
newLicenses := make([]*newLicense34, len(existingLicenses))
|
|
||||||
for idx, existingLicense := range existingLicenses {
|
|
||||||
licenseID, err := valuer.NewUUID(existingLicense.ID)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Wrapf(err, errors.TypeInvalidInput, errors.CodeInvalidInput, "license id is not a valid UUID: %s", existingLicense.ID)
|
|
||||||
}
|
|
||||||
licenseData := map[string]any{}
|
|
||||||
err = json.Unmarshal([]byte(existingLicense.Data), &licenseData)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Wrapf(err, errors.TypeInvalidInput, errors.CodeInvalidInput, "unable to unmarshal license data in map[string]any")
|
|
||||||
}
|
|
||||||
newLicenses[idx] = &newLicense34{
|
|
||||||
Identifiable: types.Identifiable{
|
|
||||||
ID: licenseID,
|
|
||||||
},
|
|
||||||
TimeAuditable: types.TimeAuditable{
|
|
||||||
CreatedAt: time.Now(),
|
|
||||||
UpdatedAt: time.Now(),
|
|
||||||
},
|
|
||||||
Key: existingLicense.Key,
|
|
||||||
Data: licenseData,
|
|
||||||
LastValidatedAt: time.Now(),
|
|
||||||
OrgID: orgID,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return newLicenses, nil
|
|
||||||
}
|
|
||||||
@ -1,103 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"database/sql"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types/quickfiltertypes"
|
|
||||||
"github.com/SigNoz/signoz/pkg/valuer"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type updateApiMonitoringFilters struct {
|
|
||||||
store sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUpdateApiMonitoringFiltersFactory(store sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("update_api_monitoring_filters"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return newUpdateApiMonitoringFilters(ctx, ps, c, store)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newUpdateApiMonitoringFilters(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &updateApiMonitoringFilters{
|
|
||||||
store: store,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateApiMonitoringFilters) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateApiMonitoringFilters) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
// Get all organization IDs as strings
|
|
||||||
var orgIDs []string
|
|
||||||
err = tx.NewSelect().
|
|
||||||
Table("organizations").
|
|
||||||
Column("id").
|
|
||||||
Scan(ctx, &orgIDs)
|
|
||||||
if err != nil {
|
|
||||||
if err == sql.ErrNoRows {
|
|
||||||
if err := tx.Commit(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, orgID := range orgIDs {
|
|
||||||
// Get the updated default quick filters which includes the new API monitoring filters
|
|
||||||
storableQuickFilters, err := quickfiltertypes.NewDefaultQuickFilter(valuer.MustNewUUID(orgID))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find the API monitoring filter from the storable quick filters
|
|
||||||
var apiMonitoringFilterJSON string
|
|
||||||
for _, filter := range storableQuickFilters {
|
|
||||||
if filter.Signal == quickfiltertypes.SignalApiMonitoring {
|
|
||||||
apiMonitoringFilterJSON = filter.Filter
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if apiMonitoringFilterJSON != "" {
|
|
||||||
_, err = tx.NewUpdate().
|
|
||||||
Table("quick_filter").
|
|
||||||
Set("filter = ?, updated_at = ?", apiMonitoringFilterJSON, time.Now()).
|
|
||||||
Where("signal = ? AND org_id = ?", quickfiltertypes.SignalApiMonitoring, orgID).
|
|
||||||
Exec(ctx)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := tx.Commit(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateApiMonitoringFilters) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,112 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"hash/fnv"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type addKeyOrganization struct {
|
|
||||||
sqlstore sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewAddKeyOrganizationFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("add_key_organization"), func(ctx context.Context, providerSettings factory.ProviderSettings, config Config) (SQLMigration, error) {
|
|
||||||
return newAddKeyOrganization(ctx, providerSettings, config, sqlstore)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newAddKeyOrganization(_ context.Context, _ factory.ProviderSettings, _ Config, sqlstore sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &addKeyOrganization{
|
|
||||||
sqlstore: sqlstore,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addKeyOrganization) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addKeyOrganization) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
ok, err := migration.sqlstore.Dialect().ColumnExists(ctx, db, "organizations", "key")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if ok {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
if _, err := tx.
|
|
||||||
NewAddColumn().
|
|
||||||
Table("organizations").
|
|
||||||
ColumnExpr("key BIGINT").
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
var existingOrgIDs []string
|
|
||||||
if err := tx.NewSelect().
|
|
||||||
Table("organizations").
|
|
||||||
Column("id").
|
|
||||||
Scan(ctx, &existingOrgIDs); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, orgID := range existingOrgIDs {
|
|
||||||
key := migration.getHash(ctx, orgID)
|
|
||||||
if _, err := tx.
|
|
||||||
NewUpdate().
|
|
||||||
Table("organizations").
|
|
||||||
Set("key = ?", key).
|
|
||||||
Where("id = ?", orgID).
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := tx.
|
|
||||||
NewCreateIndex().
|
|
||||||
Unique().
|
|
||||||
IfNotExists().
|
|
||||||
Index("idx_unique_key").
|
|
||||||
Table("organizations").
|
|
||||||
Column("key").
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := tx.Commit(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addKeyOrganization) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addKeyOrganization) getHash(_ context.Context, orgID string) uint32 {
|
|
||||||
hasher := fnv.New32a()
|
|
||||||
|
|
||||||
// Hasher never returns err.
|
|
||||||
_, _ = hasher.Write([]byte(orgID))
|
|
||||||
return hasher.Sum32()
|
|
||||||
}
|
|
||||||
@ -1,89 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types"
|
|
||||||
"github.com/SigNoz/signoz/pkg/valuer"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
// funnel Core Data Structure (funnel and funnelStep)
|
|
||||||
type funnel struct {
|
|
||||||
bun.BaseModel `bun:"table:trace_funnel"`
|
|
||||||
types.Identifiable // funnel id
|
|
||||||
types.TimeAuditable
|
|
||||||
types.UserAuditable
|
|
||||||
Name string `json:"funnel_name" bun:"name,type:text,notnull"` // funnel name
|
|
||||||
Description string `json:"description" bun:"description,type:text"` // funnel description
|
|
||||||
OrgID valuer.UUID `json:"org_id" bun:"org_id,type:varchar,notnull"`
|
|
||||||
Steps []funnelStep `json:"steps" bun:"steps,type:text,notnull"`
|
|
||||||
Tags string `json:"tags" bun:"tags,type:text"`
|
|
||||||
CreatedByUser *types.User `json:"user" bun:"rel:belongs-to,join:created_by=id"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type funnelStep struct {
|
|
||||||
types.Identifiable
|
|
||||||
Name string `json:"name,omitempty"` // step name
|
|
||||||
Description string `json:"description,omitempty"` // step description
|
|
||||||
Order int64 `json:"step_order"`
|
|
||||||
ServiceName string `json:"service_name"`
|
|
||||||
SpanName string `json:"span_name"`
|
|
||||||
Filters string `json:"filters,omitempty"`
|
|
||||||
LatencyPointer string `json:"latency_pointer,omitempty"`
|
|
||||||
LatencyType string `json:"latency_type,omitempty"`
|
|
||||||
HasErrors bool `json:"has_errors"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type addTraceFunnels struct {
|
|
||||||
sqlstore sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewAddTraceFunnelsFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("add_trace_funnels"), func(ctx context.Context, providerSettings factory.ProviderSettings, config Config) (SQLMigration, error) {
|
|
||||||
return newAddTraceFunnels(ctx, providerSettings, config, sqlstore)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newAddTraceFunnels(_ context.Context, _ factory.ProviderSettings, _ Config, sqlstore sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &addTraceFunnels{sqlstore: sqlstore}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addTraceFunnels) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addTraceFunnels) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
_, err = tx.NewCreateTable().
|
|
||||||
Model(new(funnel)).
|
|
||||||
ForeignKey(`("org_id") REFERENCES "organizations" ("id") ON DELETE CASCADE`).
|
|
||||||
IfNotExists().
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = tx.Commit()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addTraceFunnels) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,141 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"database/sql"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types"
|
|
||||||
"github.com/SigNoz/signoz/pkg/valuer"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type updateDashboard struct {
|
|
||||||
store sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
|
|
||||||
type existingDashboard36 struct {
|
|
||||||
bun.BaseModel `bun:"table:dashboards"`
|
|
||||||
|
|
||||||
types.TimeAuditable
|
|
||||||
types.UserAuditable
|
|
||||||
OrgID string `json:"-" bun:"org_id,notnull"`
|
|
||||||
ID int `json:"id" bun:"id,pk,autoincrement"`
|
|
||||||
UUID string `json:"uuid" bun:"uuid,type:text,notnull,unique"`
|
|
||||||
Data map[string]interface{} `json:"data" bun:"data,type:text,notnull"`
|
|
||||||
Locked *int `json:"isLocked" bun:"locked,notnull,default:0"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type newDashboard36 struct {
|
|
||||||
bun.BaseModel `bun:"table:dashboard"`
|
|
||||||
|
|
||||||
types.Identifiable
|
|
||||||
types.TimeAuditable
|
|
||||||
types.UserAuditable
|
|
||||||
Data map[string]interface{} `bun:"data,type:text,notnull"`
|
|
||||||
Locked bool `bun:"locked,notnull,default:false"`
|
|
||||||
OrgID valuer.UUID `bun:"org_id,type:text,notnull"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUpdateDashboardFactory(store sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("update_dashboards"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return newUpdateDashboard(ctx, ps, c, store)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newUpdateDashboard(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &updateDashboard{store: store}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateDashboard) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateDashboard) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
err = migration.store.Dialect().RenameTableAndModifyModel(ctx, tx, new(existingDashboard36), new(newDashboard36), []string{OrgReference}, func(ctx context.Context) error {
|
|
||||||
existingDashboards := make([]*existingDashboard36, 0)
|
|
||||||
err = tx.NewSelect().Model(&existingDashboards).Scan(ctx)
|
|
||||||
if err != nil {
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err == nil && len(existingDashboards) > 0 {
|
|
||||||
newDashboards, err := migration.CopyExistingDashboardsToNewDashboards(existingDashboards)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = tx.
|
|
||||||
NewInsert().
|
|
||||||
Model(&newDashboards).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = tx.Commit()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
|
|
||||||
}
|
|
||||||
func (migration *updateDashboard) Down(context.Context, *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateDashboard) CopyExistingDashboardsToNewDashboards(existingDashboards []*existingDashboard36) ([]*newDashboard36, error) {
|
|
||||||
newDashboards := make([]*newDashboard36, len(existingDashboards))
|
|
||||||
|
|
||||||
for idx, existingDashboard := range existingDashboards {
|
|
||||||
dashboardID, err := valuer.NewUUID(existingDashboard.UUID)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
orgID, err := valuer.NewUUID(existingDashboard.OrgID)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
locked := false
|
|
||||||
if existingDashboard.Locked != nil && *existingDashboard.Locked == 1 {
|
|
||||||
locked = true
|
|
||||||
}
|
|
||||||
|
|
||||||
newDashboards[idx] = &newDashboard36{
|
|
||||||
Identifiable: types.Identifiable{
|
|
||||||
ID: dashboardID,
|
|
||||||
},
|
|
||||||
TimeAuditable: existingDashboard.TimeAuditable,
|
|
||||||
UserAuditable: existingDashboard.UserAuditable,
|
|
||||||
Data: existingDashboard.Data,
|
|
||||||
Locked: locked,
|
|
||||||
OrgID: orgID,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return newDashboards, nil
|
|
||||||
}
|
|
||||||
@ -1,58 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type dropFeatureSet struct{}
|
|
||||||
|
|
||||||
func NewDropFeatureSetFactory() factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("drop_feature_set"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return newDropFeatureSet(ctx, ps, c)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newDropFeatureSet(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) {
|
|
||||||
return &dropFeatureSet{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *dropFeatureSet) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *dropFeatureSet) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
if _, err := tx.
|
|
||||||
NewDropTable().
|
|
||||||
IfExists().
|
|
||||||
Table("feature_status").
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := tx.Commit(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *dropFeatureSet) Down(context.Context, *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,66 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type dropDeprecatedTables struct{}
|
|
||||||
|
|
||||||
func NewDropDeprecatedTablesFactory() factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("drop_deprecated_tables"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return newDropDeprecatedTables(ctx, ps, c)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newDropDeprecatedTables(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) {
|
|
||||||
return &dropDeprecatedTables{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *dropDeprecatedTables) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *dropDeprecatedTables) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
if _, err := tx.
|
|
||||||
NewDropTable().
|
|
||||||
IfExists().
|
|
||||||
Table("rule_history").
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := tx.
|
|
||||||
NewDropTable().
|
|
||||||
IfExists().
|
|
||||||
Table("data_migrations").
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := tx.Commit(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *dropDeprecatedTables) Down(context.Context, *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,278 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"database/sql"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types"
|
|
||||||
"github.com/SigNoz/signoz/pkg/types/opamptypes"
|
|
||||||
"github.com/SigNoz/signoz/pkg/valuer"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type updateAgents struct {
|
|
||||||
store sqlstore.SQLStore
|
|
||||||
}
|
|
||||||
type newAgent41 struct {
|
|
||||||
bun.BaseModel `bun:"table:agent"`
|
|
||||||
|
|
||||||
types.Identifiable
|
|
||||||
types.TimeAuditable
|
|
||||||
// AgentID is needed as the ID from opamp client is ULID and not UUID, so we are keeping it like this
|
|
||||||
AgentID string `json:"agentId" yaml:"agentId" bun:"agent_id,type:text,notnull,unique"`
|
|
||||||
OrgID string `json:"orgId" yaml:"orgId" bun:"org_id,type:text,notnull"`
|
|
||||||
TerminatedAt time.Time `json:"terminatedAt" yaml:"terminatedAt" bun:"terminated_at"`
|
|
||||||
Status opamptypes.AgentStatus `json:"currentStatus" yaml:"currentStatus" bun:"status,type:text,notnull"`
|
|
||||||
Config string `bun:"config,type:text,notnull"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type existingAgentConfigVersions41 struct {
|
|
||||||
bun.BaseModel `bun:"table:agent_config_versions"`
|
|
||||||
ID string `bun:"id,pk,type:text"`
|
|
||||||
CreatedBy string `bun:"created_by,type:text"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,default:CURRENT_TIMESTAMP"`
|
|
||||||
UpdatedBy string `bun:"updated_by,type:text"`
|
|
||||||
UpdatedAt time.Time `bun:"updated_at,default:CURRENT_TIMESTAMP"`
|
|
||||||
Version int `bun:"version,default:1,unique:element_version_idx"`
|
|
||||||
Active int `bun:"active"`
|
|
||||||
IsValid int `bun:"is_valid"`
|
|
||||||
Disabled int `bun:"disabled"`
|
|
||||||
ElementType opamptypes.ElementType `bun:"element_type,notnull,type:varchar(120),unique:element_version_idx"`
|
|
||||||
DeployStatus opamptypes.DeployStatus `bun:"deploy_status,notnull,type:varchar(80),default:'DIRTY'"`
|
|
||||||
DeploySequence int `bun:"deploy_sequence"`
|
|
||||||
DeployResult string `bun:"deploy_result,type:text"`
|
|
||||||
LastHash string `bun:"last_hash,type:text"`
|
|
||||||
LastConfig string `bun:"last_config,type:text"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type newAgentConfigVersion41 struct {
|
|
||||||
bun.BaseModel `bun:"table:agent_config_version"`
|
|
||||||
|
|
||||||
types.Identifiable
|
|
||||||
types.TimeAuditable
|
|
||||||
types.UserAuditable
|
|
||||||
OrgID string `json:"orgId" bun:"org_id,type:text,notnull,unique:element_version_org_idx"`
|
|
||||||
Version int `json:"version" bun:"version,unique:element_version_org_idx"`
|
|
||||||
ElementType opamptypes.ElementType `json:"elementType" bun:"element_type,type:text,notnull,unique:element_version_org_idx"`
|
|
||||||
DeployStatus opamptypes.DeployStatus `json:"deployStatus" bun:"deploy_status,type:text,notnull,default:'dirty'"`
|
|
||||||
DeploySequence int `json:"deploySequence" bun:"deploy_sequence"`
|
|
||||||
DeployResult string `json:"deployResult" bun:"deploy_result,type:text"`
|
|
||||||
Hash string `json:"lastHash" bun:"hash,type:text"`
|
|
||||||
Config string `json:"config" bun:"config,type:text"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type existingAgentConfigElement41 struct {
|
|
||||||
bun.BaseModel `bun:"table:agent_config_elements"`
|
|
||||||
|
|
||||||
ID string `bun:"id,pk,type:text"`
|
|
||||||
CreatedBy string `bun:"created_by,type:text"`
|
|
||||||
CreatedAt time.Time `bun:"created_at,default:CURRENT_TIMESTAMP"`
|
|
||||||
UpdatedBy string `bun:"updated_by,type:text"`
|
|
||||||
UpdatedAt time.Time `bun:"updated_at,default:CURRENT_TIMESTAMP"`
|
|
||||||
ElementID string `bun:"element_id,type:text,notnull,unique:agent_config_elements_u1"`
|
|
||||||
ElementType string `bun:"element_type,type:varchar(120),notnull,unique:agent_config_elements_u1"`
|
|
||||||
VersionID string `bun:"version_id,type:text,notnull,unique:agent_config_elements_u1"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type newAgentConfigElement41 struct {
|
|
||||||
bun.BaseModel `bun:"table:agent_config_element"`
|
|
||||||
|
|
||||||
types.Identifiable
|
|
||||||
types.TimeAuditable
|
|
||||||
ElementID string `bun:"element_id,type:text,notnull,unique:element_type_version_idx"`
|
|
||||||
ElementType string `bun:"element_type,type:text,notnull,unique:element_type_version_idx"`
|
|
||||||
VersionID string `bun:"version_id,type:text,notnull,unique:element_type_version_idx"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUpdateAgentsFactory(sqlstore sqlstore.SQLStore) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("update_agents"), func(ctx context.Context, ps factory.ProviderSettings, c Config) (SQLMigration, error) {
|
|
||||||
return newUpdateAgents(ctx, ps, c, sqlstore)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newUpdateAgents(_ context.Context, _ factory.ProviderSettings, _ Config, store sqlstore.SQLStore) (SQLMigration, error) {
|
|
||||||
return &updateAgents{
|
|
||||||
store: store,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateAgents) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateAgents) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
|
|
||||||
// begin transaction
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
var orgID string
|
|
||||||
err = tx.
|
|
||||||
NewSelect().
|
|
||||||
ColumnExpr("id").
|
|
||||||
Table("organizations").
|
|
||||||
Limit(1).
|
|
||||||
Scan(ctx, &orgID)
|
|
||||||
if err != nil {
|
|
||||||
if err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := tx.
|
|
||||||
NewDropTable().
|
|
||||||
IfExists().
|
|
||||||
Table("agents").
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := tx.
|
|
||||||
NewCreateTable().
|
|
||||||
IfNotExists().
|
|
||||||
Model(new(newAgent41)).
|
|
||||||
Exec(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
RenameTableAndModifyModel(ctx, tx, new(existingAgentConfigVersions41), new(newAgentConfigVersion41), []string{OrgReference}, func(ctx context.Context) error {
|
|
||||||
existingAgentConfigVersions := make([]*existingAgentConfigVersions41, 0)
|
|
||||||
err = tx.
|
|
||||||
NewSelect().
|
|
||||||
Model(&existingAgentConfigVersions).
|
|
||||||
Scan(ctx)
|
|
||||||
if err != nil && err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err == nil && len(existingAgentConfigVersions) > 0 {
|
|
||||||
newAgentConfigVersions, err := migration.
|
|
||||||
CopyOldAgentConfigVersionToNewAgentConfigVersion(ctx, tx, existingAgentConfigVersions, orgID)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = tx.
|
|
||||||
NewInsert().
|
|
||||||
Model(&newAgentConfigVersions).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = migration.
|
|
||||||
store.
|
|
||||||
Dialect().
|
|
||||||
RenameTableAndModifyModel(ctx, tx, new(existingAgentConfigElement41), new(newAgentConfigElement41), []string{AgentConfigVersionReference}, func(ctx context.Context) error {
|
|
||||||
existingAgentConfigElements := make([]*existingAgentConfigElement41, 0)
|
|
||||||
err = tx.
|
|
||||||
NewSelect().
|
|
||||||
Model(&existingAgentConfigElements).
|
|
||||||
Scan(ctx)
|
|
||||||
if err != nil && err != sql.ErrNoRows {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err == nil && len(existingAgentConfigElements) > 0 {
|
|
||||||
newAgentConfigElements, err := migration.
|
|
||||||
CopyOldAgentConfigElementToNewAgentConfigElement(ctx, tx, existingAgentConfigElements, orgID)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err = tx.
|
|
||||||
NewInsert().
|
|
||||||
Model(&newAgentConfigElements).
|
|
||||||
Exec(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := tx.Commit(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateAgents) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateAgents) CopyOldAgentConfigVersionToNewAgentConfigVersion(ctx context.Context, tx bun.IDB, existingAgentConfigVersions []*existingAgentConfigVersions41, orgID string) ([]*newAgentConfigVersion41, error) {
|
|
||||||
newAgentConfigVersions := make([]*newAgentConfigVersion41, 0)
|
|
||||||
for _, existingAgentConfigVersion := range existingAgentConfigVersions {
|
|
||||||
versionID, err := valuer.NewUUID(existingAgentConfigVersion.ID)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
newAgentConfigVersions = append(newAgentConfigVersions, &newAgentConfigVersion41{
|
|
||||||
Identifiable: types.Identifiable{ID: versionID},
|
|
||||||
TimeAuditable: types.TimeAuditable{
|
|
||||||
CreatedAt: time.Unix(existingAgentConfigVersion.CreatedAt.Unix(), 0),
|
|
||||||
UpdatedAt: time.Unix(existingAgentConfigVersion.UpdatedAt.Unix(), 0),
|
|
||||||
},
|
|
||||||
UserAuditable: types.UserAuditable{
|
|
||||||
CreatedBy: existingAgentConfigVersion.CreatedBy,
|
|
||||||
UpdatedBy: existingAgentConfigVersion.UpdatedBy,
|
|
||||||
},
|
|
||||||
OrgID: orgID,
|
|
||||||
Version: existingAgentConfigVersion.Version,
|
|
||||||
ElementType: existingAgentConfigVersion.ElementType,
|
|
||||||
DeployStatus: existingAgentConfigVersion.DeployStatus,
|
|
||||||
DeploySequence: existingAgentConfigVersion.DeploySequence,
|
|
||||||
DeployResult: existingAgentConfigVersion.DeployResult,
|
|
||||||
Hash: orgID + existingAgentConfigVersion.LastHash,
|
|
||||||
Config: existingAgentConfigVersion.LastConfig,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return newAgentConfigVersions, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateAgents) CopyOldAgentConfigElementToNewAgentConfigElement(ctx context.Context, tx bun.IDB, existingAgentConfigElements []*existingAgentConfigElement41, orgID string) ([]*newAgentConfigElement41, error) {
|
|
||||||
newAgentConfigElements := make([]*newAgentConfigElement41, 0)
|
|
||||||
for _, existingAgentConfigElement := range existingAgentConfigElements {
|
|
||||||
elementID, err := valuer.NewUUID(existingAgentConfigElement.ElementID)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
newAgentConfigElements = append(newAgentConfigElements, &newAgentConfigElement41{
|
|
||||||
Identifiable: types.Identifiable{ID: elementID},
|
|
||||||
TimeAuditable: types.TimeAuditable{
|
|
||||||
CreatedAt: time.Unix(existingAgentConfigElement.CreatedAt.Unix(), 0),
|
|
||||||
UpdatedAt: time.Unix(existingAgentConfigElement.UpdatedAt.Unix(), 0),
|
|
||||||
},
|
|
||||||
VersionID: existingAgentConfigElement.VersionID,
|
|
||||||
ElementID: existingAgentConfigElement.ElementID,
|
|
||||||
ElementType: existingAgentConfigElement.ElementType,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return newAgentConfigElements, nil
|
|
||||||
}
|
|
||||||
@ -1,85 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlschema"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type updateUsers struct {
|
|
||||||
sqlstore sqlstore.SQLStore
|
|
||||||
sqlschema sqlschema.SQLSchema
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUpdateUsersFactory(sqlstore sqlstore.SQLStore, sqlschema sqlschema.SQLSchema) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("update_users"), func(ctx context.Context, providerSettings factory.ProviderSettings, config Config) (SQLMigration, error) {
|
|
||||||
return newUpdateUsers(ctx, providerSettings, config, sqlstore, sqlschema)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newUpdateUsers(_ context.Context, _ factory.ProviderSettings, _ Config, sqlstore sqlstore.SQLStore, sqlschema sqlschema.SQLSchema) (SQLMigration, error) {
|
|
||||||
return &updateUsers{
|
|
||||||
sqlstore: sqlstore,
|
|
||||||
sqlschema: sqlschema,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateUsers) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateUsers) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
if err := migration.sqlschema.ToggleFKEnforcement(ctx, db, false); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
table, uniqueConstraints, err := migration.sqlschema.GetTable(ctx, sqlschema.TableName("users"))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
sqls := [][]byte{}
|
|
||||||
|
|
||||||
dropSQLs := migration.sqlschema.Operator().DropConstraint(table, uniqueConstraints, &sqlschema.UniqueConstraint{ColumnNames: []sqlschema.ColumnName{"email"}})
|
|
||||||
sqls = append(sqls, dropSQLs...)
|
|
||||||
|
|
||||||
indexSQLs := migration.sqlschema.Operator().CreateIndex(&sqlschema.UniqueIndex{TableName: "users", ColumnNames: []sqlschema.ColumnName{"email", "org_id"}})
|
|
||||||
sqls = append(sqls, indexSQLs...)
|
|
||||||
|
|
||||||
for _, sql := range sqls {
|
|
||||||
if _, err := tx.ExecContext(ctx, string(sql)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := tx.Commit(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := migration.sqlschema.ToggleFKEnforcement(ctx, db, true); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateUsers) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,88 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlschema"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type updateUserInvite struct {
|
|
||||||
sqlstore sqlstore.SQLStore
|
|
||||||
sqlschema sqlschema.SQLSchema
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUpdateUserInviteFactory(sqlstore sqlstore.SQLStore, sqlschema sqlschema.SQLSchema) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("update_user_invite"), func(ctx context.Context, providerSettings factory.ProviderSettings, config Config) (SQLMigration, error) {
|
|
||||||
return newUpdateUserInvite(ctx, providerSettings, config, sqlstore, sqlschema)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newUpdateUserInvite(_ context.Context, _ factory.ProviderSettings, _ Config, sqlstore sqlstore.SQLStore, sqlschema sqlschema.SQLSchema) (SQLMigration, error) {
|
|
||||||
return &updateUserInvite{
|
|
||||||
sqlstore: sqlstore,
|
|
||||||
sqlschema: sqlschema,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateUserInvite) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateUserInvite) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
if err := migration.sqlschema.ToggleFKEnforcement(ctx, db, false); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
table, uniqueConstraints, err := migration.sqlschema.GetTable(ctx, sqlschema.TableName("user_invite"))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
sqls := [][]byte{}
|
|
||||||
|
|
||||||
dropSQLs := migration.sqlschema.Operator().DropConstraint(table, uniqueConstraints, &sqlschema.UniqueConstraint{ColumnNames: []sqlschema.ColumnName{"email"}})
|
|
||||||
sqls = append(sqls, dropSQLs...)
|
|
||||||
|
|
||||||
indexSQLs := migration.sqlschema.Operator().CreateIndex(&sqlschema.UniqueIndex{TableName: "user_invite", ColumnNames: []sqlschema.ColumnName{"email", "org_id"}})
|
|
||||||
sqls = append(sqls, indexSQLs...)
|
|
||||||
|
|
||||||
indexSQLs = migration.sqlschema.Operator().CreateIndex(&sqlschema.UniqueIndex{TableName: "user_invite", ColumnNames: []sqlschema.ColumnName{"token"}})
|
|
||||||
sqls = append(sqls, indexSQLs...)
|
|
||||||
|
|
||||||
for _, sql := range sqls {
|
|
||||||
if _, err := tx.ExecContext(ctx, string(sql)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := tx.Commit(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := migration.sqlschema.ToggleFKEnforcement(ctx, db, true); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateUserInvite) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,85 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlschema"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type updateOrgDomain struct {
|
|
||||||
sqlstore sqlstore.SQLStore
|
|
||||||
sqlschema sqlschema.SQLSchema
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUpdateOrgDomainFactory(sqlstore sqlstore.SQLStore, sqlschema sqlschema.SQLSchema) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("update_org_domain"), func(ctx context.Context, providerSettings factory.ProviderSettings, config Config) (SQLMigration, error) {
|
|
||||||
return newUpdateOrgDomain(ctx, providerSettings, config, sqlstore, sqlschema)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newUpdateOrgDomain(_ context.Context, _ factory.ProviderSettings, _ Config, sqlstore sqlstore.SQLStore, sqlschema sqlschema.SQLSchema) (SQLMigration, error) {
|
|
||||||
return &updateOrgDomain{
|
|
||||||
sqlstore: sqlstore,
|
|
||||||
sqlschema: sqlschema,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateOrgDomain) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateOrgDomain) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
if err := migration.sqlschema.ToggleFKEnforcement(ctx, db, false); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
table, uniqueConstraints, err := migration.sqlschema.GetTable(ctx, sqlschema.TableName("org_domains"))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
sqls := [][]byte{}
|
|
||||||
|
|
||||||
dropSQLs := migration.sqlschema.Operator().DropConstraint(table, uniqueConstraints, &sqlschema.UniqueConstraint{ColumnNames: []sqlschema.ColumnName{"name"}})
|
|
||||||
sqls = append(sqls, dropSQLs...)
|
|
||||||
|
|
||||||
indexSQLs := migration.sqlschema.Operator().CreateIndex(&sqlschema.UniqueIndex{TableName: "org_domains", ColumnNames: []sqlschema.ColumnName{"name", "org_id"}})
|
|
||||||
sqls = append(sqls, indexSQLs...)
|
|
||||||
|
|
||||||
for _, sql := range sqls {
|
|
||||||
if _, err := tx.ExecContext(ctx, string(sql)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := tx.Commit(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := migration.sqlschema.ToggleFKEnforcement(ctx, db, true); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *updateOrgDomain) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,75 +0,0 @@
|
|||||||
package sqlmigration
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlschema"
|
|
||||||
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
||||||
"github.com/uptrace/bun"
|
|
||||||
"github.com/uptrace/bun/migrate"
|
|
||||||
)
|
|
||||||
|
|
||||||
type addFactorIndexes struct {
|
|
||||||
sqlstore sqlstore.SQLStore
|
|
||||||
sqlschema sqlschema.SQLSchema
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewAddFactorIndexesFactory(sqlstore sqlstore.SQLStore, sqlschema sqlschema.SQLSchema) factory.ProviderFactory[SQLMigration, Config] {
|
|
||||||
return factory.NewProviderFactory(factory.MustNewName("add_factor_indexes"), func(ctx context.Context, providerSettings factory.ProviderSettings, config Config) (SQLMigration, error) {
|
|
||||||
return newAddFactorIndexes(ctx, providerSettings, config, sqlstore, sqlschema)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func newAddFactorIndexes(_ context.Context, _ factory.ProviderSettings, _ Config, sqlstore sqlstore.SQLStore, sqlschema sqlschema.SQLSchema) (SQLMigration, error) {
|
|
||||||
return &addFactorIndexes{
|
|
||||||
sqlstore: sqlstore,
|
|
||||||
sqlschema: sqlschema,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addFactorIndexes) Register(migrations *migrate.Migrations) error {
|
|
||||||
if err := migrations.Register(migration.Up, migration.Down); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addFactorIndexes) Up(ctx context.Context, db *bun.DB) error {
|
|
||||||
tx, err := db.BeginTx(ctx, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
_ = tx.Rollback()
|
|
||||||
}()
|
|
||||||
|
|
||||||
sqls := [][]byte{}
|
|
||||||
|
|
||||||
indexSQLs := migration.sqlschema.Operator().CreateIndex(&sqlschema.UniqueIndex{TableName: "factor_password", ColumnNames: []sqlschema.ColumnName{"user_id"}})
|
|
||||||
sqls = append(sqls, indexSQLs...)
|
|
||||||
|
|
||||||
indexSQLs = migration.sqlschema.Operator().CreateIndex(&sqlschema.UniqueIndex{TableName: "reset_password_token", ColumnNames: []sqlschema.ColumnName{"password_id"}})
|
|
||||||
sqls = append(sqls, indexSQLs...)
|
|
||||||
|
|
||||||
indexSQLs = migration.sqlschema.Operator().CreateIndex(&sqlschema.UniqueIndex{TableName: "reset_password_token", ColumnNames: []sqlschema.ColumnName{"token"}})
|
|
||||||
sqls = append(sqls, indexSQLs...)
|
|
||||||
|
|
||||||
for _, sql := range sqls {
|
|
||||||
if _, err := tx.ExecContext(ctx, string(sql)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := tx.Commit(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (migration *addFactorIndexes) Down(ctx context.Context, db *bun.DB) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
578
pkg/sqlmigration/s100sqlmigration/100_v100.go
Normal file
578
pkg/sqlmigration/s100sqlmigration/100_v100.go
Normal file
@ -0,0 +1,578 @@
|
|||||||
|
package s100sqlmigration
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/SigNoz/signoz/pkg/errors"
|
||||||
|
"github.com/SigNoz/signoz/pkg/factory"
|
||||||
|
"github.com/SigNoz/signoz/pkg/sqlmigration"
|
||||||
|
"github.com/SigNoz/signoz/pkg/sqlschema"
|
||||||
|
"github.com/SigNoz/signoz/pkg/sqlstore"
|
||||||
|
"github.com/uptrace/bun"
|
||||||
|
"github.com/uptrace/bun/migrate"
|
||||||
|
)
|
||||||
|
|
||||||
|
type v100 struct {
|
||||||
|
sqlstore sqlstore.SQLStore
|
||||||
|
sqlschema sqlschema.SQLSchema
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewV100Factory(sqlstore sqlstore.SQLStore, sqlschema sqlschema.SQLSchema) factory.ProviderFactory[sqlmigration.SQLMigration, sqlmigration.Config] {
|
||||||
|
return factory.NewProviderFactory(factory.MustNewName("v100"), func(_ context.Context, _ factory.ProviderSettings, _ sqlmigration.Config) (sqlmigration.SQLMigration, error) {
|
||||||
|
return &v100{
|
||||||
|
sqlstore: sqlstore,
|
||||||
|
sqlschema: sqlschema,
|
||||||
|
}, nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (migration *v100) Register(migrations *migrate.Migrations) error {
|
||||||
|
return migrations.Register(migration.Up, migration.Down)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (migration *v100) Up(ctx context.Context, db *bun.DB) error {
|
||||||
|
tables := []*sqlschema.Table{
|
||||||
|
{
|
||||||
|
Name: "organizations",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("name"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("display_name"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("alias"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("key"), DataType: sqlschema.DataTypeBigInt, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "users",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("display_name"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("email"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("role"), DataType: sqlschema.DataTypeText, Nullable: false, Default: "'VIEWER'"},
|
||||||
|
{Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "saved_views",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("name"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("category"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("source_page"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("tags"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("data"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("extra_data"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""}, //Problematic
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "pipelines",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("order_id"), DataType: sqlschema.DataTypeInteger, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("enabled"), DataType: sqlschema.DataTypeBoolean, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("name"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("alias"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("description"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("filter"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("config_json"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "notification_channel",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("name"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("type"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("data"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "alertmanager_config",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("config"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("hash"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "alertmanager_state",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("silences"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("nflog"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "org_preference",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("preference_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("preference_value"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "user_preference",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("preference_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("preference_value"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("user_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("user_id"), ReferencedTableName: sqlschema.TableName("users"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "apdex_setting",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("service_name"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("threshold"), DataType: sqlschema.DataTypeNumeric, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("exclude_status_codes"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "ttl_setting",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("transaction_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("table_name"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("ttl"), DataType: sqlschema.DataTypeInteger, Nullable: false, Default: "0"},
|
||||||
|
{Name: sqlschema.ColumnName("cold_storage_ttl"), DataType: sqlschema.DataTypeInteger, Nullable: false, Default: "0"},
|
||||||
|
{Name: sqlschema.ColumnName("status"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "virtual_field",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("name"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("expression"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("description"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("signal"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "installed_integration",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("type"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("config"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("installed_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: "current_timestamp"},
|
||||||
|
{Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "cloud_integration",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("provider"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("config"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("account_id"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("last_agent_report"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("removed_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "cloud_integration_service",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("type"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("config"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("cloud_integration_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("cloud_integration_id"), ReferencedTableName: sqlschema.TableName("cloud_integration"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "rule",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("deleted"), DataType: sqlschema.DataTypeInteger, Nullable: false, Default: "0"},
|
||||||
|
{Name: sqlschema.ColumnName("data"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "planned_maintenance",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("name"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("description"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("schedule"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "planned_maintenance_rule",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("planned_maintenance_id"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("rule_id"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("planned_maintenance_id"), ReferencedTableName: sqlschema.TableName("planned_maintenance"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("rule_id"), ReferencedTableName: sqlschema.TableName("rule"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "quick_filter",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("filter"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("signal"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "factor_password",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("password"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("temporary"), DataType: sqlschema.DataTypeBoolean, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("user_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("user_id"), ReferencedTableName: sqlschema.TableName("users"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "reset_password_token",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("token"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("password_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("password_id"), ReferencedTableName: sqlschema.TableName("factor_password"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "factor_api_key",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_by"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_by"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("token"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("role"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("name"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("expires_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("last_used"), DataType: sqlschema.DataTypeTimestamp, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("revoked"), DataType: sqlschema.DataTypeBoolean, Nullable: false, Default: "false"},
|
||||||
|
{Name: sqlschema.ColumnName("user_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("user_id"), ReferencedTableName: sqlschema.TableName("users"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "license",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("key"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("data"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("last_validated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "trace_funnel",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("name"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("description"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("steps"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("tags"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "dashboard",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("data"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("locked"), DataType: sqlschema.DataTypeBoolean, Nullable: false, Default: "false"},
|
||||||
|
{Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "agent",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("agent_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("terminated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("status"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("config"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "agent_config_version",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_by"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("version"), DataType: sqlschema.DataTypeInteger, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("element_type"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("deploy_status"), DataType: sqlschema.DataTypeText, Nullable: false, Default: "dirty"},
|
||||||
|
{Name: sqlschema.ColumnName("deploy_sequence"), DataType: sqlschema.DataTypeInteger, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("deploy_result"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("hash"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("config"), DataType: sqlschema.DataTypeText, Nullable: true, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "agent_config_element",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("element_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("element_type"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("version_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("version_id"), ReferencedTableName: sqlschema.TableName("agent_config_version"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "user_invite",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("name"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("email"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("token"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("role"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "org_domains",
|
||||||
|
Columns: []*sqlschema.Column{
|
||||||
|
{Name: sqlschema.ColumnName("id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("org_id"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("name"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("data"), DataType: sqlschema.DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("created_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
{Name: sqlschema.ColumnName("updated_at"), DataType: sqlschema.DataTypeTimestamp, Nullable: true, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &sqlschema.PrimaryKeyConstraint{ColumnNames: []sqlschema.ColumnName{sqlschema.ColumnName("id")}},
|
||||||
|
ForeignKeyConstraints: []*sqlschema.ForeignKeyConstraint{
|
||||||
|
{ReferencingColumnName: sqlschema.ColumnName("org_id"), ReferencedTableName: sqlschema.TableName("organizations"), ReferencedColumnName: sqlschema.ColumnName("id")},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := migration.sqlschema.ToggleFKEnforcement(ctx, db, false); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
tx, err := db.BeginTx(ctx, nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
_ = tx.Rollback()
|
||||||
|
}()
|
||||||
|
|
||||||
|
sqls := [][]byte{}
|
||||||
|
|
||||||
|
for _, table := range tables {
|
||||||
|
existingTable, existingUniqueConstraints, err := migration.sqlschema.GetTable(ctx, table.Name)
|
||||||
|
if err != nil {
|
||||||
|
if errors.Ast(err, errors.TypeNotFound) {
|
||||||
|
sqls = append(sqls, migration.sqlschema.Operator().CreateTable(table)...)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
sqls = append(sqls, migration.sqlschema.Operator().ConvertTable(existingTable, existingUniqueConstraints, table)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, sql := range sqls {
|
||||||
|
if _, err := tx.ExecContext(ctx, string(sql)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := tx.Commit(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := migration.sqlschema.ToggleFKEnforcement(ctx, db, true); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (migration *v100) Down(ctx context.Context, db *bun.DB) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@ -53,6 +53,7 @@ func (migrator *migrator) Migrate(ctx context.Context) error {
|
|||||||
|
|
||||||
group, err := migrator.migrator.Migrate(ctx)
|
group, err := migrator.migrator.Migrate(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
migrator.settings.Logger().ErrorContext(ctx, "failed to run sqlstore migrations", "error", err, "dialect", migrator.dialect, "group", group.String(), "applied", group.Migrations.Applied())
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -8,6 +8,7 @@ import (
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
DataTypeText = DataType{s: valuer.NewString("TEXT"), z: ""}
|
DataTypeText = DataType{s: valuer.NewString("TEXT"), z: ""}
|
||||||
|
DataTypeVarchar = DataType{s: valuer.NewString("VARCHAR"), z: ""} // Do not use this data type. Use DataTypeText instead.
|
||||||
DataTypeBigInt = DataType{s: valuer.NewString("BIGINT"), z: int64(0)}
|
DataTypeBigInt = DataType{s: valuer.NewString("BIGINT"), z: int64(0)}
|
||||||
DataTypeInteger = DataType{s: valuer.NewString("INTEGER"), z: int64(0)}
|
DataTypeInteger = DataType{s: valuer.NewString("INTEGER"), z: int64(0)}
|
||||||
DataTypeNumeric = DataType{s: valuer.NewString("NUMERIC"), z: float64(0)}
|
DataTypeNumeric = DataType{s: valuer.NewString("NUMERIC"), z: float64(0)}
|
||||||
@ -40,6 +41,13 @@ type Column struct {
|
|||||||
Default string
|
Default string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (column *Column) Equals(other *Column) bool {
|
||||||
|
return column.Name == other.Name &&
|
||||||
|
column.DataType == other.DataType &&
|
||||||
|
column.Nullable == other.Nullable &&
|
||||||
|
column.Default == other.Default
|
||||||
|
}
|
||||||
|
|
||||||
func (column *Column) ToDefinitionSQL(fmter SQLFormatter) []byte {
|
func (column *Column) ToDefinitionSQL(fmter SQLFormatter) []byte {
|
||||||
sql := []byte{}
|
sql := []byte{}
|
||||||
|
|
||||||
@ -128,3 +136,53 @@ func (column *Column) ToSetNotNullSQL(fmter SQLFormatter, tableName TableName) [
|
|||||||
|
|
||||||
return sql
|
return sql
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (column *Column) ToDropNotNullSQL(fmter SQLFormatter, tableName TableName) []byte {
|
||||||
|
sql := []byte{}
|
||||||
|
|
||||||
|
sql = append(sql, "ALTER TABLE "...)
|
||||||
|
sql = fmter.AppendIdent(sql, string(tableName))
|
||||||
|
sql = append(sql, " ALTER COLUMN "...)
|
||||||
|
sql = fmter.AppendIdent(sql, string(column.Name))
|
||||||
|
sql = append(sql, " DROP NOT NULL"...)
|
||||||
|
|
||||||
|
return sql
|
||||||
|
}
|
||||||
|
|
||||||
|
func (column *Column) ToSetDefaultSQL(fmter SQLFormatter, tableName TableName) []byte {
|
||||||
|
sql := []byte{}
|
||||||
|
|
||||||
|
sql = append(sql, "ALTER TABLE "...)
|
||||||
|
sql = fmter.AppendIdent(sql, string(tableName))
|
||||||
|
sql = append(sql, " ALTER COLUMN "...)
|
||||||
|
sql = fmter.AppendIdent(sql, string(column.Name))
|
||||||
|
sql = append(sql, " SET DEFAULT "...)
|
||||||
|
sql = append(sql, column.Default...)
|
||||||
|
|
||||||
|
return sql
|
||||||
|
}
|
||||||
|
|
||||||
|
func (column *Column) ToDropDefaultSQL(fmter SQLFormatter, tableName TableName) []byte {
|
||||||
|
sql := []byte{}
|
||||||
|
|
||||||
|
sql = append(sql, "ALTER TABLE "...)
|
||||||
|
sql = fmter.AppendIdent(sql, string(tableName))
|
||||||
|
sql = append(sql, " ALTER COLUMN "...)
|
||||||
|
sql = fmter.AppendIdent(sql, string(column.Name))
|
||||||
|
sql = append(sql, " DROP DEFAULT"...)
|
||||||
|
|
||||||
|
return sql
|
||||||
|
}
|
||||||
|
|
||||||
|
func (column *Column) ToSetDataTypeSQL(fmter SQLFormatter, tableName TableName) []byte {
|
||||||
|
sql := []byte{}
|
||||||
|
|
||||||
|
sql = append(sql, "ALTER TABLE "...)
|
||||||
|
sql = fmter.AppendIdent(sql, string(tableName))
|
||||||
|
sql = append(sql, " ALTER COLUMN "...)
|
||||||
|
sql = fmter.AppendIdent(sql, string(column.Name))
|
||||||
|
sql = append(sql, " SET DATA TYPE "...)
|
||||||
|
sql = append(sql, fmter.SQLDataTypeOf(column.DataType)...)
|
||||||
|
|
||||||
|
return sql
|
||||||
|
}
|
||||||
|
|||||||
@ -49,6 +49,9 @@ type Constraint interface {
|
|||||||
|
|
||||||
// The SQL representation of the constraint.
|
// The SQL representation of the constraint.
|
||||||
ToDropSQL(fmter SQLFormatter, tableName TableName) []byte
|
ToDropSQL(fmter SQLFormatter, tableName TableName) []byte
|
||||||
|
|
||||||
|
// The SQL representation of the constraint.
|
||||||
|
ToCreateSQL(fmter SQLFormatter, tableName TableName) []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
type PrimaryKeyConstraint struct {
|
type PrimaryKeyConstraint struct {
|
||||||
@ -139,6 +142,27 @@ func (constraint *PrimaryKeyConstraint) ToDropSQL(fmter SQLFormatter, tableName
|
|||||||
return sql
|
return sql
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (constraint *PrimaryKeyConstraint) ToCreateSQL(fmter SQLFormatter, tableName TableName) []byte {
|
||||||
|
sql := []byte{}
|
||||||
|
|
||||||
|
sql = append(sql, "ALTER TABLE "...)
|
||||||
|
sql = fmter.AppendIdent(sql, string(tableName))
|
||||||
|
sql = append(sql, " ADD CONSTRAINT "...)
|
||||||
|
sql = fmter.AppendIdent(sql, constraint.Name(tableName))
|
||||||
|
sql = append(sql, " PRIMARY KEY ("...)
|
||||||
|
|
||||||
|
for i, column := range constraint.ColumnNames {
|
||||||
|
if i > 0 {
|
||||||
|
sql = append(sql, ", "...)
|
||||||
|
}
|
||||||
|
sql = fmter.AppendIdent(sql, string(column))
|
||||||
|
}
|
||||||
|
|
||||||
|
sql = append(sql, ")"...)
|
||||||
|
|
||||||
|
return sql
|
||||||
|
}
|
||||||
|
|
||||||
type ForeignKeyConstraint struct {
|
type ForeignKeyConstraint struct {
|
||||||
ReferencingColumnName ColumnName
|
ReferencingColumnName ColumnName
|
||||||
ReferencedTableName TableName
|
ReferencedTableName TableName
|
||||||
@ -220,6 +244,24 @@ func (constraint *ForeignKeyConstraint) ToDropSQL(fmter SQLFormatter, tableName
|
|||||||
return sql
|
return sql
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (constraint *ForeignKeyConstraint) ToCreateSQL(fmter SQLFormatter, tableName TableName) []byte {
|
||||||
|
sql := []byte{}
|
||||||
|
|
||||||
|
sql = append(sql, "ALTER TABLE "...)
|
||||||
|
sql = fmter.AppendIdent(sql, string(tableName))
|
||||||
|
sql = append(sql, " ADD CONSTRAINT "...)
|
||||||
|
sql = fmter.AppendIdent(sql, constraint.Name(tableName))
|
||||||
|
sql = append(sql, " FOREIGN KEY ("...)
|
||||||
|
sql = fmter.AppendIdent(sql, string(constraint.ReferencingColumnName))
|
||||||
|
sql = append(sql, ") REFERENCES "...)
|
||||||
|
sql = fmter.AppendIdent(sql, string(constraint.ReferencedTableName))
|
||||||
|
sql = append(sql, " ("...)
|
||||||
|
sql = fmter.AppendIdent(sql, string(constraint.ReferencedColumnName))
|
||||||
|
sql = append(sql, ")"...)
|
||||||
|
|
||||||
|
return sql
|
||||||
|
}
|
||||||
|
|
||||||
// Do not use this constraint type. Instead create an index with the `UniqueIndex` type.
|
// Do not use this constraint type. Instead create an index with the `UniqueIndex` type.
|
||||||
// The main difference between a Unique Index and a Unique Constraint is mostly semantic, with a constraint focusing more on data integrity, while an index focuses on performance.
|
// The main difference between a Unique Index and a Unique Constraint is mostly semantic, with a constraint focusing more on data integrity, while an index focuses on performance.
|
||||||
// We choose to create unique indices because of sqlite. Dropping a unique index is directly supported whilst dropping a unique constraint requires a recreation of the table with the constraint removed.
|
// We choose to create unique indices because of sqlite. Dropping a unique index is directly supported whilst dropping a unique constraint requires a recreation of the table with the constraint removed.
|
||||||
@ -323,3 +365,7 @@ func (constraint *UniqueConstraint) ToDropSQL(fmter SQLFormatter, tableName Tabl
|
|||||||
|
|
||||||
return sql
|
return sql
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (constraint *UniqueConstraint) ToCreateSQL(fmter SQLFormatter, tableName TableName) []byte {
|
||||||
|
return []byte{}
|
||||||
|
}
|
||||||
|
|||||||
@ -25,6 +25,8 @@ func (formatter Formatter) DataTypeOf(dataType string) DataType {
|
|||||||
switch strings.ToUpper(dataType) {
|
switch strings.ToUpper(dataType) {
|
||||||
case "TEXT":
|
case "TEXT":
|
||||||
return DataTypeText
|
return DataTypeText
|
||||||
|
case "VARCHAR":
|
||||||
|
return DataTypeVarchar
|
||||||
case "BIGINT":
|
case "BIGINT":
|
||||||
return DataTypeBigInt
|
return DataTypeBigInt
|
||||||
case "INTEGER":
|
case "INTEGER":
|
||||||
|
|||||||
@ -1,11 +1,19 @@
|
|||||||
package sqlschema
|
package sqlschema
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"slices"
|
||||||
|
)
|
||||||
|
|
||||||
var _ SQLOperator = (*Operator)(nil)
|
var _ SQLOperator = (*Operator)(nil)
|
||||||
|
|
||||||
type OperatorSupport struct {
|
type OperatorSupport struct {
|
||||||
|
CreateConstraint bool
|
||||||
DropConstraint bool
|
DropConstraint bool
|
||||||
ColumnIfNotExistsExists bool
|
ColumnIfNotExistsExists bool
|
||||||
AlterColumnSetNotNull bool
|
AlterColumnSetNotNull bool
|
||||||
|
AlterColumnSetDataType bool
|
||||||
|
AlterColumnSetDefault bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type Operator struct {
|
type Operator struct {
|
||||||
@ -29,6 +37,62 @@ func (operator *Operator) RenameTable(table *Table, newName TableName) [][]byte
|
|||||||
return [][]byte{table.ToRenameSQL(operator.fmter, newName)}
|
return [][]byte{table.ToRenameSQL(operator.fmter, newName)}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns a list of SQL statements to convert the table to the new table.
|
||||||
|
func (operator *Operator) ConvertTable(oldTable *Table, oldTableUniqueConstraints []*UniqueConstraint, newTable *Table) [][]byte {
|
||||||
|
sql := [][]byte{}
|
||||||
|
|
||||||
|
// Check if the name has changed
|
||||||
|
if oldTable.Name != newTable.Name {
|
||||||
|
sql = append(sql, operator.RenameTable(oldTable, newTable.Name)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Drop columns that are in the old table but not in the new table.
|
||||||
|
for _, column := range oldTable.Columns {
|
||||||
|
if index := operator.findColumnByName(newTable, column.Name); index == -1 {
|
||||||
|
sql = append(sql, operator.DropColumn(oldTable, column)...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add columns that are in the new table but not in the old table.
|
||||||
|
for _, column := range newTable.Columns {
|
||||||
|
if index := operator.findColumnByName(oldTable, column.Name); index == -1 {
|
||||||
|
sql = append(sql, operator.AddColumn(oldTable, oldTableUniqueConstraints, column, column.Default)...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Modify columns that are in the new table and in the old table
|
||||||
|
for _, column := range newTable.Columns {
|
||||||
|
sql = append(sql, operator.AlterColumn(oldTable, oldTableUniqueConstraints, column)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Primary key constraints
|
||||||
|
sql = append(sql, operator.CreateConstraint(oldTable, oldTableUniqueConstraints, newTable.PrimaryKeyConstraint)...)
|
||||||
|
|
||||||
|
// Drop foreign key constraints that are in the old table but not in the new table.
|
||||||
|
for _, fkConstraint := range oldTable.ForeignKeyConstraints {
|
||||||
|
if index := operator.findForeignKeyConstraint(newTable, fkConstraint); index == -1 {
|
||||||
|
sql = append(sql, operator.DropConstraint(oldTable, oldTableUniqueConstraints, fkConstraint)...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create foreign key constraints that are in the new table but not in the old table.
|
||||||
|
for _, fkConstraint := range newTable.ForeignKeyConstraints {
|
||||||
|
if index := operator.findForeignKeyConstraint(oldTable, fkConstraint); index == -1 {
|
||||||
|
sql = append(sql, operator.CreateConstraint(oldTable, oldTableUniqueConstraints, fkConstraint)...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Drop all unique constraints and create indices for the new table.
|
||||||
|
for _, uniqueConstraint := range oldTableUniqueConstraints {
|
||||||
|
sql = append(sql, operator.DropConstraint(oldTable, oldTableUniqueConstraints, uniqueConstraint)...)
|
||||||
|
sql = append(sql, uniqueConstraint.ToIndex(oldTable.Name).ToCreateSQL(operator.fmter))
|
||||||
|
}
|
||||||
|
|
||||||
|
return slices.CompactFunc(sql, func(a, b []byte) bool {
|
||||||
|
return string(a) == string(b)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func (operator *Operator) RecreateTable(table *Table, uniqueConstraints []*UniqueConstraint) [][]byte {
|
func (operator *Operator) RecreateTable(table *Table, uniqueConstraints []*UniqueConstraint) [][]byte {
|
||||||
sqls := [][]byte{}
|
sqls := [][]byte{}
|
||||||
|
|
||||||
@ -82,6 +146,62 @@ func (operator *Operator) AddColumn(table *Table, uniqueConstraints []*UniqueCon
|
|||||||
return sqls
|
return sqls
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (operator *Operator) AlterColumn(table *Table, uniqueConstraints []*UniqueConstraint, column *Column) [][]byte {
|
||||||
|
index := operator.findColumnByName(table, column.Name)
|
||||||
|
// If the column does not exist, we do not need to alter it.
|
||||||
|
if index == -1 {
|
||||||
|
return [][]byte{}
|
||||||
|
}
|
||||||
|
|
||||||
|
oldColumn := table.Columns[index]
|
||||||
|
// If the column is the same, we do not need to alter it.
|
||||||
|
if oldColumn.Equals(column) {
|
||||||
|
return [][]byte{}
|
||||||
|
}
|
||||||
|
|
||||||
|
sqls := [][]byte{}
|
||||||
|
var recreateTable bool
|
||||||
|
|
||||||
|
if oldColumn.DataType != column.DataType {
|
||||||
|
if operator.support.AlterColumnSetDataType {
|
||||||
|
sqls = append(sqls, column.ToSetDataTypeSQL(operator.fmter, table.Name))
|
||||||
|
} else {
|
||||||
|
recreateTable = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if oldColumn.Nullable != column.Nullable {
|
||||||
|
if operator.support.AlterColumnSetNotNull {
|
||||||
|
if column.Nullable {
|
||||||
|
sqls = append(sqls, column.ToDropNotNullSQL(operator.fmter, table.Name))
|
||||||
|
} else {
|
||||||
|
sqls = append(sqls, column.ToSetNotNullSQL(operator.fmter, table.Name))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
recreateTable = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if oldColumn.Default != column.Default {
|
||||||
|
if operator.support.AlterColumnSetDefault {
|
||||||
|
if column.Default != "" {
|
||||||
|
sqls = append(sqls, column.ToSetDefaultSQL(operator.fmter, table.Name))
|
||||||
|
} else {
|
||||||
|
sqls = append(sqls, column.ToDropDefaultSQL(operator.fmter, table.Name))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
recreateTable = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
table.Columns[index] = column
|
||||||
|
if recreateTable {
|
||||||
|
sqls = append(sqls, operator.RecreateTable(table, uniqueConstraints)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
return sqls
|
||||||
|
}
|
||||||
|
|
||||||
func (operator *Operator) DropColumn(table *Table, column *Column) [][]byte {
|
func (operator *Operator) DropColumn(table *Table, column *Column) [][]byte {
|
||||||
index := operator.findColumnByName(table, column.Name)
|
index := operator.findColumnByName(table, column.Name)
|
||||||
// If the column does not exist, we do not need to drop it.
|
// If the column does not exist, we do not need to drop it.
|
||||||
@ -94,6 +214,45 @@ func (operator *Operator) DropColumn(table *Table, column *Column) [][]byte {
|
|||||||
return [][]byte{column.ToDropSQL(operator.fmter, table.Name, operator.support.ColumnIfNotExistsExists)}
|
return [][]byte{column.ToDropSQL(operator.fmter, table.Name, operator.support.ColumnIfNotExistsExists)}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (operator *Operator) CreateConstraint(table *Table, uniqueConstraints []*UniqueConstraint, constraint Constraint) [][]byte {
|
||||||
|
if constraint == nil {
|
||||||
|
return [][]byte{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if reflect.ValueOf(constraint).IsNil() {
|
||||||
|
return [][]byte{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if constraint.Type() == ConstraintTypeForeignKey {
|
||||||
|
// Constraint already exists as foreign key constraint.
|
||||||
|
if table.ForeignKeyConstraints != nil {
|
||||||
|
for _, fkConstraint := range table.ForeignKeyConstraints {
|
||||||
|
if constraint.Equals(fkConstraint) {
|
||||||
|
return [][]byte{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
table.ForeignKeyConstraints = append(table.ForeignKeyConstraints, constraint.(*ForeignKeyConstraint))
|
||||||
|
}
|
||||||
|
|
||||||
|
sqls := [][]byte{}
|
||||||
|
if constraint.Type() == ConstraintTypePrimaryKey {
|
||||||
|
if operator.support.DropConstraint {
|
||||||
|
if table.PrimaryKeyConstraint != nil {
|
||||||
|
sqls = append(sqls, table.PrimaryKeyConstraint.ToDropSQL(operator.fmter, table.Name))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
table.PrimaryKeyConstraint = constraint.(*PrimaryKeyConstraint)
|
||||||
|
}
|
||||||
|
|
||||||
|
if operator.support.CreateConstraint {
|
||||||
|
return append(sqls, constraint.ToCreateSQL(operator.fmter, table.Name))
|
||||||
|
}
|
||||||
|
|
||||||
|
return operator.RecreateTable(table, uniqueConstraints)
|
||||||
|
}
|
||||||
|
|
||||||
func (operator *Operator) DropConstraint(table *Table, uniqueConstraints []*UniqueConstraint, constraint Constraint) [][]byte {
|
func (operator *Operator) DropConstraint(table *Table, uniqueConstraints []*UniqueConstraint, constraint Constraint) [][]byte {
|
||||||
// The name of the input constraint is not guaranteed to be the same as the name of the constraint in the database.
|
// The name of the input constraint is not guaranteed to be the same as the name of the constraint in the database.
|
||||||
// So we need to find the constraint in the database and drop it.
|
// So we need to find the constraint in the database and drop it.
|
||||||
@ -141,3 +300,17 @@ func (*Operator) findUniqueConstraint(uniqueConstraints []*UniqueConstraint, con
|
|||||||
|
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (*Operator) findForeignKeyConstraint(table *Table, constraint Constraint) int {
|
||||||
|
if constraint.Type() != ConstraintTypeForeignKey {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, fkConstraint := range table.ForeignKeyConstraints {
|
||||||
|
if fkConstraint.Equals(constraint) {
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|||||||
@ -700,3 +700,144 @@ func TestOperatorDropConstraint(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestOperatorConvertTable(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
table *Table
|
||||||
|
uniqueConstraints []*UniqueConstraint
|
||||||
|
newTable *Table
|
||||||
|
support OperatorSupport
|
||||||
|
expectedSQLs [][]byte
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "NoOperation",
|
||||||
|
table: &Table{
|
||||||
|
Name: "users",
|
||||||
|
Columns: []*Column{
|
||||||
|
{Name: "id", DataType: DataTypeInteger, Nullable: false, Default: ""},
|
||||||
|
{Name: "name", DataType: DataTypeText, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
newTable: &Table{
|
||||||
|
Name: "users",
|
||||||
|
Columns: []*Column{
|
||||||
|
{Name: "id", DataType: DataTypeInteger, Nullable: false, Default: ""},
|
||||||
|
{Name: "name", DataType: DataTypeText, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
support: OperatorSupport{},
|
||||||
|
expectedSQLs: [][]byte{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "AddColumn_NullableNoDefault_ColumnIfNotExistsExistsTrue",
|
||||||
|
table: &Table{
|
||||||
|
Name: "users",
|
||||||
|
Columns: []*Column{
|
||||||
|
{Name: "id", DataType: DataTypeInteger, Nullable: false, Default: ""},
|
||||||
|
{Name: "name", DataType: DataTypeText, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
newTable: &Table{
|
||||||
|
Name: "users",
|
||||||
|
Columns: []*Column{
|
||||||
|
{Name: "id", DataType: DataTypeInteger, Nullable: false, Default: ""},
|
||||||
|
{Name: "name", DataType: DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: "age", DataType: DataTypeInteger, Nullable: true, Default: ""},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
support: OperatorSupport{
|
||||||
|
ColumnIfNotExistsExists: true,
|
||||||
|
},
|
||||||
|
expectedSQLs: [][]byte{
|
||||||
|
[]byte(`ALTER TABLE "users" ADD COLUMN IF NOT EXISTS "age" INTEGER`),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "AddColumn_NullableNoDefault_ColumnIfNotExistsExistsFalse",
|
||||||
|
table: &Table{
|
||||||
|
Name: "users",
|
||||||
|
Columns: []*Column{
|
||||||
|
{Name: "id", DataType: DataTypeInteger, Nullable: false, Default: ""},
|
||||||
|
{Name: "name", DataType: DataTypeText, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
newTable: &Table{
|
||||||
|
Name: "users",
|
||||||
|
Columns: []*Column{
|
||||||
|
{Name: "id", DataType: DataTypeInteger, Nullable: false, Default: ""},
|
||||||
|
{Name: "name", DataType: DataTypeText, Nullable: false, Default: ""},
|
||||||
|
{Name: "age", DataType: DataTypeInteger, Nullable: true, Default: ""},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
support: OperatorSupport{
|
||||||
|
ColumnIfNotExistsExists: false,
|
||||||
|
},
|
||||||
|
expectedSQLs: [][]byte{
|
||||||
|
[]byte(`ALTER TABLE "users" ADD COLUMN "age" INTEGER`),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "CreatePrimaryKeyConstraint_CreateConstraintTrue",
|
||||||
|
table: &Table{
|
||||||
|
Name: "users",
|
||||||
|
Columns: []*Column{
|
||||||
|
{Name: "id", DataType: DataTypeInteger, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
newTable: &Table{
|
||||||
|
Name: "users",
|
||||||
|
Columns: []*Column{
|
||||||
|
{Name: "id", DataType: DataTypeInteger, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &PrimaryKeyConstraint{
|
||||||
|
ColumnNames: []ColumnName{"id"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
support: OperatorSupport{
|
||||||
|
CreateConstraint: true,
|
||||||
|
},
|
||||||
|
expectedSQLs: [][]byte{
|
||||||
|
[]byte(`ALTER TABLE "users" ADD CONSTRAINT "pk_users" PRIMARY KEY ("id")`),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "CreatePrimaryKeyConstraint_CreateConstraintFalse",
|
||||||
|
table: &Table{
|
||||||
|
Name: "users",
|
||||||
|
Columns: []*Column{
|
||||||
|
{Name: "id", DataType: DataTypeInteger, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
newTable: &Table{
|
||||||
|
Name: "users",
|
||||||
|
Columns: []*Column{
|
||||||
|
{Name: "id", DataType: DataTypeInteger, Nullable: false, Default: ""},
|
||||||
|
},
|
||||||
|
PrimaryKeyConstraint: &PrimaryKeyConstraint{
|
||||||
|
ColumnNames: []ColumnName{"id"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
support: OperatorSupport{
|
||||||
|
CreateConstraint: false,
|
||||||
|
},
|
||||||
|
expectedSQLs: [][]byte{
|
||||||
|
[]byte(`CREATE TABLE IF NOT EXISTS "users__temp" ("id" INTEGER NOT NULL, CONSTRAINT "pk_users" PRIMARY KEY ("id"))`),
|
||||||
|
[]byte(`INSERT INTO "users__temp" ("id") SELECT "id" FROM "users"`),
|
||||||
|
[]byte(`DROP TABLE IF EXISTS "users"`),
|
||||||
|
[]byte(`ALTER TABLE "users__temp" RENAME TO "users"`),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, testCase := range testCases {
|
||||||
|
t.Run(testCase.name, func(t *testing.T) {
|
||||||
|
fmter := NewFormatter(schema.NewNopFormatter().Dialect())
|
||||||
|
operator := NewOperator(fmter, testCase.support)
|
||||||
|
|
||||||
|
actuals := operator.ConvertTable(testCase.table, testCase.uniqueConstraints, testCase.newTable)
|
||||||
|
assert.Equal(t, testCase.expectedSQLs, actuals)
|
||||||
|
assert.Equal(t, testCase.newTable, testCase.table)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -33,9 +33,12 @@ func New(ctx context.Context, providerSettings factory.ProviderSettings, config
|
|||||||
settings: settings,
|
settings: settings,
|
||||||
sqlstore: sqlstore,
|
sqlstore: sqlstore,
|
||||||
operator: sqlschema.NewOperator(fmter, sqlschema.OperatorSupport{
|
operator: sqlschema.NewOperator(fmter, sqlschema.OperatorSupport{
|
||||||
|
CreateConstraint: false,
|
||||||
DropConstraint: false,
|
DropConstraint: false,
|
||||||
ColumnIfNotExistsExists: false,
|
ColumnIfNotExistsExists: false,
|
||||||
AlterColumnSetNotNull: false,
|
AlterColumnSetNotNull: false,
|
||||||
|
AlterColumnSetDefault: false,
|
||||||
|
AlterColumnSetDataType: false,
|
||||||
}),
|
}),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
@ -56,7 +59,7 @@ func (provider *provider) GetTable(ctx context.Context, tableName sqlschema.Tabl
|
|||||||
BunDB().
|
BunDB().
|
||||||
NewRaw("SELECT sql FROM sqlite_master WHERE type IN (?) AND tbl_name = ? AND sql IS NOT NULL", bun.In([]string{"table"}), string(tableName)).
|
NewRaw("SELECT sql FROM sqlite_master WHERE type IN (?) AND tbl_name = ? AND sql IS NOT NULL", bun.In([]string{"table"}), string(tableName)).
|
||||||
Scan(ctx, &sql); err != nil {
|
Scan(ctx, &sql); err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, provider.sqlstore.WrapNotFoundErrf(err, errors.CodeNotFound, "table (%s) not found", tableName)
|
||||||
}
|
}
|
||||||
|
|
||||||
table, uniqueConstraints, err := parseCreateTable(sql, provider.fmter)
|
table, uniqueConstraints, err := parseCreateTable(sql, provider.fmter)
|
||||||
|
|||||||
@ -34,6 +34,9 @@ type SQLOperator interface {
|
|||||||
// Returns a list of SQL statements to rename a table.
|
// Returns a list of SQL statements to rename a table.
|
||||||
RenameTable(*Table, TableName) [][]byte
|
RenameTable(*Table, TableName) [][]byte
|
||||||
|
|
||||||
|
// Returns a list of SQL statements to convert a table to a new table.
|
||||||
|
ConvertTable(*Table, []*UniqueConstraint, *Table) [][]byte
|
||||||
|
|
||||||
// Returns a list of SQL statements to recreate a table.
|
// Returns a list of SQL statements to recreate a table.
|
||||||
RecreateTable(*Table, []*UniqueConstraint) [][]byte
|
RecreateTable(*Table, []*UniqueConstraint) [][]byte
|
||||||
|
|
||||||
@ -47,9 +50,15 @@ type SQLOperator interface {
|
|||||||
// If the column is not nullable, the column is added with the input value, then the column is made non-nullable.
|
// If the column is not nullable, the column is added with the input value, then the column is made non-nullable.
|
||||||
AddColumn(*Table, []*UniqueConstraint, *Column, any) [][]byte
|
AddColumn(*Table, []*UniqueConstraint, *Column, any) [][]byte
|
||||||
|
|
||||||
|
// Returns a list of SQL statements to alter a column.
|
||||||
|
AlterColumn(*Table, []*UniqueConstraint, *Column) [][]byte
|
||||||
|
|
||||||
// Returns a list of SQL statements to drop a column from a table.
|
// Returns a list of SQL statements to drop a column from a table.
|
||||||
DropColumn(*Table, *Column) [][]byte
|
DropColumn(*Table, *Column) [][]byte
|
||||||
|
|
||||||
|
// Returns a list of SQL statements to create a constraint on a table.
|
||||||
|
CreateConstraint(*Table, []*UniqueConstraint, Constraint) [][]byte
|
||||||
|
|
||||||
// Returns a list of SQL statements to drop a constraint from a table.
|
// Returns a list of SQL statements to drop a constraint from a table.
|
||||||
DropConstraint(*Table, []*UniqueConstraint, Constraint) [][]byte
|
DropConstraint(*Table, []*UniqueConstraint, Constraint) [][]byte
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user