Skip to content

Commit 134d3c8

Browse files
committed
Add windows apply code
Signed-off-by: Michael Crosby <[email protected]>
1 parent f867401 commit 134d3c8

3 files changed

Lines changed: 33 additions & 31 deletions

File tree

diff/lcow/lcow.go

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,9 @@ import (
2727

2828
"github.com/Microsoft/go-winio/pkg/security"
2929
"github.com/Microsoft/hcsshim/ext4/tar2ext4"
30-
"github.com/containerd/containerd/archive/compression"
3130
"github.com/containerd/containerd/content"
3231
"github.com/containerd/containerd/diff"
3332
"github.com/containerd/containerd/errdefs"
34-
"github.com/containerd/containerd/images"
3533
"github.com/containerd/containerd/log"
3634
"github.com/containerd/containerd/metadata"
3735
"github.com/containerd/containerd/mount"
@@ -108,34 +106,39 @@ func (s windowsLcowDiff) Apply(ctx context.Context, desc ocispec.Descriptor, mou
108106
}
109107
}()
110108

111-
layer, _, err := mountsToLayerAndParents(mounts)
112-
if err != nil {
113-
return emptyDesc, err
109+
var config diff.ApplyConfig
110+
for _, o := range opts {
111+
if err := o(&config); err != nil {
112+
return emptyDesc, errors.Wrap(err, "failed to apply config opt")
113+
}
114114
}
115115

116-
isCompressed, err := images.IsCompressedDiff(ctx, desc.MediaType)
116+
layer, _, err := mountsToLayerAndParents(mounts)
117117
if err != nil {
118-
return emptyDesc, errors.Wrapf(errdefs.ErrNotImplemented, "unsupported diff media type: %v", desc.MediaType)
118+
return emptyDesc, err
119119
}
120120

121121
ra, err := s.store.ReaderAt(ctx, desc)
122122
if err != nil {
123123
return emptyDesc, errors.Wrap(err, "failed to get reader from content store")
124124
}
125125
defer ra.Close()
126-
rdr := content.NewReader(ra)
127-
if isCompressed {
128-
ds, err := compression.DecompressStream(rdr)
129-
if err != nil {
130-
return emptyDesc, err
126+
127+
processor := diff.NewProcessorChain(desc.MediaType, content.NewReader(ra))
128+
for {
129+
if processor, err = diff.GetProcessor(ctx, processor, config.ProcessorPayloads); err != nil {
130+
return emptyDesc, errors.Wrapf(err, "failed to get stream processor for %s", desc.MediaType)
131+
}
132+
if processor.MediaType() == ocispec.MediaTypeImageLayer {
133+
break
131134
}
132-
defer ds.Close()
133-
rdr = ds
134135
}
136+
defer processor.Close()
137+
135138
// Calculate the Digest as we go
136139
digester := digest.Canonical.Digester()
137140
rc := &readCounter{
138-
r: io.TeeReader(rdr, digester.Hash()),
141+
r: io.TeeReader(processor, digester.Hash()),
139142
}
140143

141144
layerPath := path.Join(layer, "layer.vhd")

diff/stream.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,9 +188,7 @@ func BinaryHandler(id, returnsMediaType string, mediaTypes []string, path string
188188
}
189189
}
190190

191-
const (
192-
mediaTypeEnvVar = "STEAM_PROCESSOR_MEDIATYPE"
193-
)
191+
const mediaTypeEnvVar = "STREAM_PROCESSOR_MEDIATYPE"
194192

195193
// NewBinaryProcessor returns a binary processor for use with processing content streams
196194
func NewBinaryProcessor(ctx context.Context, imt, rmt string, stream StreamProcessor, name string, args []string, payload *types.Any) (StreamProcessor, error) {

diff/windows/windows.go

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,9 @@ import (
2626

2727
winio "github.com/Microsoft/go-winio"
2828
"github.com/containerd/containerd/archive"
29-
"github.com/containerd/containerd/archive/compression"
3029
"github.com/containerd/containerd/content"
3130
"github.com/containerd/containerd/diff"
3231
"github.com/containerd/containerd/errdefs"
33-
"github.com/containerd/containerd/images"
3432
"github.com/containerd/containerd/log"
3533
"github.com/containerd/containerd/metadata"
3634
"github.com/containerd/containerd/mount"
@@ -100,9 +98,11 @@ func (s windowsDiff) Apply(ctx context.Context, desc ocispec.Descriptor, mounts
10098
}
10199
}()
102100

103-
isCompressed, err := images.IsCompressedDiff(ctx, desc.MediaType)
104-
if err != nil {
105-
return emptyDesc, errors.Wrapf(errdefs.ErrNotImplemented, "unsupported diff media type: %v", desc.MediaType)
101+
var config diff.ApplyConfig
102+
for _, o := range opts {
103+
if err := o(&config); err != nil {
104+
return emptyDesc, errors.Wrap(err, "failed to apply config opt")
105+
}
106106
}
107107

108108
ra, err := s.store.ReaderAt(ctx, desc)
@@ -111,19 +111,20 @@ func (s windowsDiff) Apply(ctx context.Context, desc ocispec.Descriptor, mounts
111111
}
112112
defer ra.Close()
113113

114-
r := content.NewReader(ra)
115-
if isCompressed {
116-
ds, err := compression.DecompressStream(r)
117-
if err != nil {
118-
return emptyDesc, err
114+
processor := diff.NewProcessorChain(desc.MediaType, content.NewReader(ra))
115+
for {
116+
if processor, err = diff.GetProcessor(ctx, processor, config.ProcessorPayloads); err != nil {
117+
return emptyDesc, errors.Wrapf(err, "failed to get stream processor for %s", desc.MediaType)
118+
}
119+
if processor.MediaType() == ocispec.MediaTypeImageLayer {
120+
break
119121
}
120-
defer ds.Close()
121-
r = ds
122122
}
123+
defer processor.Close()
123124

124125
digester := digest.Canonical.Digester()
125126
rc := &readCounter{
126-
r: io.TeeReader(r, digester.Hash()),
127+
r: io.TeeReader(processor, digester.Hash()),
127128
}
128129

129130
layer, parentLayerPaths, err := mountsToLayerAndParents(mounts)

0 commit comments

Comments
 (0)