X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/71b3aadcbf0d8a3c0b283fc27a17773951d417c7..fd9342c42faaf2c6aa2a6800fe91172bf24e2916:/lib/boot/service.go?ds=sidebyside diff --git a/lib/boot/service.go b/lib/boot/service.go index 4b35e13768..090e852446 100644 --- a/lib/boot/service.go +++ b/lib/boot/service.go @@ -6,36 +6,57 @@ package boot import ( "context" + "errors" "path/filepath" "git.arvados.org/arvados.git/sdk/go/arvados" ) +// Run a service using the arvados-server binary. +// +// In future this will bring up the service in the current process, +// but for now (at least until the subcommand handlers get a shutdown +// mechanism) it starts a child process using the arvados-server +// binary, which the supervisor is assumed to have installed in +// {super.tempdir}/bin/. type runServiceCommand struct { - name string - svc arvados.Service - depends []bootTask + name string // arvados-server subcommand, e.g., "controller" + svc arvados.Service // cluster.Services.* entry with the desired InternalURLs + depends []supervisedTask // wait for these tasks before starting } func (runner runServiceCommand) String() string { return runner.name } -func (runner runServiceCommand) Run(ctx context.Context, fail func(error), boot *Booter) error { - boot.wait(ctx, runner.depends...) - go func() { - var u arvados.URL - for u = range runner.svc.InternalURLs { +func (runner runServiceCommand) Run(ctx context.Context, fail func(error), super *Supervisor) error { + binfile := filepath.Join(super.bindir, "arvados-server") + err := super.RunProgram(ctx, super.bindir, runOptions{}, binfile, "-version") + if err != nil { + return err + } + super.wait(ctx, runner.depends...) + for u := range runner.svc.InternalURLs { + u := u + if islocal, err := addrIsLocal(u.Host); err != nil { + return err + } else if !islocal { + continue } - fail(boot.RunProgram(ctx, boot.tempdir, nil, []string{"ARVADOS_SERVICE_INTERNAL_URL=" + u.String()}, "arvados-server", runner.name, "-config", boot.configfile)) - }() + super.waitShutdown.Add(1) + go func() { + defer super.waitShutdown.Done() + fail(super.RunProgram(ctx, super.tempdir, runOptions{env: []string{"ARVADOS_SERVICE_INTERNAL_URL=" + u.String()}}, binfile, runner.name, "-config", super.configfile)) + }() + } return nil } +// Run a Go service that isn't bundled in arvados-server. type runGoProgram struct { - src string - svc arvados.Service - depends []bootTask + src string // source dir, e.g., "services/keepproxy" + svc arvados.Service // cluster.Services.* entry with the desired InternalURLs + depends []supervisedTask // wait for these tasks before starting } func (runner runGoProgram) String() string { @@ -43,32 +64,36 @@ func (runner runGoProgram) String() string { return basename } -func (runner runGoProgram) Run(ctx context.Context, fail func(error), boot *Booter) error { - boot.wait(ctx, runner.depends...) - err := boot.RunProgram(ctx, runner.src, nil, nil, "go", "install") +func (runner runGoProgram) Run(ctx context.Context, fail func(error), super *Supervisor) error { + if len(runner.svc.InternalURLs) == 0 { + return errors.New("bug: runGoProgram needs non-empty svc.InternalURLs") + } + + binfile, err := super.installGoProgram(ctx, runner.src) if err != nil { return err } if ctx.Err() != nil { return ctx.Err() } - _, basename := filepath.Split(runner.src) - if len(runner.svc.InternalURLs) > 0 { - // Run one for each URL - for u := range runner.svc.InternalURLs { - u := u - boot.waitShutdown.Add(1) - go func() { - defer boot.waitShutdown.Done() - fail(boot.RunProgram(ctx, boot.tempdir, nil, []string{"ARVADOS_SERVICE_INTERNAL_URL=" + u.String()}, basename)) - }() + + err = super.RunProgram(ctx, super.tempdir, runOptions{}, binfile, "-version") + if err != nil { + return err + } + + super.wait(ctx, runner.depends...) + for u := range runner.svc.InternalURLs { + u := u + if islocal, err := addrIsLocal(u.Host); err != nil { + return err + } else if !islocal { + continue } - } else { - // Just run one - boot.waitShutdown.Add(1) + super.waitShutdown.Add(1) go func() { - defer boot.waitShutdown.Done() - fail(boot.RunProgram(ctx, boot.tempdir, nil, nil, basename)) + defer super.waitShutdown.Done() + fail(super.RunProgram(ctx, super.tempdir, runOptions{env: []string{"ARVADOS_SERVICE_INTERNAL_URL=" + u.String()}}, binfile)) }() } return nil