gateway: implementation for return

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
docker-18.09
Tonis Tiigi 2018-07-09 14:26:31 -07:00
parent 95d944cc31
commit c3a29cce8b
1 changed files with 45 additions and 1 deletions

View File

@ -194,6 +194,13 @@ func (gf *gatewayFrontend) Solve(ctx context.Context, llbBridge frontend.Fronten
defer func() {
for _, r := range lbf.refs {
if retErr != nil && len(lbf.lastRefs) > 0 {
for _, ref := range lbf.lastRefs {
if ref == r {
continue
}
}
}
if r != nil && (lbf.lastRef != r || retErr != nil) {
r.Release(context.TODO())
}
@ -209,10 +216,18 @@ func (gf *gatewayFrontend) Solve(ctx context.Context, llbBridge frontend.Fronten
ReadonlyRootFS: readonly,
}, rootFS, lbf.Stdin, lbf.Stdout, os.Stderr)
if lbf.err != nil {
return nil, nil, lbf.err
}
if err != nil {
return nil, nil, err
}
if lbf.lastRefs != nil {
return lbf.lastRefs, lbf.exporterAttr, nil
}
return map[string]solver.CachedResult{"default": lbf.lastRef}, lbf.exporterAttr, nil
}
@ -293,6 +308,8 @@ type llbBridgeForwarder struct {
llbBridge frontend.FrontendLLBBridge
refs map[string]solver.CachedResult
lastRef solver.CachedResult
lastRefs map[string]solver.CachedResult
err error
exporterAttr map[string][]byte
workers frontend.WorkerInfos
*pipe
@ -432,7 +449,34 @@ func (lbf *llbBridgeForwarder) Ping(context.Context, *pb.PingRequest) (*pb.PongR
}
func (lbf *llbBridgeForwarder) Return(ctx context.Context, in *pb.ReturnRequest) (*pb.ReturnResponse, error) {
return nil, errors.Errorf("return not implemented yet")
if in.Error != nil {
lbf.err = errors.Errorf(in.Error.Text)
} else {
lbf.exporterAttr = in.ExporterMeta
refs, err := lbf.convertRefs(in.ExporterRefs)
if err != nil {
lbf.err = err
} else {
lbf.lastRefs = refs
}
}
return &pb.ReturnResponse{}, nil
}
func (lbf *llbBridgeForwarder) convertRefs(refs map[string]string) (map[string]solver.CachedResult, error) {
out := make(map[string]solver.CachedResult, len(refs))
for k, v := range refs {
if v == "" {
out[k] = nil
}
r, ok := lbf.refs[v]
if !ok {
return nil, errors.Errorf("return reference %s not found", v)
}
out[k] = r
}
return out, nil
}
func serve(ctx context.Context, grpcServer *grpc.Server, conn net.Conn) {