func main() { defer common.LogPanic() common.Init() args := flag.Args() if len(args) != 3 { glog.Errorf("Expected arguments: branch target buildID") glog.Errorf("i.e.: git_master-skia razor-userdebug 1772442") os.Exit(1) } // Set the arguments necessary to lookup the git hash. branch := args[0] target := args[1] buildID := args[2] glog.Infof("Branch, target, buildID: %s, %s, %s", branch, target, buildID) // Set up the oauth client. var client *http.Client var err error // In this case we don't want a backoff transport since the Apiary backend // seems to fail a lot, so we basically want to fall back to polling if a // call fails. transport := &http.Transport{ Dial: util.DialTimeout, } if *local { // Use a local client secret file to load data. client, err = auth.InstalledAppClient(OAUTH_CACHE_FILEPATH, CLIENT_SECRET_FILEPATH, transport, androidbuildinternal.AndroidbuildInternalScope, storage.CloudPlatformScope) if err != nil { glog.Fatalf("Unable to create installed app oauth client:%s", err) } } else { // Use compute engine service account. client = auth.GCEServiceAccountClient(transport) } f, err := androidbuild.New("/tmp/android-gold-ingest", client) if err != nil { glog.Fatalf("Failed to construct client: %s", err) } for { r, err := f.Get(branch, target, buildID) if err != nil { glog.Errorf("Failed to get requested info: %s", err) time.Sleep(1 * time.Minute) continue } if r != nil { glog.Infof("Successfully found: %#v", *r) } time.Sleep(1 * time.Minute) } }
// getClient returns an authorized storage.Service and the // corresponding http.Client; if anything goes wrong, it logs a fatal // error. func getClient() (storageClient, error) { var client *http.Client var err error if *local { client, err = auth.RunFlow(auth.OAuthConfig(*oauthCacheFile, auth.SCOPE_FULL_CONTROL)) // TODO(stephana): Replace auth.RunFlow with auth.NewClient // client, err = auth.NewClient(true, *oauthCacheFile, auth.SCOPE_FULL_CONTROL, auth.SCOPE_GCE) } else { client = auth.GCEServiceAccountClient(&http.Transport{Dial: util.DialTimeout}) } if err != nil { return storageClient{}, err } gsService, err := storage.New(client) if err != nil { return storageClient{}, err } return storageClient{httpClient: client, storageService: gsService}, nil }
func main() { defer common.LogPanic() // Setup DB flags. dbConf := db.DBConfigFromFlags() common.InitWithMetricsCB("ingest", func() string { common.DecodeTomlFile(*configFilename, &config) return config.Common.GraphiteServer }) // Initialize the database. We might not need the oauth dialog if it fails. if !config.Common.Local { if err := dbConf.GetPasswordFromMetadata(); err != nil { glog.Fatal(err) } } if err := dbConf.InitDB(); err != nil { glog.Fatal(err) } // Get a backoff transport. transport := util.NewBackOffTransport() // Determine the oauth scopes we are going to use. Storage is used by all // ingesters. scopes := []string{storage.CloudPlatformScope} for _, ingesterConfig := range config.Ingesters { if ingesterConfig.ConstructorName == gconfig.CONSTRUCTOR_ANDROID_GOLD { scopes = append(scopes, androidbuildinternal.AndroidbuildInternalScope) } } // Initialize the oauth client that is used to access all scopes. var client *http.Client var err error if config.Common.Local { if config.Common.DoOAuth { client, err = auth.InstalledAppClient(config.Common.OAuthCacheFile, config.Common.OAuthClientSecretFile, transport, scopes...) if err != nil { glog.Fatalf("Failed to auth: %s", err) } } else { client = nil // Add back service account access here when it's fixed. } } else { // Assume we are on a GCE instance. client = auth.GCEServiceAccountClient(transport) } // Initialize the ingester and gold ingester. ingester.Init(client) if _, ok := config.Ingesters[gconfig.CONSTRUCTOR_GOLD]; ok { if err := goldingester.Init(client, filepath.Join(config.Ingesters["gold"].StatusDir, "android-build-info")); err != nil { glog.Fatalf("Unable to initialize GoldIngester: %s", err) } } // TODO(stephana): Cleanup the way trybots are instantiated so that each trybot has it's own // database connection and they are all instantiated the same way instead of the // one-off approaches. if ingesterConf, ok := config.Ingesters[gconfig.CONSTRUCTOR_GOLD_TRYBOT]; ok { dbConf := &database.DatabaseConfig{ Host: ingesterConf.DBHost, Port: ingesterConf.DBPort, User: database.USER_RW, Name: ingesterConf.DBName, MigrationSteps: golddb.MigrationSteps(), } if !config.Common.Local { if err := dbConf.GetPasswordFromMetadata(); err != nil { glog.Fatal(err) } } vdb, err := dbConf.NewVersionedDB() if err != nil { glog.Fatalf("Unable to open db connection: %s", err) } goldtrybot.Init(vdb) } git, err := gitinfo.NewGitInfo(config.Common.GitRepoDir, true, false) if err != nil { glog.Fatalf("Failed loading Git info: %s\n", err) } for dataset, ingesterConfig := range config.Ingesters { // Get duration equivalent to the number of days. minDuration := 24 * time.Hour * time.Duration(ingesterConfig.MinDays) constructorName := ingesterConfig.ConstructorName if constructorName == "" { constructorName = dataset } constructor := ingester.Constructor(constructorName) resultIngester := constructor() glog.Infof("Process name: %s", dataset) startProcess := NewIngestionProcess(git, config.Common.TileDir, dataset, resultIngester, ingesterConfig.ExtraParams, ingesterConfig.RunEvery.Duration, ingesterConfig.NCommits, minDuration, ingesterConfig.StatusDir, ingesterConfig.MetricName) startProcess() } select {} }