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
 | 
			
		||||
	backOffMaxDuration         = 5 * time.Minute
 | 
			
		||||
	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.
 | 
			
		||||
// TODO(random-liu): [P1] Figure out is it possible to drop event during containerd
 | 
			
		||||
// is running. If it is, we should do periodically list to sync state with containerd.
 | 
			
		||||
// TODO(random-liu): Handle event for each container in a separate goroutine.
 | 
			
		||||
type eventMonitor struct {
 | 
			
		||||
	containerStore *containerstore.Store
 | 
			
		||||
	sandboxStore   *sandboxstore.Store
 | 
			
		||||
@@ -189,6 +195,9 @@ func (em *eventMonitor) stop() {
 | 
			
		||||
// handleEvent handles a containerd event.
 | 
			
		||||
func (em *eventMonitor) handleEvent(any interface{}) error {
 | 
			
		||||
	ctx := ctrdutil.NamespacedContext()
 | 
			
		||||
	ctx, cancel := context.WithTimeout(ctx, handleEventTimeout)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
 | 
			
		||||
	switch any.(type) {
 | 
			
		||||
	// If containerd-shim exits unexpectedly, there will be no corresponding event.
 | 
			
		||||
	// 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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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.
 | 
			
		||||
func (c *criService) loadContainer(ctx context.Context, cntr containerd.Container) (containerstore.Container, error) {
 | 
			
		||||
	ctx, cancel := context.WithTimeout(ctx, loadContainerTimeout)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
	id := cntr.ID()
 | 
			
		||||
	containerDir := c.getContainerRootDir(id)
 | 
			
		||||
	volatileContainerDir := c.getVolatileContainerRootDir(id)
 | 
			
		||||
@@ -290,9 +305,9 @@ const (
 | 
			
		||||
// unknownContainerStatus returns the default container status when its status is unknown.
 | 
			
		||||
func unknownContainerStatus() containerstore.Status {
 | 
			
		||||
	return containerstore.Status{
 | 
			
		||||
		CreatedAt:  time.Now().UnixNano(),
 | 
			
		||||
		StartedAt:  time.Now().UnixNano(),
 | 
			
		||||
		FinishedAt: time.Now().UnixNano(),
 | 
			
		||||
		CreatedAt:  0,
 | 
			
		||||
		StartedAt:  0,
 | 
			
		||||
		FinishedAt: 0,
 | 
			
		||||
		ExitCode:   unknownExitCode,
 | 
			
		||||
		Reason:     unknownExitReason,
 | 
			
		||||
	}
 | 
			
		||||
@@ -300,6 +315,8 @@ func unknownContainerStatus() containerstore.Status {
 | 
			
		||||
 | 
			
		||||
// loadSandbox loads sandbox from containerd.
 | 
			
		||||
func loadSandbox(ctx context.Context, cntr containerd.Container) (sandboxstore.Sandbox, error) {
 | 
			
		||||
	ctx, cancel := context.WithTimeout(ctx, loadContainerTimeout)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
	var sandbox sandboxstore.Sandbox
 | 
			
		||||
	// Load sandbox metadata.
 | 
			
		||||
	exts, err := cntr.Extensions(ctx)
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,7 @@ func NewFakeStore(images []Image) (*Store, error) {
 | 
			
		||||
			s.refCache[ref] = i.ID
 | 
			
		||||
		}
 | 
			
		||||
		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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										12
									
								
								vendor.conf
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								vendor.conf
									
									
									
									
									
								
							@@ -1,15 +1,14 @@
 | 
			
		||||
github.com/beorn7/perks 4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9
 | 
			
		||||
github.com/blang/semver v3.1.0
 | 
			
		||||
github.com/boltdb/bolt v1.3.1
 | 
			
		||||
github.com/BurntSushi/toml a368813c5e648fee92e5f6c30e3944ff9d5e8895
 | 
			
		||||
github.com/containerd/cgroups 5e610833b72089b37d0e615de9a92dfc043757c2
 | 
			
		||||
github.com/containerd/console c12b1e7919c14469339a5d38f2f8ed9b64a9de23
 | 
			
		||||
github.com/containerd/containerd 1950f791d9225ffe061c77e74e292bcb3c428a04
 | 
			
		||||
github.com/containerd/continuity f44b615e492bdfb371aae2f76ec694d9da1db537
 | 
			
		||||
github.com/containerd/containerd f88d3e5d6dfe9b7d7941ac5241649ad8240b9282
 | 
			
		||||
github.com/containerd/continuity 7f53d412b9eb1cbf744c2063185d703a0ee34700
 | 
			
		||||
github.com/containerd/fifo 3d5202aec260678c48179c56f40e6f38a095738c
 | 
			
		||||
github.com/containerd/go-cni 6d7b509a054a3cb1c35ed1865d4fde2f0cb547cd
 | 
			
		||||
github.com/containerd/go-runc 5a6d9f37cfa36b15efba46dc7ea349fa9b7143c3
 | 
			
		||||
github.com/containerd/ttrpc 94dde388801693c54f88a6596f713b51a8b30b2d
 | 
			
		||||
github.com/containerd/ttrpc 2a805f71863501300ae1976d29f0454ae003e85a
 | 
			
		||||
github.com/containerd/typeurl a93fcdb778cd272c6e9b3028b2f42d813e785d40
 | 
			
		||||
github.com/containernetworking/cni v0.6.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/matttproud/golang_protobuf_extensions v1.0.0
 | 
			
		||||
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/reflect2 1.0.1
 | 
			
		||||
github.com/opencontainers/go-digest c9281466c8b2f606084ac71339773efd177436e7
 | 
			
		||||
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-tools fb101d5d42ab9c040f7d0a004e78336e5d5cb197
 | 
			
		||||
github.com/opencontainers/selinux b6fa367ed7f534f9ba25391cc2d467085dbb445a
 | 
			
		||||
@@ -59,6 +58,7 @@ github.com/urfave/cli 7bc6a0acffa589f415f88aca16cc1de5ffd66f9c
 | 
			
		||||
github.com/xeipuuv/gojsonpointer 4e3ac2762d5f479393488629ee9370b50873b3a6
 | 
			
		||||
github.com/xeipuuv/gojsonreference bd5ef7bd5415a7ac448318e64f11a24cd21e594b
 | 
			
		||||
github.com/xeipuuv/gojsonschema 1d523034197ff1f222f6429836dd36a2457a1874
 | 
			
		||||
go.etcd.io/bbolt v1.3.1-etcd.8
 | 
			
		||||
golang.org/x/crypto 49796115aa4b964c318aad4f3084fdb41e9aa067
 | 
			
		||||
golang.org/x/net b3756b4b77d7b13260a0a2ec658753cf48922eac
 | 
			
		||||
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 (
 | 
			
		||||
	"crypto/rand"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var _ = (json.Marshaler)(&GUID{})
 | 
			
		||||
var _ = (json.Unmarshaler)(&GUID{})
 | 
			
		||||
 | 
			
		||||
type GUID [16]byte
 | 
			
		||||
 | 
			
		||||
func New() GUID {
 | 
			
		||||
@@ -20,3 +26,44 @@ func New() GUID {
 | 
			
		||||
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:])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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 (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"syscall"
 | 
			
		||||
@@ -83,7 +84,10 @@ func (process *Process) Kill() error {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var resultp *uint16
 | 
			
		||||
	completed := false
 | 
			
		||||
	go syscallWatcher(fmt.Sprintf("TerminateProcess %s: %d", process.SystemID(), process.Pid()), &completed)
 | 
			
		||||
	err := hcsTerminateProcess(process.handle, &resultp)
 | 
			
		||||
	completed = true
 | 
			
		||||
	events := processHcsResult(resultp)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return makeProcessError(process, operation, err, events)
 | 
			
		||||
@@ -177,7 +181,10 @@ func (process *Process) Properties() (*ProcessStatus, error) {
 | 
			
		||||
		resultp     *uint16
 | 
			
		||||
		propertiesp *uint16
 | 
			
		||||
	)
 | 
			
		||||
	completed := false
 | 
			
		||||
	go syscallWatcher(fmt.Sprintf("GetProcessProperties %s: %d", process.SystemID(), process.Pid()), &completed)
 | 
			
		||||
	err := hcsGetProcessProperties(process.handle, &propertiesp, &resultp)
 | 
			
		||||
	completed = true
 | 
			
		||||
	events := processHcsResult(resultp)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		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 (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"sync"
 | 
			
		||||
@@ -63,7 +64,10 @@ func CreateComputeSystem(id string, hcsDocumentInterface interface{}) (*System,
 | 
			
		||||
		resultp  *uint16
 | 
			
		||||
		identity syscall.Handle
 | 
			
		||||
	)
 | 
			
		||||
	completed := false
 | 
			
		||||
	go syscallWatcher(fmt.Sprintf("CreateCompleteSystem %s: %s", id, hcsDocument), &completed)
 | 
			
		||||
	createError := hcsCreateComputeSystem(id, hcsDocument, identity, &computeSystem.handle, &resultp)
 | 
			
		||||
	completed = true
 | 
			
		||||
 | 
			
		||||
	if createError == nil || IsPending(createError) {
 | 
			
		||||
		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 == ErrTimeout {
 | 
			
		||||
			// 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
 | 
			
		||||
		computeSystemsp *uint16
 | 
			
		||||
	)
 | 
			
		||||
	completed := false
 | 
			
		||||
	go syscallWatcher(fmt.Sprintf("GetComputeSystems %s:", query), &completed)
 | 
			
		||||
	err = hcsEnumerateComputeSystems(query, &computeSystemsp, &resultp)
 | 
			
		||||
	completed = true
 | 
			
		||||
	events := processHcsResult(resultp)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, &HcsError{Op: operation, Err: err, Events: events}
 | 
			
		||||
@@ -192,8 +199,11 @@ func (computeSystem *System) Start() error {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var resultp *uint16
 | 
			
		||||
	completed := false
 | 
			
		||||
	go syscallWatcher(fmt.Sprintf("StartComputeSystem %s:", computeSystem.ID()), &completed)
 | 
			
		||||
	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 {
 | 
			
		||||
		return makeSystemError(computeSystem, "Start", "", err, events)
 | 
			
		||||
	}
 | 
			
		||||
@@ -219,7 +229,10 @@ func (computeSystem *System) Shutdown() error {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var resultp *uint16
 | 
			
		||||
	completed := false
 | 
			
		||||
	go syscallWatcher(fmt.Sprintf("ShutdownComputeSystem %s:", computeSystem.ID()), &completed)
 | 
			
		||||
	err := hcsShutdownComputeSystem(computeSystem.handle, "", &resultp)
 | 
			
		||||
	completed = true
 | 
			
		||||
	events := processHcsResult(resultp)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return makeSystemError(computeSystem, "Shutdown", "", err, events)
 | 
			
		||||
@@ -242,7 +255,10 @@ func (computeSystem *System) Terminate() error {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var resultp *uint16
 | 
			
		||||
	completed := false
 | 
			
		||||
	go syscallWatcher(fmt.Sprintf("TerminateComputeSystem %s:", computeSystem.ID()), &completed)
 | 
			
		||||
	err := hcsTerminateComputeSystem(computeSystem.handle, "", &resultp)
 | 
			
		||||
	completed = true
 | 
			
		||||
	events := processHcsResult(resultp)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return makeSystemError(computeSystem, "Terminate", "", err, events)
 | 
			
		||||
@@ -291,7 +307,10 @@ func (computeSystem *System) Properties(types ...schema1.PropertyType) (*schema1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var resultp, propertiesp *uint16
 | 
			
		||||
	completed := false
 | 
			
		||||
	go syscallWatcher(fmt.Sprintf("GetComputeSystemProperties %s:", computeSystem.ID()), &completed)
 | 
			
		||||
	err = hcsGetComputeSystemProperties(computeSystem.handle, string(queryj), &propertiesp, &resultp)
 | 
			
		||||
	completed = true
 | 
			
		||||
	events := processHcsResult(resultp)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, makeSystemError(computeSystem, "Properties", "", err, events)
 | 
			
		||||
@@ -320,8 +339,11 @@ func (computeSystem *System) Pause() error {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var resultp *uint16
 | 
			
		||||
	completed := false
 | 
			
		||||
	go syscallWatcher(fmt.Sprintf("PauseComputeSystem %s:", computeSystem.ID()), &completed)
 | 
			
		||||
	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 {
 | 
			
		||||
		return makeSystemError(computeSystem, "Pause", "", err, events)
 | 
			
		||||
	}
 | 
			
		||||
@@ -342,8 +364,11 @@ func (computeSystem *System) Resume() error {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var resultp *uint16
 | 
			
		||||
	completed := false
 | 
			
		||||
	go syscallWatcher(fmt.Sprintf("ResumeComputeSystem %s:", computeSystem.ID()), &completed)
 | 
			
		||||
	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 {
 | 
			
		||||
		return makeSystemError(computeSystem, "Resume", "", err, events)
 | 
			
		||||
	}
 | 
			
		||||
@@ -375,7 +400,10 @@ func (computeSystem *System) CreateProcess(c interface{}) (*Process, error) {
 | 
			
		||||
	configuration := string(configurationb)
 | 
			
		||||
	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)
 | 
			
		||||
	completed = true
 | 
			
		||||
	events := processHcsResult(resultp)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		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)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	completed := false
 | 
			
		||||
	go syscallWatcher(fmt.Sprintf("OpenProcess %s: %d", computeSystem.ID(), pid), &completed)
 | 
			
		||||
	err := hcsOpenProcess(computeSystem.handle, uint32(pid), &processHandle, &resultp)
 | 
			
		||||
	completed = true
 | 
			
		||||
	events := processHcsResult(resultp)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, makeSystemError(computeSystem, "OpenProcess", "", err, events)
 | 
			
		||||
@@ -451,7 +482,11 @@ func (computeSystem *System) Close() error {
 | 
			
		||||
		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)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -537,7 +572,10 @@ func (computeSystem *System) Modify(config interface{}) error {
 | 
			
		||||
	logrus.Debugf(title + " " + requestString)
 | 
			
		||||
 | 
			
		||||
	var resultp *uint16
 | 
			
		||||
	completed := false
 | 
			
		||||
	go syscallWatcher(fmt.Sprintf("ModifyComputeSystem %s: %s", computeSystem.ID(), requestString), &completed)
 | 
			
		||||
	err = hcsModifyComputeSystem(computeSystem.handle, requestString, &resultp)
 | 
			
		||||
	completed = true
 | 
			
		||||
	events := processHcsResult(resultp)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Duration is the default time to wait for various operations.
 | 
			
		||||
// - Waiting for async notifications from HCS
 | 
			
		||||
// - Waiting for processes to launch through
 | 
			
		||||
// - Waiting to copy data to/from a launched processes stdio pipes.
 | 
			
		||||
//
 | 
			
		||||
// This can be overridden through environment variable `HCS_TIMEOUT_SECONDS`
 | 
			
		||||
var (
 | 
			
		||||
	// defaultTimeout is the timeout for most operations that is not overridden.
 | 
			
		||||
	defaultTimeout = 4 * time.Minute
 | 
			
		||||
 | 
			
		||||
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() {
 | 
			
		||||
	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 {
 | 
			
		||||
		e, err := strconv.Atoi(envTimeout)
 | 
			
		||||
		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.
 | 
			
		||||
func CreateLayer(path, parent string) error {
 | 
			
		||||
	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)
 | 
			
		||||
	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)
 | 
			
		||||
		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
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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.
 | 
			
		||||
 | 
			
		||||
**Slack:** https://dockr.ly/community
 | 
			
		||||
**Slack:** https://join.slack.com/t/dockercommunity/shared_invite/enQtNDM4NjAwNDMyOTUwLWZlMDZmYWRjZjk4Zjc5ZGQ5NWZkOWI1Yjk2NGE3ZWVlYjYxM2VhYjczOWIyZDFhZTE3NTUwZWQzMjhmNGYyZTg
 | 
			
		||||
 | 
			
		||||
### 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.
 | 
			
		||||
	//
 | 
			
		||||
	// 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
 | 
			
		||||
	// 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.
 | 
			
		||||
	//
 | 
			
		||||
	// 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
 | 
			
		||||
	// 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.
 | 
			
		||||
	//
 | 
			
		||||
	// 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
 | 
			
		||||
	// 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"
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"compress/gzip"
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"os"
 | 
			
		||||
	"os/exec"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"sync"
 | 
			
		||||
 | 
			
		||||
	"github.com/containerd/containerd/log"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
@@ -37,6 +43,13 @@ const (
 | 
			
		||||
	Gzip
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const disablePigzEnv = "CONTAINERD_DISABLE_PIGZ"
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	initPigz   sync.Once
 | 
			
		||||
	unpigzPath string
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	bufioReader32KPool = &sync.Pool{
 | 
			
		||||
		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}
 | 
			
		||||
		return readBufWrapper, nil
 | 
			
		||||
	case Gzip:
 | 
			
		||||
		gzReader, err := gzip.NewReader(buf)
 | 
			
		||||
		ctx, cancel := context.WithCancel(context.Background())
 | 
			
		||||
		gzReader, err := gzipDecompress(ctx, buf)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			cancel()
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		readBufWrapper := &readCloserWrapper{gzReader, compression, closer}
 | 
			
		||||
 | 
			
		||||
		readBufWrapper := &readCloserWrapper{gzReader, compression, func() error {
 | 
			
		||||
			cancel()
 | 
			
		||||
			return closer()
 | 
			
		||||
		}}
 | 
			
		||||
 | 
			
		||||
		return readBufWrapper, nil
 | 
			
		||||
	default:
 | 
			
		||||
		return nil, fmt.Errorf("unsupported compression format %s", (&compression).Extension())
 | 
			
		||||
@@ -151,3 +171,67 @@ func (compression *Compression) Extension() string {
 | 
			
		||||
	}
 | 
			
		||||
	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.WithBackoffMaxDelay(3 * time.Second),
 | 
			
		||||
	}
 | 
			
		||||
	ctx, cancel := gocontext.WithTimeout(gocontext.Background(), 60*time.Second)
 | 
			
		||||
	ctx, cancel := gocontext.WithTimeout(gocontext.Background(), 2*time.Second)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
	conn, err := grpc.DialContext(ctx, dialer.DialAddress(address), gopts...)
 | 
			
		||||
	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",
 | 
			
		||||
			Usage: "add gpus to the container",
 | 
			
		||||
		},
 | 
			
		||||
		cli.BoolFlag{
 | 
			
		||||
			Name:  "allow-new-privs",
 | 
			
		||||
			Usage: "turn off OCI spec's NoNewPrivileges feature flag",
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										68
									
								
								vendor/github.com/containerd/containerd/cmd/ctr/commands/images/import.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										68
									
								
								vendor/github.com/containerd/containerd/cmd/ctr/commands/images/import.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -20,10 +20,11 @@ import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"os"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/containerd/containerd"
 | 
			
		||||
	"github.com/containerd/containerd/cmd/ctr/commands"
 | 
			
		||||
	"github.com/containerd/containerd/images"
 | 
			
		||||
	oci "github.com/containerd/containerd/images/oci"
 | 
			
		||||
	"github.com/containerd/containerd/images/archive"
 | 
			
		||||
	"github.com/containerd/containerd/log"
 | 
			
		||||
	"github.com/urfave/cli"
 | 
			
		||||
)
 | 
			
		||||
@@ -34,45 +35,58 @@ var importCommand = cli.Command{
 | 
			
		||||
	ArgsUsage: "[flags] <in>",
 | 
			
		||||
	Description: `Import images from a tar stream.
 | 
			
		||||
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)
 | 
			
		||||
but does not contain the base image name.
 | 
			
		||||
For OCI v1, you may need to specify --base-name because an OCI archive may
 | 
			
		||||
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.
 | 
			
		||||
  $ 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
 | 
			
		||||
"foo/bar:latest" and "foo/bar@sha256:deadbeef" images in the containerd store.
 | 
			
		||||
`,
 | 
			
		||||
	Flags: append([]cli.Flag{
 | 
			
		||||
		cli.StringFlag{
 | 
			
		||||
			Name:  "format",
 | 
			
		||||
			Value: "oci.v1",
 | 
			
		||||
			Usage: "image format. See DESCRIPTION.",
 | 
			
		||||
			Name:  "base-name",
 | 
			
		||||
			Value: "",
 | 
			
		||||
			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{
 | 
			
		||||
			Name:  "oci-name",
 | 
			
		||||
			Value: "unknown/unknown",
 | 
			
		||||
			Usage: "prefix added to either oci.v1 ref annotation or digest",
 | 
			
		||||
			Name:  "index-name",
 | 
			
		||||
			Usage: "image name to keep index as, by default index is discarded",
 | 
			
		||||
		},
 | 
			
		||||
		// TODO(AkihiroSuda): support commands.LabelFlag (for all children objects)
 | 
			
		||||
	}, commands.SnapshotterFlags...),
 | 
			
		||||
 | 
			
		||||
	Action: func(context *cli.Context) error {
 | 
			
		||||
		var (
 | 
			
		||||
			in   = context.Args().First()
 | 
			
		||||
			imageImporter images.Importer
 | 
			
		||||
			opts []containerd.ImportOpt
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		switch format := context.String("format"); format {
 | 
			
		||||
		case "oci.v1":
 | 
			
		||||
			imageImporter = &oci.V1Importer{
 | 
			
		||||
				ImageName: context.String("oci-name"),
 | 
			
		||||
		prefix := context.String("base-name")
 | 
			
		||||
		if prefix == "" {
 | 
			
		||||
			prefix = fmt.Sprintf("import-%s", time.Now().Format("2006-01-02"))
 | 
			
		||||
			opts = append(opts, containerd.WithImageRefTranslator(archive.AddRefPrefix(prefix)))
 | 
			
		||||
		} else {
 | 
			
		||||
			// When provided, filter out references which do not match
 | 
			
		||||
			opts = append(opts, containerd.WithImageRefTranslator(archive.FilterRefPrefix(prefix)))
 | 
			
		||||
		}
 | 
			
		||||
		default:
 | 
			
		||||
			return fmt.Errorf("unknown format %s", format)
 | 
			
		||||
 | 
			
		||||
		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)
 | 
			
		||||
@@ -90,20 +104,24 @@ If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadb
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		imgs, err := client.Import(ctx, imageImporter, r)
 | 
			
		||||
		imgs, err := client.Import(ctx, r, opts...)
 | 
			
		||||
		closeErr := r.Close()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		if err = r.Close(); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		if closeErr != nil {
 | 
			
		||||
			return closeErr
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		log.G(ctx).Debugf("unpacking %d images", len(imgs))
 | 
			
		||||
 | 
			
		||||
		for _, img := range imgs {
 | 
			
		||||
			// TODO: Allow configuration of the platform
 | 
			
		||||
			image := containerd.NewImage(client, img)
 | 
			
		||||
 | 
			
		||||
			// TODO: Show unpack status
 | 
			
		||||
			fmt.Printf("unpacking %s (%s)...", img.Name(), img.Target().Digest)
 | 
			
		||||
			err = img.Unpack(ctx, context.String("snapshotter"))
 | 
			
		||||
			fmt.Printf("unpacking %s (%s)...", img.Name, img.Target.Digest)
 | 
			
		||||
			err = image.Unpack(ctx, context.String("snapshotter"))
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				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",
 | 
			
		||||
			Usage: "directory used for storing IO FIFOs",
 | 
			
		||||
		},
 | 
			
		||||
		cli.BoolFlag{
 | 
			
		||||
			Name:  "isolated",
 | 
			
		||||
			Usage: "run the container with vm isolation",
 | 
			
		||||
		},
 | 
			
		||||
	}, append(commands.SnapshotterFlags, commands.ContainerFlags...)...),
 | 
			
		||||
	Action: func(context *cli.Context) error {
 | 
			
		||||
		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") {
 | 
			
		||||
			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"))))
 | 
			
		||||
@@ -146,9 +149,8 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli
 | 
			
		||||
 | 
			
		||||
	cOpts = append(cOpts, spec)
 | 
			
		||||
 | 
			
		||||
	// oci.WithImageConfig (WithUsername, WithUserID) depends on rootfs snapshot for resolving /etc/passwd.
 | 
			
		||||
	// So cOpts needs to have precedence over opts.
 | 
			
		||||
	// TODO: WithUsername, WithUserID should additionally support non-snapshot rootfs
 | 
			
		||||
	// oci.WithImageConfig (WithUsername, WithUserID) depends on access to rootfs for resolving via
 | 
			
		||||
	// the /etc/{passwd,group} files. So cOpts needs to have precedence over opts.
 | 
			
		||||
	return client.NewContainer(ctx, id, cOpts...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										75
									
								
								vendor/github.com/containerd/containerd/cmd/ctr/commands/run/run_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										75
									
								
								vendor/github.com/containerd/containerd/cmd/ctr/commands/run/run_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -30,32 +30,60 @@ import (
 | 
			
		||||
 | 
			
		||||
// NewContainer creates a new container
 | 
			
		||||
func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli.Context) (containerd.Container, error) {
 | 
			
		||||
	var (
 | 
			
		||||
		id    string
 | 
			
		||||
		opts  []oci.SpecOpts
 | 
			
		||||
		cOpts []containerd.NewContainerOpts
 | 
			
		||||
		spec  containerd.NewContainerOpts
 | 
			
		||||
 | 
			
		||||
		config = context.IsSet("config")
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	if config {
 | 
			
		||||
		id = context.Args().First()
 | 
			
		||||
		opts = append(opts, oci.WithSpecFromFile(context.String("config")))
 | 
			
		||||
	} else {
 | 
			
		||||
		var (
 | 
			
		||||
			ref  = context.Args().First()
 | 
			
		||||
		id   = context.Args().Get(1)
 | 
			
		||||
			args = context.Args()[2:]
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		id = context.Args().Get(1)
 | 
			
		||||
		snapshotter := context.String("snapshotter")
 | 
			
		||||
		if snapshotter == "windows-lcow" {
 | 
			
		||||
			opts = append(opts, oci.WithDefaultSpecForPlatform("linux/amd64"))
 | 
			
		||||
			// Clear the rootfs section.
 | 
			
		||||
			opts = append(opts, oci.WithRootFSPath(""))
 | 
			
		||||
		} else {
 | 
			
		||||
			opts = append(opts, oci.WithDefaultSpec())
 | 
			
		||||
		}
 | 
			
		||||
		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
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	var (
 | 
			
		||||
		opts  []oci.SpecOpts
 | 
			
		||||
		cOpts []containerd.NewContainerOpts
 | 
			
		||||
		spec  containerd.NewContainerOpts
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	if context.IsSet("config") {
 | 
			
		||||
		opts = append(opts, oci.WithSpecFromFile(context.String("config")))
 | 
			
		||||
	} else {
 | 
			
		||||
		opts = append(opts, oci.WithDefaultSpec())
 | 
			
		||||
		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))
 | 
			
		||||
	opts = append(opts, oci.WithEnv(context.StringSlice("env")))
 | 
			
		||||
	opts = append(opts, withMounts(context))
 | 
			
		||||
		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)
 | 
			
		||||
 | 
			
		||||
@@ -66,22 +94,17 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli
 | 
			
		||||
			}
 | 
			
		||||
			opts = append(opts, oci.WithTTYSize(int(size.Width), int(size.Height)))
 | 
			
		||||
		}
 | 
			
		||||
		if context.Bool("isolated") {
 | 
			
		||||
			opts = append(opts, oci.WithWindowsHyperV)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(args) > 0 {
 | 
			
		||||
		opts = append(opts, oci.WithProcessArgs(args...))
 | 
			
		||||
	}
 | 
			
		||||
	if cwd := context.String("cwd"); cwd != "" {
 | 
			
		||||
		opts = append(opts, oci.WithProcessCwd(cwd))
 | 
			
		||||
	}
 | 
			
		||||
	cOpts = append(cOpts, containerd.WithContainerLabels(commands.LabelArgs(context.StringSlice("label"))))
 | 
			
		||||
	cOpts = append(cOpts, containerd.WithRuntime(context.String("runtime"), nil))
 | 
			
		||||
 | 
			
		||||
	var s specs.Spec
 | 
			
		||||
	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)
 | 
			
		||||
 | 
			
		||||
	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.
 | 
			
		||||
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.
 | 
			
		||||
	ID string
 | 
			
		||||
 | 
			
		||||
	// Labels provide metadata extension for a contaienr.
 | 
			
		||||
	// Labels provide metadata extension for a container.
 | 
			
		||||
	//
 | 
			
		||||
	// These are optional and fully mutable.
 | 
			
		||||
	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))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if !errdefs.IsAlreadyExists(err) {
 | 
			
		||||
			return err
 | 
			
		||||
			return errors.Wrap(err, "failed to open writer")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		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 {
 | 
			
		||||
	ws, err := cw.Status()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
		return errors.Wrap(err, "failed to get status")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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 {
 | 
			
		||||
		return err
 | 
			
		||||
		return errors.Wrap(err, "failed to copy")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := cw.Commit(ctx, size, expected, opts...); err != nil {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/github.com/containerd/containerd/content/local/writer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								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!!
 | 
			
		||||
	defer os.RemoveAll(w.path)
 | 
			
		||||
 | 
			
		||||
	if err := os.Rename(ingest, target); err != nil {
 | 
			
		||||
		if os.IsExist(err) {
 | 
			
		||||
	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 {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	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,
 | 
			
		||||
	})
 | 
			
		||||
	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{
 | 
			
		||||
@@ -82,7 +82,7 @@ func (rw *remoteWriter) Write(p []byte) (n int, err error) {
 | 
			
		||||
		Data:   p,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
		return 0, errors.Wrap(errdefs.FromGRPC(err), "failed to send write")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	n = int(resp.Offset - offset)
 | 
			
		||||
@@ -112,7 +112,7 @@ func (rw *remoteWriter) Commit(ctx context.Context, size int64, expected digest.
 | 
			
		||||
		Labels:   base.Labels,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return errdefs.FromGRPC(err)
 | 
			
		||||
		return errors.Wrap(errdefs.FromGRPC(err), "commit failed")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if size != 0 && resp.Offset != size {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/diff/walking/differ.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/diff/walking/differ.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -139,8 +139,10 @@ func (s *walkingDiff) Compare(ctx context.Context, lower, upper []mount.Mount, o
 | 
			
		||||
 | 
			
		||||
			dgst := cw.Digest()
 | 
			
		||||
			if err := cw.Commit(ctx, 0, dgst, commitopts...); err != nil {
 | 
			
		||||
				if !errdefs.IsAlreadyExists(err) {
 | 
			
		||||
					return errors.Wrap(err, "failed to commit")
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			info, err := s.store.Info(ctx, dgst)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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"
 | 
			
		||||
	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type exportOpts struct {
 | 
			
		||||
@@ -51,7 +52,7 @@ func (c *Client) Export(ctx context.Context, exporter images.Exporter, desc ocis
 | 
			
		||||
	}
 | 
			
		||||
	pr, pw := io.Pipe()
 | 
			
		||||
	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
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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
 | 
			
		||||
	// Target descriptor for the image content
 | 
			
		||||
	Target() ocispec.Descriptor
 | 
			
		||||
	// Labels of the image
 | 
			
		||||
	Labels() map[string]string
 | 
			
		||||
	// Unpack unpacks the image's content into a snapshot
 | 
			
		||||
	Unpack(context.Context, string) error
 | 
			
		||||
	// RootFS returns the unpacked diffids that make up images rootfs.
 | 
			
		||||
@@ -86,6 +88,10 @@ func (i *image) Target() ocispec.Descriptor {
 | 
			
		||||
	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) {
 | 
			
		||||
	provider := i.client.ContentStore()
 | 
			
		||||
	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.
 | 
			
		||||
type Importer interface {
 | 
			
		||||
	// 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.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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) {
 | 
			
		||||
			r, err := cs.ReaderAt(ctx, desc)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return 0, err
 | 
			
		||||
				return 0, errors.Wrap(err, "failed to get reader")
 | 
			
		||||
			}
 | 
			
		||||
			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))
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return 0, err
 | 
			
		||||
				return 0, errors.Wrap(err, "failed to copy to tar")
 | 
			
		||||
			}
 | 
			
		||||
			if dgstr.Digest() != desc.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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										129
									
								
								vendor/github.com/containerd/containerd/import.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										129
									
								
								vendor/github.com/containerd/containerd/import.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -18,36 +18,62 @@ package containerd
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"io"
 | 
			
		||||
 | 
			
		||||
	"github.com/containerd/containerd/content"
 | 
			
		||||
	"github.com/containerd/containerd/errdefs"
 | 
			
		||||
	"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 {
 | 
			
		||||
	indexName string
 | 
			
		||||
	imageRefT func(string) string
 | 
			
		||||
	dgstRefT  func(digest.Digest) string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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) {
 | 
			
		||||
	var iopts importOpts
 | 
			
		||||
	for _, o := range opts {
 | 
			
		||||
		if err := o(&iopts); err != nil {
 | 
			
		||||
			return iopts, err
 | 
			
		||||
// WithImageRefTranslator is used to translate the index reference
 | 
			
		||||
// to an image reference for the image store.
 | 
			
		||||
func WithImageRefTranslator(f func(string) string) ImportOpt {
 | 
			
		||||
	return func(c *importOpts) error {
 | 
			
		||||
		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.
 | 
			
		||||
// 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.
 | 
			
		||||
func (c *Client) Import(ctx context.Context, importer images.Importer, reader io.Reader, opts ...ImportOpt) ([]Image, error) {
 | 
			
		||||
	_, err := resolveImportOpt(opts...) // unused now
 | 
			
		||||
	if err != nil {
 | 
			
		||||
func (c *Client) Import(ctx context.Context, reader io.Reader, opts ...ImportOpt) ([]images.Image, error) {
 | 
			
		||||
	var iopts importOpts
 | 
			
		||||
	for _, o := range opts {
 | 
			
		||||
		if err := o(&iopts); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ctx, done, err := c.WithLease(ctx)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -55,31 +81,86 @@ func (c *Client) Import(ctx context.Context, importer images.Importer, reader io
 | 
			
		||||
	}
 | 
			
		||||
	defer done(ctx)
 | 
			
		||||
 | 
			
		||||
	imgrecs, err := importer.Import(ctx, c.ContentStore(), reader)
 | 
			
		||||
	index, err := archive.ImportIndex(ctx, c.ContentStore(), reader)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		// is.Update() is not called on error
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	is := c.ImageService()
 | 
			
		||||
	var images []Image
 | 
			
		||||
	for _, imgrec := range imgrecs {
 | 
			
		||||
		if updated, err := is.Update(ctx, imgrec, "target"); err != nil {
 | 
			
		||||
	var (
 | 
			
		||||
		imgs []images.Image
 | 
			
		||||
		cs   = c.ContentStore()
 | 
			
		||||
		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) {
 | 
			
		||||
				return nil, err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			created, err := is.Create(ctx, imgrec)
 | 
			
		||||
			img, err = is.Create(ctx, imgs[i])
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				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 (
 | 
			
		||||
	"context"
 | 
			
		||||
 | 
			
		||||
	"github.com/boltdb/bolt"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	bolt "go.etcd.io/bbolt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
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 (
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/boltdb/bolt"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	bolt "go.etcd.io/bbolt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/boltdb/bolt"
 | 
			
		||||
	digest "github.com/opencontainers/go-digest"
 | 
			
		||||
	bolt "go.etcd.io/bbolt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 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) {
 | 
			
		||||
	bkt, err := createBucketIfNotExists(tx, bucketKeyVersion, []byte(namespace), bucketKeyObjectContent, bucketKeyObjectBlob, []byte(dgst.String()))
 | 
			
		||||
	bkt, err := createBucketIfNotExists(tx, bucketKeyVersion, []byte(namespace), bucketKeyObjectContent, bucketKeyObjectBlob)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return bkt, nil
 | 
			
		||||
	return bkt.CreateBucket([]byte(dgst.String()))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/boltdb/bolt"
 | 
			
		||||
	"github.com/containerd/containerd/containers"
 | 
			
		||||
	"github.com/containerd/containerd/errdefs"
 | 
			
		||||
	"github.com/containerd/containerd/filters"
 | 
			
		||||
@@ -32,6 +31,7 @@ import (
 | 
			
		||||
	"github.com/gogo/protobuf/proto"
 | 
			
		||||
	"github.com/gogo/protobuf/types"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	bolt "go.etcd.io/bbolt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type containerStore struct {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										15
									
								
								vendor/github.com/containerd/containerd/metadata/content.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/containerd/containerd/metadata/content.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -23,7 +23,6 @@ import (
 | 
			
		||||
	"sync"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/boltdb/bolt"
 | 
			
		||||
	"github.com/containerd/containerd/content"
 | 
			
		||||
	"github.com/containerd/containerd/errdefs"
 | 
			
		||||
	"github.com/containerd/containerd/filters"
 | 
			
		||||
@@ -34,6 +33,7 @@ import (
 | 
			
		||||
	digest "github.com/opencontainers/go-digest"
 | 
			
		||||
	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	bolt "go.etcd.io/bbolt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type contentStore struct {
 | 
			
		||||
@@ -592,9 +592,6 @@ func (nw *namespacedWriter) commit(ctx context.Context, tx *bolt.Tx, size int64,
 | 
			
		||||
		}
 | 
			
		||||
		size = nw.desc.Size
 | 
			
		||||
		actual = nw.desc.Digest
 | 
			
		||||
		if getBlobBucket(tx, nw.namespace, actual) != nil {
 | 
			
		||||
			return "", errors.Wrapf(errdefs.ErrAlreadyExists, "content %v", actual)
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		status, err := nw.w.Status()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
@@ -606,18 +603,16 @@ func (nw *namespacedWriter) commit(ctx context.Context, tx *bolt.Tx, size int64,
 | 
			
		||||
		size = status.Offset
 | 
			
		||||
		actual = nw.w.Digest()
 | 
			
		||||
 | 
			
		||||
		if err := nw.w.Commit(ctx, size, expected); err != nil {
 | 
			
		||||
			if !errdefs.IsAlreadyExists(err) {
 | 
			
		||||
		if err := nw.w.Commit(ctx, size, expected); err != nil && !errdefs.IsAlreadyExists(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)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if err == bolt.ErrBucketExists {
 | 
			
		||||
			return "", errors.Wrapf(errdefs.ErrAlreadyExists, "content %v", actual)
 | 
			
		||||
		}
 | 
			
		||||
		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"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/boltdb/bolt"
 | 
			
		||||
	"github.com/containerd/containerd/content"
 | 
			
		||||
	"github.com/containerd/containerd/gc"
 | 
			
		||||
	"github.com/containerd/containerd/log"
 | 
			
		||||
	"github.com/containerd/containerd/snapshots"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	bolt "go.etcd.io/bbolt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
@@ -43,7 +43,7 @@ const (
 | 
			
		||||
	// dbVersion represents updates to the schema
 | 
			
		||||
	// version which are additions and compatible with
 | 
			
		||||
	// prior version of the same schema.
 | 
			
		||||
	dbVersion = 2
 | 
			
		||||
	dbVersion = 3
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 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"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/boltdb/bolt"
 | 
			
		||||
	"github.com/containerd/containerd/gc"
 | 
			
		||||
	"github.com/containerd/containerd/log"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	bolt "go.etcd.io/bbolt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
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"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/boltdb/bolt"
 | 
			
		||||
	"github.com/containerd/containerd/errdefs"
 | 
			
		||||
	"github.com/containerd/containerd/filters"
 | 
			
		||||
	"github.com/containerd/containerd/images"
 | 
			
		||||
@@ -33,6 +32,7 @@ import (
 | 
			
		||||
	digest "github.com/opencontainers/go-digest"
 | 
			
		||||
	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	bolt "go.etcd.io/bbolt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
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"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/boltdb/bolt"
 | 
			
		||||
	"github.com/containerd/containerd/errdefs"
 | 
			
		||||
	"github.com/containerd/containerd/filters"
 | 
			
		||||
	"github.com/containerd/containerd/leases"
 | 
			
		||||
@@ -28,6 +27,7 @@ import (
 | 
			
		||||
	"github.com/containerd/containerd/namespaces"
 | 
			
		||||
	digest "github.com/opencontainers/go-digest"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	bolt "go.etcd.io/bbolt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
 | 
			
		||||
import "github.com/boltdb/bolt"
 | 
			
		||||
import bolt "go.etcd.io/bbolt"
 | 
			
		||||
 | 
			
		||||
type migration struct {
 | 
			
		||||
	schema  string
 | 
			
		||||
@@ -45,6 +45,11 @@ var migrations = []migration{
 | 
			
		||||
		version: 2,
 | 
			
		||||
		migrate: migrateIngests,
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		schema:  "v1",
 | 
			
		||||
		version: 3,
 | 
			
		||||
		migrate: noOpMigration,
 | 
			
		||||
	},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// addChildLinks Adds children key to the snapshotters to enforce snapshot
 | 
			
		||||
@@ -154,3 +159,10 @@ func migrateIngests(tx *bolt.Tx) error {
 | 
			
		||||
 | 
			
		||||
	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 (
 | 
			
		||||
	"context"
 | 
			
		||||
 | 
			
		||||
	"github.com/boltdb/bolt"
 | 
			
		||||
	"github.com/containerd/containerd/errdefs"
 | 
			
		||||
	l "github.com/containerd/containerd/labels"
 | 
			
		||||
	"github.com/containerd/containerd/namespaces"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	bolt "go.etcd.io/bbolt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
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"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/boltdb/bolt"
 | 
			
		||||
	"github.com/containerd/containerd/errdefs"
 | 
			
		||||
	"github.com/containerd/containerd/labels"
 | 
			
		||||
	"github.com/containerd/containerd/log"
 | 
			
		||||
@@ -32,6 +31,7 @@ import (
 | 
			
		||||
	"github.com/containerd/containerd/namespaces"
 | 
			
		||||
	"github.com/containerd/containerd/snapshots"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	bolt "go.etcd.io/bbolt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
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",
 | 
			
		||||
				Type:        "proc",
 | 
			
		||||
				Source:      "proc",
 | 
			
		||||
				Options:     []string{"nosuid", "noexec", "nodev"},
 | 
			
		||||
			},
 | 
			
		||||
			{
 | 
			
		||||
				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
 | 
			
		||||
func WithImageConfig(image Image) SpecOpts {
 | 
			
		||||
	return WithImageConfigArgs(image, nil)
 | 
			
		||||
@@ -315,8 +323,14 @@ func WithImageConfigArgs(image Image, args []string) SpecOpts {
 | 
			
		||||
			}
 | 
			
		||||
			s.Process.Cwd = cwd
 | 
			
		||||
			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 {
 | 
			
		||||
			s.Process.Env = config.Env
 | 
			
		||||
			s.Process.Args = append(config.Entrypoint, config.Cmd...)
 | 
			
		||||
@@ -997,3 +1011,14 @@ var WithPrivileged = Compose(
 | 
			
		||||
	WithApparmorProfile(""),
 | 
			
		||||
	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
 | 
			
		||||
	}
 | 
			
		||||
	path = filepath.Join(path, id)
 | 
			
		||||
	if err := os.Mkdir(path, 0711); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	defer func() {
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			os.RemoveAll(path)
 | 
			
		||||
@@ -60,10 +63,6 @@ func newBundle(id, path, workDir string, spec []byte) (b *bundle, err error) {
 | 
			
		||||
			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 {
 | 
			
		||||
		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"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/boltdb/bolt"
 | 
			
		||||
	eventstypes "github.com/containerd/containerd/api/events"
 | 
			
		||||
	"github.com/containerd/containerd/api/types"
 | 
			
		||||
	"github.com/containerd/containerd/containers"
 | 
			
		||||
@@ -49,6 +48,7 @@ import (
 | 
			
		||||
	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	"github.com/sirupsen/logrus"
 | 
			
		||||
	bolt "go.etcd.io/bbolt"
 | 
			
		||||
	"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"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
 | 
			
		||||
	"github.com/boltdb/bolt"
 | 
			
		||||
	"github.com/containerd/containerd/containers"
 | 
			
		||||
	"github.com/containerd/containerd/events/exchange"
 | 
			
		||||
	"github.com/containerd/containerd/log"
 | 
			
		||||
@@ -32,6 +31,7 @@ import (
 | 
			
		||||
	"github.com/containerd/containerd/namespaces"
 | 
			
		||||
	"github.com/containerd/containerd/plugin"
 | 
			
		||||
	"github.com/containerd/containerd/runtime"
 | 
			
		||||
	bolt "go.etcd.io/bbolt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
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"
 | 
			
		||||
	"io"
 | 
			
		||||
 | 
			
		||||
	"github.com/boltdb/bolt"
 | 
			
		||||
	eventstypes "github.com/containerd/containerd/api/events"
 | 
			
		||||
	api "github.com/containerd/containerd/api/services/containers/v1"
 | 
			
		||||
	"github.com/containerd/containerd/containers"
 | 
			
		||||
@@ -30,6 +29,7 @@ import (
 | 
			
		||||
	"github.com/containerd/containerd/plugin"
 | 
			
		||||
	"github.com/containerd/containerd/services"
 | 
			
		||||
	ptypes "github.com/gogo/protobuf/types"
 | 
			
		||||
	bolt "go.etcd.io/bbolt"
 | 
			
		||||
	"google.golang.org/grpc"
 | 
			
		||||
	"google.golang.org/grpc/codes"
 | 
			
		||||
	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(
 | 
			
		||||
		&readResponseWriter{session: session},
 | 
			
		||||
		io.NewSectionReader(ra, offset, size), *p)
 | 
			
		||||
	return err
 | 
			
		||||
	return errdefs.ToGRPC(err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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.
 | 
			
		||||
				n, err := wr.Write(req.Data)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
					return errdefs.ToGRPC(err)
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				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))
 | 
			
		||||
				}
 | 
			
		||||
				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 (
 | 
			
		||||
	"context"
 | 
			
		||||
 | 
			
		||||
	"github.com/boltdb/bolt"
 | 
			
		||||
	"github.com/containerd/containerd/gc"
 | 
			
		||||
	"github.com/containerd/containerd/leases"
 | 
			
		||||
	"github.com/containerd/containerd/metadata"
 | 
			
		||||
	"github.com/containerd/containerd/plugin"
 | 
			
		||||
	"github.com/containerd/containerd/services"
 | 
			
		||||
	bolt "go.etcd.io/bbolt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
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"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/boltdb/bolt"
 | 
			
		||||
	eventstypes "github.com/containerd/containerd/api/events"
 | 
			
		||||
	api "github.com/containerd/containerd/api/services/namespaces/v1"
 | 
			
		||||
	"github.com/containerd/containerd/errdefs"
 | 
			
		||||
@@ -30,6 +29,7 @@ import (
 | 
			
		||||
	"github.com/containerd/containerd/plugin"
 | 
			
		||||
	"github.com/containerd/containerd/services"
 | 
			
		||||
	ptypes "github.com/gogo/protobuf/types"
 | 
			
		||||
	bolt "go.etcd.io/bbolt"
 | 
			
		||||
	"google.golang.org/grpc"
 | 
			
		||||
	"google.golang.org/grpc/codes"
 | 
			
		||||
	"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"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/boltdb/bolt"
 | 
			
		||||
	csapi "github.com/containerd/containerd/api/services/content/v1"
 | 
			
		||||
	ssapi "github.com/containerd/containerd/api/services/snapshots/v1"
 | 
			
		||||
	"github.com/containerd/containerd/content"
 | 
			
		||||
@@ -46,6 +45,7 @@ import (
 | 
			
		||||
	metrics "github.com/docker/go-metrics"
 | 
			
		||||
	grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	bolt "go.etcd.io/bbolt"
 | 
			
		||||
	"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"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/boltdb/bolt"
 | 
			
		||||
	api "github.com/containerd/containerd/api/services/tasks/v1"
 | 
			
		||||
	"github.com/containerd/containerd/api/types"
 | 
			
		||||
	"github.com/containerd/containerd/api/types/task"
 | 
			
		||||
@@ -48,6 +47,7 @@ import (
 | 
			
		||||
	ptypes "github.com/gogo/protobuf/types"
 | 
			
		||||
	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	bolt "go.etcd.io/bbolt"
 | 
			
		||||
	"google.golang.org/grpc"
 | 
			
		||||
	"google.golang.org/grpc/codes"
 | 
			
		||||
	"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"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/boltdb/bolt"
 | 
			
		||||
	"github.com/containerd/containerd/errdefs"
 | 
			
		||||
	"github.com/containerd/containerd/metadata/boltutil"
 | 
			
		||||
	"github.com/containerd/containerd/snapshots"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	bolt "go.etcd.io/bbolt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
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"
 | 
			
		||||
	"sync"
 | 
			
		||||
 | 
			
		||||
	"github.com/boltdb/bolt"
 | 
			
		||||
	"github.com/containerd/containerd/snapshots"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	bolt "go.etcd.io/bbolt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Transactor is used to finalize an active transaction.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								vendor/github.com/containerd/containerd/task.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/containerd/containerd/task.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -607,9 +607,12 @@ func writeContent(ctx context.Context, store content.Ingester, mediaType, ref st
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return d, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := writer.Commit(ctx, size, "", opts...); err != nil {
 | 
			
		||||
		if !errdefs.IsAlreadyExists(err) {
 | 
			
		||||
			return d, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return v1.Descriptor{
 | 
			
		||||
		MediaType: mediaType,
 | 
			
		||||
		Digest:    writer.Digest(),
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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/fifo 3d5202aec260678c48179c56f40e6f38a095738c
 | 
			
		||||
github.com/containerd/btrfs 2e1aa0ddf94f91fa282b6ed87c23bf0d64911244
 | 
			
		||||
github.com/containerd/continuity f44b615e492bdfb371aae2f76ec694d9da1db537
 | 
			
		||||
github.com/containerd/continuity 7f53d412b9eb1cbf744c2063185d703a0ee34700
 | 
			
		||||
github.com/coreos/go-systemd 48702e0da86bd25e76cfef347e2adeb434a0d0a6
 | 
			
		||||
github.com/docker/go-metrics 4ea375f7759c82740c893fc030bc37088d2ec098
 | 
			
		||||
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/googleapis 08a7655d27152912db7aaf4f983275eaf8d128ef
 | 
			
		||||
github.com/golang/protobuf v1.1.0
 | 
			
		||||
github.com/opencontainers/runtime-spec d810dbc60d8c5aeeb3d054bd1132fab2121968ce # v1.0.1-43-gd810dbc
 | 
			
		||||
github.com/opencontainers/runc 20aff4f0488c6d4b8df4d85b4f63f1f704c11abd
 | 
			
		||||
github.com/opencontainers/runtime-spec eba862dc2470385a233c7507392675cbeadf7353 # v1.0.1-45-geba862d
 | 
			
		||||
github.com/opencontainers/runc 00dc70017d222b178a002ed30e9321b12647af2d
 | 
			
		||||
github.com/sirupsen/logrus v1.0.0
 | 
			
		||||
github.com/urfave/cli 7bc6a0acffa589f415f88aca16cc1de5ffd66f9c
 | 
			
		||||
golang.org/x/net b3756b4b77d7b13260a0a2ec658753cf48922eac
 | 
			
		||||
@@ -33,18 +33,18 @@ golang.org/x/sync 450f422ab23cf9881c94e2db30cac0eb1b7cf80c
 | 
			
		||||
github.com/BurntSushi/toml a368813c5e648fee92e5f6c30e3944ff9d5e8895
 | 
			
		||||
github.com/grpc-ecosystem/go-grpc-prometheus 6b7015e65d366bf3f19b2b2a000a831940f0f7e0
 | 
			
		||||
github.com/Microsoft/go-winio v0.4.10
 | 
			
		||||
github.com/Microsoft/hcsshim 44c060121b68e8bdc40b411beba551f3b4ee9e55
 | 
			
		||||
github.com/boltdb/bolt e9cf4fae01b5a8ff89d0ec6b32f0d9c9f79aefdd
 | 
			
		||||
github.com/Microsoft/hcsshim v0.7.4
 | 
			
		||||
google.golang.org/genproto d80a6e20e776b0b17a324d0ba1ab50a39c8e8944
 | 
			
		||||
golang.org/x/text 19e51611da83d6be54ddafce4a4af510cb3e9ea4
 | 
			
		||||
github.com/containerd/ttrpc 94dde388801693c54f88a6596f713b51a8b30b2d
 | 
			
		||||
github.com/containerd/ttrpc 2a805f71863501300ae1976d29f0454ae003e85a
 | 
			
		||||
github.com/syndtr/gocapability db04d3cc01c8b54962a58ec7e491717d06cfcc16
 | 
			
		||||
gotest.tools v2.1.0
 | 
			
		||||
github.com/google/go-cmp v0.1.0
 | 
			
		||||
go.etcd.io/bbolt v1.3.1-etcd.8
 | 
			
		||||
 | 
			
		||||
# cri dependencies
 | 
			
		||||
github.com/containerd/cri v1.11.1
 | 
			
		||||
github.com/containerd/go-cni 5882530828ecf62032409b298a3e8b19e08b6534
 | 
			
		||||
github.com/containerd/cri 9f39e3289533fc228c5e5fcac0a6dbdd60c6047b # release/1.2 branch
 | 
			
		||||
github.com/containerd/go-cni 6d7b509a054a3cb1c35ed1865d4fde2f0cb547cd
 | 
			
		||||
github.com/blang/semver v3.1.0
 | 
			
		||||
github.com/containernetworking/cni v0.6.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/docker 86f080cff0914e9694068ed78d503701667c4c00
 | 
			
		||||
github.com/docker/spdystream 449fdfce4d962303d702fec724ef0ad181c92528
 | 
			
		||||
github.com/emicklei/go-restful ff4f55a206334ef123e4f79bbf348980da81ca46
 | 
			
		||||
github.com/ghodss/yaml 73d445a93680fa1a78ae23a5839bad48f32ba1ee
 | 
			
		||||
github.com/emicklei/go-restful v2.2.1
 | 
			
		||||
github.com/ghodss/yaml v1.0.0
 | 
			
		||||
github.com/golang/glog 44145f04b68cf362d9c4df2182967c2275eaefed
 | 
			
		||||
github.com/google/gofuzz 44d81051d367757e1c7c6a5a86423ece9afcf63c
 | 
			
		||||
github.com/hashicorp/errwrap 7554cd9344cec97297fa6649b055a8c98c2a1e55
 | 
			
		||||
github.com/hashicorp/go-multierror ed905158d87462226a13fe39ddf685ea65f1c11f
 | 
			
		||||
github.com/json-iterator/go f2b4162afba35581b6d4a50d3b8f34e33c144682
 | 
			
		||||
github.com/modern-go/reflect2 05fbef0ca5da472bbf96c9322b84a53edc03c9fd
 | 
			
		||||
github.com/json-iterator/go 1.1.5
 | 
			
		||||
github.com/modern-go/reflect2 1.0.1
 | 
			
		||||
github.com/modern-go/concurrent 1.0.3
 | 
			
		||||
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/tchap/go-patricia 5ad6cdb7538b0097d5598c7e57f0a24072adf7dc
 | 
			
		||||
github.com/tchap/go-patricia v2.2.6
 | 
			
		||||
github.com/xeipuuv/gojsonpointer 4e3ac2762d5f479393488629ee9370b50873b3a6
 | 
			
		||||
github.com/xeipuuv/gojsonreference bd5ef7bd5415a7ac448318e64f11a24cd21e594b
 | 
			
		||||
github.com/xeipuuv/gojsonschema 1d523034197ff1f222f6429836dd36a2457a1874
 | 
			
		||||
golang.org/x/crypto 49796115aa4b964c318aad4f3084fdb41e9aa067
 | 
			
		||||
golang.org/x/oauth2 a6bd8cefa1811bd24b86f8902872e4e8225f74c4
 | 
			
		||||
golang.org/x/time f51c12702a4d776e4c1fa9b0fabab841babae631
 | 
			
		||||
gopkg.in/inf.v0 3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4
 | 
			
		||||
gopkg.in/yaml.v2 v2.2.1
 | 
			
		||||
k8s.io/api 9e5ffd1f1320950b238cfce291b926411f0af722
 | 
			
		||||
k8s.io/apimachinery ed135c5b96450fd24e5e981c708114fbbd950697
 | 
			
		||||
k8s.io/apiserver a90e3a95c2e91b944bfca8225c4e0d12e42a9eb5
 | 
			
		||||
k8s.io/client-go 03bfb9bdcfe5482795b999f39ca3ed9ad42ce5bb
 | 
			
		||||
k8s.io/kubernetes v1.11.0
 | 
			
		||||
k8s.io/utils 733eca437aa39379e4bcc25e726439dfca40fcff
 | 
			
		||||
k8s.io/api 012f271b5d41baad56190c5f1ae19bff16df0fd8
 | 
			
		||||
k8s.io/apimachinery 6429050ef506887d121f3e7306e894f8900d8a63
 | 
			
		||||
k8s.io/apiserver e9312c15296b6c2c923ebd5031ff5d1d5fd022d7
 | 
			
		||||
k8s.io/client-go 37c3c02ec96533daec0dbda1f39a6b1d68505c79
 | 
			
		||||
k8s.io/kubernetes v1.12.0-beta.1
 | 
			
		||||
k8s.io/utils 982821ea41da7e7c15f3d3738921eb2e7e241ccd
 | 
			
		||||
 | 
			
		||||
# zfs dependencies
 | 
			
		||||
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"
 | 
			
		||||
 | 
			
		||||
	// 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
 | 
			
		||||
	// 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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
   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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
   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
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -13,7 +29,11 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
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 {
 | 
			
		||||
@@ -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
 | 
			
		||||
	// 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.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"os"
 | 
			
		||||
 | 
			
		||||
	"github.com/containerd/continuity/sysx"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
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 {
 | 
			
		||||
	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.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -15,5 +31,9 @@ func (d *driver) Lchmod(path string, mode os.FileMode) error {
 | 
			
		||||
		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
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
   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
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -10,5 +26,9 @@ import (
 | 
			
		||||
 | 
			
		||||
// Lchmod changes the mode of a file not following symlinks.
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
   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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
   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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
   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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
   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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
   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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
   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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -232,12 +248,6 @@ func walkLink(root, path string, linksWalked *int) (newpath string, islink bool,
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", false, err
 | 
			
		||||
	}
 | 
			
		||||
	if filepath.IsAbs(newpath) && strings.HasPrefix(newpath, root) {
 | 
			
		||||
		newpath = newpath[:len(root)]
 | 
			
		||||
		if !strings.HasPrefix(newpath, "/") {
 | 
			
		||||
			newpath = "/" + newpath
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	*linksWalked++
 | 
			
		||||
	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
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
   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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
   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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
//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