forked from mystiq/dex
cmd/dex-overlord, db: migrations in overlord
Migrations happen only in the overlord, so there's no thundering herd, and database initialziation can be more easily controlled.
This commit is contained in:
parent
84bc8073de
commit
8b6a2699d9
2 changed files with 18 additions and 13 deletions
|
@ -15,6 +15,7 @@ import (
|
||||||
"github.com/coreos/dex/db"
|
"github.com/coreos/dex/db"
|
||||||
pflag "github.com/coreos/dex/pkg/flag"
|
pflag "github.com/coreos/dex/pkg/flag"
|
||||||
"github.com/coreos/dex/pkg/log"
|
"github.com/coreos/dex/pkg/log"
|
||||||
|
ptime "github.com/coreos/dex/pkg/time"
|
||||||
"github.com/coreos/dex/server"
|
"github.com/coreos/dex/server"
|
||||||
"github.com/coreos/dex/user"
|
"github.com/coreos/dex/user"
|
||||||
)
|
)
|
||||||
|
@ -29,14 +30,17 @@ func main() {
|
||||||
fs := flag.NewFlagSet("dex-overlord", flag.ExitOnError)
|
fs := flag.NewFlagSet("dex-overlord", flag.ExitOnError)
|
||||||
secret := fs.String("key-secret", "", "symmetric key used to encrypt/decrypt signing key data in DB")
|
secret := fs.String("key-secret", "", "symmetric key used to encrypt/decrypt signing key data in DB")
|
||||||
dbURL := fs.String("db-url", "", "DSN-formatted database connection string")
|
dbURL := fs.String("db-url", "", "DSN-formatted database connection string")
|
||||||
|
|
||||||
|
dbMigrate := fs.Bool("db-migrate", true, "perform database migrations when starting up overlord. This includes the initial DB objects creation.")
|
||||||
|
|
||||||
keyPeriod := fs.Duration("key-period", 24*time.Hour, "length of time for-which a given key will be valid")
|
keyPeriod := fs.Duration("key-period", 24*time.Hour, "length of time for-which a given key will be valid")
|
||||||
gcInterval := fs.Duration("gc-interval", time.Hour, "length of time between garbage collection runs")
|
gcInterval := fs.Duration("gc-interval", time.Hour, "length of time between garbage collection runs")
|
||||||
|
|
||||||
adminListen := fs.String("admin-listen", "http://0.0.0.0:5557", "scheme, host and port for listening for administrative operation requests ")
|
adminListen := fs.String("admin-listen", "http://0.0.0.0:5557", "scheme, host and port for listening for administrative operation requests ")
|
||||||
|
|
||||||
|
localConnectorID := fs.String("local-connector", "local", "ID of the local connector")
|
||||||
logDebug := fs.Bool("log-debug", false, "log debug-level information")
|
logDebug := fs.Bool("log-debug", false, "log debug-level information")
|
||||||
logTimestamps := fs.Bool("log-timestamps", false, "prefix log lines with timestamps")
|
logTimestamps := fs.Bool("log-timestamps", false, "prefix log lines with timestamps")
|
||||||
localConnectorID := fs.String("local-connector", "local", "ID of the local connector")
|
|
||||||
|
|
||||||
if err := fs.Parse(os.Args[1:]); err != nil {
|
if err := fs.Parse(os.Args[1:]); err != nil {
|
||||||
fmt.Fprintln(os.Stderr, err.Error())
|
fmt.Fprintln(os.Stderr, err.Error())
|
||||||
|
@ -74,6 +78,19 @@ func main() {
|
||||||
log.Fatalf(err.Error())
|
log.Fatalf(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if *dbMigrate {
|
||||||
|
var sleep time.Duration
|
||||||
|
for {
|
||||||
|
if migrations, err := db.MigrateToLatest(dbc); err == nil {
|
||||||
|
log.Infof("Performed %d db migrations", migrations)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
sleep = ptime.ExpBackoff(sleep, time.Minute)
|
||||||
|
log.Errorf("Unable to migrate database, retrying in %v: %v", sleep, err)
|
||||||
|
time.Sleep(sleep)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
userRepo := db.NewUserRepo(dbc)
|
userRepo := db.NewUserRepo(dbc)
|
||||||
pwiRepo := db.NewPasswordInfoRepo(dbc)
|
pwiRepo := db.NewPasswordInfoRepo(dbc)
|
||||||
userManager := user.NewManager(userRepo,
|
userManager := user.NewManager(userRepo,
|
||||||
|
|
12
db/conn.go
12
db/conn.go
|
@ -5,13 +5,11 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/coopernurse/gorp"
|
"github.com/coopernurse/gorp"
|
||||||
_ "github.com/lib/pq"
|
_ "github.com/lib/pq"
|
||||||
|
|
||||||
"github.com/coreos/dex/pkg/log"
|
"github.com/coreos/dex/pkg/log"
|
||||||
ptime "github.com/coreos/dex/pkg/time"
|
|
||||||
"github.com/coreos/dex/repo"
|
"github.com/coreos/dex/repo"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -73,16 +71,6 @@ func NewConnection(cfg Config) (*gorp.DbMap, error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var sleep time.Duration
|
|
||||||
for {
|
|
||||||
if err = dbm.CreateTablesIfNotExists(); err == nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
sleep = ptime.ExpBackoff(sleep, time.Minute)
|
|
||||||
log.Errorf("Unable to initialize database, retrying in %v: %v", sleep, err)
|
|
||||||
time.Sleep(sleep)
|
|
||||||
}
|
|
||||||
|
|
||||||
return &dbm, nil
|
return &dbm, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue