Merge pull request #924 from Random-Liu/add-timeout-for-recover
Add timeout for recover and event monitor
This commit is contained in:
		@@ -42,11 +42,17 @@ const (
 | 
				
			|||||||
	backOffInitDuration        = 1 * time.Second
 | 
						backOffInitDuration        = 1 * time.Second
 | 
				
			||||||
	backOffMaxDuration         = 5 * time.Minute
 | 
						backOffMaxDuration         = 5 * time.Minute
 | 
				
			||||||
	backOffExpireCheckDuration = 1 * time.Second
 | 
						backOffExpireCheckDuration = 1 * time.Second
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// handleEventTimeout is the timeout for handling 1 event. Event monitor
 | 
				
			||||||
 | 
						// handles events in serial, if one event blocks the event monitor, no
 | 
				
			||||||
 | 
						// other events can be handled.
 | 
				
			||||||
 | 
						// Add a timeout for each event handling, events that timeout will be requeued and
 | 
				
			||||||
 | 
						// handled again in the future.
 | 
				
			||||||
 | 
						handleEventTimeout = 10 * time.Second
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// eventMonitor monitors containerd event and updates internal state correspondingly.
 | 
					// eventMonitor monitors containerd event and updates internal state correspondingly.
 | 
				
			||||||
// TODO(random-liu): [P1] Figure out is it possible to drop event during containerd
 | 
					// TODO(random-liu): Handle event for each container in a separate goroutine.
 | 
				
			||||||
// is running. If it is, we should do periodically list to sync state with containerd.
 | 
					 | 
				
			||||||
type eventMonitor struct {
 | 
					type eventMonitor struct {
 | 
				
			||||||
	containerStore *containerstore.Store
 | 
						containerStore *containerstore.Store
 | 
				
			||||||
	sandboxStore   *sandboxstore.Store
 | 
						sandboxStore   *sandboxstore.Store
 | 
				
			||||||
@@ -189,6 +195,9 @@ func (em *eventMonitor) stop() {
 | 
				
			|||||||
// handleEvent handles a containerd event.
 | 
					// handleEvent handles a containerd event.
 | 
				
			||||||
func (em *eventMonitor) handleEvent(any interface{}) error {
 | 
					func (em *eventMonitor) handleEvent(any interface{}) error {
 | 
				
			||||||
	ctx := ctrdutil.NamespacedContext()
 | 
						ctx := ctrdutil.NamespacedContext()
 | 
				
			||||||
 | 
						ctx, cancel := context.WithTimeout(ctx, handleEventTimeout)
 | 
				
			||||||
 | 
						defer cancel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch any.(type) {
 | 
						switch any.(type) {
 | 
				
			||||||
	// If containerd-shim exits unexpectedly, there will be no corresponding event.
 | 
						// If containerd-shim exits unexpectedly, there will be no corresponding event.
 | 
				
			||||||
	// However, containerd could not retrieve container state in that case, so it's
 | 
						// However, containerd could not retrieve container state in that case, so it's
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -136,8 +136,23 @@ func (c *criService) recover(ctx context.Context) error {
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// loadContainerTimeout is the default timeout for loading a container/sandbox.
 | 
				
			||||||
 | 
					// One container/sandbox hangs (e.g. containerd#2438) should not affect other
 | 
				
			||||||
 | 
					// containers/sandboxes.
 | 
				
			||||||
 | 
					// Most CRI container/sandbox related operations are per container, the ones
 | 
				
			||||||
 | 
					// which handle multiple containers at a time are:
 | 
				
			||||||
 | 
					// * ListPodSandboxes: Don't talk with containerd services.
 | 
				
			||||||
 | 
					// * ListContainers: Don't talk with containerd services.
 | 
				
			||||||
 | 
					// * ListContainerStats: Not in critical code path, a default timeout will
 | 
				
			||||||
 | 
					// be applied at CRI level.
 | 
				
			||||||
 | 
					// * Recovery logic: We should set a time for each container/sandbox recovery.
 | 
				
			||||||
 | 
					// * Event montior: We should set a timeout for each container/sandbox event handling.
 | 
				
			||||||
 | 
					const loadContainerTimeout = 10 * time.Second
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// loadContainer loads container from containerd and status checkpoint.
 | 
					// loadContainer loads container from containerd and status checkpoint.
 | 
				
			||||||
func (c *criService) loadContainer(ctx context.Context, cntr containerd.Container) (containerstore.Container, error) {
 | 
					func (c *criService) loadContainer(ctx context.Context, cntr containerd.Container) (containerstore.Container, error) {
 | 
				
			||||||
 | 
						ctx, cancel := context.WithTimeout(ctx, loadContainerTimeout)
 | 
				
			||||||
 | 
						defer cancel()
 | 
				
			||||||
	id := cntr.ID()
 | 
						id := cntr.ID()
 | 
				
			||||||
	containerDir := c.getContainerRootDir(id)
 | 
						containerDir := c.getContainerRootDir(id)
 | 
				
			||||||
	volatileContainerDir := c.getVolatileContainerRootDir(id)
 | 
						volatileContainerDir := c.getVolatileContainerRootDir(id)
 | 
				
			||||||
@@ -290,9 +305,9 @@ const (
 | 
				
			|||||||
// unknownContainerStatus returns the default container status when its status is unknown.
 | 
					// unknownContainerStatus returns the default container status when its status is unknown.
 | 
				
			||||||
func unknownContainerStatus() containerstore.Status {
 | 
					func unknownContainerStatus() containerstore.Status {
 | 
				
			||||||
	return containerstore.Status{
 | 
						return containerstore.Status{
 | 
				
			||||||
		CreatedAt:  time.Now().UnixNano(),
 | 
							CreatedAt:  0,
 | 
				
			||||||
		StartedAt:  time.Now().UnixNano(),
 | 
							StartedAt:  0,
 | 
				
			||||||
		FinishedAt: time.Now().UnixNano(),
 | 
							FinishedAt: 0,
 | 
				
			||||||
		ExitCode:   unknownExitCode,
 | 
							ExitCode:   unknownExitCode,
 | 
				
			||||||
		Reason:     unknownExitReason,
 | 
							Reason:     unknownExitReason,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -300,6 +315,8 @@ func unknownContainerStatus() containerstore.Status {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// loadSandbox loads sandbox from containerd.
 | 
					// loadSandbox loads sandbox from containerd.
 | 
				
			||||||
func loadSandbox(ctx context.Context, cntr containerd.Container) (sandboxstore.Sandbox, error) {
 | 
					func loadSandbox(ctx context.Context, cntr containerd.Container) (sandboxstore.Sandbox, error) {
 | 
				
			||||||
 | 
						ctx, cancel := context.WithTimeout(ctx, loadContainerTimeout)
 | 
				
			||||||
 | 
						defer cancel()
 | 
				
			||||||
	var sandbox sandboxstore.Sandbox
 | 
						var sandbox sandboxstore.Sandbox
 | 
				
			||||||
	// Load sandbox metadata.
 | 
						// Load sandbox metadata.
 | 
				
			||||||
	exts, err := cntr.Extensions(ctx)
 | 
						exts, err := cntr.Extensions(ctx)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,7 @@ func NewFakeStore(images []Image) (*Store, error) {
 | 
				
			|||||||
			s.refCache[ref] = i.ID
 | 
								s.refCache[ref] = i.ID
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if err := s.store.add(i); err != nil {
 | 
							if err := s.store.add(i); err != nil {
 | 
				
			||||||
			return nil, errors.Wrapf(err, "add image %q", i)
 | 
								return nil, errors.Wrapf(err, "add image %+v", i)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return s, nil
 | 
						return s, nil
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										12
									
								
								vendor.conf
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								vendor.conf
									
									
									
									
									
								
							@@ -1,15 +1,14 @@
 | 
				
			|||||||
github.com/beorn7/perks 4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9
 | 
					github.com/beorn7/perks 4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9
 | 
				
			||||||
github.com/blang/semver v3.1.0
 | 
					github.com/blang/semver v3.1.0
 | 
				
			||||||
github.com/boltdb/bolt v1.3.1
 | 
					 | 
				
			||||||
github.com/BurntSushi/toml a368813c5e648fee92e5f6c30e3944ff9d5e8895
 | 
					github.com/BurntSushi/toml a368813c5e648fee92e5f6c30e3944ff9d5e8895
 | 
				
			||||||
github.com/containerd/cgroups 5e610833b72089b37d0e615de9a92dfc043757c2
 | 
					github.com/containerd/cgroups 5e610833b72089b37d0e615de9a92dfc043757c2
 | 
				
			||||||
github.com/containerd/console c12b1e7919c14469339a5d38f2f8ed9b64a9de23
 | 
					github.com/containerd/console c12b1e7919c14469339a5d38f2f8ed9b64a9de23
 | 
				
			||||||
github.com/containerd/containerd 1950f791d9225ffe061c77e74e292bcb3c428a04
 | 
					github.com/containerd/containerd f88d3e5d6dfe9b7d7941ac5241649ad8240b9282
 | 
				
			||||||
github.com/containerd/continuity f44b615e492bdfb371aae2f76ec694d9da1db537
 | 
					github.com/containerd/continuity 7f53d412b9eb1cbf744c2063185d703a0ee34700
 | 
				
			||||||
github.com/containerd/fifo 3d5202aec260678c48179c56f40e6f38a095738c
 | 
					github.com/containerd/fifo 3d5202aec260678c48179c56f40e6f38a095738c
 | 
				
			||||||
github.com/containerd/go-cni 6d7b509a054a3cb1c35ed1865d4fde2f0cb547cd
 | 
					github.com/containerd/go-cni 6d7b509a054a3cb1c35ed1865d4fde2f0cb547cd
 | 
				
			||||||
github.com/containerd/go-runc 5a6d9f37cfa36b15efba46dc7ea349fa9b7143c3
 | 
					github.com/containerd/go-runc 5a6d9f37cfa36b15efba46dc7ea349fa9b7143c3
 | 
				
			||||||
github.com/containerd/ttrpc 94dde388801693c54f88a6596f713b51a8b30b2d
 | 
					github.com/containerd/ttrpc 2a805f71863501300ae1976d29f0454ae003e85a
 | 
				
			||||||
github.com/containerd/typeurl a93fcdb778cd272c6e9b3028b2f42d813e785d40
 | 
					github.com/containerd/typeurl a93fcdb778cd272c6e9b3028b2f42d813e785d40
 | 
				
			||||||
github.com/containernetworking/cni v0.6.0
 | 
					github.com/containernetworking/cni v0.6.0
 | 
				
			||||||
github.com/containernetworking/plugins v0.7.0
 | 
					github.com/containernetworking/plugins v0.7.0
 | 
				
			||||||
@@ -35,12 +34,12 @@ github.com/hashicorp/go-multierror ed905158d87462226a13fe39ddf685ea65f1c11f
 | 
				
			|||||||
github.com/json-iterator/go 1.1.5
 | 
					github.com/json-iterator/go 1.1.5
 | 
				
			||||||
github.com/matttproud/golang_protobuf_extensions v1.0.0
 | 
					github.com/matttproud/golang_protobuf_extensions v1.0.0
 | 
				
			||||||
github.com/Microsoft/go-winio v0.4.10
 | 
					github.com/Microsoft/go-winio v0.4.10
 | 
				
			||||||
github.com/Microsoft/hcsshim 44c060121b68e8bdc40b411beba551f3b4ee9e55
 | 
					github.com/Microsoft/hcsshim v0.7.4
 | 
				
			||||||
github.com/modern-go/concurrent 1.0.3
 | 
					github.com/modern-go/concurrent 1.0.3
 | 
				
			||||||
github.com/modern-go/reflect2 1.0.1
 | 
					github.com/modern-go/reflect2 1.0.1
 | 
				
			||||||
github.com/opencontainers/go-digest c9281466c8b2f606084ac71339773efd177436e7
 | 
					github.com/opencontainers/go-digest c9281466c8b2f606084ac71339773efd177436e7
 | 
				
			||||||
github.com/opencontainers/image-spec v1.0.1
 | 
					github.com/opencontainers/image-spec v1.0.1
 | 
				
			||||||
github.com/opencontainers/runc 20aff4f0488c6d4b8df4d85b4f63f1f704c11abd
 | 
					github.com/opencontainers/runc 00dc70017d222b178a002ed30e9321b12647af2d
 | 
				
			||||||
github.com/opencontainers/runtime-spec eba862dc2470385a233c7507392675cbeadf7353
 | 
					github.com/opencontainers/runtime-spec eba862dc2470385a233c7507392675cbeadf7353
 | 
				
			||||||
github.com/opencontainers/runtime-tools fb101d5d42ab9c040f7d0a004e78336e5d5cb197
 | 
					github.com/opencontainers/runtime-tools fb101d5d42ab9c040f7d0a004e78336e5d5cb197
 | 
				
			||||||
github.com/opencontainers/selinux b6fa367ed7f534f9ba25391cc2d467085dbb445a
 | 
					github.com/opencontainers/selinux b6fa367ed7f534f9ba25391cc2d467085dbb445a
 | 
				
			||||||
@@ -59,6 +58,7 @@ github.com/urfave/cli 7bc6a0acffa589f415f88aca16cc1de5ffd66f9c
 | 
				
			|||||||
github.com/xeipuuv/gojsonpointer 4e3ac2762d5f479393488629ee9370b50873b3a6
 | 
					github.com/xeipuuv/gojsonpointer 4e3ac2762d5f479393488629ee9370b50873b3a6
 | 
				
			||||||
github.com/xeipuuv/gojsonreference bd5ef7bd5415a7ac448318e64f11a24cd21e594b
 | 
					github.com/xeipuuv/gojsonreference bd5ef7bd5415a7ac448318e64f11a24cd21e594b
 | 
				
			||||||
github.com/xeipuuv/gojsonschema 1d523034197ff1f222f6429836dd36a2457a1874
 | 
					github.com/xeipuuv/gojsonschema 1d523034197ff1f222f6429836dd36a2457a1874
 | 
				
			||||||
 | 
					go.etcd.io/bbolt v1.3.1-etcd.8
 | 
				
			||||||
golang.org/x/crypto 49796115aa4b964c318aad4f3084fdb41e9aa067
 | 
					golang.org/x/crypto 49796115aa4b964c318aad4f3084fdb41e9aa067
 | 
				
			||||||
golang.org/x/net b3756b4b77d7b13260a0a2ec658753cf48922eac
 | 
					golang.org/x/net b3756b4b77d7b13260a0a2ec658753cf48922eac
 | 
				
			||||||
golang.org/x/oauth2 a6bd8cefa1811bd24b86f8902872e4e8225f74c4
 | 
					golang.org/x/oauth2 a6bd8cefa1811bd24b86f8902872e4e8225f74c4
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										47
									
								
								vendor/github.com/Microsoft/hcsshim/internal/guid/guid.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										47
									
								
								vendor/github.com/Microsoft/hcsshim/internal/guid/guid.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,10 +2,16 @@ package guid
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"crypto/rand"
 | 
						"crypto/rand"
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
 | 
						"strconv"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var _ = (json.Marshaler)(&GUID{})
 | 
				
			||||||
 | 
					var _ = (json.Unmarshaler)(&GUID{})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type GUID [16]byte
 | 
					type GUID [16]byte
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func New() GUID {
 | 
					func New() GUID {
 | 
				
			||||||
@@ -20,3 +26,44 @@ func New() GUID {
 | 
				
			|||||||
func (g GUID) String() string {
 | 
					func (g GUID) String() string {
 | 
				
			||||||
	return fmt.Sprintf("%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x-%02x", g[3], g[2], g[1], g[0], g[5], g[4], g[7], g[6], g[8:10], g[10:])
 | 
						return fmt.Sprintf("%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x-%02x", g[3], g[2], g[1], g[0], g[5], g[4], g[7], g[6], g[8:10], g[10:])
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func FromString(s string) GUID {
 | 
				
			||||||
 | 
						if len(s) != 36 {
 | 
				
			||||||
 | 
							panic(fmt.Sprintf("invalid GUID length: %d", len(s)))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' {
 | 
				
			||||||
 | 
							panic("invalid GUID format")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						indexOrder := [16]int{
 | 
				
			||||||
 | 
							0, 2, 4, 6,
 | 
				
			||||||
 | 
							9, 11,
 | 
				
			||||||
 | 
							14, 16,
 | 
				
			||||||
 | 
							19, 21,
 | 
				
			||||||
 | 
							24, 26, 28, 30, 32, 34,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						byteOrder := [16]int{
 | 
				
			||||||
 | 
							3, 2, 1, 0,
 | 
				
			||||||
 | 
							5, 4,
 | 
				
			||||||
 | 
							7, 6,
 | 
				
			||||||
 | 
							8, 9,
 | 
				
			||||||
 | 
							10, 11, 12, 13, 14, 15,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var g GUID
 | 
				
			||||||
 | 
						for i, x := range indexOrder {
 | 
				
			||||||
 | 
							b, err := strconv.ParseInt(s[x:x+2], 16, 16)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								panic(err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							g[byteOrder[i]] = byte(b)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (g GUID) MarshalJSON() ([]byte, error) {
 | 
				
			||||||
 | 
						return json.Marshal(g.String())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (g *GUID) UnmarshalJSON(data []byte) error {
 | 
				
			||||||
 | 
						*g = FromString(strings.Trim(string(data), "\""))
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										7
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hcs/process.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hcs/process.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,6 +2,7 @@ package hcs
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
	"syscall"
 | 
						"syscall"
 | 
				
			||||||
@@ -83,7 +84,10 @@ func (process *Process) Kill() error {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var resultp *uint16
 | 
						var resultp *uint16
 | 
				
			||||||
 | 
						completed := false
 | 
				
			||||||
 | 
						go syscallWatcher(fmt.Sprintf("TerminateProcess %s: %d", process.SystemID(), process.Pid()), &completed)
 | 
				
			||||||
	err := hcsTerminateProcess(process.handle, &resultp)
 | 
						err := hcsTerminateProcess(process.handle, &resultp)
 | 
				
			||||||
 | 
						completed = true
 | 
				
			||||||
	events := processHcsResult(resultp)
 | 
						events := processHcsResult(resultp)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return makeProcessError(process, operation, err, events)
 | 
							return makeProcessError(process, operation, err, events)
 | 
				
			||||||
@@ -177,7 +181,10 @@ func (process *Process) Properties() (*ProcessStatus, error) {
 | 
				
			|||||||
		resultp     *uint16
 | 
							resultp     *uint16
 | 
				
			||||||
		propertiesp *uint16
 | 
							propertiesp *uint16
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
 | 
						completed := false
 | 
				
			||||||
 | 
						go syscallWatcher(fmt.Sprintf("GetProcessProperties %s: %d", process.SystemID(), process.Pid()), &completed)
 | 
				
			||||||
	err := hcsGetProcessProperties(process.handle, &propertiesp, &resultp)
 | 
						err := hcsGetProcessProperties(process.handle, &propertiesp, &resultp)
 | 
				
			||||||
 | 
						completed = true
 | 
				
			||||||
	events := processHcsResult(resultp)
 | 
						events := processHcsResult(resultp)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, makeProcessError(process, operation, err, events)
 | 
							return nil, makeProcessError(process, operation, err, events)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										48
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										48
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,6 +2,7 @@ package hcs
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
@@ -63,7 +64,10 @@ func CreateComputeSystem(id string, hcsDocumentInterface interface{}) (*System,
 | 
				
			|||||||
		resultp  *uint16
 | 
							resultp  *uint16
 | 
				
			||||||
		identity syscall.Handle
 | 
							identity syscall.Handle
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
 | 
						completed := false
 | 
				
			||||||
 | 
						go syscallWatcher(fmt.Sprintf("CreateCompleteSystem %s: %s", id, hcsDocument), &completed)
 | 
				
			||||||
	createError := hcsCreateComputeSystem(id, hcsDocument, identity, &computeSystem.handle, &resultp)
 | 
						createError := hcsCreateComputeSystem(id, hcsDocument, identity, &computeSystem.handle, &resultp)
 | 
				
			||||||
 | 
						completed = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if createError == nil || IsPending(createError) {
 | 
						if createError == nil || IsPending(createError) {
 | 
				
			||||||
		if err := computeSystem.registerCallback(); err != nil {
 | 
							if err := computeSystem.registerCallback(); err != nil {
 | 
				
			||||||
@@ -74,7 +78,7 @@ func CreateComputeSystem(id string, hcsDocumentInterface interface{}) (*System,
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	events, err := processAsyncHcsResult(createError, resultp, computeSystem.callbackNumber, hcsNotificationSystemCreateCompleted, &timeout.Duration)
 | 
						events, err := processAsyncHcsResult(createError, resultp, computeSystem.callbackNumber, hcsNotificationSystemCreateCompleted, &timeout.SystemCreate)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		if err == ErrTimeout {
 | 
							if err == ErrTimeout {
 | 
				
			||||||
			// Terminate the compute system if it still exists. We're okay to
 | 
								// Terminate the compute system if it still exists. We're okay to
 | 
				
			||||||
@@ -135,7 +139,10 @@ func GetComputeSystems(q schema1.ComputeSystemQuery) ([]schema1.ContainerPropert
 | 
				
			|||||||
		resultp         *uint16
 | 
							resultp         *uint16
 | 
				
			||||||
		computeSystemsp *uint16
 | 
							computeSystemsp *uint16
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
 | 
						completed := false
 | 
				
			||||||
 | 
						go syscallWatcher(fmt.Sprintf("GetComputeSystems %s:", query), &completed)
 | 
				
			||||||
	err = hcsEnumerateComputeSystems(query, &computeSystemsp, &resultp)
 | 
						err = hcsEnumerateComputeSystems(query, &computeSystemsp, &resultp)
 | 
				
			||||||
 | 
						completed = true
 | 
				
			||||||
	events := processHcsResult(resultp)
 | 
						events := processHcsResult(resultp)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, &HcsError{Op: operation, Err: err, Events: events}
 | 
							return nil, &HcsError{Op: operation, Err: err, Events: events}
 | 
				
			||||||
@@ -192,8 +199,11 @@ func (computeSystem *System) Start() error {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var resultp *uint16
 | 
						var resultp *uint16
 | 
				
			||||||
 | 
						completed := false
 | 
				
			||||||
 | 
						go syscallWatcher(fmt.Sprintf("StartComputeSystem %s:", computeSystem.ID()), &completed)
 | 
				
			||||||
	err := hcsStartComputeSystem(computeSystem.handle, "", &resultp)
 | 
						err := hcsStartComputeSystem(computeSystem.handle, "", &resultp)
 | 
				
			||||||
	events, err := processAsyncHcsResult(err, resultp, computeSystem.callbackNumber, hcsNotificationSystemStartCompleted, &timeout.Duration)
 | 
						completed = true
 | 
				
			||||||
 | 
						events, err := processAsyncHcsResult(err, resultp, computeSystem.callbackNumber, hcsNotificationSystemStartCompleted, &timeout.SystemStart)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return makeSystemError(computeSystem, "Start", "", err, events)
 | 
							return makeSystemError(computeSystem, "Start", "", err, events)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -219,7 +229,10 @@ func (computeSystem *System) Shutdown() error {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var resultp *uint16
 | 
						var resultp *uint16
 | 
				
			||||||
 | 
						completed := false
 | 
				
			||||||
 | 
						go syscallWatcher(fmt.Sprintf("ShutdownComputeSystem %s:", computeSystem.ID()), &completed)
 | 
				
			||||||
	err := hcsShutdownComputeSystem(computeSystem.handle, "", &resultp)
 | 
						err := hcsShutdownComputeSystem(computeSystem.handle, "", &resultp)
 | 
				
			||||||
 | 
						completed = true
 | 
				
			||||||
	events := processHcsResult(resultp)
 | 
						events := processHcsResult(resultp)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return makeSystemError(computeSystem, "Shutdown", "", err, events)
 | 
							return makeSystemError(computeSystem, "Shutdown", "", err, events)
 | 
				
			||||||
@@ -242,7 +255,10 @@ func (computeSystem *System) Terminate() error {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var resultp *uint16
 | 
						var resultp *uint16
 | 
				
			||||||
 | 
						completed := false
 | 
				
			||||||
 | 
						go syscallWatcher(fmt.Sprintf("TerminateComputeSystem %s:", computeSystem.ID()), &completed)
 | 
				
			||||||
	err := hcsTerminateComputeSystem(computeSystem.handle, "", &resultp)
 | 
						err := hcsTerminateComputeSystem(computeSystem.handle, "", &resultp)
 | 
				
			||||||
 | 
						completed = true
 | 
				
			||||||
	events := processHcsResult(resultp)
 | 
						events := processHcsResult(resultp)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return makeSystemError(computeSystem, "Terminate", "", err, events)
 | 
							return makeSystemError(computeSystem, "Terminate", "", err, events)
 | 
				
			||||||
@@ -291,7 +307,10 @@ func (computeSystem *System) Properties(types ...schema1.PropertyType) (*schema1
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var resultp, propertiesp *uint16
 | 
						var resultp, propertiesp *uint16
 | 
				
			||||||
 | 
						completed := false
 | 
				
			||||||
 | 
						go syscallWatcher(fmt.Sprintf("GetComputeSystemProperties %s:", computeSystem.ID()), &completed)
 | 
				
			||||||
	err = hcsGetComputeSystemProperties(computeSystem.handle, string(queryj), &propertiesp, &resultp)
 | 
						err = hcsGetComputeSystemProperties(computeSystem.handle, string(queryj), &propertiesp, &resultp)
 | 
				
			||||||
 | 
						completed = true
 | 
				
			||||||
	events := processHcsResult(resultp)
 | 
						events := processHcsResult(resultp)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, makeSystemError(computeSystem, "Properties", "", err, events)
 | 
							return nil, makeSystemError(computeSystem, "Properties", "", err, events)
 | 
				
			||||||
@@ -320,8 +339,11 @@ func (computeSystem *System) Pause() error {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var resultp *uint16
 | 
						var resultp *uint16
 | 
				
			||||||
 | 
						completed := false
 | 
				
			||||||
 | 
						go syscallWatcher(fmt.Sprintf("PauseComputeSystem %s:", computeSystem.ID()), &completed)
 | 
				
			||||||
	err := hcsPauseComputeSystem(computeSystem.handle, "", &resultp)
 | 
						err := hcsPauseComputeSystem(computeSystem.handle, "", &resultp)
 | 
				
			||||||
	events, err := processAsyncHcsResult(err, resultp, computeSystem.callbackNumber, hcsNotificationSystemPauseCompleted, &timeout.Duration)
 | 
						completed = true
 | 
				
			||||||
 | 
						events, err := processAsyncHcsResult(err, resultp, computeSystem.callbackNumber, hcsNotificationSystemPauseCompleted, &timeout.SystemPause)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return makeSystemError(computeSystem, "Pause", "", err, events)
 | 
							return makeSystemError(computeSystem, "Pause", "", err, events)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -342,8 +364,11 @@ func (computeSystem *System) Resume() error {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var resultp *uint16
 | 
						var resultp *uint16
 | 
				
			||||||
 | 
						completed := false
 | 
				
			||||||
 | 
						go syscallWatcher(fmt.Sprintf("ResumeComputeSystem %s:", computeSystem.ID()), &completed)
 | 
				
			||||||
	err := hcsResumeComputeSystem(computeSystem.handle, "", &resultp)
 | 
						err := hcsResumeComputeSystem(computeSystem.handle, "", &resultp)
 | 
				
			||||||
	events, err := processAsyncHcsResult(err, resultp, computeSystem.callbackNumber, hcsNotificationSystemResumeCompleted, &timeout.Duration)
 | 
						completed = true
 | 
				
			||||||
 | 
						events, err := processAsyncHcsResult(err, resultp, computeSystem.callbackNumber, hcsNotificationSystemResumeCompleted, &timeout.SystemResume)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return makeSystemError(computeSystem, "Resume", "", err, events)
 | 
							return makeSystemError(computeSystem, "Resume", "", err, events)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -375,7 +400,10 @@ func (computeSystem *System) CreateProcess(c interface{}) (*Process, error) {
 | 
				
			|||||||
	configuration := string(configurationb)
 | 
						configuration := string(configurationb)
 | 
				
			||||||
	logrus.Debugf(title+" config=%s", configuration)
 | 
						logrus.Debugf(title+" config=%s", configuration)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						completed := false
 | 
				
			||||||
 | 
						go syscallWatcher(fmt.Sprintf("CreateProcess %s: %s", computeSystem.ID(), configuration), &completed)
 | 
				
			||||||
	err = hcsCreateProcess(computeSystem.handle, configuration, &processInfo, &processHandle, &resultp)
 | 
						err = hcsCreateProcess(computeSystem.handle, configuration, &processInfo, &processHandle, &resultp)
 | 
				
			||||||
 | 
						completed = true
 | 
				
			||||||
	events := processHcsResult(resultp)
 | 
						events := processHcsResult(resultp)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, makeSystemError(computeSystem, "CreateProcess", configuration, err, events)
 | 
							return nil, makeSystemError(computeSystem, "CreateProcess", configuration, err, events)
 | 
				
			||||||
@@ -415,7 +443,10 @@ func (computeSystem *System) OpenProcess(pid int) (*Process, error) {
 | 
				
			|||||||
		return nil, makeSystemError(computeSystem, "OpenProcess", "", ErrAlreadyClosed, nil)
 | 
							return nil, makeSystemError(computeSystem, "OpenProcess", "", ErrAlreadyClosed, nil)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						completed := false
 | 
				
			||||||
 | 
						go syscallWatcher(fmt.Sprintf("OpenProcess %s: %d", computeSystem.ID(), pid), &completed)
 | 
				
			||||||
	err := hcsOpenProcess(computeSystem.handle, uint32(pid), &processHandle, &resultp)
 | 
						err := hcsOpenProcess(computeSystem.handle, uint32(pid), &processHandle, &resultp)
 | 
				
			||||||
 | 
						completed = true
 | 
				
			||||||
	events := processHcsResult(resultp)
 | 
						events := processHcsResult(resultp)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, makeSystemError(computeSystem, "OpenProcess", "", err, events)
 | 
							return nil, makeSystemError(computeSystem, "OpenProcess", "", err, events)
 | 
				
			||||||
@@ -451,7 +482,11 @@ func (computeSystem *System) Close() error {
 | 
				
			|||||||
		return makeSystemError(computeSystem, "Close", "", err, nil)
 | 
							return makeSystemError(computeSystem, "Close", "", err, nil)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err := hcsCloseComputeSystem(computeSystem.handle); err != nil {
 | 
						completed := false
 | 
				
			||||||
 | 
						go syscallWatcher(fmt.Sprintf("CloseComputeSystem %s:", computeSystem.ID()), &completed)
 | 
				
			||||||
 | 
						err := hcsCloseComputeSystem(computeSystem.handle)
 | 
				
			||||||
 | 
						completed = true
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
		return makeSystemError(computeSystem, "Close", "", err, nil)
 | 
							return makeSystemError(computeSystem, "Close", "", err, nil)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -537,7 +572,10 @@ func (computeSystem *System) Modify(config interface{}) error {
 | 
				
			|||||||
	logrus.Debugf(title + " " + requestString)
 | 
						logrus.Debugf(title + " " + requestString)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var resultp *uint16
 | 
						var resultp *uint16
 | 
				
			||||||
 | 
						completed := false
 | 
				
			||||||
 | 
						go syscallWatcher(fmt.Sprintf("ModifyComputeSystem %s: %s", computeSystem.ID(), requestString), &completed)
 | 
				
			||||||
	err = hcsModifyComputeSystem(computeSystem.handle, requestString, &resultp)
 | 
						err = hcsModifyComputeSystem(computeSystem.handle, requestString, &resultp)
 | 
				
			||||||
 | 
						completed = true
 | 
				
			||||||
	events := processHcsResult(resultp)
 | 
						events := processHcsResult(resultp)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return makeSystemError(computeSystem, "Modify", requestString, err, events)
 | 
							return makeSystemError(computeSystem, "Modify", requestString, err, events)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										30
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hcs/watcher.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hcs/watcher.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					package hcs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/Microsoft/hcsshim/internal/timeout"
 | 
				
			||||||
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// syscallWatcher is used as a very simple goroutine around calls into
 | 
				
			||||||
 | 
					// the platform. In some cases, we have seen HCS APIs not returning due to
 | 
				
			||||||
 | 
					// various bugs, and the goroutine making the syscall ends up not returning,
 | 
				
			||||||
 | 
					// prior to its async callback. By spinning up a syscallWatcher, it allows
 | 
				
			||||||
 | 
					// us to at least log a warning if a syscall doesn't complete in a reasonable
 | 
				
			||||||
 | 
					// amount of time.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Usage is:
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// completed := false
 | 
				
			||||||
 | 
					// go syscallWatcher("some description", &completed)
 | 
				
			||||||
 | 
					// <syscall>
 | 
				
			||||||
 | 
					// completed = true
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					func syscallWatcher(description string, syscallCompleted *bool) {
 | 
				
			||||||
 | 
						time.Sleep(timeout.SyscallWatcher)
 | 
				
			||||||
 | 
						if *syscallCompleted {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						logrus.Warnf("%s: Did not complete within %s. This may indicate a platform issue. If it appears to be making no forward progress, obtain the stacks and see is there is a syscall stuck in the platform API for a significant length of time.", description, timeout.SyscallWatcher)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										2
									
								
								vendor/github.com/Microsoft/hcsshim/internal/interop/zsyscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/Microsoft/hcsshim/internal/interop/zsyscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT
 | 
					// Code generated by 'go generate'; DO NOT EDIT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package interop
 | 
					package interop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/Microsoft/hcsshim/internal/safefile/zsyscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/Microsoft/hcsshim/internal/safefile/zsyscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT
 | 
					// Code generated by 'go generate'; DO NOT EDIT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package safefile
 | 
					package safefile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										62
									
								
								vendor/github.com/Microsoft/hcsshim/internal/timeout/timeout.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										62
									
								
								vendor/github.com/Microsoft/hcsshim/internal/timeout/timeout.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -6,21 +6,65 @@ import (
 | 
				
			|||||||
	"time"
 | 
						"time"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Duration is the default time to wait for various operations.
 | 
					var (
 | 
				
			||||||
// - Waiting for async notifications from HCS
 | 
						// defaultTimeout is the timeout for most operations that is not overridden.
 | 
				
			||||||
// - Waiting for processes to launch through
 | 
						defaultTimeout = 4 * time.Minute
 | 
				
			||||||
// - Waiting to copy data to/from a launched processes stdio pipes.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// This can be overridden through environment variable `HCS_TIMEOUT_SECONDS`
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
var Duration = 4 * time.Minute
 | 
						// defaultTimeoutTestdRetry is the retry loop timeout for testd to respond
 | 
				
			||||||
 | 
						// for a disk to come online in LCOW.
 | 
				
			||||||
 | 
						defaultTimeoutTestdRetry = 5 * time.Second
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// External variables for HCSShim consumers to use.
 | 
				
			||||||
 | 
					var (
 | 
				
			||||||
 | 
						// SystemCreate is the timeout for creating a compute system
 | 
				
			||||||
 | 
						SystemCreate time.Duration = defaultTimeout
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// SystemStart is the timeout for starting a compute system
 | 
				
			||||||
 | 
						SystemStart time.Duration = defaultTimeout
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// SystemPause is the timeout for pausing a compute system
 | 
				
			||||||
 | 
						SystemPause time.Duration = defaultTimeout
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// SystemResume is the timeout for resuming a compute system
 | 
				
			||||||
 | 
						SystemResume time.Duration = defaultTimeout
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// SyscallWatcher is the timeout before warning of a potential stuck platform syscall.
 | 
				
			||||||
 | 
						SyscallWatcher time.Duration = defaultTimeout
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Tar2VHD is the timeout for the tar2vhd operation to complete
 | 
				
			||||||
 | 
						Tar2VHD time.Duration = defaultTimeout
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// ExternalCommandToStart is the timeout for external commands to start
 | 
				
			||||||
 | 
						ExternalCommandToStart = defaultTimeout
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// ExternalCommandToComplete is the timeout for external commands to complete.
 | 
				
			||||||
 | 
						// Generally this means copying data from their stdio pipes.
 | 
				
			||||||
 | 
						ExternalCommandToComplete = defaultTimeout
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// TestDRetryLoop is the timeout for testd retry loop when onlining a SCSI disk in LCOW
 | 
				
			||||||
 | 
						TestDRetryLoop = defaultTimeoutTestdRetry
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() {
 | 
					func init() {
 | 
				
			||||||
	envTimeout := os.Getenv("HCSSHIM_TIMEOUT_SECONDS")
 | 
						SystemCreate = durationFromEnvironment("HCSSHIM_TIMEOUT_SYSTEMCREATE", SystemCreate)
 | 
				
			||||||
 | 
						SystemStart = durationFromEnvironment("HCSSHIM_TIMEOUT_SYSTEMSTART", SystemStart)
 | 
				
			||||||
 | 
						SystemPause = durationFromEnvironment("HCSSHIM_TIMEOUT_SYSTEMPAUSE", SystemPause)
 | 
				
			||||||
 | 
						SystemResume = durationFromEnvironment("HCSSHIM_TIMEOUT_SYSTEMRESUME", SystemResume)
 | 
				
			||||||
 | 
						SyscallWatcher = durationFromEnvironment("HCSSHIM_TIMEOUT_SYSCALLWATCHER", SyscallWatcher)
 | 
				
			||||||
 | 
						Tar2VHD = durationFromEnvironment("HCSSHIM_TIMEOUT_TAR2VHD", Tar2VHD)
 | 
				
			||||||
 | 
						ExternalCommandToStart = durationFromEnvironment("HCSSHIM_TIMEOUT_EXTERNALCOMMANDSTART", ExternalCommandToStart)
 | 
				
			||||||
 | 
						ExternalCommandToComplete = durationFromEnvironment("HCSSHIM_TIMEOUT_EXTERNALCOMMANDCOMPLETE", ExternalCommandToComplete)
 | 
				
			||||||
 | 
						TestDRetryLoop = durationFromEnvironment("HCSSHIM_TIMEOUT_TESTDRETRYLOOP", TestDRetryLoop)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func durationFromEnvironment(env string, defaultValue time.Duration) time.Duration {
 | 
				
			||||||
 | 
						envTimeout := os.Getenv(env)
 | 
				
			||||||
	if len(envTimeout) > 0 {
 | 
						if len(envTimeout) > 0 {
 | 
				
			||||||
		e, err := strconv.Atoi(envTimeout)
 | 
							e, err := strconv.Atoi(envTimeout)
 | 
				
			||||||
		if err == nil && e > 0 {
 | 
							if err == nil && e > 0 {
 | 
				
			||||||
			Duration = time.Second * time.Duration(e)
 | 
								return time.Second * time.Duration(e)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						return defaultValue
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/createlayer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/createlayer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -9,15 +9,15 @@ import (
 | 
				
			|||||||
// the parent layer provided.
 | 
					// the parent layer provided.
 | 
				
			||||||
func CreateLayer(path, parent string) error {
 | 
					func CreateLayer(path, parent string) error {
 | 
				
			||||||
	title := "hcsshim::CreateLayer "
 | 
						title := "hcsshim::CreateLayer "
 | 
				
			||||||
	logrus.Debugf(title+"Flavour %d ID %s parent %s", path, parent)
 | 
						logrus.Debugf(title+"ID %s parent %s", path, parent)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err := createLayer(&stdDriverInfo, path, parent)
 | 
						err := createLayer(&stdDriverInfo, path, parent)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		err = hcserror.Errorf(err, title, "path=%s parent=%s flavour=%d", path, parent)
 | 
							err = hcserror.Errorf(err, title, "path=%s parent=%s", path, parent)
 | 
				
			||||||
		logrus.Error(err)
 | 
							logrus.Error(err)
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	logrus.Debugf(title+" - succeeded path=%s parent=%s flavour=%d", path, parent)
 | 
						logrus.Debugf(title+"- succeeded path=%s parent=%s", path, parent)
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -224,7 +224,7 @@ This will be the best place to discuss design and implementation.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
For sync communication we have a community slack with a #containerd channel that everyone is welcome to join and chat about development.
 | 
					For sync communication we have a community slack with a #containerd channel that everyone is welcome to join and chat about development.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**Slack:** https://dockr.ly/community
 | 
					**Slack:** https://join.slack.com/t/dockercommunity/shared_invite/enQtNDM4NjAwNDMyOTUwLWZlMDZmYWRjZjk4Zjc5ZGQ5NWZkOWI1Yjk2NGE3ZWVlYjYxM2VhYjczOWIyZDFhZTE3NTUwZWQzMjhmNGYyZTg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Reporting security issues
 | 
					### Reporting security issues
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/containerd/containerd/api/services/content/v1/content.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/containerd/containerd/api/services/content/v1/content.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -443,7 +443,7 @@ type ContentClient interface {
 | 
				
			|||||||
	// Only one active stream may exist at a time for each ref.
 | 
						// Only one active stream may exist at a time for each ref.
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	// Once a write stream has started, it may only write to a single ref, thus
 | 
						// Once a write stream has started, it may only write to a single ref, thus
 | 
				
			||||||
	// once a stream is started, the ref may be ommitted on subsequent writes.
 | 
						// once a stream is started, the ref may be omitted on subsequent writes.
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	// For any write transaction represented by a ref, only a single write may
 | 
						// For any write transaction represented by a ref, only a single write may
 | 
				
			||||||
	// be made to a given offset. If overlapping writes occur, it is an error.
 | 
						// be made to a given offset. If overlapping writes occur, it is an error.
 | 
				
			||||||
@@ -658,7 +658,7 @@ type ContentServer interface {
 | 
				
			|||||||
	// Only one active stream may exist at a time for each ref.
 | 
						// Only one active stream may exist at a time for each ref.
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	// Once a write stream has started, it may only write to a single ref, thus
 | 
						// Once a write stream has started, it may only write to a single ref, thus
 | 
				
			||||||
	// once a stream is started, the ref may be ommitted on subsequent writes.
 | 
						// once a stream is started, the ref may be omitted on subsequent writes.
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	// For any write transaction represented by a ref, only a single write may
 | 
						// For any write transaction represented by a ref, only a single write may
 | 
				
			||||||
	// be made to a given offset. If overlapping writes occur, it is an error.
 | 
						// be made to a given offset. If overlapping writes occur, it is an error.
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/api/services/content/v1/content.proto
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/api/services/content/v1/content.proto
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -55,7 +55,7 @@ service Content {
 | 
				
			|||||||
	// Only one active stream may exist at a time for each ref.
 | 
						// Only one active stream may exist at a time for each ref.
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	// Once a write stream has started, it may only write to a single ref, thus
 | 
						// Once a write stream has started, it may only write to a single ref, thus
 | 
				
			||||||
	// once a stream is started, the ref may be ommitted on subsequent writes.
 | 
						// once a stream is started, the ref may be omitted on subsequent writes.
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	// For any write transaction represented by a ref, only a single write may
 | 
						// For any write transaction represented by a ref, only a single write may
 | 
				
			||||||
	// be made to a given offset. If overlapping writes occur, it is an error.
 | 
						// be made to a given offset. If overlapping writes occur, it is an error.
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										88
									
								
								vendor/github.com/containerd/containerd/archive/compression/compression.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										88
									
								
								vendor/github.com/containerd/containerd/archive/compression/compression.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -20,9 +20,15 @@ import (
 | 
				
			|||||||
	"bufio"
 | 
						"bufio"
 | 
				
			||||||
	"bytes"
 | 
						"bytes"
 | 
				
			||||||
	"compress/gzip"
 | 
						"compress/gzip"
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
						"os/exec"
 | 
				
			||||||
 | 
						"strconv"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/containerd/containerd/log"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type (
 | 
					type (
 | 
				
			||||||
@@ -37,6 +43,13 @@ const (
 | 
				
			|||||||
	Gzip
 | 
						Gzip
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const disablePigzEnv = "CONTAINERD_DISABLE_PIGZ"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var (
 | 
				
			||||||
 | 
						initPigz   sync.Once
 | 
				
			||||||
 | 
						unpigzPath string
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	bufioReader32KPool = &sync.Pool{
 | 
						bufioReader32KPool = &sync.Pool{
 | 
				
			||||||
		New: func() interface{} { return bufio.NewReaderSize(nil, 32*1024) },
 | 
							New: func() interface{} { return bufio.NewReaderSize(nil, 32*1024) },
 | 
				
			||||||
@@ -120,11 +133,18 @@ func DecompressStream(archive io.Reader) (DecompressReadCloser, error) {
 | 
				
			|||||||
		readBufWrapper := &readCloserWrapper{buf, compression, closer}
 | 
							readBufWrapper := &readCloserWrapper{buf, compression, closer}
 | 
				
			||||||
		return readBufWrapper, nil
 | 
							return readBufWrapper, nil
 | 
				
			||||||
	case Gzip:
 | 
						case Gzip:
 | 
				
			||||||
		gzReader, err := gzip.NewReader(buf)
 | 
							ctx, cancel := context.WithCancel(context.Background())
 | 
				
			||||||
 | 
							gzReader, err := gzipDecompress(ctx, buf)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
 | 
								cancel()
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		readBufWrapper := &readCloserWrapper{gzReader, compression, closer}
 | 
					
 | 
				
			||||||
 | 
							readBufWrapper := &readCloserWrapper{gzReader, compression, func() error {
 | 
				
			||||||
 | 
								cancel()
 | 
				
			||||||
 | 
								return closer()
 | 
				
			||||||
 | 
							}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return readBufWrapper, nil
 | 
							return readBufWrapper, nil
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		return nil, fmt.Errorf("unsupported compression format %s", (&compression).Extension())
 | 
							return nil, fmt.Errorf("unsupported compression format %s", (&compression).Extension())
 | 
				
			||||||
@@ -151,3 +171,67 @@ func (compression *Compression) Extension() string {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	return ""
 | 
						return ""
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func gzipDecompress(ctx context.Context, buf io.Reader) (io.ReadCloser, error) {
 | 
				
			||||||
 | 
						initPigz.Do(func() {
 | 
				
			||||||
 | 
							if unpigzPath = detectPigz(); unpigzPath != "" {
 | 
				
			||||||
 | 
								log.L.Debug("using pigz for decompression")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if unpigzPath == "" {
 | 
				
			||||||
 | 
							return gzip.NewReader(buf)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return cmdStream(exec.CommandContext(ctx, unpigzPath, "-d", "-c"), buf)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func cmdStream(cmd *exec.Cmd, in io.Reader) (io.ReadCloser, error) {
 | 
				
			||||||
 | 
						reader, writer := io.Pipe()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cmd.Stdin = in
 | 
				
			||||||
 | 
						cmd.Stdout = writer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var errBuf bytes.Buffer
 | 
				
			||||||
 | 
						cmd.Stderr = &errBuf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := cmd.Start(); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						go func() {
 | 
				
			||||||
 | 
							if err := cmd.Wait(); err != nil {
 | 
				
			||||||
 | 
								writer.CloseWithError(fmt.Errorf("%s: %s", err, errBuf.String()))
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								writer.Close()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return reader, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func detectPigz() string {
 | 
				
			||||||
 | 
						path, err := exec.LookPath("unpigz")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.L.WithError(err).Debug("unpigz not found, falling back to go gzip")
 | 
				
			||||||
 | 
							return ""
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Check if pigz disabled via CONTAINERD_DISABLE_PIGZ env variable
 | 
				
			||||||
 | 
						value := os.Getenv(disablePigzEnv)
 | 
				
			||||||
 | 
						if value == "" {
 | 
				
			||||||
 | 
							return path
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						disable, err := strconv.ParseBool(value)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.L.WithError(err).Warnf("could not parse %s: %s", disablePigzEnv, value)
 | 
				
			||||||
 | 
							return path
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if disable {
 | 
				
			||||||
 | 
							return ""
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return path
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/cmd/containerd/command/publish.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/cmd/containerd/command/publish.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -99,7 +99,7 @@ func connect(address string, d func(string, time.Duration) (net.Conn, error)) (*
 | 
				
			|||||||
		grpc.FailOnNonTempDialError(true),
 | 
							grpc.FailOnNonTempDialError(true),
 | 
				
			||||||
		grpc.WithBackoffMaxDelay(3 * time.Second),
 | 
							grpc.WithBackoffMaxDelay(3 * time.Second),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	ctx, cancel := gocontext.WithTimeout(gocontext.Background(), 60*time.Second)
 | 
						ctx, cancel := gocontext.WithTimeout(gocontext.Background(), 2*time.Second)
 | 
				
			||||||
	defer cancel()
 | 
						defer cancel()
 | 
				
			||||||
	conn, err := grpc.DialContext(ctx, dialer.DialAddress(address), gopts...)
 | 
						conn, err := grpc.DialContext(ctx, dialer.DialAddress(address), gopts...)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/containerd/containerd/cmd/ctr/commands/commands.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/containerd/containerd/cmd/ctr/commands/commands.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -124,6 +124,10 @@ var (
 | 
				
			|||||||
			Name:  "gpus",
 | 
								Name:  "gpus",
 | 
				
			||||||
			Usage: "add gpus to the container",
 | 
								Usage: "add gpus to the container",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							cli.BoolFlag{
 | 
				
			||||||
 | 
								Name:  "allow-new-privs",
 | 
				
			||||||
 | 
								Usage: "turn off OCI spec's NoNewPrivileges feature flag",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										72
									
								
								vendor/github.com/containerd/containerd/cmd/ctr/commands/images/import.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										72
									
								
								vendor/github.com/containerd/containerd/cmd/ctr/commands/images/import.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -20,10 +20,11 @@ import (
 | 
				
			|||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/containerd/containerd"
 | 
				
			||||||
	"github.com/containerd/containerd/cmd/ctr/commands"
 | 
						"github.com/containerd/containerd/cmd/ctr/commands"
 | 
				
			||||||
	"github.com/containerd/containerd/images"
 | 
						"github.com/containerd/containerd/images/archive"
 | 
				
			||||||
	oci "github.com/containerd/containerd/images/oci"
 | 
					 | 
				
			||||||
	"github.com/containerd/containerd/log"
 | 
						"github.com/containerd/containerd/log"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -34,45 +35,58 @@ var importCommand = cli.Command{
 | 
				
			|||||||
	ArgsUsage: "[flags] <in>",
 | 
						ArgsUsage: "[flags] <in>",
 | 
				
			||||||
	Description: `Import images from a tar stream.
 | 
						Description: `Import images from a tar stream.
 | 
				
			||||||
Implemented formats:
 | 
					Implemented formats:
 | 
				
			||||||
- oci.v1     (default)
 | 
					- oci.v1
 | 
				
			||||||
 | 
					- docker.v1.1
 | 
				
			||||||
 | 
					- docker.v1.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
For oci.v1 format, you need to specify --oci-name because an OCI archive contains image refs (tags)
 | 
					For OCI v1, you may need to specify --base-name because an OCI archive may
 | 
				
			||||||
but does not contain the base image name.
 | 
					contain only partial image references (tags without the base image name).
 | 
				
			||||||
 | 
					If no base image name is provided, a name will be generated as "import-%{yyyy-MM-dd}".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
e.g.
 | 
					e.g.
 | 
				
			||||||
  $ ctr images import --format oci.v1 --oci-name foo/bar foobar.tar
 | 
					  $ ctr images import --base-name foo/bar foobar.tar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadbeef", the command will create
 | 
					If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadbeef", the command will create
 | 
				
			||||||
"foo/bar:latest" and "foo/bar@sha256:deadbeef" images in the containerd store.
 | 
					"foo/bar:latest" and "foo/bar@sha256:deadbeef" images in the containerd store.
 | 
				
			||||||
`,
 | 
					`,
 | 
				
			||||||
	Flags: append([]cli.Flag{
 | 
						Flags: append([]cli.Flag{
 | 
				
			||||||
		cli.StringFlag{
 | 
							cli.StringFlag{
 | 
				
			||||||
			Name:  "format",
 | 
								Name:  "base-name",
 | 
				
			||||||
			Value: "oci.v1",
 | 
								Value: "",
 | 
				
			||||||
			Usage: "image format. See DESCRIPTION.",
 | 
								Usage: "base image name for added images, when provided only images with this name prefix are imported",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							cli.BoolFlag{
 | 
				
			||||||
 | 
								Name:  "digests",
 | 
				
			||||||
 | 
								Usage: "whether to create digest images (default: false)",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		cli.StringFlag{
 | 
							cli.StringFlag{
 | 
				
			||||||
			Name:  "oci-name",
 | 
								Name:  "index-name",
 | 
				
			||||||
			Value: "unknown/unknown",
 | 
								Usage: "image name to keep index as, by default index is discarded",
 | 
				
			||||||
			Usage: "prefix added to either oci.v1 ref annotation or digest",
 | 
					 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		// TODO(AkihiroSuda): support commands.LabelFlag (for all children objects)
 | 
					 | 
				
			||||||
	}, commands.SnapshotterFlags...),
 | 
						}, commands.SnapshotterFlags...),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Action: func(context *cli.Context) error {
 | 
						Action: func(context *cli.Context) error {
 | 
				
			||||||
		var (
 | 
							var (
 | 
				
			||||||
			in            = context.Args().First()
 | 
								in   = context.Args().First()
 | 
				
			||||||
			imageImporter images.Importer
 | 
								opts []containerd.ImportOpt
 | 
				
			||||||
		)
 | 
							)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		switch format := context.String("format"); format {
 | 
							prefix := context.String("base-name")
 | 
				
			||||||
		case "oci.v1":
 | 
							if prefix == "" {
 | 
				
			||||||
			imageImporter = &oci.V1Importer{
 | 
								prefix = fmt.Sprintf("import-%s", time.Now().Format("2006-01-02"))
 | 
				
			||||||
				ImageName: context.String("oci-name"),
 | 
								opts = append(opts, containerd.WithImageRefTranslator(archive.AddRefPrefix(prefix)))
 | 
				
			||||||
			}
 | 
							} else {
 | 
				
			||||||
		default:
 | 
								// When provided, filter out references which do not match
 | 
				
			||||||
			return fmt.Errorf("unknown format %s", format)
 | 
								opts = append(opts, containerd.WithImageRefTranslator(archive.FilterRefPrefix(prefix)))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if context.Bool("digests") {
 | 
				
			||||||
 | 
								opts = append(opts, containerd.WithDigestRef(archive.DigestTranslator(prefix)))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if idxName := context.String("index-name"); idxName != "" {
 | 
				
			||||||
 | 
								opts = append(opts, containerd.WithIndexName(idxName))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		client, ctx, cancel, err := commands.NewClient(context)
 | 
							client, ctx, cancel, err := commands.NewClient(context)
 | 
				
			||||||
@@ -90,20 +104,24 @@ If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadb
 | 
				
			|||||||
				return err
 | 
									return err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		imgs, err := client.Import(ctx, imageImporter, r)
 | 
							imgs, err := client.Import(ctx, r, opts...)
 | 
				
			||||||
 | 
							closeErr := r.Close()
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if err = r.Close(); err != nil {
 | 
							if closeErr != nil {
 | 
				
			||||||
			return err
 | 
								return closeErr
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		log.G(ctx).Debugf("unpacking %d images", len(imgs))
 | 
							log.G(ctx).Debugf("unpacking %d images", len(imgs))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for _, img := range imgs {
 | 
							for _, img := range imgs {
 | 
				
			||||||
 | 
								// TODO: Allow configuration of the platform
 | 
				
			||||||
 | 
								image := containerd.NewImage(client, img)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// TODO: Show unpack status
 | 
								// TODO: Show unpack status
 | 
				
			||||||
			fmt.Printf("unpacking %s (%s)...", img.Name(), img.Target().Digest)
 | 
								fmt.Printf("unpacking %s (%s)...", img.Name, img.Target.Digest)
 | 
				
			||||||
			err = img.Unpack(ctx, context.String("snapshotter"))
 | 
								err = image.Unpack(ctx, context.String("snapshotter"))
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return err
 | 
									return err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/containerd/containerd/cmd/ctr/commands/run/run.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/containerd/containerd/cmd/ctr/commands/run/run.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -106,6 +106,10 @@ var Command = cli.Command{
 | 
				
			|||||||
			Name:  "fifo-dir",
 | 
								Name:  "fifo-dir",
 | 
				
			||||||
			Usage: "directory used for storing IO FIFOs",
 | 
								Usage: "directory used for storing IO FIFOs",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							cli.BoolFlag{
 | 
				
			||||||
 | 
								Name:  "isolated",
 | 
				
			||||||
 | 
								Usage: "run the container with vm isolation",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
	}, append(commands.SnapshotterFlags, commands.ContainerFlags...)...),
 | 
						}, append(commands.SnapshotterFlags, commands.ContainerFlags...)...),
 | 
				
			||||||
	Action: func(context *cli.Context) error {
 | 
						Action: func(context *cli.Context) error {
 | 
				
			||||||
		var (
 | 
							var (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										8
									
								
								vendor/github.com/containerd/containerd/cmd/ctr/commands/run/run_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/containerd/containerd/cmd/ctr/commands/run/run_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -136,6 +136,9 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli
 | 
				
			|||||||
		if context.IsSet("gpus") {
 | 
							if context.IsSet("gpus") {
 | 
				
			||||||
			opts = append(opts, nvidia.WithGPUs(nvidia.WithDevices(context.Int("gpus")), nvidia.WithAllCapabilities))
 | 
								opts = append(opts, nvidia.WithGPUs(nvidia.WithDevices(context.Int("gpus")), nvidia.WithAllCapabilities))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							if context.IsSet("allow-new-privs") {
 | 
				
			||||||
 | 
								opts = append(opts, oci.WithNewPrivileges)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cOpts = append(cOpts, containerd.WithContainerLabels(commands.LabelArgs(context.StringSlice("label"))))
 | 
						cOpts = append(cOpts, containerd.WithContainerLabels(commands.LabelArgs(context.StringSlice("label"))))
 | 
				
			||||||
@@ -146,9 +149,8 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	cOpts = append(cOpts, spec)
 | 
						cOpts = append(cOpts, spec)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// oci.WithImageConfig (WithUsername, WithUserID) depends on rootfs snapshot for resolving /etc/passwd.
 | 
						// oci.WithImageConfig (WithUsername, WithUserID) depends on access to rootfs for resolving via
 | 
				
			||||||
	// So cOpts needs to have precedence over opts.
 | 
						// the /etc/{passwd,group} files. So cOpts needs to have precedence over opts.
 | 
				
			||||||
	// TODO: WithUsername, WithUserID should additionally support non-snapshot rootfs
 | 
					 | 
				
			||||||
	return client.NewContainer(ctx, id, cOpts...)
 | 
						return client.NewContainer(ctx, id, cOpts...)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										95
									
								
								vendor/github.com/containerd/containerd/cmd/ctr/commands/run/run_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										95
									
								
								vendor/github.com/containerd/containerd/cmd/ctr/commands/run/run_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -31,57 +31,80 @@ import (
 | 
				
			|||||||
// NewContainer creates a new container
 | 
					// NewContainer creates a new container
 | 
				
			||||||
func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli.Context) (containerd.Container, error) {
 | 
					func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli.Context) (containerd.Container, error) {
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		ref  = context.Args().First()
 | 
							id    string
 | 
				
			||||||
		id   = context.Args().Get(1)
 | 
					 | 
				
			||||||
		args = context.Args()[2:]
 | 
					 | 
				
			||||||
	)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	image, err := client.GetImage(ctx, ref)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	var (
 | 
					 | 
				
			||||||
		opts  []oci.SpecOpts
 | 
							opts  []oci.SpecOpts
 | 
				
			||||||
		cOpts []containerd.NewContainerOpts
 | 
							cOpts []containerd.NewContainerOpts
 | 
				
			||||||
		spec  containerd.NewContainerOpts
 | 
							spec  containerd.NewContainerOpts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							config = context.IsSet("config")
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if context.IsSet("config") {
 | 
						if config {
 | 
				
			||||||
 | 
							id = context.Args().First()
 | 
				
			||||||
		opts = append(opts, oci.WithSpecFromFile(context.String("config")))
 | 
							opts = append(opts, oci.WithSpecFromFile(context.String("config")))
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		opts = append(opts, oci.WithDefaultSpec())
 | 
							var (
 | 
				
			||||||
	}
 | 
								ref  = context.Args().First()
 | 
				
			||||||
 | 
								args = context.Args()[2:]
 | 
				
			||||||
 | 
							)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	opts = append(opts, oci.WithImageConfig(image))
 | 
							id = context.Args().Get(1)
 | 
				
			||||||
	opts = append(opts, oci.WithEnv(context.StringSlice("env")))
 | 
							snapshotter := context.String("snapshotter")
 | 
				
			||||||
	opts = append(opts, withMounts(context))
 | 
							if snapshotter == "windows-lcow" {
 | 
				
			||||||
	if context.Bool("tty") {
 | 
								opts = append(opts, oci.WithDefaultSpecForPlatform("linux/amd64"))
 | 
				
			||||||
		opts = append(opts, oci.WithTTY)
 | 
								// Clear the rootfs section.
 | 
				
			||||||
 | 
								opts = append(opts, oci.WithRootFSPath(""))
 | 
				
			||||||
		con := console.Current()
 | 
							} else {
 | 
				
			||||||
		size, err := con.Size()
 | 
								opts = append(opts, oci.WithDefaultSpec())
 | 
				
			||||||
		if err != nil {
 | 
							}
 | 
				
			||||||
			logrus.WithError(err).Error("console size")
 | 
							opts = append(opts, oci.WithEnv(context.StringSlice("env")))
 | 
				
			||||||
 | 
							opts = append(opts, withMounts(context))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							image, err := client.GetImage(ctx, ref)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							unpacked, err := image.IsUnpacked(ctx, snapshotter)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if !unpacked {
 | 
				
			||||||
 | 
								if err := image.Unpack(ctx, snapshotter); err != nil {
 | 
				
			||||||
 | 
									return nil, err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							opts = append(opts, oci.WithImageConfig(image))
 | 
				
			||||||
 | 
							cOpts = append(cOpts, containerd.WithImage(image))
 | 
				
			||||||
 | 
							cOpts = append(cOpts, containerd.WithSnapshotter(snapshotter))
 | 
				
			||||||
 | 
							cOpts = append(cOpts, containerd.WithNewSnapshot(id, image))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if len(args) > 0 {
 | 
				
			||||||
 | 
								opts = append(opts, oci.WithProcessArgs(args...))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if cwd := context.String("cwd"); cwd != "" {
 | 
				
			||||||
 | 
								opts = append(opts, oci.WithProcessCwd(cwd))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if context.Bool("tty") {
 | 
				
			||||||
 | 
								opts = append(opts, oci.WithTTY)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								con := console.Current()
 | 
				
			||||||
 | 
								size, err := con.Size()
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									logrus.WithError(err).Error("console size")
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								opts = append(opts, oci.WithTTYSize(int(size.Width), int(size.Height)))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if context.Bool("isolated") {
 | 
				
			||||||
 | 
								opts = append(opts, oci.WithWindowsHyperV)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		opts = append(opts, oci.WithTTYSize(int(size.Width), int(size.Height)))
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if len(args) > 0 {
 | 
						cOpts = append(cOpts, containerd.WithContainerLabels(commands.LabelArgs(context.StringSlice("label"))))
 | 
				
			||||||
		opts = append(opts, oci.WithProcessArgs(args...))
 | 
						cOpts = append(cOpts, containerd.WithRuntime(context.String("runtime"), nil))
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if cwd := context.String("cwd"); cwd != "" {
 | 
					 | 
				
			||||||
		opts = append(opts, oci.WithProcessCwd(cwd))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var s specs.Spec
 | 
						var s specs.Spec
 | 
				
			||||||
	spec = containerd.WithSpec(&s, opts...)
 | 
						spec = containerd.WithSpec(&s, opts...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cOpts = append(cOpts, containerd.WithContainerLabels(commands.LabelArgs(context.StringSlice("label"))))
 | 
					 | 
				
			||||||
	cOpts = append(cOpts, containerd.WithImage(image))
 | 
					 | 
				
			||||||
	cOpts = append(cOpts, containerd.WithSnapshotter(context.String("snapshotter")))
 | 
					 | 
				
			||||||
	cOpts = append(cOpts, containerd.WithNewSnapshot(id, image))
 | 
					 | 
				
			||||||
	cOpts = append(cOpts, containerd.WithRuntime(context.String("runtime"), nil))
 | 
					 | 
				
			||||||
	cOpts = append(cOpts, spec)
 | 
						cOpts = append(cOpts, spec)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return client.NewContainer(ctx, id, cOpts...)
 | 
						return client.NewContainer(ctx, id, cOpts...)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/containerd/containerd/containers/containers.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/containerd/containerd/containers/containers.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -28,12 +28,12 @@ import (
 | 
				
			|||||||
//
 | 
					//
 | 
				
			||||||
// The resources specified in this object are used to create tasks from the container.
 | 
					// The resources specified in this object are used to create tasks from the container.
 | 
				
			||||||
type Container struct {
 | 
					type Container struct {
 | 
				
			||||||
	// ID uniquely identifies the container in a nameapace.
 | 
						// ID uniquely identifies the container in a namespace.
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	// This property is required and cannot be changed after creation.
 | 
						// This property is required and cannot be changed after creation.
 | 
				
			||||||
	ID string
 | 
						ID string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Labels provide metadata extension for a contaienr.
 | 
						// Labels provide metadata extension for a container.
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	// These are optional and fully mutable.
 | 
						// These are optional and fully mutable.
 | 
				
			||||||
	Labels map[string]string
 | 
						Labels map[string]string
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								vendor/github.com/containerd/containerd/content/helpers.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/containerd/containerd/content/helpers.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -70,7 +70,7 @@ func WriteBlob(ctx context.Context, cs Ingester, ref string, r io.Reader, desc o
 | 
				
			|||||||
	cw, err := OpenWriter(ctx, cs, WithRef(ref), WithDescriptor(desc))
 | 
						cw, err := OpenWriter(ctx, cs, WithRef(ref), WithDescriptor(desc))
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		if !errdefs.IsAlreadyExists(err) {
 | 
							if !errdefs.IsAlreadyExists(err) {
 | 
				
			||||||
			return err
 | 
								return errors.Wrap(err, "failed to open writer")
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return nil // all ready present
 | 
							return nil // all ready present
 | 
				
			||||||
@@ -127,7 +127,7 @@ func OpenWriter(ctx context.Context, cs Ingester, opts ...WriterOpt) (Writer, er
 | 
				
			|||||||
func Copy(ctx context.Context, cw Writer, r io.Reader, size int64, expected digest.Digest, opts ...Opt) error {
 | 
					func Copy(ctx context.Context, cw Writer, r io.Reader, size int64, expected digest.Digest, opts ...Opt) error {
 | 
				
			||||||
	ws, err := cw.Status()
 | 
						ws, err := cw.Status()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return errors.Wrap(err, "failed to get status")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ws.Offset > 0 {
 | 
						if ws.Offset > 0 {
 | 
				
			||||||
@@ -138,7 +138,7 @@ func Copy(ctx context.Context, cw Writer, r io.Reader, size int64, expected dige
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if _, err := copyWithBuffer(cw, r); err != nil {
 | 
						if _, err := copyWithBuffer(cw, r); err != nil {
 | 
				
			||||||
		return err
 | 
							return errors.Wrap(err, "failed to copy")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err := cw.Commit(ctx, size, expected, opts...); err != nil {
 | 
						if err := cw.Commit(ctx, size, expected, opts...); err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										8
									
								
								vendor/github.com/containerd/containerd/content/local/writer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/containerd/containerd/content/local/writer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -132,11 +132,11 @@ func (w *writer) Commit(ctx context.Context, size int64, expected digest.Digest,
 | 
				
			|||||||
	// clean up!!
 | 
						// clean up!!
 | 
				
			||||||
	defer os.RemoveAll(w.path)
 | 
						defer os.RemoveAll(w.path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if _, err := os.Stat(target); err == nil {
 | 
				
			||||||
 | 
							// collision with the target file!
 | 
				
			||||||
 | 
							return errors.Wrapf(errdefs.ErrAlreadyExists, "content %v", dgst)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	if err := os.Rename(ingest, target); err != nil {
 | 
						if err := os.Rename(ingest, target); err != nil {
 | 
				
			||||||
		if os.IsExist(err) {
 | 
					 | 
				
			||||||
			// collision with the target file!
 | 
					 | 
				
			||||||
			return errors.Wrapf(errdefs.ErrAlreadyExists, "content %v", dgst)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	commitTime := time.Now()
 | 
						commitTime := time.Now()
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								vendor/github.com/containerd/containerd/content/proxy/content_writer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/containerd/containerd/content/proxy/content_writer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -57,7 +57,7 @@ func (rw *remoteWriter) Status() (content.Status, error) {
 | 
				
			|||||||
		Action: contentapi.WriteActionStat,
 | 
							Action: contentapi.WriteActionStat,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return content.Status{}, errors.Wrap(err, "error getting writer status")
 | 
							return content.Status{}, errors.Wrap(errdefs.FromGRPC(err), "error getting writer status")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return content.Status{
 | 
						return content.Status{
 | 
				
			||||||
@@ -82,7 +82,7 @@ func (rw *remoteWriter) Write(p []byte) (n int, err error) {
 | 
				
			|||||||
		Data:   p,
 | 
							Data:   p,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return 0, err
 | 
							return 0, errors.Wrap(errdefs.FromGRPC(err), "failed to send write")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	n = int(resp.Offset - offset)
 | 
						n = int(resp.Offset - offset)
 | 
				
			||||||
@@ -112,7 +112,7 @@ func (rw *remoteWriter) Commit(ctx context.Context, size int64, expected digest.
 | 
				
			|||||||
		Labels:   base.Labels,
 | 
							Labels:   base.Labels,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return errdefs.FromGRPC(err)
 | 
							return errors.Wrap(errdefs.FromGRPC(err), "commit failed")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if size != 0 && resp.Offset != size {
 | 
						if size != 0 && resp.Offset != size {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/containerd/containerd/diff/walking/differ.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/containerd/containerd/diff/walking/differ.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -139,7 +139,9 @@ func (s *walkingDiff) Compare(ctx context.Context, lower, upper []mount.Mount, o
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			dgst := cw.Digest()
 | 
								dgst := cw.Digest()
 | 
				
			||||||
			if err := cw.Commit(ctx, 0, dgst, commitopts...); err != nil {
 | 
								if err := cw.Commit(ctx, 0, dgst, commitopts...); err != nil {
 | 
				
			||||||
				return errors.Wrap(err, "failed to commit")
 | 
									if !errdefs.IsAlreadyExists(err) {
 | 
				
			||||||
 | 
										return errors.Wrap(err, "failed to commit")
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			info, err := s.store.Info(ctx, dgst)
 | 
								info, err := s.store.Info(ctx, dgst)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								vendor/github.com/containerd/containerd/export.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/containerd/containerd/export.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -22,6 +22,7 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"github.com/containerd/containerd/images"
 | 
						"github.com/containerd/containerd/images"
 | 
				
			||||||
	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
						ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
				
			||||||
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type exportOpts struct {
 | 
					type exportOpts struct {
 | 
				
			||||||
@@ -51,7 +52,7 @@ func (c *Client) Export(ctx context.Context, exporter images.Exporter, desc ocis
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	pr, pw := io.Pipe()
 | 
						pr, pw := io.Pipe()
 | 
				
			||||||
	go func() {
 | 
						go func() {
 | 
				
			||||||
		pw.CloseWithError(exporter.Export(ctx, c.ContentStore(), desc, pw))
 | 
							pw.CloseWithError(errors.Wrap(exporter.Export(ctx, c.ContentStore(), desc, pw), "export failed"))
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
	return pr, nil
 | 
						return pr, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								vendor/github.com/containerd/containerd/image.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/containerd/containerd/image.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -37,6 +37,8 @@ type Image interface {
 | 
				
			|||||||
	Name() string
 | 
						Name() string
 | 
				
			||||||
	// Target descriptor for the image content
 | 
						// Target descriptor for the image content
 | 
				
			||||||
	Target() ocispec.Descriptor
 | 
						Target() ocispec.Descriptor
 | 
				
			||||||
 | 
						// Labels of the image
 | 
				
			||||||
 | 
						Labels() map[string]string
 | 
				
			||||||
	// Unpack unpacks the image's content into a snapshot
 | 
						// Unpack unpacks the image's content into a snapshot
 | 
				
			||||||
	Unpack(context.Context, string) error
 | 
						Unpack(context.Context, string) error
 | 
				
			||||||
	// RootFS returns the unpacked diffids that make up images rootfs.
 | 
						// RootFS returns the unpacked diffids that make up images rootfs.
 | 
				
			||||||
@@ -86,6 +88,10 @@ func (i *image) Target() ocispec.Descriptor {
 | 
				
			|||||||
	return i.i.Target
 | 
						return i.i.Target
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (i *image) Labels() map[string]string {
 | 
				
			||||||
 | 
						return i.i.Labels
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (i *image) RootFS(ctx context.Context) ([]digest.Digest, error) {
 | 
					func (i *image) RootFS(ctx context.Context) ([]digest.Digest, error) {
 | 
				
			||||||
	provider := i.client.ContentStore()
 | 
						provider := i.client.ContentStore()
 | 
				
			||||||
	return i.i.RootFS(ctx, provider, i.platform)
 | 
						return i.i.RootFS(ctx, provider, i.platform)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										254
									
								
								vendor/github.com/containerd/containerd/images/archive/importer.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										254
									
								
								vendor/github.com/containerd/containerd/images/archive/importer.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,254 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Package archive provides a Docker and OCI compatible importer
 | 
				
			||||||
 | 
					package archive
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"archive/tar"
 | 
				
			||||||
 | 
						"bytes"
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"io"
 | 
				
			||||||
 | 
						"io/ioutil"
 | 
				
			||||||
 | 
						"path"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/containerd/containerd/archive/compression"
 | 
				
			||||||
 | 
						"github.com/containerd/containerd/content"
 | 
				
			||||||
 | 
						"github.com/containerd/containerd/images"
 | 
				
			||||||
 | 
						"github.com/containerd/containerd/log"
 | 
				
			||||||
 | 
						digest "github.com/opencontainers/go-digest"
 | 
				
			||||||
 | 
						specs "github.com/opencontainers/image-spec/specs-go"
 | 
				
			||||||
 | 
						ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
				
			||||||
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ImportIndex imports an index from a tar achive image bundle
 | 
				
			||||||
 | 
					// - implements Docker v1.1, v1.2 and OCI v1.
 | 
				
			||||||
 | 
					// - prefers OCI v1 when provided
 | 
				
			||||||
 | 
					// - creates OCI index for Docker formats
 | 
				
			||||||
 | 
					// - normalizes Docker references and adds as OCI ref name
 | 
				
			||||||
 | 
					//      e.g. alpine:latest -> docker.io/library/alpine:latest
 | 
				
			||||||
 | 
					// - existing OCI reference names are untouched
 | 
				
			||||||
 | 
					// - TODO: support option to compress layers on ingest
 | 
				
			||||||
 | 
					func ImportIndex(ctx context.Context, store content.Store, reader io.Reader) (ocispec.Descriptor, error) {
 | 
				
			||||||
 | 
						var (
 | 
				
			||||||
 | 
							tr = tar.NewReader(reader)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ociLayout ocispec.ImageLayout
 | 
				
			||||||
 | 
							mfsts     []struct {
 | 
				
			||||||
 | 
								Config   string
 | 
				
			||||||
 | 
								RepoTags []string
 | 
				
			||||||
 | 
								Layers   []string
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							symlinks = make(map[string]string)
 | 
				
			||||||
 | 
							blobs    = make(map[string]ocispec.Descriptor)
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
						for {
 | 
				
			||||||
 | 
							hdr, err := tr.Next()
 | 
				
			||||||
 | 
							if err == io.EOF {
 | 
				
			||||||
 | 
								break
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return ocispec.Descriptor{}, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if hdr.Typeflag == tar.TypeSymlink {
 | 
				
			||||||
 | 
								symlinks[hdr.Name] = path.Join(path.Dir(hdr.Name), hdr.Linkname)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if hdr.Typeflag != tar.TypeReg && hdr.Typeflag != tar.TypeRegA {
 | 
				
			||||||
 | 
								if hdr.Typeflag != tar.TypeDir {
 | 
				
			||||||
 | 
									log.G(ctx).WithField("file", hdr.Name).Debug("file type ignored")
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							hdrName := path.Clean(hdr.Name)
 | 
				
			||||||
 | 
							if hdrName == ocispec.ImageLayoutFile {
 | 
				
			||||||
 | 
								if err = onUntarJSON(tr, &ociLayout); err != nil {
 | 
				
			||||||
 | 
									return ocispec.Descriptor{}, errors.Wrapf(err, "untar oci layout %q", hdr.Name)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else if hdrName == "manifest.json" {
 | 
				
			||||||
 | 
								if err = onUntarJSON(tr, &mfsts); err != nil {
 | 
				
			||||||
 | 
									return ocispec.Descriptor{}, errors.Wrapf(err, "untar manifest %q", hdr.Name)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								dgst, err := onUntarBlob(ctx, tr, store, hdr.Size, "tar-"+hdrName)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return ocispec.Descriptor{}, errors.Wrapf(err, "failed to ingest %q", hdr.Name)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								blobs[hdrName] = ocispec.Descriptor{
 | 
				
			||||||
 | 
									Digest: dgst,
 | 
				
			||||||
 | 
									Size:   hdr.Size,
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// If OCI layout was given, interpret the tar as an OCI layout.
 | 
				
			||||||
 | 
						// When not provided, the layout of the tar will be interpretted
 | 
				
			||||||
 | 
						// as Docker v1.1 or v1.2.
 | 
				
			||||||
 | 
						if ociLayout.Version != "" {
 | 
				
			||||||
 | 
							if ociLayout.Version != ocispec.ImageLayoutVersion {
 | 
				
			||||||
 | 
								return ocispec.Descriptor{}, errors.Errorf("unsupported OCI version %s", ociLayout.Version)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							idx, ok := blobs["index.json"]
 | 
				
			||||||
 | 
							if !ok {
 | 
				
			||||||
 | 
								return ocispec.Descriptor{}, errors.Errorf("missing index.json in OCI layout %s", ocispec.ImageLayoutVersion)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							idx.MediaType = ocispec.MediaTypeImageIndex
 | 
				
			||||||
 | 
							return idx, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for name, linkname := range symlinks {
 | 
				
			||||||
 | 
							desc, ok := blobs[linkname]
 | 
				
			||||||
 | 
							if !ok {
 | 
				
			||||||
 | 
								return ocispec.Descriptor{}, errors.Errorf("no target for symlink layer from %q to %q", name, linkname)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							blobs[name] = desc
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var idx ocispec.Index
 | 
				
			||||||
 | 
						for _, mfst := range mfsts {
 | 
				
			||||||
 | 
							config, ok := blobs[mfst.Config]
 | 
				
			||||||
 | 
							if !ok {
 | 
				
			||||||
 | 
								return ocispec.Descriptor{}, errors.Errorf("image config %q not found", mfst.Config)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							config.MediaType = ocispec.MediaTypeImageConfig
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							layers, err := resolveLayers(ctx, store, mfst.Layers, blobs)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return ocispec.Descriptor{}, errors.Wrap(err, "failed to resolve layers")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							manifest := ocispec.Manifest{
 | 
				
			||||||
 | 
								Versioned: specs.Versioned{
 | 
				
			||||||
 | 
									SchemaVersion: 2,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								Config: config,
 | 
				
			||||||
 | 
								Layers: layers,
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							desc, err := writeManifest(ctx, store, manifest, ocispec.MediaTypeImageManifest)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return ocispec.Descriptor{}, errors.Wrap(err, "write docker manifest")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							platforms, err := images.Platforms(ctx, store, desc)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return ocispec.Descriptor{}, errors.Wrap(err, "unable to resolve platform")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if len(platforms) > 0 {
 | 
				
			||||||
 | 
								// Only one platform can be resolved from non-index manifest,
 | 
				
			||||||
 | 
								// The platform can only come from the config included above,
 | 
				
			||||||
 | 
								// if the config has no platform it can be safely ommitted.
 | 
				
			||||||
 | 
								desc.Platform = &platforms[0]
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if len(mfst.RepoTags) == 0 {
 | 
				
			||||||
 | 
								idx.Manifests = append(idx.Manifests, desc)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								// Add descriptor per tag
 | 
				
			||||||
 | 
								for _, ref := range mfst.RepoTags {
 | 
				
			||||||
 | 
									mfstdesc := desc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									normalized, err := normalizeReference(ref)
 | 
				
			||||||
 | 
									if err != nil {
 | 
				
			||||||
 | 
										return ocispec.Descriptor{}, err
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									mfstdesc.Annotations = map[string]string{
 | 
				
			||||||
 | 
										ocispec.AnnotationRefName: normalized,
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									idx.Manifests = append(idx.Manifests, mfstdesc)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return writeManifest(ctx, store, idx, ocispec.MediaTypeImageIndex)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func onUntarJSON(r io.Reader, j interface{}) error {
 | 
				
			||||||
 | 
						b, err := ioutil.ReadAll(r)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err := json.Unmarshal(b, j); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func onUntarBlob(ctx context.Context, r io.Reader, store content.Ingester, size int64, ref string) (digest.Digest, error) {
 | 
				
			||||||
 | 
						dgstr := digest.Canonical.Digester()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := content.WriteBlob(ctx, store, ref, io.TeeReader(r, dgstr.Hash()), ocispec.Descriptor{Size: size}); err != nil {
 | 
				
			||||||
 | 
							return "", err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return dgstr.Digest(), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func resolveLayers(ctx context.Context, store content.Store, layerFiles []string, blobs map[string]ocispec.Descriptor) ([]ocispec.Descriptor, error) {
 | 
				
			||||||
 | 
						var layers []ocispec.Descriptor
 | 
				
			||||||
 | 
						for _, f := range layerFiles {
 | 
				
			||||||
 | 
							desc, ok := blobs[f]
 | 
				
			||||||
 | 
							if !ok {
 | 
				
			||||||
 | 
								return nil, errors.Errorf("layer %q not found", f)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Open blob, resolve media type
 | 
				
			||||||
 | 
							ra, err := store.ReaderAt(ctx, desc)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, errors.Wrapf(err, "failed to open %q (%s)", f, desc.Digest)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							s, err := compression.DecompressStream(content.NewReader(ra))
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, errors.Wrapf(err, "failed to detect compression for %q", f)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if s.GetCompression() == compression.Uncompressed {
 | 
				
			||||||
 | 
								// TODO: Support compressing and writing back to content store
 | 
				
			||||||
 | 
								desc.MediaType = ocispec.MediaTypeImageLayer
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								desc.MediaType = ocispec.MediaTypeImageLayerGzip
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							s.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							layers = append(layers, desc)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return layers, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func writeManifest(ctx context.Context, cs content.Ingester, manifest interface{}, mediaType string) (ocispec.Descriptor, error) {
 | 
				
			||||||
 | 
						manifestBytes, err := json.Marshal(manifest)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return ocispec.Descriptor{}, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						desc := ocispec.Descriptor{
 | 
				
			||||||
 | 
							MediaType: mediaType,
 | 
				
			||||||
 | 
							Digest:    digest.FromBytes(manifestBytes),
 | 
				
			||||||
 | 
							Size:      int64(len(manifestBytes)),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err := content.WriteBlob(ctx, cs, "manifest-"+desc.Digest.String(), bytes.NewReader(manifestBytes), desc); err != nil {
 | 
				
			||||||
 | 
							return ocispec.Descriptor{}, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return desc, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										86
									
								
								vendor/github.com/containerd/containerd/images/archive/reference.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								vendor/github.com/containerd/containerd/images/archive/reference.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,86 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package archive
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/containerd/cri/pkg/util"
 | 
				
			||||||
 | 
						digest "github.com/opencontainers/go-digest"
 | 
				
			||||||
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// FilterRefPrefix restricts references to having the given image
 | 
				
			||||||
 | 
					// prefix. Tag-only references will have the prefix prepended.
 | 
				
			||||||
 | 
					func FilterRefPrefix(image string) func(string) string {
 | 
				
			||||||
 | 
						return refTranslator(image, true)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// AddRefPrefix prepends the given image prefix to tag-only references,
 | 
				
			||||||
 | 
					// while leaving returning full references unmodified.
 | 
				
			||||||
 | 
					func AddRefPrefix(image string) func(string) string {
 | 
				
			||||||
 | 
						return refTranslator(image, false)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// refTranslator creates a reference which only has a tag or verifies
 | 
				
			||||||
 | 
					// a full reference.
 | 
				
			||||||
 | 
					func refTranslator(image string, checkPrefix bool) func(string) string {
 | 
				
			||||||
 | 
						return func(ref string) string {
 | 
				
			||||||
 | 
							// Check if ref is full reference
 | 
				
			||||||
 | 
							if strings.ContainsAny(ref, "/:@") {
 | 
				
			||||||
 | 
								// If not prefixed, don't include image
 | 
				
			||||||
 | 
								if checkPrefix && !isImagePrefix(ref, image) {
 | 
				
			||||||
 | 
									return ""
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return ref
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return image + ":" + ref
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func isImagePrefix(s, prefix string) bool {
 | 
				
			||||||
 | 
						if !strings.HasPrefix(s, prefix) {
 | 
				
			||||||
 | 
							return false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(s) > len(prefix) {
 | 
				
			||||||
 | 
							switch s[len(prefix)] {
 | 
				
			||||||
 | 
							case '/', ':', '@':
 | 
				
			||||||
 | 
								// Prevent matching partial namespaces
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								return false
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func normalizeReference(ref string) (string, error) {
 | 
				
			||||||
 | 
						// TODO: Replace this function to not depend on reference package
 | 
				
			||||||
 | 
						normalized, err := util.NormalizeImageRef(ref)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return "", errors.Wrapf(err, "normalize image ref %q", ref)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return normalized.String(), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// DigestTranslator creates a digest reference by adding the
 | 
				
			||||||
 | 
					// digest to an image name
 | 
				
			||||||
 | 
					func DigestTranslator(prefix string) func(digest.Digest) string {
 | 
				
			||||||
 | 
						return func(dgst digest.Digest) string {
 | 
				
			||||||
 | 
							return prefix + "@" + dgst.String()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/images/importexport.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/images/importexport.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -27,7 +27,7 @@ import (
 | 
				
			|||||||
// Importer is the interface for image importer.
 | 
					// Importer is the interface for image importer.
 | 
				
			||||||
type Importer interface {
 | 
					type Importer interface {
 | 
				
			||||||
	// Import imports an image from a tar stream.
 | 
						// Import imports an image from a tar stream.
 | 
				
			||||||
	Import(ctx context.Context, store content.Store, reader io.Reader) ([]Image, error)
 | 
						Import(ctx context.Context, store content.Store, reader io.Reader) (ocispec.Descriptor, error)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Exporter is the interface for image exporter.
 | 
					// Exporter is the interface for image exporter.
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/containerd/containerd/images/oci/exporter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/containerd/containerd/images/oci/exporter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -94,7 +94,7 @@ func blobRecord(cs content.Provider, desc ocispec.Descriptor) tarRecord {
 | 
				
			|||||||
		CopyTo: func(ctx context.Context, w io.Writer) (int64, error) {
 | 
							CopyTo: func(ctx context.Context, w io.Writer) (int64, error) {
 | 
				
			||||||
			r, err := cs.ReaderAt(ctx, desc)
 | 
								r, err := cs.ReaderAt(ctx, desc)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return 0, err
 | 
									return 0, errors.Wrap(err, "failed to get reader")
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			defer r.Close()
 | 
								defer r.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -103,7 +103,7 @@ func blobRecord(cs content.Provider, desc ocispec.Descriptor) tarRecord {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			n, err := io.Copy(io.MultiWriter(w, dgstr.Hash()), content.NewReader(r))
 | 
								n, err := io.Copy(io.MultiWriter(w, dgstr.Hash()), content.NewReader(r))
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return 0, err
 | 
									return 0, errors.Wrap(err, "failed to copy to tar")
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if dgstr.Digest() != desc.Digest {
 | 
								if dgstr.Digest() != desc.Digest {
 | 
				
			||||||
				return 0, errors.Errorf("unexpected digest %s copied", dgstr.Digest())
 | 
									return 0, errors.Errorf("unexpected digest %s copied", dgstr.Digest())
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										204
									
								
								vendor/github.com/containerd/containerd/images/oci/importer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										204
									
								
								vendor/github.com/containerd/containerd/images/oci/importer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,204 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
   Copyright The containerd Authors.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
					 | 
				
			||||||
   you may not use this file except in compliance with the License.
 | 
					 | 
				
			||||||
   You may obtain a copy of the License at
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   Unless required by applicable law or agreed to in writing, software
 | 
					 | 
				
			||||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
					 | 
				
			||||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					 | 
				
			||||||
   See the License for the specific language governing permissions and
 | 
					 | 
				
			||||||
   limitations under the License.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Package oci provides the importer and the exporter for OCI Image Spec.
 | 
					 | 
				
			||||||
package oci
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"archive/tar"
 | 
					 | 
				
			||||||
	"context"
 | 
					 | 
				
			||||||
	"encoding/json"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"io"
 | 
					 | 
				
			||||||
	"io/ioutil"
 | 
					 | 
				
			||||||
	"path"
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/containerd/containerd/content"
 | 
					 | 
				
			||||||
	"github.com/containerd/containerd/errdefs"
 | 
					 | 
				
			||||||
	"github.com/containerd/containerd/images"
 | 
					 | 
				
			||||||
	digest "github.com/opencontainers/go-digest"
 | 
					 | 
				
			||||||
	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
					 | 
				
			||||||
	"github.com/pkg/errors"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// V1Importer implements OCI Image Spec v1.
 | 
					 | 
				
			||||||
type V1Importer struct {
 | 
					 | 
				
			||||||
	// ImageName is preprended to either `:` + OCI ref name or `@` + digest (for anonymous refs).
 | 
					 | 
				
			||||||
	// This field is mandatory atm, but may change in the future. maybe ref map[string]string as in moby/moby#33355
 | 
					 | 
				
			||||||
	ImageName string
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var _ images.Importer = &V1Importer{}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Import implements Importer.
 | 
					 | 
				
			||||||
func (oi *V1Importer) Import(ctx context.Context, store content.Store, reader io.Reader) ([]images.Image, error) {
 | 
					 | 
				
			||||||
	if oi.ImageName == "" {
 | 
					 | 
				
			||||||
		return nil, errors.New("ImageName not set")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	tr := tar.NewReader(reader)
 | 
					 | 
				
			||||||
	var imgrecs []images.Image
 | 
					 | 
				
			||||||
	foundIndexJSON := false
 | 
					 | 
				
			||||||
	for {
 | 
					 | 
				
			||||||
		hdr, err := tr.Next()
 | 
					 | 
				
			||||||
		if err == io.EOF {
 | 
					 | 
				
			||||||
			break
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if hdr.Typeflag != tar.TypeReg && hdr.Typeflag != tar.TypeRegA {
 | 
					 | 
				
			||||||
			continue
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		hdrName := path.Clean(hdr.Name)
 | 
					 | 
				
			||||||
		if hdrName == "index.json" {
 | 
					 | 
				
			||||||
			if foundIndexJSON {
 | 
					 | 
				
			||||||
				return nil, errors.New("duplicated index.json")
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			foundIndexJSON = true
 | 
					 | 
				
			||||||
			imgrecs, err = onUntarIndexJSON(tr, oi.ImageName)
 | 
					 | 
				
			||||||
			if err != nil {
 | 
					 | 
				
			||||||
				return nil, err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			continue
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if strings.HasPrefix(hdrName, "blobs/") {
 | 
					 | 
				
			||||||
			if err := onUntarBlob(ctx, tr, store, hdrName, hdr.Size); err != nil {
 | 
					 | 
				
			||||||
				return nil, err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if !foundIndexJSON {
 | 
					 | 
				
			||||||
		return nil, errors.New("no index.json found")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for _, img := range imgrecs {
 | 
					 | 
				
			||||||
		err := setGCRefContentLabels(ctx, store, img.Target)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return imgrecs, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// FIXME(AkihiroSuda): set GC labels for unreferrenced blobs (i.e. with unknown media types)?
 | 
					 | 
				
			||||||
	return imgrecs, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func onUntarIndexJSON(r io.Reader, imageName string) ([]images.Image, error) {
 | 
					 | 
				
			||||||
	b, err := ioutil.ReadAll(r)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	var idx ocispec.Index
 | 
					 | 
				
			||||||
	if err := json.Unmarshal(b, &idx); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	var imgrecs []images.Image
 | 
					 | 
				
			||||||
	for _, m := range idx.Manifests {
 | 
					 | 
				
			||||||
		ref, err := normalizeImageRef(imageName, m)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		imgrecs = append(imgrecs, images.Image{
 | 
					 | 
				
			||||||
			Name:   ref,
 | 
					 | 
				
			||||||
			Target: m,
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return imgrecs, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func normalizeImageRef(imageName string, manifest ocispec.Descriptor) (string, error) {
 | 
					 | 
				
			||||||
	digest := manifest.Digest
 | 
					 | 
				
			||||||
	if digest == "" {
 | 
					 | 
				
			||||||
		return "", errors.Errorf("manifest with empty digest: %v", manifest)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	ociRef := manifest.Annotations[ocispec.AnnotationRefName]
 | 
					 | 
				
			||||||
	if ociRef == "" {
 | 
					 | 
				
			||||||
		return imageName + "@" + digest.String(), nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return imageName + ":" + ociRef, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func onUntarBlob(ctx context.Context, r io.Reader, store content.Ingester, name string, size int64) error {
 | 
					 | 
				
			||||||
	// name is like "blobs/sha256/deadbeef"
 | 
					 | 
				
			||||||
	split := strings.Split(name, "/")
 | 
					 | 
				
			||||||
	if len(split) != 3 {
 | 
					 | 
				
			||||||
		return errors.Errorf("unexpected name: %q", name)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	algo := digest.Algorithm(split[1])
 | 
					 | 
				
			||||||
	if !algo.Available() {
 | 
					 | 
				
			||||||
		return errors.Errorf("unsupported algorithm: %s", algo)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	dgst := digest.NewDigestFromHex(algo.String(), split[2])
 | 
					 | 
				
			||||||
	return content.WriteBlob(ctx, store, "unknown-"+dgst.String(), r, ocispec.Descriptor{Size: size, Digest: dgst})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// GetChildrenDescriptors returns children blob descriptors for the following supported types:
 | 
					 | 
				
			||||||
// - images.MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest
 | 
					 | 
				
			||||||
// - images.MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex
 | 
					 | 
				
			||||||
func GetChildrenDescriptors(r io.Reader, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
 | 
					 | 
				
			||||||
	switch desc.MediaType {
 | 
					 | 
				
			||||||
	case images.MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest:
 | 
					 | 
				
			||||||
		var manifest ocispec.Manifest
 | 
					 | 
				
			||||||
		if err := json.NewDecoder(r).Decode(&manifest); err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return append([]ocispec.Descriptor{manifest.Config}, manifest.Layers...), nil
 | 
					 | 
				
			||||||
	case images.MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex:
 | 
					 | 
				
			||||||
		var index ocispec.Index
 | 
					 | 
				
			||||||
		if err := json.NewDecoder(r).Decode(&index); err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return index.Manifests, nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func setGCRefContentLabels(ctx context.Context, store content.Store, desc ocispec.Descriptor) error {
 | 
					 | 
				
			||||||
	info, err := store.Info(ctx, desc.Digest)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		if errdefs.IsNotFound(err) {
 | 
					 | 
				
			||||||
			// when the archive is created from multi-arch image,
 | 
					 | 
				
			||||||
			// it may contain only blobs for a certain platform.
 | 
					 | 
				
			||||||
			// So ErrNotFound (on manifest list) is expected here.
 | 
					 | 
				
			||||||
			return nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	ra, err := store.ReaderAt(ctx, desc)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	defer ra.Close()
 | 
					 | 
				
			||||||
	r := content.NewReader(ra)
 | 
					 | 
				
			||||||
	children, err := GetChildrenDescriptors(r, desc)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if info.Labels == nil {
 | 
					 | 
				
			||||||
		info.Labels = map[string]string{}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for i, child := range children {
 | 
					 | 
				
			||||||
		// Note: child blob is not guaranteed to be written to the content store. (multi-arch)
 | 
					 | 
				
			||||||
		info.Labels[fmt.Sprintf("containerd.io/gc.ref.content.%d", i)] = child.Digest.String()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if _, err := store.Update(ctx, info, "labels"); err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for _, child := range children {
 | 
					 | 
				
			||||||
		if err := setGCRefContentLabels(ctx, store, child); err != nil {
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										133
									
								
								vendor/github.com/containerd/containerd/import.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										133
									
								
								vendor/github.com/containerd/containerd/import.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -18,35 +18,61 @@ package containerd
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/containerd/containerd/content"
 | 
				
			||||||
	"github.com/containerd/containerd/errdefs"
 | 
						"github.com/containerd/containerd/errdefs"
 | 
				
			||||||
	"github.com/containerd/containerd/images"
 | 
						"github.com/containerd/containerd/images"
 | 
				
			||||||
 | 
						"github.com/containerd/containerd/images/archive"
 | 
				
			||||||
 | 
						digest "github.com/opencontainers/go-digest"
 | 
				
			||||||
 | 
						ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type importOpts struct {
 | 
					type importOpts struct {
 | 
				
			||||||
 | 
						indexName string
 | 
				
			||||||
 | 
						imageRefT func(string) string
 | 
				
			||||||
 | 
						dgstRefT  func(digest.Digest) string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ImportOpt allows the caller to specify import specific options
 | 
					// ImportOpt allows the caller to specify import specific options
 | 
				
			||||||
type ImportOpt func(c *importOpts) error
 | 
					type ImportOpt func(*importOpts) error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func resolveImportOpt(opts ...ImportOpt) (importOpts, error) {
 | 
					// WithImageRefTranslator is used to translate the index reference
 | 
				
			||||||
	var iopts importOpts
 | 
					// to an image reference for the image store.
 | 
				
			||||||
	for _, o := range opts {
 | 
					func WithImageRefTranslator(f func(string) string) ImportOpt {
 | 
				
			||||||
		if err := o(&iopts); err != nil {
 | 
						return func(c *importOpts) error {
 | 
				
			||||||
			return iopts, err
 | 
							c.imageRefT = f
 | 
				
			||||||
		}
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// WithDigestRef is used to create digest images for each
 | 
				
			||||||
 | 
					// manifest in the index.
 | 
				
			||||||
 | 
					func WithDigestRef(f func(digest.Digest) string) ImportOpt {
 | 
				
			||||||
 | 
						return func(c *importOpts) error {
 | 
				
			||||||
 | 
							c.dgstRefT = f
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// WithIndexName creates a tag pointing to the imported index
 | 
				
			||||||
 | 
					func WithIndexName(name string) ImportOpt {
 | 
				
			||||||
 | 
						return func(c *importOpts) error {
 | 
				
			||||||
 | 
							c.indexName = name
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return iopts, nil
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Import imports an image from a Tar stream using reader.
 | 
					// Import imports an image from a Tar stream using reader.
 | 
				
			||||||
// Caller needs to specify importer. Future version may use oci.v1 as the default.
 | 
					// Caller needs to specify importer. Future version may use oci.v1 as the default.
 | 
				
			||||||
// Note that unreferrenced blobs may be imported to the content store as well.
 | 
					// Note that unreferrenced blobs may be imported to the content store as well.
 | 
				
			||||||
func (c *Client) Import(ctx context.Context, importer images.Importer, reader io.Reader, opts ...ImportOpt) ([]Image, error) {
 | 
					func (c *Client) Import(ctx context.Context, reader io.Reader, opts ...ImportOpt) ([]images.Image, error) {
 | 
				
			||||||
	_, err := resolveImportOpt(opts...) // unused now
 | 
						var iopts importOpts
 | 
				
			||||||
	if err != nil {
 | 
						for _, o := range opts {
 | 
				
			||||||
		return nil, err
 | 
							if err := o(&iopts); err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ctx, done, err := c.WithLease(ctx)
 | 
						ctx, done, err := c.WithLease(ctx)
 | 
				
			||||||
@@ -55,31 +81,86 @@ func (c *Client) Import(ctx context.Context, importer images.Importer, reader io
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	defer done(ctx)
 | 
						defer done(ctx)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	imgrecs, err := importer.Import(ctx, c.ContentStore(), reader)
 | 
						index, err := archive.ImportIndex(ctx, c.ContentStore(), reader)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		// is.Update() is not called on error
 | 
					 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	is := c.ImageService()
 | 
						var (
 | 
				
			||||||
	var images []Image
 | 
							imgs []images.Image
 | 
				
			||||||
	for _, imgrec := range imgrecs {
 | 
							cs   = c.ContentStore()
 | 
				
			||||||
		if updated, err := is.Update(ctx, imgrec, "target"); err != nil {
 | 
							is   = c.ImageService()
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if iopts.indexName != "" {
 | 
				
			||||||
 | 
							imgs = append(imgs, images.Image{
 | 
				
			||||||
 | 
								Name:   iopts.indexName,
 | 
				
			||||||
 | 
								Target: index,
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var handler images.HandlerFunc
 | 
				
			||||||
 | 
						handler = func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
 | 
				
			||||||
 | 
							// Only save images at top level
 | 
				
			||||||
 | 
							if desc.Digest != index.Digest {
 | 
				
			||||||
 | 
								return images.Children(ctx, cs, desc)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							p, err := content.ReadBlob(ctx, cs, desc)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							var idx ocispec.Index
 | 
				
			||||||
 | 
							if err := json.Unmarshal(p, &idx); err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for _, m := range idx.Manifests {
 | 
				
			||||||
 | 
								if ref := m.Annotations[ocispec.AnnotationRefName]; ref != "" {
 | 
				
			||||||
 | 
									if iopts.imageRefT != nil {
 | 
				
			||||||
 | 
										ref = iopts.imageRefT(ref)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if ref != "" {
 | 
				
			||||||
 | 
										imgs = append(imgs, images.Image{
 | 
				
			||||||
 | 
											Name:   ref,
 | 
				
			||||||
 | 
											Target: m,
 | 
				
			||||||
 | 
										})
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if iopts.dgstRefT != nil {
 | 
				
			||||||
 | 
									ref := iopts.dgstRefT(m.Digest)
 | 
				
			||||||
 | 
									if ref != "" {
 | 
				
			||||||
 | 
										imgs = append(imgs, images.Image{
 | 
				
			||||||
 | 
											Name:   ref,
 | 
				
			||||||
 | 
											Target: m,
 | 
				
			||||||
 | 
										})
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return idx.Manifests, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						handler = images.SetChildrenLabels(cs, handler)
 | 
				
			||||||
 | 
						if err := images.Walk(ctx, handler, index); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for i := range imgs {
 | 
				
			||||||
 | 
							img, err := is.Update(ctx, imgs[i], "target")
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
			if !errdefs.IsNotFound(err) {
 | 
								if !errdefs.IsNotFound(err) {
 | 
				
			||||||
				return nil, err
 | 
									return nil, err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			created, err := is.Create(ctx, imgrec)
 | 
								img, err = is.Create(ctx, imgs[i])
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return nil, err
 | 
									return nil, err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					 | 
				
			||||||
			imgrec = created
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			imgrec = updated
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							imgs[i] = img
 | 
				
			||||||
		images = append(images, NewImage(c, imgrec))
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return images, nil
 | 
					
 | 
				
			||||||
 | 
						return imgs, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/metadata/bolt.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/metadata/bolt.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -19,8 +19,8 @@ package metadata
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/boltdb/bolt"
 | 
					 | 
				
			||||||
	"github.com/pkg/errors"
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
						bolt "go.etcd.io/bbolt"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type transactionKey struct{}
 | 
					type transactionKey struct{}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/metadata/boltutil/helpers.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/metadata/boltutil/helpers.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -19,8 +19,8 @@ package boltutil
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/boltdb/bolt"
 | 
					 | 
				
			||||||
	"github.com/pkg/errors"
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
						bolt "go.etcd.io/bbolt"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								vendor/github.com/containerd/containerd/metadata/buckets.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/containerd/containerd/metadata/buckets.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -17,8 +17,8 @@
 | 
				
			|||||||
package metadata
 | 
					package metadata
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"github.com/boltdb/bolt"
 | 
					 | 
				
			||||||
	digest "github.com/opencontainers/go-digest"
 | 
						digest "github.com/opencontainers/go-digest"
 | 
				
			||||||
 | 
						bolt "go.etcd.io/bbolt"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// The layout where a "/" delineates a bucket is described in the following
 | 
					// The layout where a "/" delineates a bucket is described in the following
 | 
				
			||||||
@@ -164,11 +164,11 @@ func getSnapshotterBucket(tx *bolt.Tx, namespace, snapshotter string) *bolt.Buck
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func createBlobBucket(tx *bolt.Tx, namespace string, dgst digest.Digest) (*bolt.Bucket, error) {
 | 
					func createBlobBucket(tx *bolt.Tx, namespace string, dgst digest.Digest) (*bolt.Bucket, error) {
 | 
				
			||||||
	bkt, err := createBucketIfNotExists(tx, bucketKeyVersion, []byte(namespace), bucketKeyObjectContent, bucketKeyObjectBlob, []byte(dgst.String()))
 | 
						bkt, err := createBucketIfNotExists(tx, bucketKeyVersion, []byte(namespace), bucketKeyObjectContent, bucketKeyObjectBlob)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return bkt, nil
 | 
						return bkt.CreateBucket([]byte(dgst.String()))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func getBlobsBucket(tx *bolt.Tx, namespace string) *bolt.Bucket {
 | 
					func getBlobsBucket(tx *bolt.Tx, namespace string) *bolt.Bucket {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/metadata/containers.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/metadata/containers.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -21,7 +21,6 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/boltdb/bolt"
 | 
					 | 
				
			||||||
	"github.com/containerd/containerd/containers"
 | 
						"github.com/containerd/containerd/containers"
 | 
				
			||||||
	"github.com/containerd/containerd/errdefs"
 | 
						"github.com/containerd/containerd/errdefs"
 | 
				
			||||||
	"github.com/containerd/containerd/filters"
 | 
						"github.com/containerd/containerd/filters"
 | 
				
			||||||
@@ -32,6 +31,7 @@ import (
 | 
				
			|||||||
	"github.com/gogo/protobuf/proto"
 | 
						"github.com/gogo/protobuf/proto"
 | 
				
			||||||
	"github.com/gogo/protobuf/types"
 | 
						"github.com/gogo/protobuf/types"
 | 
				
			||||||
	"github.com/pkg/errors"
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
						bolt "go.etcd.io/bbolt"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type containerStore struct {
 | 
					type containerStore struct {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										17
									
								
								vendor/github.com/containerd/containerd/metadata/content.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								vendor/github.com/containerd/containerd/metadata/content.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -23,7 +23,6 @@ import (
 | 
				
			|||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/boltdb/bolt"
 | 
					 | 
				
			||||||
	"github.com/containerd/containerd/content"
 | 
						"github.com/containerd/containerd/content"
 | 
				
			||||||
	"github.com/containerd/containerd/errdefs"
 | 
						"github.com/containerd/containerd/errdefs"
 | 
				
			||||||
	"github.com/containerd/containerd/filters"
 | 
						"github.com/containerd/containerd/filters"
 | 
				
			||||||
@@ -34,6 +33,7 @@ import (
 | 
				
			|||||||
	digest "github.com/opencontainers/go-digest"
 | 
						digest "github.com/opencontainers/go-digest"
 | 
				
			||||||
	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
						ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
				
			||||||
	"github.com/pkg/errors"
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
						bolt "go.etcd.io/bbolt"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type contentStore struct {
 | 
					type contentStore struct {
 | 
				
			||||||
@@ -592,9 +592,6 @@ func (nw *namespacedWriter) commit(ctx context.Context, tx *bolt.Tx, size int64,
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		size = nw.desc.Size
 | 
							size = nw.desc.Size
 | 
				
			||||||
		actual = nw.desc.Digest
 | 
							actual = nw.desc.Digest
 | 
				
			||||||
		if getBlobBucket(tx, nw.namespace, actual) != nil {
 | 
					 | 
				
			||||||
			return "", errors.Wrapf(errdefs.ErrAlreadyExists, "content %v", actual)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		status, err := nw.w.Status()
 | 
							status, err := nw.w.Status()
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
@@ -606,18 +603,16 @@ func (nw *namespacedWriter) commit(ctx context.Context, tx *bolt.Tx, size int64,
 | 
				
			|||||||
		size = status.Offset
 | 
							size = status.Offset
 | 
				
			||||||
		actual = nw.w.Digest()
 | 
							actual = nw.w.Digest()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if err := nw.w.Commit(ctx, size, expected); err != nil {
 | 
							if err := nw.w.Commit(ctx, size, expected); err != nil && !errdefs.IsAlreadyExists(err) {
 | 
				
			||||||
			if !errdefs.IsAlreadyExists(err) {
 | 
								return "", err
 | 
				
			||||||
				return "", err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if getBlobBucket(tx, nw.namespace, actual) != nil {
 | 
					 | 
				
			||||||
				return "", errors.Wrapf(errdefs.ErrAlreadyExists, "content %v", actual)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bkt, err := createBlobBucket(tx, nw.namespace, actual)
 | 
						bkt, err := createBlobBucket(tx, nw.namespace, actual)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 | 
							if err == bolt.ErrBucketExists {
 | 
				
			||||||
 | 
								return "", errors.Wrapf(errdefs.ErrAlreadyExists, "content %v", actual)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		return "", err
 | 
							return "", err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/containerd/containerd/metadata/db.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/containerd/containerd/metadata/db.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -23,12 +23,12 @@ import (
 | 
				
			|||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/boltdb/bolt"
 | 
					 | 
				
			||||||
	"github.com/containerd/containerd/content"
 | 
						"github.com/containerd/containerd/content"
 | 
				
			||||||
	"github.com/containerd/containerd/gc"
 | 
						"github.com/containerd/containerd/gc"
 | 
				
			||||||
	"github.com/containerd/containerd/log"
 | 
						"github.com/containerd/containerd/log"
 | 
				
			||||||
	"github.com/containerd/containerd/snapshots"
 | 
						"github.com/containerd/containerd/snapshots"
 | 
				
			||||||
	"github.com/pkg/errors"
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
						bolt "go.etcd.io/bbolt"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@@ -43,7 +43,7 @@ const (
 | 
				
			|||||||
	// dbVersion represents updates to the schema
 | 
						// dbVersion represents updates to the schema
 | 
				
			||||||
	// version which are additions and compatible with
 | 
						// version which are additions and compatible with
 | 
				
			||||||
	// prior version of the same schema.
 | 
						// prior version of the same schema.
 | 
				
			||||||
	dbVersion = 2
 | 
						dbVersion = 3
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DB represents a metadata database backed by a bolt
 | 
					// DB represents a metadata database backed by a bolt
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/metadata/gc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/metadata/gc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -23,10 +23,10 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/boltdb/bolt"
 | 
					 | 
				
			||||||
	"github.com/containerd/containerd/gc"
 | 
						"github.com/containerd/containerd/gc"
 | 
				
			||||||
	"github.com/containerd/containerd/log"
 | 
						"github.com/containerd/containerd/log"
 | 
				
			||||||
	"github.com/pkg/errors"
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
						bolt "go.etcd.io/bbolt"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/metadata/images.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/metadata/images.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -23,7 +23,6 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/boltdb/bolt"
 | 
					 | 
				
			||||||
	"github.com/containerd/containerd/errdefs"
 | 
						"github.com/containerd/containerd/errdefs"
 | 
				
			||||||
	"github.com/containerd/containerd/filters"
 | 
						"github.com/containerd/containerd/filters"
 | 
				
			||||||
	"github.com/containerd/containerd/images"
 | 
						"github.com/containerd/containerd/images"
 | 
				
			||||||
@@ -33,6 +32,7 @@ import (
 | 
				
			|||||||
	digest "github.com/opencontainers/go-digest"
 | 
						digest "github.com/opencontainers/go-digest"
 | 
				
			||||||
	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
						ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
				
			||||||
	"github.com/pkg/errors"
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
						bolt "go.etcd.io/bbolt"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type imageStore struct {
 | 
					type imageStore struct {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/metadata/leases.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/metadata/leases.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -20,7 +20,6 @@ import (
 | 
				
			|||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/boltdb/bolt"
 | 
					 | 
				
			||||||
	"github.com/containerd/containerd/errdefs"
 | 
						"github.com/containerd/containerd/errdefs"
 | 
				
			||||||
	"github.com/containerd/containerd/filters"
 | 
						"github.com/containerd/containerd/filters"
 | 
				
			||||||
	"github.com/containerd/containerd/leases"
 | 
						"github.com/containerd/containerd/leases"
 | 
				
			||||||
@@ -28,6 +27,7 @@ import (
 | 
				
			|||||||
	"github.com/containerd/containerd/namespaces"
 | 
						"github.com/containerd/containerd/namespaces"
 | 
				
			||||||
	digest "github.com/opencontainers/go-digest"
 | 
						digest "github.com/opencontainers/go-digest"
 | 
				
			||||||
	"github.com/pkg/errors"
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
						bolt "go.etcd.io/bbolt"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// LeaseManager manages the create/delete lifecyle of leases
 | 
					// LeaseManager manages the create/delete lifecyle of leases
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										14
									
								
								vendor/github.com/containerd/containerd/metadata/migrations.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								vendor/github.com/containerd/containerd/metadata/migrations.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -16,7 +16,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
package metadata
 | 
					package metadata
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "github.com/boltdb/bolt"
 | 
					import bolt "go.etcd.io/bbolt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type migration struct {
 | 
					type migration struct {
 | 
				
			||||||
	schema  string
 | 
						schema  string
 | 
				
			||||||
@@ -45,6 +45,11 @@ var migrations = []migration{
 | 
				
			|||||||
		version: 2,
 | 
							version: 2,
 | 
				
			||||||
		migrate: migrateIngests,
 | 
							migrate: migrateIngests,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							schema:  "v1",
 | 
				
			||||||
 | 
							version: 3,
 | 
				
			||||||
 | 
							migrate: noOpMigration,
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// addChildLinks Adds children key to the snapshotters to enforce snapshot
 | 
					// addChildLinks Adds children key to the snapshotters to enforce snapshot
 | 
				
			||||||
@@ -154,3 +159,10 @@ func migrateIngests(tx *bolt.Tx) error {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// noOpMigration was for a database change from boltdb/bolt which is no
 | 
				
			||||||
 | 
					// longer being supported, to go.etcd.io/bbolt which is the currently
 | 
				
			||||||
 | 
					// maintained repo for boltdb.
 | 
				
			||||||
 | 
					func noOpMigration(tx *bolt.Tx) error {
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/metadata/namespaces.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/metadata/namespaces.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -19,11 +19,11 @@ package metadata
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/boltdb/bolt"
 | 
					 | 
				
			||||||
	"github.com/containerd/containerd/errdefs"
 | 
						"github.com/containerd/containerd/errdefs"
 | 
				
			||||||
	l "github.com/containerd/containerd/labels"
 | 
						l "github.com/containerd/containerd/labels"
 | 
				
			||||||
	"github.com/containerd/containerd/namespaces"
 | 
						"github.com/containerd/containerd/namespaces"
 | 
				
			||||||
	"github.com/pkg/errors"
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
						bolt "go.etcd.io/bbolt"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type namespaceStore struct {
 | 
					type namespaceStore struct {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/metadata/snapshot.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/metadata/snapshot.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -23,7 +23,6 @@ import (
 | 
				
			|||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/boltdb/bolt"
 | 
					 | 
				
			||||||
	"github.com/containerd/containerd/errdefs"
 | 
						"github.com/containerd/containerd/errdefs"
 | 
				
			||||||
	"github.com/containerd/containerd/labels"
 | 
						"github.com/containerd/containerd/labels"
 | 
				
			||||||
	"github.com/containerd/containerd/log"
 | 
						"github.com/containerd/containerd/log"
 | 
				
			||||||
@@ -32,6 +31,7 @@ import (
 | 
				
			|||||||
	"github.com/containerd/containerd/namespaces"
 | 
						"github.com/containerd/containerd/namespaces"
 | 
				
			||||||
	"github.com/containerd/containerd/snapshots"
 | 
						"github.com/containerd/containerd/snapshots"
 | 
				
			||||||
	"github.com/pkg/errors"
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
						bolt "go.etcd.io/bbolt"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type snapshotter struct {
 | 
					type snapshotter struct {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								vendor/github.com/containerd/containerd/oci/spec.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/containerd/containerd/oci/spec.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -167,6 +167,7 @@ func populateDefaultUnixSpec(ctx context.Context, s *Spec, id string) error {
 | 
				
			|||||||
				Destination: "/proc",
 | 
									Destination: "/proc",
 | 
				
			||||||
				Type:        "proc",
 | 
									Type:        "proc",
 | 
				
			||||||
				Source:      "proc",
 | 
									Source:      "proc",
 | 
				
			||||||
 | 
									Options:     []string{"nosuid", "noexec", "nodev"},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				Destination: "/dev",
 | 
									Destination: "/dev",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										27
									
								
								vendor/github.com/containerd/containerd/oci/spec_opts.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								vendor/github.com/containerd/containerd/oci/spec_opts.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -268,6 +268,14 @@ func WithLinuxNamespace(ns specs.LinuxNamespace) SpecOpts {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// WithNewPrivileges turns off the NoNewPrivileges feature flag in the spec
 | 
				
			||||||
 | 
					func WithNewPrivileges(_ context.Context, _ Client, _ *containers.Container, s *Spec) error {
 | 
				
			||||||
 | 
						setProcess(s)
 | 
				
			||||||
 | 
						s.Process.NoNewPrivileges = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// WithImageConfig configures the spec to from the configuration of an Image
 | 
					// WithImageConfig configures the spec to from the configuration of an Image
 | 
				
			||||||
func WithImageConfig(image Image) SpecOpts {
 | 
					func WithImageConfig(image Image) SpecOpts {
 | 
				
			||||||
	return WithImageConfigArgs(image, nil)
 | 
						return WithImageConfigArgs(image, nil)
 | 
				
			||||||
@@ -315,8 +323,14 @@ func WithImageConfigArgs(image Image, args []string) SpecOpts {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
			s.Process.Cwd = cwd
 | 
								s.Process.Cwd = cwd
 | 
				
			||||||
			if config.User != "" {
 | 
								if config.User != "" {
 | 
				
			||||||
				return WithUser(config.User)(ctx, client, c, s)
 | 
									if err := WithUser(config.User)(ctx, client, c, s); err != nil {
 | 
				
			||||||
 | 
										return err
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									return WithAdditionalGIDs(fmt.Sprintf("%d", s.Process.User.UID))(ctx, client, c, s)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								// we should query the image's /etc/group for additional GIDs
 | 
				
			||||||
 | 
								// even if there is no specified user in the image config
 | 
				
			||||||
 | 
								return WithAdditionalGIDs("root")(ctx, client, c, s)
 | 
				
			||||||
		} else if s.Windows != nil {
 | 
							} else if s.Windows != nil {
 | 
				
			||||||
			s.Process.Env = config.Env
 | 
								s.Process.Env = config.Env
 | 
				
			||||||
			s.Process.Args = append(config.Entrypoint, config.Cmd...)
 | 
								s.Process.Args = append(config.Entrypoint, config.Cmd...)
 | 
				
			||||||
@@ -997,3 +1011,14 @@ var WithPrivileged = Compose(
 | 
				
			|||||||
	WithApparmorProfile(""),
 | 
						WithApparmorProfile(""),
 | 
				
			||||||
	WithSeccompUnconfined,
 | 
						WithSeccompUnconfined,
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// WithWindowsHyperV sets the Windows.HyperV section for HyperV isolation of containers.
 | 
				
			||||||
 | 
					func WithWindowsHyperV(_ context.Context, _ Client, _ *containers.Container, s *Spec) error {
 | 
				
			||||||
 | 
						if s.Windows == nil {
 | 
				
			||||||
 | 
							s.Windows = &specs.Windows{}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if s.Windows.HyperV == nil {
 | 
				
			||||||
 | 
							s.Windows.HyperV = &specs.WindowsHyperV{}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										7
									
								
								vendor/github.com/containerd/containerd/runtime/v1/linux/bundle.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/github.com/containerd/containerd/runtime/v1/linux/bundle.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -46,6 +46,9 @@ func newBundle(id, path, workDir string, spec []byte) (b *bundle, err error) {
 | 
				
			|||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	path = filepath.Join(path, id)
 | 
						path = filepath.Join(path, id)
 | 
				
			||||||
 | 
						if err := os.Mkdir(path, 0711); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	defer func() {
 | 
						defer func() {
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			os.RemoveAll(path)
 | 
								os.RemoveAll(path)
 | 
				
			||||||
@@ -60,10 +63,6 @@ func newBundle(id, path, workDir string, spec []byte) (b *bundle, err error) {
 | 
				
			|||||||
			os.RemoveAll(workDir)
 | 
								os.RemoveAll(workDir)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if err := os.Mkdir(path, 0711); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if err := os.Mkdir(filepath.Join(path, "rootfs"), 0711); err != nil {
 | 
						if err := os.Mkdir(filepath.Join(path, "rootfs"), 0711); err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/runtime/v1/linux/runtime.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/runtime/v1/linux/runtime.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -26,7 +26,6 @@ import (
 | 
				
			|||||||
	"path/filepath"
 | 
						"path/filepath"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/boltdb/bolt"
 | 
					 | 
				
			||||||
	eventstypes "github.com/containerd/containerd/api/events"
 | 
						eventstypes "github.com/containerd/containerd/api/events"
 | 
				
			||||||
	"github.com/containerd/containerd/api/types"
 | 
						"github.com/containerd/containerd/api/types"
 | 
				
			||||||
	"github.com/containerd/containerd/containers"
 | 
						"github.com/containerd/containerd/containers"
 | 
				
			||||||
@@ -49,6 +48,7 @@ import (
 | 
				
			|||||||
	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
						ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
				
			||||||
	"github.com/pkg/errors"
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
 | 
						bolt "go.etcd.io/bbolt"
 | 
				
			||||||
	"golang.org/x/sys/unix"
 | 
						"golang.org/x/sys/unix"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/runtime/v2/manager.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/runtime/v2/manager.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -23,7 +23,6 @@ import (
 | 
				
			|||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"path/filepath"
 | 
						"path/filepath"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/boltdb/bolt"
 | 
					 | 
				
			||||||
	"github.com/containerd/containerd/containers"
 | 
						"github.com/containerd/containerd/containers"
 | 
				
			||||||
	"github.com/containerd/containerd/events/exchange"
 | 
						"github.com/containerd/containerd/events/exchange"
 | 
				
			||||||
	"github.com/containerd/containerd/log"
 | 
						"github.com/containerd/containerd/log"
 | 
				
			||||||
@@ -32,6 +31,7 @@ import (
 | 
				
			|||||||
	"github.com/containerd/containerd/namespaces"
 | 
						"github.com/containerd/containerd/namespaces"
 | 
				
			||||||
	"github.com/containerd/containerd/plugin"
 | 
						"github.com/containerd/containerd/plugin"
 | 
				
			||||||
	"github.com/containerd/containerd/runtime"
 | 
						"github.com/containerd/containerd/runtime"
 | 
				
			||||||
 | 
						bolt "go.etcd.io/bbolt"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() {
 | 
					func init() {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/services/containers/local.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/services/containers/local.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -20,7 +20,6 @@ import (
 | 
				
			|||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/boltdb/bolt"
 | 
					 | 
				
			||||||
	eventstypes "github.com/containerd/containerd/api/events"
 | 
						eventstypes "github.com/containerd/containerd/api/events"
 | 
				
			||||||
	api "github.com/containerd/containerd/api/services/containers/v1"
 | 
						api "github.com/containerd/containerd/api/services/containers/v1"
 | 
				
			||||||
	"github.com/containerd/containerd/containers"
 | 
						"github.com/containerd/containerd/containers"
 | 
				
			||||||
@@ -30,6 +29,7 @@ import (
 | 
				
			|||||||
	"github.com/containerd/containerd/plugin"
 | 
						"github.com/containerd/containerd/plugin"
 | 
				
			||||||
	"github.com/containerd/containerd/services"
 | 
						"github.com/containerd/containerd/services"
 | 
				
			||||||
	ptypes "github.com/gogo/protobuf/types"
 | 
						ptypes "github.com/gogo/protobuf/types"
 | 
				
			||||||
 | 
						bolt "go.etcd.io/bbolt"
 | 
				
			||||||
	"google.golang.org/grpc"
 | 
						"google.golang.org/grpc"
 | 
				
			||||||
	"google.golang.org/grpc/codes"
 | 
						"google.golang.org/grpc/codes"
 | 
				
			||||||
	grpcm "google.golang.org/grpc/metadata"
 | 
						grpcm "google.golang.org/grpc/metadata"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								vendor/github.com/containerd/containerd/services/content/service.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/containerd/containerd/services/content/service.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -213,7 +213,7 @@ func (s *service) Read(req *api.ReadContentRequest, session api.Content_ReadServ
 | 
				
			|||||||
	_, err = io.CopyBuffer(
 | 
						_, err = io.CopyBuffer(
 | 
				
			||||||
		&readResponseWriter{session: session},
 | 
							&readResponseWriter{session: session},
 | 
				
			||||||
		io.NewSectionReader(ra, offset, size), *p)
 | 
							io.NewSectionReader(ra, offset, size), *p)
 | 
				
			||||||
	return err
 | 
						return errdefs.ToGRPC(err)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// readResponseWriter is a writer that places the output into ReadContentRequest messages.
 | 
					// readResponseWriter is a writer that places the output into ReadContentRequest messages.
 | 
				
			||||||
@@ -420,7 +420,7 @@ func (s *service) Write(session api.Content_WriteServer) (err error) {
 | 
				
			|||||||
				// maintain the offset as append only, we just issue the write.
 | 
									// maintain the offset as append only, we just issue the write.
 | 
				
			||||||
				n, err := wr.Write(req.Data)
 | 
									n, err := wr.Write(req.Data)
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					return err
 | 
										return errdefs.ToGRPC(err)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if n != len(req.Data) {
 | 
									if n != len(req.Data) {
 | 
				
			||||||
@@ -438,7 +438,7 @@ func (s *service) Write(session api.Content_WriteServer) (err error) {
 | 
				
			|||||||
					opts = append(opts, content.WithLabels(req.Labels))
 | 
										opts = append(opts, content.WithLabels(req.Labels))
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if err := wr.Commit(ctx, total, expected, opts...); err != nil {
 | 
									if err := wr.Commit(ctx, total, expected, opts...); err != nil {
 | 
				
			||||||
					return err
 | 
										return errdefs.ToGRPC(err)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/services/leases/local.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/services/leases/local.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -19,12 +19,12 @@ package leases
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/boltdb/bolt"
 | 
					 | 
				
			||||||
	"github.com/containerd/containerd/gc"
 | 
						"github.com/containerd/containerd/gc"
 | 
				
			||||||
	"github.com/containerd/containerd/leases"
 | 
						"github.com/containerd/containerd/leases"
 | 
				
			||||||
	"github.com/containerd/containerd/metadata"
 | 
						"github.com/containerd/containerd/metadata"
 | 
				
			||||||
	"github.com/containerd/containerd/plugin"
 | 
						"github.com/containerd/containerd/plugin"
 | 
				
			||||||
	"github.com/containerd/containerd/services"
 | 
						"github.com/containerd/containerd/services"
 | 
				
			||||||
 | 
						bolt "go.etcd.io/bbolt"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() {
 | 
					func init() {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/services/namespaces/local.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/services/namespaces/local.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -20,7 +20,6 @@ import (
 | 
				
			|||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/boltdb/bolt"
 | 
					 | 
				
			||||||
	eventstypes "github.com/containerd/containerd/api/events"
 | 
						eventstypes "github.com/containerd/containerd/api/events"
 | 
				
			||||||
	api "github.com/containerd/containerd/api/services/namespaces/v1"
 | 
						api "github.com/containerd/containerd/api/services/namespaces/v1"
 | 
				
			||||||
	"github.com/containerd/containerd/errdefs"
 | 
						"github.com/containerd/containerd/errdefs"
 | 
				
			||||||
@@ -30,6 +29,7 @@ import (
 | 
				
			|||||||
	"github.com/containerd/containerd/plugin"
 | 
						"github.com/containerd/containerd/plugin"
 | 
				
			||||||
	"github.com/containerd/containerd/services"
 | 
						"github.com/containerd/containerd/services"
 | 
				
			||||||
	ptypes "github.com/gogo/protobuf/types"
 | 
						ptypes "github.com/gogo/protobuf/types"
 | 
				
			||||||
 | 
						bolt "go.etcd.io/bbolt"
 | 
				
			||||||
	"google.golang.org/grpc"
 | 
						"google.golang.org/grpc"
 | 
				
			||||||
	"google.golang.org/grpc/codes"
 | 
						"google.golang.org/grpc/codes"
 | 
				
			||||||
	"google.golang.org/grpc/status"
 | 
						"google.golang.org/grpc/status"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/services/server/server.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/services/server/server.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -29,7 +29,6 @@ import (
 | 
				
			|||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/boltdb/bolt"
 | 
					 | 
				
			||||||
	csapi "github.com/containerd/containerd/api/services/content/v1"
 | 
						csapi "github.com/containerd/containerd/api/services/content/v1"
 | 
				
			||||||
	ssapi "github.com/containerd/containerd/api/services/snapshots/v1"
 | 
						ssapi "github.com/containerd/containerd/api/services/snapshots/v1"
 | 
				
			||||||
	"github.com/containerd/containerd/content"
 | 
						"github.com/containerd/containerd/content"
 | 
				
			||||||
@@ -46,6 +45,7 @@ import (
 | 
				
			|||||||
	metrics "github.com/docker/go-metrics"
 | 
						metrics "github.com/docker/go-metrics"
 | 
				
			||||||
	grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus"
 | 
						grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus"
 | 
				
			||||||
	"github.com/pkg/errors"
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
						bolt "go.etcd.io/bbolt"
 | 
				
			||||||
	"google.golang.org/grpc"
 | 
						"google.golang.org/grpc"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/services/tasks/local.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/services/tasks/local.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -26,7 +26,6 @@ import (
 | 
				
			|||||||
	"path/filepath"
 | 
						"path/filepath"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/boltdb/bolt"
 | 
					 | 
				
			||||||
	api "github.com/containerd/containerd/api/services/tasks/v1"
 | 
						api "github.com/containerd/containerd/api/services/tasks/v1"
 | 
				
			||||||
	"github.com/containerd/containerd/api/types"
 | 
						"github.com/containerd/containerd/api/types"
 | 
				
			||||||
	"github.com/containerd/containerd/api/types/task"
 | 
						"github.com/containerd/containerd/api/types/task"
 | 
				
			||||||
@@ -48,6 +47,7 @@ import (
 | 
				
			|||||||
	ptypes "github.com/gogo/protobuf/types"
 | 
						ptypes "github.com/gogo/protobuf/types"
 | 
				
			||||||
	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
						ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
				
			||||||
	"github.com/pkg/errors"
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
						bolt "go.etcd.io/bbolt"
 | 
				
			||||||
	"google.golang.org/grpc"
 | 
						"google.golang.org/grpc"
 | 
				
			||||||
	"google.golang.org/grpc/codes"
 | 
						"google.golang.org/grpc/codes"
 | 
				
			||||||
	"google.golang.org/grpc/status"
 | 
						"google.golang.org/grpc/status"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/snapshots/storage/bolt.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/snapshots/storage/bolt.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -23,11 +23,11 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/boltdb/bolt"
 | 
					 | 
				
			||||||
	"github.com/containerd/containerd/errdefs"
 | 
						"github.com/containerd/containerd/errdefs"
 | 
				
			||||||
	"github.com/containerd/containerd/metadata/boltutil"
 | 
						"github.com/containerd/containerd/metadata/boltutil"
 | 
				
			||||||
	"github.com/containerd/containerd/snapshots"
 | 
						"github.com/containerd/containerd/snapshots"
 | 
				
			||||||
	"github.com/pkg/errors"
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
						bolt "go.etcd.io/bbolt"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/snapshots/storage/metastore.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/snapshots/storage/metastore.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -25,9 +25,9 @@ import (
 | 
				
			|||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/boltdb/bolt"
 | 
					 | 
				
			||||||
	"github.com/containerd/containerd/snapshots"
 | 
						"github.com/containerd/containerd/snapshots"
 | 
				
			||||||
	"github.com/pkg/errors"
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
						bolt "go.etcd.io/bbolt"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Transactor is used to finalize an active transaction.
 | 
					// Transactor is used to finalize an active transaction.
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										5
									
								
								vendor/github.com/containerd/containerd/task.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/containerd/containerd/task.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -607,8 +607,11 @@ func writeContent(ctx context.Context, store content.Ingester, mediaType, ref st
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return d, err
 | 
							return d, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err := writer.Commit(ctx, size, "", opts...); err != nil {
 | 
						if err := writer.Commit(ctx, size, "", opts...); err != nil {
 | 
				
			||||||
		return d, err
 | 
							if !errdefs.IsAlreadyExists(err) {
 | 
				
			||||||
 | 
								return d, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return v1.Descriptor{
 | 
						return v1.Descriptor{
 | 
				
			||||||
		MediaType: mediaType,
 | 
							MediaType: mediaType,
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										41
									
								
								vendor/github.com/containerd/containerd/vendor.conf
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										41
									
								
								vendor/github.com/containerd/containerd/vendor.conf
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -4,7 +4,7 @@ github.com/containerd/cgroups 5e610833b72089b37d0e615de9a92dfc043757c2
 | 
				
			|||||||
github.com/containerd/typeurl a93fcdb778cd272c6e9b3028b2f42d813e785d40
 | 
					github.com/containerd/typeurl a93fcdb778cd272c6e9b3028b2f42d813e785d40
 | 
				
			||||||
github.com/containerd/fifo 3d5202aec260678c48179c56f40e6f38a095738c
 | 
					github.com/containerd/fifo 3d5202aec260678c48179c56f40e6f38a095738c
 | 
				
			||||||
github.com/containerd/btrfs 2e1aa0ddf94f91fa282b6ed87c23bf0d64911244
 | 
					github.com/containerd/btrfs 2e1aa0ddf94f91fa282b6ed87c23bf0d64911244
 | 
				
			||||||
github.com/containerd/continuity f44b615e492bdfb371aae2f76ec694d9da1db537
 | 
					github.com/containerd/continuity 7f53d412b9eb1cbf744c2063185d703a0ee34700
 | 
				
			||||||
github.com/coreos/go-systemd 48702e0da86bd25e76cfef347e2adeb434a0d0a6
 | 
					github.com/coreos/go-systemd 48702e0da86bd25e76cfef347e2adeb434a0d0a6
 | 
				
			||||||
github.com/docker/go-metrics 4ea375f7759c82740c893fc030bc37088d2ec098
 | 
					github.com/docker/go-metrics 4ea375f7759c82740c893fc030bc37088d2ec098
 | 
				
			||||||
github.com/docker/go-events 9461782956ad83b30282bf90e31fa6a70c255ba9
 | 
					github.com/docker/go-events 9461782956ad83b30282bf90e31fa6a70c255ba9
 | 
				
			||||||
@@ -19,8 +19,8 @@ github.com/matttproud/golang_protobuf_extensions v1.0.0
 | 
				
			|||||||
github.com/gogo/protobuf v1.0.0
 | 
					github.com/gogo/protobuf v1.0.0
 | 
				
			||||||
github.com/gogo/googleapis 08a7655d27152912db7aaf4f983275eaf8d128ef
 | 
					github.com/gogo/googleapis 08a7655d27152912db7aaf4f983275eaf8d128ef
 | 
				
			||||||
github.com/golang/protobuf v1.1.0
 | 
					github.com/golang/protobuf v1.1.0
 | 
				
			||||||
github.com/opencontainers/runtime-spec d810dbc60d8c5aeeb3d054bd1132fab2121968ce # v1.0.1-43-gd810dbc
 | 
					github.com/opencontainers/runtime-spec eba862dc2470385a233c7507392675cbeadf7353 # v1.0.1-45-geba862d
 | 
				
			||||||
github.com/opencontainers/runc 20aff4f0488c6d4b8df4d85b4f63f1f704c11abd
 | 
					github.com/opencontainers/runc 00dc70017d222b178a002ed30e9321b12647af2d
 | 
				
			||||||
github.com/sirupsen/logrus v1.0.0
 | 
					github.com/sirupsen/logrus v1.0.0
 | 
				
			||||||
github.com/urfave/cli 7bc6a0acffa589f415f88aca16cc1de5ffd66f9c
 | 
					github.com/urfave/cli 7bc6a0acffa589f415f88aca16cc1de5ffd66f9c
 | 
				
			||||||
golang.org/x/net b3756b4b77d7b13260a0a2ec658753cf48922eac
 | 
					golang.org/x/net b3756b4b77d7b13260a0a2ec658753cf48922eac
 | 
				
			||||||
@@ -33,18 +33,18 @@ golang.org/x/sync 450f422ab23cf9881c94e2db30cac0eb1b7cf80c
 | 
				
			|||||||
github.com/BurntSushi/toml a368813c5e648fee92e5f6c30e3944ff9d5e8895
 | 
					github.com/BurntSushi/toml a368813c5e648fee92e5f6c30e3944ff9d5e8895
 | 
				
			||||||
github.com/grpc-ecosystem/go-grpc-prometheus 6b7015e65d366bf3f19b2b2a000a831940f0f7e0
 | 
					github.com/grpc-ecosystem/go-grpc-prometheus 6b7015e65d366bf3f19b2b2a000a831940f0f7e0
 | 
				
			||||||
github.com/Microsoft/go-winio v0.4.10
 | 
					github.com/Microsoft/go-winio v0.4.10
 | 
				
			||||||
github.com/Microsoft/hcsshim 44c060121b68e8bdc40b411beba551f3b4ee9e55
 | 
					github.com/Microsoft/hcsshim v0.7.4
 | 
				
			||||||
github.com/boltdb/bolt e9cf4fae01b5a8ff89d0ec6b32f0d9c9f79aefdd
 | 
					 | 
				
			||||||
google.golang.org/genproto d80a6e20e776b0b17a324d0ba1ab50a39c8e8944
 | 
					google.golang.org/genproto d80a6e20e776b0b17a324d0ba1ab50a39c8e8944
 | 
				
			||||||
golang.org/x/text 19e51611da83d6be54ddafce4a4af510cb3e9ea4
 | 
					golang.org/x/text 19e51611da83d6be54ddafce4a4af510cb3e9ea4
 | 
				
			||||||
github.com/containerd/ttrpc 94dde388801693c54f88a6596f713b51a8b30b2d
 | 
					github.com/containerd/ttrpc 2a805f71863501300ae1976d29f0454ae003e85a
 | 
				
			||||||
github.com/syndtr/gocapability db04d3cc01c8b54962a58ec7e491717d06cfcc16
 | 
					github.com/syndtr/gocapability db04d3cc01c8b54962a58ec7e491717d06cfcc16
 | 
				
			||||||
gotest.tools v2.1.0
 | 
					gotest.tools v2.1.0
 | 
				
			||||||
github.com/google/go-cmp v0.1.0
 | 
					github.com/google/go-cmp v0.1.0
 | 
				
			||||||
 | 
					go.etcd.io/bbolt v1.3.1-etcd.8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# cri dependencies
 | 
					# cri dependencies
 | 
				
			||||||
github.com/containerd/cri v1.11.1
 | 
					github.com/containerd/cri 9f39e3289533fc228c5e5fcac0a6dbdd60c6047b # release/1.2 branch
 | 
				
			||||||
github.com/containerd/go-cni 5882530828ecf62032409b298a3e8b19e08b6534
 | 
					github.com/containerd/go-cni 6d7b509a054a3cb1c35ed1865d4fde2f0cb547cd
 | 
				
			||||||
github.com/blang/semver v3.1.0
 | 
					github.com/blang/semver v3.1.0
 | 
				
			||||||
github.com/containernetworking/cni v0.6.0
 | 
					github.com/containernetworking/cni v0.6.0
 | 
				
			||||||
github.com/containernetworking/plugins v0.7.0
 | 
					github.com/containernetworking/plugins v0.7.0
 | 
				
			||||||
@@ -52,32 +52,33 @@ github.com/davecgh/go-spew v1.1.0
 | 
				
			|||||||
github.com/docker/distribution b38e5838b7b2f2ad48e06ec4b500011976080621
 | 
					github.com/docker/distribution b38e5838b7b2f2ad48e06ec4b500011976080621
 | 
				
			||||||
github.com/docker/docker 86f080cff0914e9694068ed78d503701667c4c00
 | 
					github.com/docker/docker 86f080cff0914e9694068ed78d503701667c4c00
 | 
				
			||||||
github.com/docker/spdystream 449fdfce4d962303d702fec724ef0ad181c92528
 | 
					github.com/docker/spdystream 449fdfce4d962303d702fec724ef0ad181c92528
 | 
				
			||||||
github.com/emicklei/go-restful ff4f55a206334ef123e4f79bbf348980da81ca46
 | 
					github.com/emicklei/go-restful v2.2.1
 | 
				
			||||||
github.com/ghodss/yaml 73d445a93680fa1a78ae23a5839bad48f32ba1ee
 | 
					github.com/ghodss/yaml v1.0.0
 | 
				
			||||||
github.com/golang/glog 44145f04b68cf362d9c4df2182967c2275eaefed
 | 
					github.com/golang/glog 44145f04b68cf362d9c4df2182967c2275eaefed
 | 
				
			||||||
github.com/google/gofuzz 44d81051d367757e1c7c6a5a86423ece9afcf63c
 | 
					github.com/google/gofuzz 44d81051d367757e1c7c6a5a86423ece9afcf63c
 | 
				
			||||||
github.com/hashicorp/errwrap 7554cd9344cec97297fa6649b055a8c98c2a1e55
 | 
					github.com/hashicorp/errwrap 7554cd9344cec97297fa6649b055a8c98c2a1e55
 | 
				
			||||||
github.com/hashicorp/go-multierror ed905158d87462226a13fe39ddf685ea65f1c11f
 | 
					github.com/hashicorp/go-multierror ed905158d87462226a13fe39ddf685ea65f1c11f
 | 
				
			||||||
github.com/json-iterator/go f2b4162afba35581b6d4a50d3b8f34e33c144682
 | 
					github.com/json-iterator/go 1.1.5
 | 
				
			||||||
github.com/modern-go/reflect2 05fbef0ca5da472bbf96c9322b84a53edc03c9fd
 | 
					github.com/modern-go/reflect2 1.0.1
 | 
				
			||||||
github.com/modern-go/concurrent 1.0.3
 | 
					github.com/modern-go/concurrent 1.0.3
 | 
				
			||||||
github.com/opencontainers/runtime-tools v0.6.0
 | 
					github.com/opencontainers/runtime-tools v0.6.0
 | 
				
			||||||
github.com/opencontainers/selinux 4a2974bf1ee960774ffd517717f1f45325af0206
 | 
					github.com/opencontainers/selinux b6fa367ed7f534f9ba25391cc2d467085dbb445a
 | 
				
			||||||
github.com/seccomp/libseccomp-golang 32f571b70023028bd57d9288c20efbcb237f3ce0
 | 
					github.com/seccomp/libseccomp-golang 32f571b70023028bd57d9288c20efbcb237f3ce0
 | 
				
			||||||
github.com/tchap/go-patricia 5ad6cdb7538b0097d5598c7e57f0a24072adf7dc
 | 
					github.com/tchap/go-patricia v2.2.6
 | 
				
			||||||
github.com/xeipuuv/gojsonpointer 4e3ac2762d5f479393488629ee9370b50873b3a6
 | 
					github.com/xeipuuv/gojsonpointer 4e3ac2762d5f479393488629ee9370b50873b3a6
 | 
				
			||||||
github.com/xeipuuv/gojsonreference bd5ef7bd5415a7ac448318e64f11a24cd21e594b
 | 
					github.com/xeipuuv/gojsonreference bd5ef7bd5415a7ac448318e64f11a24cd21e594b
 | 
				
			||||||
github.com/xeipuuv/gojsonschema 1d523034197ff1f222f6429836dd36a2457a1874
 | 
					github.com/xeipuuv/gojsonschema 1d523034197ff1f222f6429836dd36a2457a1874
 | 
				
			||||||
golang.org/x/crypto 49796115aa4b964c318aad4f3084fdb41e9aa067
 | 
					golang.org/x/crypto 49796115aa4b964c318aad4f3084fdb41e9aa067
 | 
				
			||||||
 | 
					golang.org/x/oauth2 a6bd8cefa1811bd24b86f8902872e4e8225f74c4
 | 
				
			||||||
golang.org/x/time f51c12702a4d776e4c1fa9b0fabab841babae631
 | 
					golang.org/x/time f51c12702a4d776e4c1fa9b0fabab841babae631
 | 
				
			||||||
gopkg.in/inf.v0 3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4
 | 
					gopkg.in/inf.v0 3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4
 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.1
 | 
					gopkg.in/yaml.v2 v2.2.1
 | 
				
			||||||
k8s.io/api 9e5ffd1f1320950b238cfce291b926411f0af722
 | 
					k8s.io/api 012f271b5d41baad56190c5f1ae19bff16df0fd8
 | 
				
			||||||
k8s.io/apimachinery ed135c5b96450fd24e5e981c708114fbbd950697
 | 
					k8s.io/apimachinery 6429050ef506887d121f3e7306e894f8900d8a63
 | 
				
			||||||
k8s.io/apiserver a90e3a95c2e91b944bfca8225c4e0d12e42a9eb5
 | 
					k8s.io/apiserver e9312c15296b6c2c923ebd5031ff5d1d5fd022d7
 | 
				
			||||||
k8s.io/client-go 03bfb9bdcfe5482795b999f39ca3ed9ad42ce5bb
 | 
					k8s.io/client-go 37c3c02ec96533daec0dbda1f39a6b1d68505c79
 | 
				
			||||||
k8s.io/kubernetes v1.11.0
 | 
					k8s.io/kubernetes v1.12.0-beta.1
 | 
				
			||||||
k8s.io/utils 733eca437aa39379e4bcc25e726439dfca40fcff
 | 
					k8s.io/utils 982821ea41da7e7c15f3d3738921eb2e7e241ccd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# zfs dependencies
 | 
					# zfs dependencies
 | 
				
			||||||
github.com/containerd/zfs 9a0b8b8b5982014b729cd34eb7cd7a11062aa6ec
 | 
					github.com/containerd/zfs 9a0b8b8b5982014b729cd34eb7cd7a11062aa6ec
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/version/version.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/version/version.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -21,7 +21,7 @@ var (
 | 
				
			|||||||
	Package = "github.com/containerd/containerd"
 | 
						Package = "github.com/containerd/containerd"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Version holds the complete version number. Filled in at linking time.
 | 
						// Version holds the complete version number. Filled in at linking time.
 | 
				
			||||||
	Version = "1.2.0-beta.2+unknown"
 | 
						Version = "1.2.0-rc.0+unknown"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Revision is filled with the VCS (e.g. git) revision being used to build
 | 
						// Revision is filled with the VCS (e.g. git) revision being used to build
 | 
				
			||||||
	// the program at linking time.
 | 
						// the program at linking time.
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/context.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/context.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package continuity
 | 
					package continuity
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/devices/devices.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/devices/devices.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package devices
 | 
					package devices
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "fmt"
 | 
					import "fmt"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/devices/devices_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/devices/devices_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,5 +1,21 @@
 | 
				
			|||||||
// +build linux darwin freebsd solaris
 | 
					// +build linux darwin freebsd solaris
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package devices
 | 
					package devices
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/devices/devices_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/devices/devices_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package devices
 | 
					package devices
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/digests.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/digests.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package continuity
 | 
					package continuity
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/driver/driver.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/driver/driver.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package driver
 | 
					package driver
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										28
									
								
								vendor/github.com/containerd/continuity/driver/driver_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								vendor/github.com/containerd/continuity/driver/driver_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,5 +1,21 @@
 | 
				
			|||||||
// +build linux darwin freebsd solaris
 | 
					// +build linux darwin freebsd solaris
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package driver
 | 
					package driver
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
@@ -13,7 +29,11 @@ import (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (d *driver) Mknod(path string, mode os.FileMode, major, minor int) error {
 | 
					func (d *driver) Mknod(path string, mode os.FileMode, major, minor int) error {
 | 
				
			||||||
	return devices.Mknod(path, mode, major, minor)
 | 
						err := devices.Mknod(path, mode, major, minor)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							err = &os.PathError{Op: "mknod", Path: path, Err: err}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (d *driver) Mkfifo(path string, mode os.FileMode) error {
 | 
					func (d *driver) Mkfifo(path string, mode os.FileMode) error {
 | 
				
			||||||
@@ -22,7 +42,11 @@ func (d *driver) Mkfifo(path string, mode os.FileMode) error {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	// mknod with a mode that has ModeNamedPipe set creates a fifo, not a
 | 
						// mknod with a mode that has ModeNamedPipe set creates a fifo, not a
 | 
				
			||||||
	// device.
 | 
						// device.
 | 
				
			||||||
	return devices.Mknod(path, mode, 0, 0)
 | 
						err := devices.Mknod(path, mode, 0, 0)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							err = &os.PathError{Op: "mkfifo", Path: path, Err: err}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Getxattr returns all of the extended attributes for the file at path p.
 | 
					// Getxattr returns all of the extended attributes for the file at path p.
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										21
									
								
								vendor/github.com/containerd/continuity/driver/driver_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								vendor/github.com/containerd/continuity/driver/driver_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,18 +1,33 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package driver
 | 
					package driver
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/containerd/continuity/sysx"
 | 
						"github.com/containerd/continuity/sysx"
 | 
				
			||||||
	"github.com/pkg/errors"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (d *driver) Mknod(path string, mode os.FileMode, major, minor int) error {
 | 
					func (d *driver) Mknod(path string, mode os.FileMode, major, minor int) error {
 | 
				
			||||||
	return errors.Wrap(ErrNotSupported, "cannot create device node on Windows")
 | 
						return &os.PathError{Op: "mknod", Path: path, Err: ErrNotSupported}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (d *driver) Mkfifo(path string, mode os.FileMode) error {
 | 
					func (d *driver) Mkfifo(path string, mode os.FileMode) error {
 | 
				
			||||||
	return errors.Wrap(ErrNotSupported, "cannot create fifo on Windows")
 | 
						return &os.PathError{Op: "mkfifo", Path: path, Err: ErrNotSupported}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Lchmod changes the mode of an file not following symlinks.
 | 
					// Lchmod changes the mode of an file not following symlinks.
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										22
									
								
								vendor/github.com/containerd/continuity/driver/lchmod_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/github.com/containerd/continuity/driver/lchmod_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package driver
 | 
					package driver
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
@@ -15,5 +31,9 @@ func (d *driver) Lchmod(path string, mode os.FileMode) error {
 | 
				
			|||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return unix.Fchmodat(unix.AT_FDCWD, path, uint32(mode), 0)
 | 
						err := unix.Fchmodat(unix.AT_FDCWD, path, uint32(mode), 0)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							err = &os.PathError{Op: "lchmod", Path: path, Err: err}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										22
									
								
								vendor/github.com/containerd/continuity/driver/lchmod_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/github.com/containerd/continuity/driver/lchmod_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,5 +1,21 @@
 | 
				
			|||||||
// +build darwin freebsd solaris
 | 
					// +build darwin freebsd solaris
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package driver
 | 
					package driver
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
@@ -10,5 +26,9 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Lchmod changes the mode of a file not following symlinks.
 | 
					// Lchmod changes the mode of a file not following symlinks.
 | 
				
			||||||
func (d *driver) Lchmod(path string, mode os.FileMode) error {
 | 
					func (d *driver) Lchmod(path string, mode os.FileMode) error {
 | 
				
			||||||
	return unix.Fchmodat(unix.AT_FDCWD, path, uint32(mode), unix.AT_SYMLINK_NOFOLLOW)
 | 
						err := unix.Fchmodat(unix.AT_FDCWD, path, uint32(mode), unix.AT_SYMLINK_NOFOLLOW)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							err = &os.PathError{Op: "lchmod", Path: path, Err: err}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/driver/utils.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/driver/utils.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package driver
 | 
					package driver
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/copy.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/copy.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package fs
 | 
					package fs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/copy_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/copy_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package fs
 | 
					package fs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/copy_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/copy_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,5 +1,21 @@
 | 
				
			|||||||
// +build solaris darwin freebsd
 | 
					// +build solaris darwin freebsd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package fs
 | 
					package fs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/copy_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/copy_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package fs
 | 
					package fs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/diff.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/diff.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package fs
 | 
					package fs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/diff_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/diff_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,5 +1,21 @@
 | 
				
			|||||||
// +build !windows
 | 
					// +build !windows
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package fs
 | 
					package fs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/diff_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/diff_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package fs
 | 
					package fs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/dtype_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/dtype_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,5 +1,21 @@
 | 
				
			|||||||
// +build linux
 | 
					// +build linux
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package fs
 | 
					package fs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/du.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/du.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package fs
 | 
					package fs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "context"
 | 
					import "context"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/du_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/du_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,5 +1,21 @@
 | 
				
			|||||||
// +build !windows
 | 
					// +build !windows
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package fs
 | 
					package fs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/du_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/du_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,5 +1,21 @@
 | 
				
			|||||||
// +build windows
 | 
					// +build windows
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package fs
 | 
					package fs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/hardlink.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/hardlink.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package fs
 | 
					package fs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "os"
 | 
					import "os"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/hardlink_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/hardlink_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,5 +1,21 @@
 | 
				
			|||||||
// +build !windows
 | 
					// +build !windows
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package fs
 | 
					package fs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/hardlink_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/hardlink_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package fs
 | 
					package fs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "os"
 | 
					import "os"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										22
									
								
								vendor/github.com/containerd/continuity/fs/path.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/github.com/containerd/continuity/fs/path.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package fs
 | 
					package fs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
@@ -232,12 +248,6 @@ func walkLink(root, path string, linksWalked *int) (newpath string, islink bool,
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return "", false, err
 | 
							return "", false, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if filepath.IsAbs(newpath) && strings.HasPrefix(newpath, root) {
 | 
					 | 
				
			||||||
		newpath = newpath[:len(root)]
 | 
					 | 
				
			||||||
		if !strings.HasPrefix(newpath, "/") {
 | 
					 | 
				
			||||||
			newpath = "/" + newpath
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	*linksWalked++
 | 
						*linksWalked++
 | 
				
			||||||
	return newpath, true, nil
 | 
						return newpath, true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/stat_bsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/stat_bsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,5 +1,21 @@
 | 
				
			|||||||
// +build darwin freebsd
 | 
					// +build darwin freebsd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package fs
 | 
					package fs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/stat_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/stat_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package fs
 | 
					package fs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/time.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/fs/time.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package fs
 | 
					package fs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "time"
 | 
					import "time"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/groups_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/groups_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package continuity
 | 
					package continuity
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/hardlinks.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/hardlinks.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package continuity
 | 
					package continuity
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/hardlinks_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/hardlinks_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,5 +1,21 @@
 | 
				
			|||||||
// +build linux darwin freebsd solaris
 | 
					// +build linux darwin freebsd solaris
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package continuity
 | 
					package continuity
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/hardlinks_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/hardlinks_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package continuity
 | 
					package continuity
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "os"
 | 
					import "os"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/ioutils.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/ioutils.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package continuity
 | 
					package continuity
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/manifest.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/manifest.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package continuity
 | 
					package continuity
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/pathdriver/path_driver.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/pathdriver/path_driver.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package pathdriver
 | 
					package pathdriver
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/continuity/proto/gen.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/continuity/proto/gen.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package proto
 | 
					package proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//go:generate protoc --go_out=. manifest.proto
 | 
					//go:generate protoc --go_out=. manifest.proto
 | 
				
			||||||
 
 | 
				
			|||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user