blob: 1206c21ccd76b5de0130ed2c7e77ba7d6b83bbc0 [file] [log] [blame]
// Copyright 2018 The Goma Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package backend
import (
"context"
"fmt"
bspb "google.golang.org/genproto/googleapis/bytestream"
"google.golang.org/grpc"
"go.chromium.org/goma/server/exec"
"go.chromium.org/goma/server/execlog"
"go.chromium.org/goma/server/file"
pb "go.chromium.org/goma/server/proto/backend"
filepb "go.chromium.org/goma/server/proto/file"
"go.chromium.org/goma/server/server"
)
// FromLocalBackend creates new GRPC from cfg.
// returned func would release resources associated with GRPC.
func FromLocalBackend(ctx context.Context, cfg *pb.LocalBackend, opt Option) (GRPC, func(), error) {
fileAddr := cfg.FileAddr
if fileAddr == "" {
fileAddr = "file-server:5050"
}
fileConn, err := server.DialContext(ctx, fileAddr,
grpc.WithDefaultCallOptions(
grpc.MaxCallSendMsgSize(file.DefaultMaxMsgSize),
grpc.MaxCallRecvMsgSize(file.DefaultMaxMsgSize),
grpc.FailFast(false)))
if err != nil {
return GRPC{}, func() {}, fmt.Errorf("dial %s: %v", fileAddr, err)
}
execAddr := cfg.ExecAddr
if execAddr == "" {
execAddr = "exec-server:5050"
}
var bsConn *grpc.ClientConn
var bsClient bspb.ByteStreamClient
if cfg.EnableBytestream {
bsConn, err = server.DialContext(ctx, execAddr)
if err != nil {
fileConn.Close()
return GRPC{}, func() {}, fmt.Errorf("dial %s: %v", execAddr, err)
}
bsClient = bspb.NewByteStreamClient(bsConn)
}
dialOptions := append(
[]grpc.DialOption{
grpc.WithDefaultCallOptions(grpc.FailFast(false)),
},
server.DefaultDialOption()...)
execlogAddr := cfg.ExeclogAddr
if execlogAddr == "" {
execlogAddr = "execlog-server:5050"
}
be := GRPC{
ExecServer: ExecServer{
Client: exec.NewClient(execAddr, dialOptions...),
},
FileServer: FileServer{
Client: filepb.NewFileServiceClient(fileConn),
},
ExeclogServer: ExeclogServer{
Client: execlog.NewClient(execlogAddr, dialOptions...),
},
ByteStreamClient: bsClient,
Auth: opt.Auth,
}
if cfg.TraceOption != nil {
be.Namespace = cfg.TraceOption.Namespace
be.Cluster = cfg.TraceOption.Cluster
}
return be, func() {
bsConn.Close()
fileConn.Close()
}, nil
}