in origin/cmd/cmd.go [112:291]
func Run(flags *Flags, opts ...Option) {
if flags.PeerPort == 0 {
panic("must specify non-zero peer port")
}
if flags.BlobServerPort == 0 {
panic("must specify non-zero blob server port")
}
var overrides options
for _, o := range opts {
o(&overrides)
}
var config Config
if overrides.config != nil {
config = *overrides.config
} else {
if err := configutil.Load(flags.ConfigFile, &config); err != nil {
panic(err)
}
if flags.SecretsFile != "" {
if err := configutil.Load(flags.SecretsFile, &config); err != nil {
panic(err)
}
}
}
if overrides.logger != nil {
log.SetGlobalLogger(overrides.logger.Sugar())
} else {
zlog := log.ConfigureLogger(config.ZapLogging)
defer zlog.Sync()
}
stats := overrides.metrics
if stats == nil {
s, closer, err := metrics.New(config.Metrics, flags.KrakenCluster)
if err != nil {
log.Fatalf("Failed to init metrics: %s", err)
}
stats = s
defer closer.Close()
}
go metrics.EmitVersion(stats)
var hostname string
if flags.BlobServerHostName == "" {
var err error
hostname, err = os.Hostname()
if err != nil {
log.Fatalf("Error getting hostname: %s", err)
}
} else {
hostname = flags.BlobServerHostName
}
log.Infof("Configuring origin with hostname '%s'", hostname)
if flags.PeerIP == "" {
localIP, err := netutil.GetLocalIP()
if err != nil {
log.Fatalf("Error getting local ip: %s", err)
}
flags.PeerIP = localIP
}
cas, err := store.NewCAStore(config.CAStore, stats)
if err != nil {
log.Fatalf("Failed to create castore: %s", err)
}
pctx, err := core.NewPeerContext(
config.PeerIDFactory, flags.Zone, flags.KrakenCluster, flags.PeerIP, flags.PeerPort, true)
if err != nil {
log.Fatalf("Failed to create peer context: %s", err)
}
backendManager, err := backend.NewManager(config.BackendManager, config.Backends, config.Auth, stats)
if err != nil {
log.Fatalf("Error creating backend manager: %s", err)
}
localDB, err := localdb.New(config.LocalDB)
if err != nil {
log.Fatalf("Error creating local db: %s", err)
}
writeBackManager, err := persistedretry.NewManager(
config.WriteBack,
stats,
writeback.NewStore(localDB),
writeback.NewExecutor(stats, cas, backendManager))
if err != nil {
log.Fatalf("Error creating write-back manager: %s", err)
}
metaInfoGenerator, err := metainfogen.New(config.MetaInfoGen, cas)
if err != nil {
log.Fatalf("Error creating metainfo generator: %s", err)
}
blobRefresher := blobrefresh.New(config.BlobRefresh, stats, cas, backendManager, metaInfoGenerator)
netevents, err := networkevent.NewProducer(config.NetworkEvent)
if err != nil {
log.Fatalf("Error creating network event producer: %s", err)
}
sched, err := scheduler.NewOriginScheduler(
config.Scheduler, stats, pctx, cas, netevents, blobRefresher)
if err != nil {
log.Fatalf("Error creating scheduler: %s", err)
}
cluster, err := hostlist.New(config.Cluster)
if err != nil {
log.Fatalf("Error creating cluster host list: %s", err)
}
tls, err := config.TLS.BuildClient()
if err != nil {
log.Fatalf("Error building client tls config: %s", err)
}
healthCheckFilter := healthcheck.NewFilter(config.HealthCheck, healthcheck.Default(tls))
hashRing := hashring.New(
config.HashRing,
cluster,
healthCheckFilter,
hashring.WithWatcher(backend.NewBandwidthWatcher(backendManager)))
go hashRing.Monitor(nil)
addr := fmt.Sprintf("%s:%d", hostname, flags.BlobServerPort)
if !hashRing.Contains(addr) {
// When DNS is used for hash ring membership, the members will be IP
// addresses instead of hostnames.
ip, err := netutil.GetLocalIP()
if err != nil {
log.Fatalf("Error getting local ip: %s", err)
}
addr = fmt.Sprintf("%s:%d", ip, flags.BlobServerPort)
if !hashRing.Contains(addr) {
log.Fatalf(
"Neither %s nor %s (port %d) found in hash ring",
hostname, ip, flags.BlobServerPort)
}
}
server, err := blobserver.New(
config.BlobServer,
stats,
clock.New(),
addr,
hashRing,
cas,
blobclient.NewProvider(blobclient.WithTLS(tls)),
blobclient.NewClusterProvider(blobclient.WithTLS(tls)),
pctx,
backendManager,
blobRefresher,
metaInfoGenerator,
writeBackManager)
if err != nil {
log.Fatalf("Error initializing blob server: %s", err)
}
h := addTorrentDebugEndpoints(server.Handler(), sched)
go func() { log.Fatal(server.ListenAndServe(h)) }()
log.Info("Starting nginx...")
log.Fatal(nginx.Run(
config.Nginx,
map[string]interface{}{
"port": flags.BlobServerPort,
"server": nginx.GetServer(config.BlobServer.Listener.Net, config.BlobServer.Listener.Addr),
},
nginx.WithTLS(config.TLS)))
}