Skip to content

Commit 0a7c192

Browse files
authored
Merge pull request containerd#9630 from AkihiroSuda/transfer-desc
transfer: add OCI descriptors to Progress structure
2 parents 63e0ecd + a2472c0 commit 0a7c192

File tree

10 files changed

+97
-26
lines changed

10 files changed

+97
-26
lines changed

api/next.pb.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7231,6 +7231,7 @@ file {
72317231
file {
72327232
name: "github.com/containerd/containerd/api/types/transfer/progress.proto"
72337233
package: "containerd.types.transfer"
7234+
dependency: "github.com/containerd/containerd/api/types/descriptor.proto"
72347235
message_type {
72357236
name: "Progress"
72367237
field {
@@ -7268,6 +7269,14 @@ file {
72687269
type: TYPE_INT64
72697270
json_name: "total"
72707271
}
7272+
field {
7273+
name: "desc"
7274+
number: 6
7275+
label: LABEL_OPTIONAL
7276+
type: TYPE_MESSAGE
7277+
type_name: ".containerd.types.Descriptor"
7278+
json_name: "desc"
7279+
}
72717280
}
72727281
options {
72737282
go_package: "github.com/containerd/containerd/v2/api/types/transfer"

api/types/transfer/progress.pb.go

Lines changed: 43 additions & 25 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/types/transfer/progress.proto

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ syntax = "proto3";
1818

1919
package containerd.types.transfer;
2020

21+
import "github.com/containerd/containerd/api/types/descriptor.proto";
22+
2123
option go_package = "github.com/containerd/containerd/v2/api/types/transfer";
2224

2325
message Progress {
@@ -26,4 +28,5 @@ message Progress {
2628
repeated string parents = 3;
2729
int64 progress = 4;
2830
int64 total = 5;
31+
containerd.types.Descriptor desc = 6;
2932
}

cmd/ctr/commands/images/pull.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,18 @@ type progressNode struct {
206206
root bool
207207
}
208208

209+
func (n *progressNode) mainDesc() *ocispec.Descriptor {
210+
if n.Desc != nil {
211+
return n.Desc
212+
}
213+
for _, c := range n.children {
214+
if desc := c.mainDesc(); desc != nil {
215+
return desc
216+
}
217+
}
218+
return nil
219+
}
220+
209221
// ProgressHandler continuously updates the output with job progress
210222
// by checking status in the content store.
211223
func ProgressHandler(ctx context.Context, out io.Writer) (transfer.ProgressFunc, func()) {
@@ -329,6 +341,11 @@ func ProgressHandler(ctx context.Context, out io.Writer) (transfer.ProgressFunc,
329341

330342
func DisplayHierarchy(w io.Writer, status string, roots []*progressNode, start time.Time) {
331343
total := displayNode(w, "", roots)
344+
for _, r := range roots {
345+
if desc := r.mainDesc(); desc != nil {
346+
fmt.Fprintf(w, "%s %s\n", desc.MediaType, desc.Digest)
347+
}
348+
}
332349
// Print the Status line
333350
fmt.Fprintf(w, "%s\telapsed: %-4.1fs\ttotal: %7.6v\t(%v)\t\n",
334351
status,

pkg/transfer/local/import.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ func (ts *localTransferService) importStream(ctx context.Context, i transfer.Ima
128128
}
129129

130130
for _, desc := range descriptors {
131+
desc := desc
131132
imgs, err := is.Store(ctx, desc, ts.images)
132133
if err != nil {
133134
if errdefs.IsNotFound(err) {
@@ -142,6 +143,7 @@ func (ts *localTransferService) importStream(ctx context.Context, i transfer.Ima
142143
tops.Progress(transfer.Progress{
143144
Event: "saved",
144145
Name: img.Name,
146+
Desc: &desc,
145147
})
146148
}
147149
}

pkg/transfer/local/progress.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ func (j *ProgressTracker) HandleProgress(ctx context.Context, pf transfer.Progre
106106
Parents: job.parents,
107107
Progress: status.Offset,
108108
Total: status.Total,
109+
Desc: &job.desc,
109110
})
110111
job.progress = status.Offset
111112
job.state = jobInProgress
@@ -122,6 +123,7 @@ func (j *ProgressTracker) HandleProgress(ctx context.Context, pf transfer.Progre
122123
Parents: job.parents,
123124
Progress: job.desc.Size,
124125
Total: job.desc.Size,
126+
Desc: &job.desc,
125127
})
126128

127129
}
@@ -165,6 +167,7 @@ func (j *ProgressTracker) HandleProgress(ctx context.Context, pf transfer.Progre
165167
//Digest: desc.Digest.String(),
166168
Progress: 0,
167169
Total: update.desc.Size,
170+
Desc: &job.desc,
168171
})
169172
}
170173
if update.exists {
@@ -173,6 +176,7 @@ func (j *ProgressTracker) HandleProgress(ctx context.Context, pf transfer.Progre
173176
Name: remotes.MakeRefKey(ctx, update.desc),
174177
Progress: update.desc.Size,
175178
Total: update.desc.Size,
179+
Desc: &job.desc,
176180
})
177181
job.state = jobComplete
178182
job.progress = job.desc.Size

pkg/transfer/local/push.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ func (ts *localTransferService) push(ctx context.Context, ig transfer.ImageGette
6363
Event: "pushing content",
6464
Name: img.Name,
6565
//Digest: img.Target.Digest.String(),
66+
Desc: &img.Target,
6667
})
6768
}
6869

@@ -109,9 +110,11 @@ func (ts *localTransferService) push(ctx context.Context, ig transfer.ImageGette
109110
Event: "pushed content",
110111
Name: img.Name,
111112
//Digest: img.Target.Digest.String(),
113+
Desc: &img.Target,
112114
})
113115
tops.Progress(transfer.Progress{
114116
Event: fmt.Sprintf("Completed push to %s", p),
117+
Desc: &img.Target,
115118
})
116119
}
117120

pkg/transfer/proxy/transfer.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,13 @@ import (
2525

2626
transferapi "github.com/containerd/containerd/v2/api/services/transfer/v1"
2727
transfertypes "github.com/containerd/containerd/v2/api/types/transfer"
28+
"github.com/containerd/containerd/v2/oci"
2829
"github.com/containerd/containerd/v2/pkg/streaming"
2930
"github.com/containerd/containerd/v2/pkg/transfer"
3031
tstreaming "github.com/containerd/containerd/v2/pkg/transfer/streaming"
3132
"github.com/containerd/log"
3233
"github.com/containerd/typeurl/v2"
34+
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
3335
)
3436

3537
type proxyTransferrer struct {
@@ -74,12 +76,18 @@ func (p *proxyTransferrer) Transfer(ctx context.Context, src interface{}, dst in
7476
}
7577
switch v := i.(type) {
7678
case *transfertypes.Progress:
79+
var descp *ocispec.Descriptor
80+
if v.Desc != nil {
81+
desc := oci.DescriptorFromProto(v.Desc)
82+
descp = &desc
83+
}
7784
o.Progress(transfer.Progress{
7885
Event: v.Event,
7986
Name: v.Name,
8087
Parents: v.Parents,
8188
Progress: v.Progress,
8289
Total: v.Total,
90+
Desc: descp,
8391
})
8492
default:
8593
log.G(ctx).Warnf("unhandled progress object %T: %v", i, a.GetTypeUrl())

pkg/transfer/transfer.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,5 +132,5 @@ type Progress struct {
132132
Parents []string
133133
Progress int64
134134
Total int64
135-
// Descriptor?
135+
Desc *ocispec.Descriptor // since containerd v2.0
136136
}

services/transfer/service.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@ import (
2020
"context"
2121

2222
transferapi "github.com/containerd/containerd/v2/api/services/transfer/v1"
23+
"github.com/containerd/containerd/v2/api/types"
2324
transferTypes "github.com/containerd/containerd/v2/api/types/transfer"
2425
"github.com/containerd/containerd/v2/errdefs"
26+
"github.com/containerd/containerd/v2/oci"
2527
"github.com/containerd/containerd/v2/pkg/streaming"
2628
"github.com/containerd/containerd/v2/pkg/transfer"
2729
tplugins "github.com/containerd/containerd/v2/pkg/transfer/plugins"
@@ -92,12 +94,17 @@ func (s *service) Transfer(ctx context.Context, req *transferapi.TransferRequest
9294
defer stream.Close()
9395

9496
pf := func(p transfer.Progress) {
97+
var descp *types.Descriptor
98+
if p.Desc != nil {
99+
descp = oci.DescriptorToProto(*p.Desc)
100+
}
95101
progress, err := typeurl.MarshalAny(&transferTypes.Progress{
96102
Event: p.Event,
97103
Name: p.Name,
98104
Parents: p.Parents,
99105
Progress: p.Progress,
100106
Total: p.Total,
107+
Desc: descp,
101108
})
102109
if err != nil {
103110
log.G(ctx).WithError(err).Warnf("event could not be marshaled: %v/%v", p.Event, p.Name)

0 commit comments

Comments
 (0)