1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
13 "git.arvados.org/arvados.git/sdk/go/arvados"
14 "github.com/coreos/go-systemd/daemon"
18 httpServer *http.Server
20 cluster *arvados.Cluster
21 eventSource *pgEventSource
25 func (srv *server) Close() {
27 srv.eventSource.Close()
28 srv.httpServer.Close()
32 func (srv *server) WaitReady() {
33 srv.setupOnce.Do(srv.setup)
34 srv.eventSource.WaitReady()
37 func (srv *server) Run() error {
38 srv.setupOnce.Do(srv.setup)
39 return srv.httpServer.Serve(srv.listener)
42 func (srv *server) setup() {
45 var listen arvados.URL
46 for listen, _ = range srv.cluster.Services.Websocket.InternalURLs {
49 ln, err := net.Listen("tcp", listen.Host)
51 log.WithField("Listen", listen).Fatal(err)
53 log.WithField("Listen", ln.Addr().String()).Info("listening")
55 client := arvados.Client{}
56 client.APIHost = srv.cluster.Services.Controller.ExternalURL.Host
57 client.AuthToken = srv.cluster.SystemRootToken
58 client.Insecure = srv.cluster.TLS.Insecure
61 srv.eventSource = &pgEventSource{
62 DataSource: srv.cluster.PostgreSQL.Connection.String(),
63 MaxOpenConns: srv.cluster.PostgreSQL.ConnectionPool,
64 QueueSize: srv.cluster.API.WebsocketServerEventQueue,
67 srv.httpServer = &http.Server{
69 ReadTimeout: time.Minute,
70 WriteTimeout: time.Minute,
71 MaxHeaderBytes: 1 << 20,
75 eventSource: srv.eventSource,
76 newPermChecker: func() permChecker { return newPermChecker(client) },
82 log.Info("event source stopped")
86 if _, err := daemon.SdNotify(false, "READY=1"); err != nil {
87 log.WithError(err).Warn("error notifying init daemon")