func getRegistryClient() (client.API, error) { var dial func(string, string) (net.Conn, error) tun := getTunnelFlag() if tun != "" { sshClient, err := ssh.NewSSHClient("core", tun, getChecker(), false) if err != nil { return nil, fmt.Errorf("failed initializing SSH client: %v", err) } dial = func(network, addr string) (net.Conn, error) { tcpaddr, err := net.ResolveTCPAddr(network, addr) if err != nil { return nil, err } return sshClient.DialTCP(network, nil, tcpaddr) } } tlsConfig, err := etcd.TLSClientConfig(globalFlags.EtcdCAFile, globalFlags.EtcdCertFile, globalFlags.EtcdKeyFile) if err != nil { return nil, err } trans := http.Transport{ Dial: dial, TLSClientConfig: tlsConfig, } return client.NewRegistryClient(&trans, globalFlags.Endpoint, globalFlags.EtcdKeyPrefix) }
func New(cfg config.Config) (*Server, error) { mgr, err := systemd.NewSystemdUnitManager(systemd.DefaultUnitsDirectory) if err != nil { return nil, err } mach, err := newMachineFromConfig(cfg, mgr) if err != nil { return nil, err } tlsConfig, err := etcd.TLSClientConfig(cfg.EtcdCAFile, cfg.EtcdCertFile, cfg.EtcdKeyFile) if err != nil { return nil, err } eClient, err := etcd.NewClient(cfg.EtcdServers, http.Transport{TLSClientConfig: tlsConfig}) if err != nil { return nil, err } reg := registry.New(eClient, cfg.EtcdKeyPrefix) pub := agent.NewUnitStatePublisher(mgr, reg, mach) gen := unit.NewUnitStateGenerator(mgr) a, err := newAgentFromConfig(mach, reg, cfg, mgr, gen) if err != nil { return nil, err } ar, err := newAgentReconcilerFromConfig(reg, cfg) if err != nil { return nil, err } e := engine.New(reg, mach) rStream, err := registry.NewEventStream(eClient, reg) if err != nil { return nil, err } eBus := event.NewEventBus() eBus.AddListener(event.JobEvent, ar.Trigger) eBus.AddListener(event.GlobalEvent, e.Trigger) listeners, err := activation.Listeners(false) if err != nil { return nil, err } hrt, mon, err := newHeartMonitorFromConfig(mach, reg, cfg) if err != nil { return nil, err } apiServer := api.NewServer(listeners, api.NewServeMux(reg)) apiServer.Serve() srv := Server{ agent: a, aReconciler: ar, usGen: gen, usPub: pub, engine: e, rStream: rStream, eBus: eBus, mach: mach, hrt: hrt, mon: mon, api: apiServer, stop: nil, } return &srv, nil }