Skip to content

Commit

Permalink
Add the Org ID (#2781)
Browse files Browse the repository at this point in the history
* feat: add migration for org ids

* maintain: make the linter happy
  • Loading branch information
pdevine committed Aug 1, 2022
1 parent c19170c commit 501cd0d
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 29 deletions.
44 changes: 43 additions & 1 deletion internal/server/data/migrations.go
Expand Up @@ -421,8 +421,15 @@ func migrate(db *gorm.DB) error {
{
ID: "202204211705",
Migrate: func(tx *gorm.DB) error {
type Model struct {
ID uid.ID
CreatedAt time.Time `gorm:"<-:create"`
UpdatedAt time.Time
DeletedAt gorm.DeletedAt
}

type Settings struct {
models.Model
Model
PrivateJWK models.EncryptedAtRestBytes
}

Expand Down Expand Up @@ -479,6 +486,7 @@ func migrate(db *gorm.DB) error {
setDestinationLastSeenAt(),
deleteDuplicateGrants(),
dropDeletedProviderUsers(),
addOrganizations(),
// next one here
})
if err := m.Migrate(); err != nil {
Expand Down Expand Up @@ -655,3 +663,37 @@ func deleteDuplicates(tx *gorm.DB, group string, model models.Modelable) error {
subQuery := tx.Select("min(id)").Group(group).Model(model)
return tx.Where("id NOT in (?)", subQuery).Delete(model).Error
}

func addOrganizations() *migrator.Migration {
return &migrator.Migration{
ID: "202207271554",
Migrate: func(tx *gorm.DB) error {
logging.Debugf("migrating orgs")
mods := []interface{}{
&models.AccessKey{},
&models.Credential{},
&models.Destination{},
&models.EncryptionKey{},
&models.Grant{},
&models.Group{},
&models.Identity{},
&models.Organization{},
&models.Provider{},
&models.Settings{},
}

for _, mod := range mods {
if tx.Migrator().HasTable(mod) {
if !tx.Migrator().HasColumn(mod, "organization_id") {
if err := tx.Migrator().AddColumn(mod, "organization_id"); err != nil {
logging.Debugf("failed to add column: %q", mod)
return err
}
}
}
}

return nil
},
}
}
68 changes: 41 additions & 27 deletions internal/server/data/migrations_test.go
Expand Up @@ -17,33 +17,6 @@ import (
"github.com/infrahq/infra/internal/testing/patch"
)

func TestMigration_SettingsPopulatePasswordDefaults(t *testing.T) {
for _, driver := range dbDrivers(t) {
t.Run(driver.Name(), func(t *testing.T) {
db, err := newRawDB(driver)
assert.NilError(t, err)

patch.ModelsSymmetricKey(t)
logging.PatchLogger(t, zerolog.NewTestWriter(t))

loadSQL(t, db, "202207120000-"+driver.Name())

db, err = NewDB(driver, nil)
assert.NilError(t, err)

var settings models.Settings
err = db.Omit("private_jwk").First(&settings).Error
assert.NilError(t, err)

assert.Equal(t, settings.LowercaseMin, 0)
assert.Equal(t, settings.UppercaseMin, 0)
assert.Equal(t, settings.NumberMin, 0)
assert.Equal(t, settings.SymbolMin, 0)
assert.Equal(t, settings.LengthMin, 8)
})
}
}

// see loadSQL for setting up your own migration test
func TestMigration_202204111503(t *testing.T) {
driver := setupWithNoMigrations(t, func(db *gorm.DB) {
Expand Down Expand Up @@ -276,3 +249,44 @@ func TestMigration_RemoveDeletedProviderUsers(t *testing.T) {
})
}
}

func TestMigration_SettingsPopulatePasswordDefaults(t *testing.T) {
for _, driver := range dbDrivers(t) {
t.Run(driver.Name(), func(t *testing.T) {
db, err := newRawDB(driver)
assert.NilError(t, err)

patch.ModelsSymmetricKey(t)
logging.PatchLogger(t, zerolog.NewTestWriter(t))

loadSQL(t, db, "202207120000-"+driver.Name())

db, err = NewDB(driver, nil)
assert.NilError(t, err)

var settings models.Settings
err = db.Omit("private_jwk").First(&settings).Error
assert.NilError(t, err)

assert.Equal(t, settings.LowercaseMin, 0)
assert.Equal(t, settings.UppercaseMin, 0)
assert.Equal(t, settings.NumberMin, 0)
assert.Equal(t, settings.SymbolMin, 0)
assert.Equal(t, settings.LengthMin, 8)
})
}
}

func TestMigration_AddOrganizations(t *testing.T) {
for _, driver := range dbDrivers(t) {
t.Run(driver.Name(), func(t *testing.T) {
db, err := newRawDB(driver)
assert.NilError(t, err)

loadSQL(t, db, "202207041724-"+driver.Name())

_, err = NewDB(driver, nil)
assert.NilError(t, err)
})
}
}
3 changes: 2 additions & 1 deletion internal/server/models/model.go
Expand Up @@ -17,7 +17,8 @@ type Modelable interface {
const CreatedBySystem = 1

type Model struct {
ID uid.ID
ID uid.ID
OrganizationID uid.ID
// CreatedAt is set by GORM to time.Now when a record is first created.
// See https://gorm.io/docs/conventions.html#Timestamp-Tracking
// gorm:"<-:create" allows read and create, but not updating
Expand Down

0 comments on commit 501cd0d

Please sign in to comment.