func Open(dialect string, addr string, filestoragePath string) (*api.Services, error) { conn, err := migration.Open(dialect, addr, migrations.Migrations) if err != nil { return nil, err } db, err := gorm.Open(dialect, conn) if err != nil { return nil, err } r := &resources{ DB: &db, Ports: operator.NewScheduler(16000, 2000), FilestoragePath: filestoragePath, } s := &api.Services{ Rankings: &rankingsDB{r}, Games: &gamesDB{r}, Matches: &matchesDB{r}, Players: &playersDB{r}, Users: &usersDB{r}, DB: &db, } r.Services = s return s, nil }
func (runner *Runner) Open() *sql.DB { dbConn, err := migration.Open( "postgres", runner.DataSourceName(), migrations.Migrations, ) Expect(err).NotTo(HaveOccurred()) return dbConn }
func main() { logger := lager.NewLogger("checkin") logger.RegisterSink(lager.NewWriterSink(os.Stdout, lager.INFO)) var opts Opts _, err := flags.Parse(&opts) if err != nil { logger.Error("parsing-flags", err) os.Exit(1) } // ts := oauth2.StaticTokenSource( // &oauth2.Token{AccessToken: opts.GitHubAccessToken}, // ) // tc := oauth2.NewClient(oauth2.NoContext, ts) // githubClient := github.NewClient(tc) // checker := build.NewConcourseChecker() // checker = build.NewStatusReporter(checker, githubClient.Repositories) dbConn, err := migration.Open(opts.DBDriver, opts.DBURL, migrations.Migrations) if err != nil { logger.Error("failed-to-run-migrations", err) os.Exit(1) } sqlDB := db.NewSQL(logger.Session("db"), dbConn) enqueuer := build.NewEnqueuer(sqlDB) apiServer := api.NewServer(opts.GitHubSecret, enqueuer) members := []grouper.Member{ { "api", http_server.New( opts.Addr, apiServer, ), }, } group := grouper.NewParallel(os.Interrupt, members) running := ifrit.Invoke(sigmon.New(group)) logger.Info("listening", lager.Data{ "api": opts.Addr, }) err = <-running.Wait() if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } }
// Open opens a connection to an IMDb relational database. The driver may // either be "sqlite3" or "postgres". The dsn (data source name) is dependent // upon the driver. For example, for the sqlite3 driver, the dsn is just a // path to a file (that may not exist). // // In general, the 'driver' and 'dsn' should be exactly the same as used in // the 'database/sql' package. // // Whenever an imdb database is opened, it is checked to make sure its schema // is up to date with the current library. If it isn't, it will be updated. func Open(driver, dsn string) (*DB, error) { db, err := migration.Open(driver, dsn, migrations[driver]) if err != nil { return nil, err } if driver == "postgres" { if _, err := db.Exec("SET timezone = UTC"); err != nil { return nil, fmt.Errorf("Could not set timezone to UTC: %s", err) } } return &DB{db, driver}, nil }
func LockDBAndMigrate(logger lager.Logger, sqlDriver string, sqlDataSource string) (db.Conn, error) { var err error var dbLockConn db.Conn var dbConn db.Conn for { dbLockConn, err = sql.Open(sqlDriver, sqlDataSource) if err != nil { if strings.Contains(err.Error(), " dial ") { logger.Error("failed-to-open-db-retrying", err) time.Sleep(5 * time.Second) continue } return nil, err } break } lockName := crc32.ChecksumIEEE([]byte(sqlDriver + sqlDataSource)) for { _, err = dbLockConn.Exec(`select pg_advisory_lock($1)`, lockName) if err != nil { logger.Error("failed-to-acquire-lock-retrying", err) time.Sleep(5 * time.Second) continue } logger.Info("migration-lock-acquired") migrations := Translogrifier(logger, Migrations) dbConn, err = migration.Open(sqlDriver, sqlDataSource, migrations) if err != nil { logger.Fatal("failed-to-run-migrations", err) } _, err = dbLockConn.Exec(`select pg_advisory_unlock($1)`, lockName) if err != nil { logger.Error("failed-to-release-lock", err) } dbLockConn.Close() break } return dbConn, nil }
// Connect is a helper function that establishes a new // database connection and auto-generates the database // schema. If the database already exists, it will perform // and update as needed. func Connect(driver, datasource string) (*sql.DB, error) { switch driver { case driverPostgres: meddler.Default = meddler.PostgreSQL case driverSqlite: meddler.Default = meddler.SQLite case driverMysql: meddler.Default = meddler.MySQL } migration.DefaultGetVersion = migrate.GetVersion migration.DefaultSetVersion = migrate.SetVersion var migrations = []migration.Migrator{ migrate.Setup, } return migration.Open(driver, datasource, migrations) }
func connect(conf configPgsql) *lcmDB { conns := fmt.Sprintf( "user=%s password=%s host=%s port=%d dbname=%s sslmode=disable", conf.User, conf.Password, conf.Host, conf.Port, conf.Database) pgsqlDB, err := migration.Open("postgres", conns, schemaMigrations) if err != nil { log.Fatalf("Could not connect to PostgreSQL (%s@%s/%s): %s", conf.User, conf.Host, conf.Database, err) } // All time operations in the database are done in UTC. // Times for the user (in their timezone) are mostly handled in template // helper functions. csql.Exec(pgsqlDB, "SET timezone = UTC") return &lcmDB{pgsqlDB, conf} }
func Connect(driver, conn string) (*sqlx.DB, error) { migrator := migrate.Migrator{driver} migration.DefaultGetVersion = migrator.GetVersion migration.DefaultSetVersion = migrator.SetVersion migrations := []migration.Migrator{ migrator.Setup, migrator.CreateDefaultPerson, } db, err := migration.Open(driver, conn, migrations) if err != nil { return nil, err } if err := db.Ping(); err != nil { return nil, err } return sqlx.NewDb(db, driver), nil }
} BeforeEach(func() { Ω(migrationFromSet).ShouldNot(BeNil(), "Migration was not added to the list!") var err error postgresRunner = postgresrunner.Runner{ Port: 5433 + GinkgoParallelNode(), } dbProcess = ifrit.Envoke(postgresRunner) postgresRunner.CreateTestDB() dbConn, err = migration.Open("postgres", postgresRunner.DataSourceName(), precedingMigrations) Ω(err).ShouldNot(HaveOccurred()) }) AfterEach(func() { err := dbConn.Close() Ω(err).ShouldNot(HaveOccurred()) postgresRunner.DropTestDB() dbProcess.Signal(os.Interrupt) Eventually(dbProcess.Wait(), 10*time.Second).Should(Receive()) }) JustBeforeEach(func() { tx, err := dbConn.Begin()
func main() { flag.Parse() if !*dev && (*httpUsername == "" || (*httpHashedPassword == "" && *httpPassword == "")) { fatal(errors.New("must specify -httpUsername and -httpPassword or -httpHashedPassword or turn on dev mode")) } if _, err := os.Stat(*templatesDir); err != nil { fatal(errors.New("directory specified via -templates does not exist")) } if _, err := os.Stat(*publicDir); err != nil { fatal(errors.New("directory specified via -public does not exist")) } logger := lager.NewLogger("atc") logLevel := lager.INFO if *dev { logLevel = lager.DEBUG } sink := lager.NewReconfigurableSink(lager.NewWriterSink(os.Stdout, lager.DEBUG), logLevel) logger.RegisterSink(sink) var err error var dbConn Db.Conn for { dbConn, err = migration.Open(*sqlDriver, *sqlDataSource, migrations.Migrations) if err != nil { if strings.Contains(err.Error(), " dial ") { logger.Error("failed-to-open-db", err) time.Sleep(5 * time.Second) continue } fatal(err) } break } dbConn = Db.Explain(logger, dbConn, 500*time.Millisecond) listener := pq.NewListener(*sqlDataSource, time.Second, time.Minute, nil) bus := Db.NewNotificationsBus(listener) db := Db.NewSQL(logger.Session("db"), dbConn, bus) pipelineDBFactory := Db.NewPipelineDBFactory(logger.Session("db"), dbConn, bus, db) var configDB Db.ConfigDB configDB = Db.PlanConvertingConfigDB{db} var resourceTypesNG []atc.WorkerResourceType err = json.Unmarshal([]byte(*resourceTypes), &resourceTypesNG) if err != nil { logger.Fatal("invalid-resource-types", err) } var workerClient worker.Client if *gardenAddr != "" { workerClient = worker.NewGardenWorker( gclient.New(gconn.NewWithLogger( *gardenNetwork, *gardenAddr, logger.Session("garden-connection"), )), clock.NewClock(), -1, resourceTypesNG, "linux", []string{}, ) } else { workerClient = worker.NewPool(worker.NewDBWorkerProvider(db, logger)) } resourceTracker := resource.NewTracker(workerClient) gardenFactory := exec.NewGardenFactory(workerClient, resourceTracker, func() string { guid, err := uuid.NewV4() if err != nil { panic("not enough entropy to generate guid: " + err.Error()) } return guid.String() }) execEngine := engine.NewExecEngine(gardenFactory, engine.NewBuildDelegateFactory(db), db) engine := engine.NewDBEngine(engine.Engines{execEngine}, db, db) var webValidator auth.Validator if *httpUsername != "" && *httpHashedPassword != "" { webValidator = auth.BasicAuthHashedValidator{ Username: *httpUsername, HashedPassword: *httpHashedPassword, } } else if *httpUsername != "" && *httpPassword != "" { webValidator = auth.BasicAuthValidator{ Username: *httpUsername, Password: *httpPassword, } } else { webValidator = auth.NoopValidator{} } callbacksURL, err := url.Parse(*callbacksURLString) if err != nil { fatal(err) } drain := make(chan struct{}) apiHandler, err := api.NewHandler( logger, // logger lager.Logger, webValidator, // validator auth.Validator, pipelineDBFactory, // pipelineDBFactory db.PipelineDBFactory, configDB, // configDB db.ConfigDB, db, // buildsDB buildserver.BuildsDB, db, // workerDB workerserver.WorkerDB, db, // pipeDB pipes.PipeDB, db, // pipelinesDB db.PipelinesDB, config.ValidateConfig, // configValidator configserver.ConfigValidator, callbacksURL.String(), // peerURL string, buildserver.NewEventHandler, // eventHandlerFactory buildserver.EventHandlerFactory, drain, // drain <-chan struct{}, engine, // engine engine.Engine, workerClient, // workerClient worker.Client, sink, // sink *lager.ReconfigurableSink, *cliDownloadsDir, // cliDownloadsDir string, ) if err != nil { fatal(err) } radarSchedulerFactory := pipelines.NewRadarSchedulerFactory( resourceTracker, *checkInterval, db, engine, db, ) webHandler, err := web.NewHandler( logger, webValidator, radarSchedulerFactory, db, pipelineDBFactory, configDB, *templatesDir, *publicDir, engine, ) if err != nil { fatal(err) } webMux := http.NewServeMux() webMux.Handle("/api/v1/", apiHandler) webMux.Handle("/", webHandler) var httpHandler http.Handler httpHandler = webMux if !*publiclyViewable { httpHandler = auth.Handler{ Handler: httpHandler, Validator: webValidator, } } // copy Authorization header as ATC-Authorization cookie for websocket auth httpHandler = auth.CookieSetHandler{ Handler: httpHandler, } httpHandler = httpmetrics.Wrap(httpHandler) webListenAddr := fmt.Sprintf("%s:%d", *webListenAddress, *webListenPort) debugListenAddr := fmt.Sprintf("%s:%d", *debugListenAddress, *debugListenPort) syncer := pipelines.NewSyncer( logger.Session("syncer"), db, pipelineDBFactory, func(pipelineDB Db.PipelineDB) ifrit.Runner { return grouper.NewParallel(os.Interrupt, grouper.Members{ { pipelineDB.ScopedName("radar"), rdr.NewRunner( logger.Session(pipelineDB.ScopedName("radar")), *noop, db, radarSchedulerFactory.BuildRadar(pipelineDB), pipelineDB, 1*time.Minute, ), }, { pipelineDB.ScopedName("scheduler"), &sched.Runner{ Logger: logger.Session(pipelineDB.ScopedName("scheduler")), Locker: db, DB: pipelineDB, Scheduler: radarSchedulerFactory.BuildScheduler(pipelineDB), Noop: *noop, Interval: 10 * time.Second, }, }, }) }, ) buildTracker := builds.NewTracker( logger.Session("build-tracker"), db, engine, ) memberGrouper := []grouper.Member{ {"web", http_server.New(webListenAddr, httpHandler)}, {"debug", http_server.New(debugListenAddr, http.DefaultServeMux)}, {"drainer", ifrit.RunFunc(func(signals <-chan os.Signal, ready chan<- struct{}) error { close(ready) <-signals close(drain) return nil })}, {"pipelines", pipelines.SyncRunner{ Syncer: syncer, Interval: 10 * time.Second, Clock: clock.NewClock(), }}, {"builds", builds.TrackerRunner{ Tracker: buildTracker, Interval: 10 * time.Second, Clock: clock.NewClock(), }}, } group := grouper.NewParallel(os.Interrupt, memberGrouper) running := ifrit.Envoke(sigmon.New(group)) logger.Info("listening", lager.Data{ "web": webListenAddr, "debug": debugListenAddr, }) err = <-running.Wait() if err != nil { logger.Error("exited-with-failure", err) os.Exit(1) } }