Skip to content

Commit 05a3171

Browse files
committed
Update transfer proxy to support ttrpc
Signed-off-by: Derek McGowan <[email protected]>
1 parent ec04e4f commit 05a3171

File tree

2 files changed

+43
-9
lines changed

2 files changed

+43
-9
lines changed

client/transfer.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package client
1919
import (
2020
"context"
2121

22-
transferapi "github.com/containerd/containerd/api/services/transfer/v1"
2322
"github.com/containerd/containerd/v2/core/streaming"
2423
streamproxy "github.com/containerd/containerd/v2/core/streaming/proxy"
2524
"github.com/containerd/containerd/v2/core/transfer"
@@ -33,7 +32,7 @@ func (c *Client) Transfer(ctx context.Context, src interface{}, dest interface{}
3332
}
3433
defer done(ctx)
3534

36-
return proxy.NewTransferrer(transferapi.NewTransferClient(c.conn), c.streamCreator()).Transfer(ctx, src, dest, opts...)
35+
return proxy.NewTransferrer(c.conn, c.streamCreator()).Transfer(ctx, src, dest, opts...)
3736
}
3837

3938
func (c *Client) streamCreator() streaming.StreamCreator {

core/transfer/proxy/transfer.go

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,35 +19,70 @@ package proxy
1919
import (
2020
"context"
2121
"errors"
22+
"fmt"
2223
"io"
2324

25+
"google.golang.org/grpc"
2426
"google.golang.org/protobuf/types/known/anypb"
27+
"google.golang.org/protobuf/types/known/emptypb"
2528

2629
transferapi "github.com/containerd/containerd/api/services/transfer/v1"
2730
transfertypes "github.com/containerd/containerd/api/types/transfer"
2831
"github.com/containerd/containerd/v2/core/streaming"
2932
"github.com/containerd/containerd/v2/core/transfer"
3033
tstreaming "github.com/containerd/containerd/v2/core/transfer/streaming"
3134
"github.com/containerd/containerd/v2/pkg/oci"
35+
"github.com/containerd/errdefs"
3236
"github.com/containerd/log"
37+
"github.com/containerd/ttrpc"
3338
"github.com/containerd/typeurl/v2"
3439
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
3540
)
3641

3742
type proxyTransferrer struct {
38-
client transferapi.TransferClient
43+
client transferapi.TTRPCTransferService
3944
streamCreator streaming.StreamCreator
4045
}
4146

42-
// NewTransferrer returns a new transferrer which communicates over a GRPC
43-
// connection using the containerd transfer API
44-
func NewTransferrer(client transferapi.TransferClient, sc streaming.StreamCreator) transfer.Transferrer {
45-
return &proxyTransferrer{
46-
client: client,
47-
streamCreator: sc,
47+
// NewTransferrer returns a new transferrer which can communicate over a GRPC
48+
// or TTRPC connection using the containerd transfer API
49+
func NewTransferrer(client any, sc streaming.StreamCreator) transfer.Transferrer {
50+
switch c := client.(type) {
51+
case transferapi.TransferClient:
52+
return &proxyTransferrer{
53+
client: convertClient{c},
54+
streamCreator: sc,
55+
}
56+
case grpc.ClientConnInterface:
57+
return &proxyTransferrer{
58+
client: convertClient{transferapi.NewTransferClient(c)},
59+
streamCreator: sc,
60+
}
61+
case transferapi.TTRPCTransferService:
62+
return &proxyTransferrer{
63+
client: c,
64+
streamCreator: sc,
65+
}
66+
case *ttrpc.Client:
67+
return &proxyTransferrer{
68+
client: transferapi.NewTTRPCTransferClient(c),
69+
streamCreator: sc,
70+
}
71+
case transfer.Transferrer:
72+
return c
73+
default:
74+
panic(fmt.Errorf("unsupported stream client %T: %w", client, errdefs.ErrNotImplemented))
4875
}
4976
}
5077

78+
type convertClient struct {
79+
transferapi.TransferClient
80+
}
81+
82+
func (c convertClient) Transfer(ctx context.Context, r *transferapi.TransferRequest) (*emptypb.Empty, error) {
83+
return c.TransferClient.Transfer(ctx, r)
84+
}
85+
5186
func (p *proxyTransferrer) Transfer(ctx context.Context, src interface{}, dst interface{}, opts ...transfer.Opt) error {
5287
o := &transfer.Config{}
5388
for _, opt := range opts {

0 commit comments

Comments
 (0)