mirror of https://github.com/containers/podman.git
				
				
				
			Bump github.com/containers/storage from 1.19.1 to 1.19.2
Bumps [github.com/containers/storage](https://github.com/containers/storage) from 1.19.1 to 1.19.2. - [Release notes](https://github.com/containers/storage/releases) - [Changelog](https://github.com/containers/storage/blob/master/docs/containers-storage-changes.md) - [Commits](https://github.com/containers/storage/compare/v1.19.1...v1.19.2) Signed-off-by: dependabot-preview[bot] <support@dependabot.com> Signed-off-by: Valentin Rothberg <rothberg@redhat.com> Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
This commit is contained in:
		
							parent
							
								
									150679d7b1
								
							
						
					
					
						commit
						1f0cc866d4
					
				
							
								
								
									
										2
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										2
									
								
								go.mod
								
								
								
								
							|  | @ -14,7 +14,7 @@ require ( | |||
| 	github.com/containers/conmon v2.0.16+incompatible | ||||
| 	github.com/containers/image/v5 v5.4.4 | ||||
| 	github.com/containers/psgo v1.5.0 | ||||
| 	github.com/containers/storage v1.19.1 | ||||
| 	github.com/containers/storage v1.19.2 | ||||
| 	github.com/coreos/go-systemd/v22 v22.0.0 | ||||
| 	github.com/cri-o/ocicni v0.2.0 | ||||
| 	github.com/cyphar/filepath-securejoin v0.2.2 | ||||
|  |  | |||
							
								
								
									
										9
									
								
								go.sum
								
								
								
								
							
							
						
						
									
										9
									
								
								go.sum
								
								
								
								
							|  | @ -17,6 +17,8 @@ github.com/Microsoft/go-winio v0.4.15-0.20200113171025-3fe6c5262873/go.mod h1:tT | |||
| github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= | ||||
| github.com/Microsoft/hcsshim v0.8.7 h1:ptnOoufxGSzauVTsdE+wMYnCWA301PdoN4xg5oRdZpg= | ||||
| github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= | ||||
| github.com/Microsoft/hcsshim v0.8.9 h1:VrfodqvztU8YSOvygU+DN1BGaSGxmrNfqOv5oOuX2Bk= | ||||
| github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= | ||||
| github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= | ||||
| github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= | ||||
| github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= | ||||
|  | @ -54,6 +56,8 @@ github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtM | |||
| github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= | ||||
| github.com/containerd/containerd v1.3.0 h1:xjvXQWABwS2uiv3TWgQt5Uth60Gu86LTGZXMJkjc7rY= | ||||
| github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= | ||||
| github.com/containerd/containerd v1.3.2 h1:ForxmXkA6tPIvffbrDAcPUIB32QgXkt2XFj+F0UxetA= | ||||
| github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= | ||||
| github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc h1:TP+534wVlf61smEIq1nwLLAjQVEK2EADoW3CX9AuT+8= | ||||
| github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= | ||||
| github.com/containerd/continuity v0.0.0-20200228182428-0f16d7a0959c h1:8ahmSVELW1wghbjerVAyuEYD5+Dio66RYvSS0iGfL1M= | ||||
|  | @ -92,6 +96,8 @@ github.com/containers/storage v1.19.0 h1:bVIF5EglbT5PQnqcN7sE6VWqoQzlToqzjXdz+eN | |||
| github.com/containers/storage v1.19.0/go.mod h1:9Xc4rrTubn5hmtBfL+PSJH1XlfTQwR4VAG1NDUIpCts= | ||||
| github.com/containers/storage v1.19.1 h1:YKIzOO12iaD5Ra0PKFS6emcygbHLmwmQOCQRU/19YAQ= | ||||
| github.com/containers/storage v1.19.1/go.mod h1:KbXjSwKnx17ejOsjFcCXSf78mCgZkQSLPBNTMRc3XrQ= | ||||
| github.com/containers/storage v1.19.2 h1:vhcUwEjDZiPJxaLPFsjvyavnEjFw6qQi9HAkVz1amfI= | ||||
| github.com/containers/storage v1.19.2/go.mod h1:gYCp3jzgXkvubO0rI14QAjz5Mxm/qKJgLmHFyqayDnw= | ||||
| github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= | ||||
| github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= | ||||
| github.com/coreos/go-iptables v0.4.5 h1:DpHb9vJrZQEFMcVLFKAAGMUVX0XoRC0ptCthinRYm38= | ||||
|  | @ -395,6 +401,7 @@ github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 | |||
| github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= | ||||
| github.com/prometheus/common v0.6.0 h1:kRhiuYSXR3+uv2IbVbZhUxK5zVD/2pp3Gd2PpvPkpEo= | ||||
| github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= | ||||
| github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= | ||||
| github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= | ||||
| github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= | ||||
| github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= | ||||
|  | @ -615,12 +622,14 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 | |||
| google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= | ||||
| google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb h1:i1Ppqkc3WQXikh8bXiwHqAN5Rv3/qDCcRk0/Otx73BY= | ||||
| google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= | ||||
| google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= | ||||
| google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE= | ||||
| google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= | ||||
| google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= | ||||
| google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= | ||||
| google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= | ||||
| google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= | ||||
| google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= | ||||
| google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= | ||||
| google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= | ||||
| google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk= | ||||
|  |  | |||
|  | @ -0,0 +1,151 @@ | |||
| // +build windows
 | ||||
| 
 | ||||
| package vhd | ||||
| 
 | ||||
| import "syscall" | ||||
| 
 | ||||
| //go:generate go run mksyscall_windows.go -output zvhd.go vhd.go
 | ||||
| 
 | ||||
| //sys createVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, securityDescriptor *uintptr, flags uint32, providerSpecificFlags uint32, parameters *createVirtualDiskParameters, o *syscall.Overlapped, handle *syscall.Handle) (err error) [failretval != 0] = VirtDisk.CreateVirtualDisk
 | ||||
| //sys openVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, flags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (err error) [failretval != 0] = VirtDisk.OpenVirtualDisk
 | ||||
| //sys detachVirtualDisk(handle syscall.Handle, flags uint32, providerSpecificFlags uint32) (err error) [failretval != 0] = VirtDisk.DetachVirtualDisk
 | ||||
| 
 | ||||
| type virtualStorageType struct { | ||||
| 	DeviceID uint32 | ||||
| 	VendorID [16]byte | ||||
| } | ||||
| 
 | ||||
| type ( | ||||
| 	createVirtualDiskFlag uint32 | ||||
| 	VirtualDiskAccessMask uint32 | ||||
| 	VirtualDiskFlag       uint32 | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	// Flags for creating a VHD (not exported)
 | ||||
| 	createVirtualDiskFlagNone                        createVirtualDiskFlag = 0 | ||||
| 	createVirtualDiskFlagFullPhysicalAllocation      createVirtualDiskFlag = 1 | ||||
| 	createVirtualDiskFlagPreventWritesToSourceDisk   createVirtualDiskFlag = 2 | ||||
| 	createVirtualDiskFlagDoNotCopyMetadataFromParent createVirtualDiskFlag = 4 | ||||
| 
 | ||||
| 	// Access Mask for opening a VHD
 | ||||
| 	VirtualDiskAccessNone     VirtualDiskAccessMask = 0 | ||||
| 	VirtualDiskAccessAttachRO VirtualDiskAccessMask = 65536 | ||||
| 	VirtualDiskAccessAttachRW VirtualDiskAccessMask = 131072 | ||||
| 	VirtualDiskAccessDetach   VirtualDiskAccessMask = 262144 | ||||
| 	VirtualDiskAccessGetInfo  VirtualDiskAccessMask = 524288 | ||||
| 	VirtualDiskAccessCreate   VirtualDiskAccessMask = 1048576 | ||||
| 	VirtualDiskAccessMetaOps  VirtualDiskAccessMask = 2097152 | ||||
| 	VirtualDiskAccessRead     VirtualDiskAccessMask = 851968 | ||||
| 	VirtualDiskAccessAll      VirtualDiskAccessMask = 4128768 | ||||
| 	VirtualDiskAccessWritable VirtualDiskAccessMask = 3276800 | ||||
| 
 | ||||
| 	// Flags for opening a VHD
 | ||||
| 	OpenVirtualDiskFlagNone                        VirtualDiskFlag = 0 | ||||
| 	OpenVirtualDiskFlagNoParents                   VirtualDiskFlag = 0x1 | ||||
| 	OpenVirtualDiskFlagBlankFile                   VirtualDiskFlag = 0x2 | ||||
| 	OpenVirtualDiskFlagBootDrive                   VirtualDiskFlag = 0x4 | ||||
| 	OpenVirtualDiskFlagCachedIO                    VirtualDiskFlag = 0x8 | ||||
| 	OpenVirtualDiskFlagCustomDiffChain             VirtualDiskFlag = 0x10 | ||||
| 	OpenVirtualDiskFlagParentCachedIO              VirtualDiskFlag = 0x20 | ||||
| 	OpenVirtualDiskFlagVhdSetFileOnly              VirtualDiskFlag = 0x40 | ||||
| 	OpenVirtualDiskFlagIgnoreRelativeParentLocator VirtualDiskFlag = 0x80 | ||||
| 	OpenVirtualDiskFlagNoWriteHardening            VirtualDiskFlag = 0x100 | ||||
| ) | ||||
| 
 | ||||
| type createVersion2 struct { | ||||
| 	UniqueID                 [16]byte // GUID
 | ||||
| 	MaximumSize              uint64 | ||||
| 	BlockSizeInBytes         uint32 | ||||
| 	SectorSizeInBytes        uint32 | ||||
| 	ParentPath               *uint16 // string
 | ||||
| 	SourcePath               *uint16 // string
 | ||||
| 	OpenFlags                uint32 | ||||
| 	ParentVirtualStorageType virtualStorageType | ||||
| 	SourceVirtualStorageType virtualStorageType | ||||
| 	ResiliencyGUID           [16]byte // GUID
 | ||||
| } | ||||
| 
 | ||||
| type createVirtualDiskParameters struct { | ||||
| 	Version  uint32 // Must always be set to 2
 | ||||
| 	Version2 createVersion2 | ||||
| } | ||||
| 
 | ||||
| type openVersion2 struct { | ||||
| 	GetInfoOnly    int32    // bool but 4-byte aligned
 | ||||
| 	ReadOnly       int32    // bool but 4-byte aligned
 | ||||
| 	ResiliencyGUID [16]byte // GUID
 | ||||
| } | ||||
| 
 | ||||
| type openVirtualDiskParameters struct { | ||||
| 	Version  uint32 // Must always be set to 2
 | ||||
| 	Version2 openVersion2 | ||||
| } | ||||
| 
 | ||||
| // CreateVhdx will create a simple vhdx file at the given path using default values.
 | ||||
| func CreateVhdx(path string, maxSizeInGb, blockSizeInMb uint32) error { | ||||
| 	var ( | ||||
| 		defaultType virtualStorageType | ||||
| 		handle      syscall.Handle | ||||
| 	) | ||||
| 
 | ||||
| 	parameters := createVirtualDiskParameters{ | ||||
| 		Version: 2, | ||||
| 		Version2: createVersion2{ | ||||
| 			MaximumSize:      uint64(maxSizeInGb) * 1024 * 1024 * 1024, | ||||
| 			BlockSizeInBytes: blockSizeInMb * 1024 * 1024, | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	if err := createVirtualDisk( | ||||
| 		&defaultType, | ||||
| 		path, | ||||
| 		uint32(VirtualDiskAccessNone), | ||||
| 		nil, | ||||
| 		uint32(createVirtualDiskFlagNone), | ||||
| 		0, | ||||
| 		¶meters, | ||||
| 		nil, | ||||
| 		&handle); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	if err := syscall.CloseHandle(handle); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // DetachVhd detaches a mounted container layer vhd found at `path`.
 | ||||
| func DetachVhd(path string) error { | ||||
| 	handle, err := OpenVirtualDisk( | ||||
| 		path, | ||||
| 		VirtualDiskAccessNone, | ||||
| 		OpenVirtualDiskFlagCachedIO|OpenVirtualDiskFlagIgnoreRelativeParentLocator) | ||||
| 
 | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer syscall.CloseHandle(handle) | ||||
| 	return detachVirtualDisk(handle, 0, 0) | ||||
| } | ||||
| 
 | ||||
| // OpenVirtualDisk obtains a handle to a VHD opened with supplied access mask and flags.
 | ||||
| func OpenVirtualDisk(path string, accessMask VirtualDiskAccessMask, flag VirtualDiskFlag) (syscall.Handle, error) { | ||||
| 	var ( | ||||
| 		defaultType virtualStorageType | ||||
| 		handle      syscall.Handle | ||||
| 	) | ||||
| 	parameters := openVirtualDiskParameters{Version: 2} | ||||
| 	if err := openVirtualDisk( | ||||
| 		&defaultType, | ||||
| 		path, | ||||
| 		uint32(accessMask), | ||||
| 		uint32(flag), | ||||
| 		¶meters, | ||||
| 		&handle); err != nil { | ||||
| 		return 0, err | ||||
| 	} | ||||
| 	return handle, nil | ||||
| } | ||||
|  | @ -0,0 +1,99 @@ | |||
| // MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT
 | ||||
| 
 | ||||
| package vhd | ||||
| 
 | ||||
| import ( | ||||
| 	"syscall" | ||||
| 	"unsafe" | ||||
| 
 | ||||
| 	"golang.org/x/sys/windows" | ||||
| ) | ||||
| 
 | ||||
| var _ unsafe.Pointer | ||||
| 
 | ||||
| // Do the interface allocations only once for common
 | ||||
| // Errno values.
 | ||||
| const ( | ||||
| 	errnoERROR_IO_PENDING = 997 | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) | ||||
| ) | ||||
| 
 | ||||
| // errnoErr returns common boxed Errno values, to prevent
 | ||||
| // allocations at runtime.
 | ||||
| func errnoErr(e syscall.Errno) error { | ||||
| 	switch e { | ||||
| 	case 0: | ||||
| 		return nil | ||||
| 	case errnoERROR_IO_PENDING: | ||||
| 		return errERROR_IO_PENDING | ||||
| 	} | ||||
| 	// TODO: add more here, after collecting data on the common
 | ||||
| 	// error values see on Windows. (perhaps when running
 | ||||
| 	// all.bat?)
 | ||||
| 	return e | ||||
| } | ||||
| 
 | ||||
| var ( | ||||
| 	modVirtDisk = windows.NewLazySystemDLL("VirtDisk.dll") | ||||
| 
 | ||||
| 	procCreateVirtualDisk = modVirtDisk.NewProc("CreateVirtualDisk") | ||||
| 	procOpenVirtualDisk   = modVirtDisk.NewProc("OpenVirtualDisk") | ||||
| 	procDetachVirtualDisk = modVirtDisk.NewProc("DetachVirtualDisk") | ||||
| ) | ||||
| 
 | ||||
| func createVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, securityDescriptor *uintptr, flags uint32, providerSpecificFlags uint32, parameters *createVirtualDiskParameters, o *syscall.Overlapped, handle *syscall.Handle) (err error) { | ||||
| 	var _p0 *uint16 | ||||
| 	_p0, err = syscall.UTF16PtrFromString(path) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	return _createVirtualDisk(virtualStorageType, _p0, virtualDiskAccessMask, securityDescriptor, flags, providerSpecificFlags, parameters, o, handle) | ||||
| } | ||||
| 
 | ||||
| func _createVirtualDisk(virtualStorageType *virtualStorageType, path *uint16, virtualDiskAccessMask uint32, securityDescriptor *uintptr, flags uint32, providerSpecificFlags uint32, parameters *createVirtualDiskParameters, o *syscall.Overlapped, handle *syscall.Handle) (err error) { | ||||
| 	r1, _, e1 := syscall.Syscall9(procCreateVirtualDisk.Addr(), 9, uintptr(unsafe.Pointer(virtualStorageType)), uintptr(unsafe.Pointer(path)), uintptr(virtualDiskAccessMask), uintptr(unsafe.Pointer(securityDescriptor)), uintptr(flags), uintptr(providerSpecificFlags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(o)), uintptr(unsafe.Pointer(handle))) | ||||
| 	if r1 != 0 { | ||||
| 		if e1 != 0 { | ||||
| 			err = errnoErr(e1) | ||||
| 		} else { | ||||
| 			err = syscall.EINVAL | ||||
| 		} | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| func openVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, flags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (err error) { | ||||
| 	var _p0 *uint16 | ||||
| 	_p0, err = syscall.UTF16PtrFromString(path) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	return _openVirtualDisk(virtualStorageType, _p0, virtualDiskAccessMask, flags, parameters, handle) | ||||
| } | ||||
| 
 | ||||
| func _openVirtualDisk(virtualStorageType *virtualStorageType, path *uint16, virtualDiskAccessMask uint32, flags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (err error) { | ||||
| 	r1, _, e1 := syscall.Syscall6(procOpenVirtualDisk.Addr(), 6, uintptr(unsafe.Pointer(virtualStorageType)), uintptr(unsafe.Pointer(path)), uintptr(virtualDiskAccessMask), uintptr(flags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(handle))) | ||||
| 	if r1 != 0 { | ||||
| 		if e1 != 0 { | ||||
| 			err = errnoErr(e1) | ||||
| 		} else { | ||||
| 			err = syscall.EINVAL | ||||
| 		} | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| func detachVirtualDisk(handle syscall.Handle, flags uint32, providerSpecificFlags uint32) (err error) { | ||||
| 	r1, _, e1 := syscall.Syscall(procDetachVirtualDisk.Addr(), 3, uintptr(handle), uintptr(flags), uintptr(providerSpecificFlags)) | ||||
| 	if r1 != 0 { | ||||
| 		if e1 != 0 { | ||||
| 			err = errnoErr(e1) | ||||
| 		} else { | ||||
| 			err = syscall.EINVAL | ||||
| 		} | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | @ -0,0 +1,3 @@ | |||
| * @microsoft/containerplat | ||||
| 
 | ||||
| /hcn/* @nagiesek | ||||
|  | @ -2,7 +2,7 @@ | |||
| 
 | ||||
| [](https://ci.appveyor.com/project/WindowsVirtualization/hcsshim/branch/master) | ||||
| 
 | ||||
| This package contains the Golang interface for using the Windows [Host Compute Service](https://blogs.technet.microsoft.com/virtualization/2017/01/27/introducing-the-host-compute-service-hcs/) (HCS) to launch and manage [Windows Containers](https://docs.microsoft.com/en-us/virtualization/windowscontainers/about/). It also contains other helpers and functions for managing Windows Containers such as the Golang interface for the Host Network Service (HNS). | ||||
| This package contains the Golang interface for using the Windows [Host Compute Service](https://techcommunity.microsoft.com/t5/containers/introducing-the-host-compute-service-hcs/ba-p/382332) (HCS) to launch and manage [Windows Containers](https://docs.microsoft.com/en-us/virtualization/windowscontainers/about/). It also contains other helpers and functions for managing Windows Containers such as the Golang interface for the Host Network Service (HNS). | ||||
| 
 | ||||
| It is primarily used in the [Moby Project](https://github.com/moby/moby), but it can be freely used by other projects as well. | ||||
| 
 | ||||
|  | @ -16,6 +16,11 @@ When you submit a pull request, a CLA-bot will automatically determine whether y | |||
| a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions | ||||
| provided by the bot. You will only need to do this once across all repos using our CLA. | ||||
| 
 | ||||
| We also ask that contributors [sign their commits](https://git-scm.com/docs/git-commit) using `git commit -s` or `git commit --signoff` to certify they either authored the work themselves or otherwise have permission to use it in this project.  | ||||
| 
 | ||||
| 
 | ||||
| ## Code of Conduct | ||||
| 
 | ||||
| This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). | ||||
| For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or | ||||
| contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. | ||||
|  |  | |||
|  | @ -6,7 +6,7 @@ clone_folder: c:\gopath\src\github.com\Microsoft\hcsshim | |||
| 
 | ||||
| environment: | ||||
|   GOPATH: c:\gopath | ||||
|   PATH: C:\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev1\mingw64\bin;%GOPATH%\bin;C:\gometalinter-2.0.12-windows-amd64;%PATH% | ||||
|   PATH: "%GOPATH%\\bin;C:\\gometalinter-2.0.12-windows-amd64;%PATH%" | ||||
| 
 | ||||
| stack: go 1.13.4 | ||||
| 
 | ||||
|  | @ -22,10 +22,12 @@ build_script: | |||
|   - go build ./internal/tools/uvmboot | ||||
|   - go build ./internal/tools/zapdir | ||||
|   - go test -v ./... -tags admin | ||||
|   - go test -c ./test/containerd-shim-runhcs-v1/ -tags functional | ||||
|   - go test -c ./test/cri-containerd/ -tags functional | ||||
|   - go test -c ./test/functional/ -tags functional | ||||
|   - go test -c ./test/runhcs/ -tags functional | ||||
|   - cd test | ||||
|   - go test -v ./internal -tags admin | ||||
|   - go test -c ./containerd-shim-runhcs-v1/ -tags functional | ||||
|   - go test -c ./cri-containerd/ -tags functional | ||||
|   - go test -c ./functional/ -tags functional | ||||
|   - go test -c ./runhcs/ -tags functional | ||||
| 
 | ||||
| artifacts: | ||||
|   - path: 'containerd-shim-runhcs-v1.exe' | ||||
|  | @ -35,7 +37,7 @@ artifacts: | |||
|   - path: 'grantvmgroupaccess.exe'   | ||||
|   - path: 'uvmboot.exe' | ||||
|   - path: 'zapdir.exe' | ||||
|   - path: 'containerd-shim-runhcs-v1.test.exe' | ||||
|   - path: 'cri-containerd.test.exe' | ||||
|   - path: 'functional.test.exe' | ||||
|   - path: 'runhcs.test.exe' | ||||
|   - path: './test/containerd-shim-runhcs-v1.test.exe' | ||||
|   - path: './test/cri-containerd.test.exe' | ||||
|   - path: './test/functional.test.exe' | ||||
|   - path: './test/runhcs.test.exe' | ||||
|  |  | |||
|  | @ -4,34 +4,32 @@ go 1.13 | |||
| 
 | ||||
| require ( | ||||
| 	github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 | ||||
| 	github.com/blang/semver v3.1.0+incompatible // indirect | ||||
| 	github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f | ||||
| 	github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1 | ||||
| 	github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69 | ||||
| 	github.com/containerd/containerd v1.3.2 | ||||
| 	github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc // indirect | ||||
| 	github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448 // indirect | ||||
| 	github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3 | ||||
| 	github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de | ||||
| 	github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd | ||||
| 	github.com/gogo/protobuf v1.2.1 | ||||
| 	github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce // indirect | ||||
| 	github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874 // indirect | ||||
| 	github.com/gogo/protobuf v1.3.1 | ||||
| 	github.com/golang/protobuf v1.3.2 // indirect | ||||
| 	github.com/kr/pretty v0.1.0 // indirect | ||||
| 	github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2 // indirect | ||||
| 	github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f // indirect | ||||
| 	github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700 | ||||
| 	github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39 | ||||
| 	github.com/pkg/errors v0.8.1 | ||||
| 	github.com/prometheus/procfs v0.0.5 // indirect | ||||
| 	github.com/sirupsen/logrus v1.4.1 | ||||
| 	github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8 // indirect | ||||
| 	github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7 // indirect | ||||
| 	github.com/sirupsen/logrus v1.4.2 | ||||
| 	github.com/stretchr/testify v1.4.0 // indirect | ||||
| 	github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5 | ||||
| 	github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect | ||||
| 	github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect | ||||
| 	github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f // indirect | ||||
| 	go.opencensus.io v0.22.0 | ||||
| 	golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 | ||||
| 	golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 // indirect | ||||
| 	golang.org/x/sync v0.0.0-20190423024810-112230192c58 | ||||
| 	golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3 | ||||
| 	google.golang.org/grpc v1.20.1 | ||||
| 	google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873 // indirect | ||||
| 	google.golang.org/grpc v1.23.1 | ||||
| 	gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect | ||||
| 	gopkg.in/yaml.v2 v2.2.8 // indirect | ||||
| 	gotest.tools v2.2.0+incompatible // indirect | ||||
| 	k8s.io/kubernetes v1.13.0 | ||||
| ) | ||||
|  |  | |||
|  | @ -1,16 +1,15 @@ | |||
| cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= | ||||
| github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= | ||||
| github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= | ||||
| github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 h1:ygIc8M6trr62pF5DucadTWGdEB4mEyvzi0e2nbcmcyA= | ||||
| github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= | ||||
| github.com/blang/semver v3.1.0+incompatible h1:7hqmJYuaEK3qwVjWubYiht3j93YI0WQBuysxHIfUriU= | ||||
| github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= | ||||
| github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= | ||||
| github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f h1:tSNMc+rJDfmYntojat8lljbt1mgKNpTxUZJsSzJ9Y1s= | ||||
| github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= | ||||
| github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1 h1:uict5mhHFTzKLUCufdSLym7z/J0CbBJT59lYbP9wtbg= | ||||
| github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= | ||||
| github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69 h1:rG1clvJbgsUcmb50J82YUJhUMopWNtZvyMZjb+4fqGw= | ||||
| github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= | ||||
| github.com/containerd/containerd v1.3.2 h1:ForxmXkA6tPIvffbrDAcPUIB32QgXkt2XFj+F0UxetA= | ||||
| github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= | ||||
| github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc h1:TP+534wVlf61smEIq1nwLLAjQVEK2EADoW3CX9AuT+8= | ||||
| github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= | ||||
| github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448 h1:PUD50EuOMkXVcpBIA/R95d56duJR9VxhwncsFbNnxW4= | ||||
|  | @ -23,6 +22,7 @@ github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd h1:JNn81o/xG+8N | |||
| github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= | ||||
| github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= | ||||
| github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= | ||||
| github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | ||||
| github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= | ||||
|  | @ -31,6 +31,8 @@ github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68Fp | |||
| github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= | ||||
| github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= | ||||
| github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= | ||||
| github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= | ||||
| github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= | ||||
| github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= | ||||
| github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= | ||||
| github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= | ||||
|  | @ -38,47 +40,47 @@ github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM | |||
| github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | ||||
| github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= | ||||
| github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | ||||
| github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= | ||||
| github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | ||||
| github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= | ||||
| github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= | ||||
| github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | ||||
| github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce h1:prjrVgOk2Yg6w+PflHoszQNLTUh4kaByUcEWM/9uin4= | ||||
| github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= | ||||
| github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874 h1:cAv7ZbSmyb1wjn6T4TIiyFCkpcfgpbcNNC3bM2srLaI= | ||||
| github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= | ||||
| github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= | ||||
| github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= | ||||
| github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= | ||||
| github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= | ||||
| github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= | ||||
| github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= | ||||
| github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | ||||
| github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= | ||||
| github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= | ||||
| github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= | ||||
| github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= | ||||
| github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= | ||||
| github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2 h1:QhPf3A2AZW3tTGvHPg0TA+CR3oHbVLlXUhlghqISp1I= | ||||
| github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= | ||||
| github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f h1:a969LJ4IQFwRHYqonHtUDMSh9i54WcKggeEkQ3fZMl4= | ||||
| github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= | ||||
| github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700 h1:eNUVfm/RFLIi1G7flU5/ZRTHvd4kcVuzfRnL6OFlzCI= | ||||
| github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= | ||||
| github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39 h1:H7DMc6FAjgwZZi8BRqjrAAHWoqEr5e5L6pS4V0ezet4= | ||||
| github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= | ||||
| github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= | ||||
| github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||
| github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= | ||||
| github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||
| github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8= | ||||
| github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= | ||||
| github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7 h1:hhvfGDVThBnd4kYisSFmYuHYeUhglxcwag7FhVPH9zM= | ||||
| github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= | ||||
| github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k= | ||||
| github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= | ||||
| github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= | ||||
| github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= | ||||
| github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||
| github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||
| github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= | ||||
| github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | ||||
| github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8 h1:zLV6q4e8Jv9EHjNg/iHfzwDkCve6Ua5jCygptrtXHvI= | ||||
| github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= | ||||
| github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= | ||||
| github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= | ||||
| github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5 h1:MCfT24H3f//U5+UCrZp1/riVO3B50BovxtDiNn0XKkk= | ||||
| github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= | ||||
| github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= | ||||
| github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= | ||||
| github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= | ||||
| github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= | ||||
| github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f h1:mvXjJIHRZyhNuGassLTcXTwjiWq7NmjdavZsUnmFybQ= | ||||
| github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= | ||||
| go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= | ||||
| go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= | ||||
| golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||
|  | @ -93,15 +95,19 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJV | |||
| golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||
| golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09 h1:KaQtG+aDELoNmXYas3TVkGNYRuq8JQ1aa7LJt8EXVyo= | ||||
| golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||
| golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI= | ||||
| golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | ||||
| golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI= | ||||
| golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= | ||||
| golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3 h1:7TYNF4UdlohbFwpNH04CoPMp1cHUZgO1Ebq5r2hIjfo= | ||||
|  | @ -112,20 +118,32 @@ golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= | |||
| golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= | ||||
| golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= | ||||
| golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | ||||
| golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= | ||||
| google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= | ||||
| google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | ||||
| google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc= | ||||
| google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= | ||||
| google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb h1:i1Ppqkc3WQXikh8bXiwHqAN5Rv3/qDCcRk0/Otx73BY= | ||||
| google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= | ||||
| google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873 h1:nfPFGzJkUDX6uBmpN/pSw7MbOAWegH5QDQuoXFHedLg= | ||||
| google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= | ||||
| google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= | ||||
| google.golang.org/grpc v1.20.1 h1:Hz2g2wirWK7H0qIIhGIqRGTuMwTE8HEKFnDZZ7lm9NU= | ||||
| google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= | ||||
| google.golang.org/grpc v1.23.1 h1:q4XQuHFC6I28BKZpo6IYyb3mNO+l7lSOxRuYTCiDfXk= | ||||
| google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= | ||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= | ||||
| gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= | ||||
| gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||
| gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= | ||||
| gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||
| gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= | ||||
| gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= | ||||
| honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||
| k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8= | ||||
| k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= | ||||
| honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||
|  |  | |||
|  | @ -21,8 +21,11 @@ const ( | |||
| 	OutboundNat          = hns.OutboundNat | ||||
| 	ExternalLoadBalancer = hns.ExternalLoadBalancer | ||||
| 	Route                = hns.Route | ||||
| 	Proxy                = hns.Proxy | ||||
| ) | ||||
| 
 | ||||
| type ProxyPolicy = hns.ProxyPolicy | ||||
| 
 | ||||
| type NatPolicy = hns.NatPolicy | ||||
| 
 | ||||
| type QosPolicy = hns.QosPolicy | ||||
|  |  | |||
|  | @ -1,7 +0,0 @@ | |||
| package hcs | ||||
| 
 | ||||
| import "C" | ||||
| 
 | ||||
| // This import is needed to make the library compile as CGO because HCSSHIM
 | ||||
| // only works with CGO due to callbacks from HCS comming back from a C thread
 | ||||
| // which is not supported without CGO. See https://github.com/golang/go/issues/10973
 | ||||
|  | @ -0,0 +1,5 @@ | |||
| package hcs | ||||
| 
 | ||||
| //go:generate go run ../../mksyscall_windows.go -output zsyscall_windows.go syscall.go
 | ||||
| 
 | ||||
| //sys hcsFormatWritableLayerVhd(handle uintptr) (hr error) = computestorage.HcsFormatWritableLayerVhd
 | ||||
|  | @ -4,12 +4,9 @@ import ( | |||
| 	"context" | ||||
| 	"encoding/json" | ||||
| 	"errors" | ||||
| 	"os" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"sync" | ||||
| 	"syscall" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/Microsoft/hcsshim/internal/cow" | ||||
| 	"github.com/Microsoft/hcsshim/internal/log" | ||||
|  | @ -21,27 +18,6 @@ import ( | |||
| 	"go.opencensus.io/trace" | ||||
| ) | ||||
| 
 | ||||
| // currentContainerStarts is used to limit the number of concurrent container
 | ||||
| // starts.
 | ||||
| var currentContainerStarts containerStarts | ||||
| 
 | ||||
| type containerStarts struct { | ||||
| 	maxParallel int | ||||
| 	inProgress  int | ||||
| 	sync.Mutex | ||||
| } | ||||
| 
 | ||||
| func init() { | ||||
| 	mpsS := os.Getenv("HCSSHIM_MAX_PARALLEL_START") | ||||
| 	if len(mpsS) > 0 { | ||||
| 		mpsI, err := strconv.Atoi(mpsS) | ||||
| 		if err != nil || mpsI < 0 { | ||||
| 			return | ||||
| 		} | ||||
| 		currentContainerStarts.maxParallel = mpsI | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| type System struct { | ||||
| 	handleLock     sync.RWMutex | ||||
| 	handle         vmcompute.HcsSystem | ||||
|  | @ -215,32 +191,6 @@ func (computeSystem *System) Start(ctx context.Context) (err error) { | |||
| 		return makeSystemError(computeSystem, operation, "", ErrAlreadyClosed, nil) | ||||
| 	} | ||||
| 
 | ||||
| 	// This is a very simple backoff-retry loop to limit the number
 | ||||
| 	// of parallel container starts if environment variable
 | ||||
| 	// HCSSHIM_MAX_PARALLEL_START is set to a positive integer.
 | ||||
| 	// It should generally only be used as a workaround to various
 | ||||
| 	// platform issues that exist between RS1 and RS4 as of Aug 2018
 | ||||
| 	if currentContainerStarts.maxParallel > 0 { | ||||
| 		for { | ||||
| 			currentContainerStarts.Lock() | ||||
| 			if currentContainerStarts.inProgress < currentContainerStarts.maxParallel { | ||||
| 				currentContainerStarts.inProgress++ | ||||
| 				currentContainerStarts.Unlock() | ||||
| 				break | ||||
| 			} | ||||
| 			if currentContainerStarts.inProgress == currentContainerStarts.maxParallel { | ||||
| 				currentContainerStarts.Unlock() | ||||
| 				time.Sleep(100 * time.Millisecond) | ||||
| 			} | ||||
| 		} | ||||
| 		// Make sure we decrement the count when we are done.
 | ||||
| 		defer func() { | ||||
| 			currentContainerStarts.Lock() | ||||
| 			currentContainerStarts.inProgress-- | ||||
| 			currentContainerStarts.Unlock() | ||||
| 		}() | ||||
| 	} | ||||
| 
 | ||||
| 	resultJSON, err := vmcompute.HcsStartComputeSystem(ctx, computeSystem.handle, "") | ||||
| 	events, err := processAsyncHcsResult(ctx, err, resultJSON, computeSystem.callbackNumber, hcsNotificationSystemStartCompleted, &timeout.SystemStart) | ||||
| 	if err != nil { | ||||
|  |  | |||
|  | @ -1,10 +1,14 @@ | |||
| package hcs | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"io" | ||||
| 	"syscall" | ||||
| 
 | ||||
| 	"github.com/Microsoft/go-winio" | ||||
| 	diskutil "github.com/Microsoft/go-winio/vhd" | ||||
| 	"github.com/pkg/errors" | ||||
| 	"golang.org/x/sys/windows" | ||||
| ) | ||||
| 
 | ||||
| // makeOpenFiles calls winio.MakeOpenFile for each handle in a slice but closes all the handles
 | ||||
|  | @ -31,3 +35,27 @@ func makeOpenFiles(hs []syscall.Handle) (_ []io.ReadWriteCloser, err error) { | |||
| 	} | ||||
| 	return fs, nil | ||||
| } | ||||
| 
 | ||||
| // creates a VHD formatted with NTFS of size `sizeGB` at the given `vhdPath`.
 | ||||
| func CreateNTFSVHD(ctx context.Context, vhdPath string, sizeGB uint32) (err error) { | ||||
| 	if err := diskutil.CreateVhdx(vhdPath, sizeGB, 1); err != nil { | ||||
| 		return errors.Wrap(err, "failed to create VHD") | ||||
| 	} | ||||
| 
 | ||||
| 	vhd, err := diskutil.OpenVirtualDisk(vhdPath, diskutil.VirtualDiskAccessNone, diskutil.OpenVirtualDiskFlagNone) | ||||
| 	if err != nil { | ||||
| 		return errors.Wrap(err, "failed to open VHD") | ||||
| 	} | ||||
| 	defer func() { | ||||
| 		err2 := windows.CloseHandle(windows.Handle(vhd)) | ||||
| 		if err == nil { | ||||
| 			err = errors.Wrap(err2, "failed to close VHD") | ||||
| 		} | ||||
| 	}() | ||||
| 
 | ||||
| 	if err := hcsFormatWritableLayerVhd(uintptr(vhd)); err != nil { | ||||
| 		return errors.Wrap(err, "failed to format VHD") | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
|  |  | |||
							
								
								
									
										54
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hcs/zsyscall_windows.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							
							
						
						
									
										54
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hcs/zsyscall_windows.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							|  | @ -0,0 +1,54 @@ | |||
| // Code generated mksyscall_windows.exe DO NOT EDIT
 | ||||
| 
 | ||||
| package hcs | ||||
| 
 | ||||
| import ( | ||||
| 	"syscall" | ||||
| 	"unsafe" | ||||
| 
 | ||||
| 	"golang.org/x/sys/windows" | ||||
| ) | ||||
| 
 | ||||
| var _ unsafe.Pointer | ||||
| 
 | ||||
| // Do the interface allocations only once for common
 | ||||
| // Errno values.
 | ||||
| const ( | ||||
| 	errnoERROR_IO_PENDING = 997 | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) | ||||
| ) | ||||
| 
 | ||||
| // errnoErr returns common boxed Errno values, to prevent
 | ||||
| // allocations at runtime.
 | ||||
| func errnoErr(e syscall.Errno) error { | ||||
| 	switch e { | ||||
| 	case 0: | ||||
| 		return nil | ||||
| 	case errnoERROR_IO_PENDING: | ||||
| 		return errERROR_IO_PENDING | ||||
| 	} | ||||
| 	// TODO: add more here, after collecting data on the common
 | ||||
| 	// error values see on Windows. (perhaps when running
 | ||||
| 	// all.bat?)
 | ||||
| 	return e | ||||
| } | ||||
| 
 | ||||
| var ( | ||||
| 	modcomputestorage = windows.NewLazySystemDLL("computestorage.dll") | ||||
| 
 | ||||
| 	procHcsFormatWritableLayerVhd = modcomputestorage.NewProc("HcsFormatWritableLayerVhd") | ||||
| ) | ||||
| 
 | ||||
| func hcsFormatWritableLayerVhd(handle uintptr) (hr error) { | ||||
| 	r0, _, _ := syscall.Syscall(procHcsFormatWritableLayerVhd.Addr(), 1, uintptr(handle), 0, 0) | ||||
| 	if int32(r0) < 0 { | ||||
| 		if r0&0x1fff0000 == 0x00070000 { | ||||
| 			r0 &= 0xffff | ||||
| 		} | ||||
| 		hr = syscall.Errno(r0) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | @ -173,6 +173,27 @@ func (endpoint *HNSEndpoint) ApplyACLPolicy(policies ...*ACLPolicy) error { | |||
| 	return err | ||||
| } | ||||
| 
 | ||||
| // ApplyProxyPolicy applies a set of Proxy Policies on the Endpoint
 | ||||
| func (endpoint *HNSEndpoint) ApplyProxyPolicy(policies ...*ProxyPolicy) error { | ||||
| 	operation := "ApplyProxyPolicy" | ||||
| 	title := "hcsshim::HNSEndpoint::" + operation | ||||
| 	logrus.Debugf(title+" id=%s", endpoint.Id) | ||||
| 
 | ||||
| 	for _, policy := range policies { | ||||
| 		if policy == nil { | ||||
| 			continue | ||||
| 		} | ||||
| 		jsonString, err := json.Marshal(policy) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		endpoint.Policies = append(endpoint.Policies, jsonString) | ||||
| 	} | ||||
| 
 | ||||
| 	_, err := endpoint.Update() | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| // ContainerAttach attaches an endpoint to container
 | ||||
| func (endpoint *HNSEndpoint) ContainerAttach(containerID string, compartmentID uint16) error { | ||||
| 	operation := "ContainerAttach" | ||||
|  |  | |||
|  | @ -17,6 +17,7 @@ const ( | |||
| 	OutboundNat          PolicyType = "OutBoundNAT" | ||||
| 	ExternalLoadBalancer PolicyType = "ELB" | ||||
| 	Route                PolicyType = "ROUTE" | ||||
| 	Proxy                PolicyType = "PROXY" | ||||
| ) | ||||
| 
 | ||||
| type NatPolicy struct { | ||||
|  | @ -60,6 +61,15 @@ type OutboundNatPolicy struct { | |||
| 	Destinations []string `json:",omitempty"` | ||||
| } | ||||
| 
 | ||||
| type ProxyPolicy struct { | ||||
| 	Type          PolicyType `json:"Type"` | ||||
| 	IP            string     `json:",omitempty"` | ||||
| 	Port          string     `json:",omitempty"` | ||||
| 	ExceptionList []string   `json:",omitempty"` | ||||
| 	Destination   string     `json:",omitempty"` | ||||
| 	OutboundNat   bool       `json:",omitempty"` | ||||
| } | ||||
| 
 | ||||
| type ActionType string | ||||
| type DirectionType string | ||||
| type RuleType string | ||||
|  |  | |||
|  | @ -214,9 +214,10 @@ type MappedVirtualDiskController struct { | |||
| 
 | ||||
| // GuestDefinedCapabilities is part of the GuestConnectionInfo returned by a GuestConnection call on a utility VM
 | ||||
| type GuestDefinedCapabilities struct { | ||||
| 	NamespaceAddRequestSupported bool `json:",omitempty"` | ||||
| 	SignalProcessSupported       bool `json:",omitempty"` | ||||
| 	DumpStacksSupported          bool `json:",omitempty"` | ||||
| 	NamespaceAddRequestSupported  bool `json:",omitempty"` | ||||
| 	SignalProcessSupported        bool `json:",omitempty"` | ||||
| 	DumpStacksSupported           bool `json:",omitempty"` | ||||
| 	DeleteContainerStateSupported bool `json:",omitempty"` | ||||
| } | ||||
| 
 | ||||
| // GuestConnectionInfo is the structure of an iterm return by a GuestConnection call on a utility VM
 | ||||
|  |  | |||
|  | @ -39,4 +39,8 @@ type Devices struct { | |||
| 	FlexibleIov map[string]FlexibleIoDevice `json:"FlexibleIov,omitempty"` | ||||
| 
 | ||||
| 	SharedMemory *SharedMemoryConfiguration `json:"SharedMemory,omitempty"` | ||||
| 
 | ||||
| 	// TODO: This is pre-release support in schema 2.3. Need to add build number
 | ||||
| 	// docs when a public build with this is out.
 | ||||
| 	VirtualPci map[string]VirtualPciDevice `json:",omitempty"` | ||||
| } | ||||
|  |  | |||
|  | @ -27,4 +27,23 @@ type Memory2 struct { | |||
| 	// to the VM, allowing it to trim non-zeroed pages from the working set (if supported by
 | ||||
| 	// the guest operating system).
 | ||||
| 	EnableColdDiscardHint bool `json:"EnableColdDiscardHint,omitempty"` | ||||
| 
 | ||||
| 	// LowMmioGapInMB is the low MMIO region allocated below 4GB.
 | ||||
| 	//
 | ||||
| 	// TODO: This is pre-release support in schema 2.3. Need to add build number
 | ||||
| 	// docs when a public build with this is out.
 | ||||
| 	LowMMIOGapInMB uint64 `json:"LowMmioGapInMB,omitempty"` | ||||
| 
 | ||||
| 	// HighMmioBaseInMB is the high MMIO region allocated above 4GB (base and
 | ||||
| 	// size).
 | ||||
| 	//
 | ||||
| 	// TODO: This is pre-release support in schema 2.3. Need to add build number
 | ||||
| 	// docs when a public build with this is out.
 | ||||
| 	HighMMIOBaseInMB uint64 `json:"HighMmioBaseInMB,omitempty"` | ||||
| 
 | ||||
| 	// HighMmioGapInMB is the high MMIO region.
 | ||||
| 	//
 | ||||
| 	// TODO: This is pre-release support in schema 2.3. Need to add build number
 | ||||
| 	// docs when a public build with this is out.
 | ||||
| 	HighMMIOGapInMB uint64 `json:"HighMmioGapInMB,omitempty"` | ||||
| } | ||||
|  |  | |||
							
								
								
									
										16
									
								
								vendor/github.com/Microsoft/hcsshim/internal/schema2/virtual_pci_device.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							
							
						
						
									
										16
									
								
								vendor/github.com/Microsoft/hcsshim/internal/schema2/virtual_pci_device.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							|  | @ -0,0 +1,16 @@ | |||
| /* | ||||
|  * HCS API | ||||
|  * | ||||
|  * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
 | ||||
|  * | ||||
|  * API version: 2.3 | ||||
|  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 | ||||
|  */ | ||||
| 
 | ||||
| package hcsschema | ||||
| 
 | ||||
| // TODO: This is pre-release support in schema 2.3. Need to add build number
 | ||||
| // docs when a public build with this is out.
 | ||||
| type VirtualPciDevice struct { | ||||
| 	Functions []VirtualPciFunction `json:",omitempty"` | ||||
| } | ||||
							
								
								
									
										18
									
								
								vendor/github.com/Microsoft/hcsshim/internal/schema2/virtual_pci_function.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							
							
						
						
									
										18
									
								
								vendor/github.com/Microsoft/hcsshim/internal/schema2/virtual_pci_function.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							|  | @ -0,0 +1,18 @@ | |||
| /* | ||||
|  * HCS API | ||||
|  * | ||||
|  * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
 | ||||
|  * | ||||
|  * API version: 2.3 | ||||
|  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 | ||||
|  */ | ||||
| 
 | ||||
| package hcsschema | ||||
| 
 | ||||
| // TODO: This is pre-release support in schema 2.3. Need to add build number
 | ||||
| // docs when a public build with this is out.
 | ||||
| type VirtualPciFunction struct { | ||||
| 	DeviceInstancePath string `json:",omitempty"` | ||||
| 
 | ||||
| 	VirtualFunction uint16 `json:",omitempty"` | ||||
| } | ||||
|  | @ -1,28 +1,23 @@ | |||
| package wclayer | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 
 | ||||
| 	"github.com/Microsoft/hcsshim/internal/hcserror" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"github.com/Microsoft/hcsshim/internal/oc" | ||||
| 	"go.opencensus.io/trace" | ||||
| ) | ||||
| 
 | ||||
| // ActivateLayer will find the layer with the given id and mount it's filesystem.
 | ||||
| // For a read/write layer, the mounted filesystem will appear as a volume on the
 | ||||
| // host, while a read-only layer is generally expected to be a no-op.
 | ||||
| // An activated layer must later be deactivated via DeactivateLayer.
 | ||||
| func ActivateLayer(path string) (err error) { | ||||
| func ActivateLayer(ctx context.Context, path string) (err error) { | ||||
| 	title := "hcsshim::ActivateLayer" | ||||
| 	fields := logrus.Fields{ | ||||
| 		"path": path, | ||||
| 	} | ||||
| 	logrus.WithFields(fields).Debug(title) | ||||
| 	defer func() { | ||||
| 		if err != nil { | ||||
| 			fields[logrus.ErrorKey] = err | ||||
| 			logrus.WithFields(fields).Error(err) | ||||
| 		} else { | ||||
| 			logrus.WithFields(fields).Debug(title + " - succeeded") | ||||
| 		} | ||||
| 	}() | ||||
| 	ctx, span := trace.StartSpan(ctx, title) | ||||
| 	defer span.End() | ||||
| 	defer func() { oc.SetSpanStatus(span, err) }() | ||||
| 	span.AddAttributes(trace.StringAttribute("path", path)) | ||||
| 
 | ||||
| 	err = activateLayer(&stdDriverInfo, path) | ||||
| 	if err != nil { | ||||
|  |  | |||
|  | @ -1,6 +1,7 @@ | |||
| package wclayer | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
|  | @ -8,10 +9,15 @@ import ( | |||
| 
 | ||||
| 	"github.com/Microsoft/go-winio" | ||||
| 	"github.com/Microsoft/hcsshim/internal/hcserror" | ||||
| 	"github.com/Microsoft/hcsshim/internal/oc" | ||||
| 	"github.com/Microsoft/hcsshim/internal/safefile" | ||||
| 	"go.opencensus.io/trace" | ||||
| ) | ||||
| 
 | ||||
| type baseLayerWriter struct { | ||||
| 	ctx context.Context | ||||
| 	s   *trace.Span | ||||
| 
 | ||||
| 	root         *os.File | ||||
| 	f            *os.File | ||||
| 	bw           *winio.BackupFileWriter | ||||
|  | @ -136,12 +142,15 @@ func (w *baseLayerWriter) Write(b []byte) (int, error) { | |||
| 	return n, err | ||||
| } | ||||
| 
 | ||||
| func (w *baseLayerWriter) Close() error { | ||||
| func (w *baseLayerWriter) Close() (err error) { | ||||
| 	defer w.s.End() | ||||
| 	defer func() { oc.SetSpanStatus(w.s, err) }() | ||||
| 	defer func() { | ||||
| 		w.root.Close() | ||||
| 		w.root = nil | ||||
| 	}() | ||||
| 	err := w.closeCurrentFile() | ||||
| 
 | ||||
| 	err = w.closeCurrentFile() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | @ -153,7 +162,7 @@ func (w *baseLayerWriter) Close() error { | |||
| 			return err | ||||
| 		} | ||||
| 
 | ||||
| 		err = ProcessBaseLayer(w.root.Name()) | ||||
| 		err = ProcessBaseLayer(w.ctx, w.root.Name()) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | @ -163,7 +172,7 @@ func (w *baseLayerWriter) Close() error { | |||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			err = ProcessUtilityVMImage(filepath.Join(w.root.Name(), "UtilityVM")) | ||||
| 			err = ProcessUtilityVMImage(w.ctx, filepath.Join(w.root.Name(), "UtilityVM")) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
|  |  | |||
|  | @ -1,27 +1,23 @@ | |||
| package wclayer | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 
 | ||||
| 	"github.com/Microsoft/hcsshim/internal/hcserror" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"github.com/Microsoft/hcsshim/internal/oc" | ||||
| 	"go.opencensus.io/trace" | ||||
| ) | ||||
| 
 | ||||
| // CreateLayer creates a new, empty, read-only layer on the filesystem based on
 | ||||
| // the parent layer provided.
 | ||||
| func CreateLayer(path, parent string) (err error) { | ||||
| func CreateLayer(ctx context.Context, path, parent string) (err error) { | ||||
| 	title := "hcsshim::CreateLayer" | ||||
| 	fields := logrus.Fields{ | ||||
| 		"parent": parent, | ||||
| 		"path":   path, | ||||
| 	} | ||||
| 	logrus.WithFields(fields).Debug(title) | ||||
| 	defer func() { | ||||
| 		if err != nil { | ||||
| 			fields[logrus.ErrorKey] = err | ||||
| 			logrus.WithFields(fields).Error(err) | ||||
| 		} else { | ||||
| 			logrus.WithFields(fields).Debug(title + " - succeeded") | ||||
| 		} | ||||
| 	}() | ||||
| 	ctx, span := trace.StartSpan(ctx, title) | ||||
| 	defer span.End() | ||||
| 	defer func() { oc.SetSpanStatus(span, err) }() | ||||
| 	span.AddAttributes( | ||||
| 		trace.StringAttribute("path", path), | ||||
| 		trace.StringAttribute("parent", parent)) | ||||
| 
 | ||||
| 	err = createLayer(&stdDriverInfo, path, parent) | ||||
| 	if err != nil { | ||||
|  |  | |||
|  | @ -1,31 +1,29 @@ | |||
| package wclayer | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/Microsoft/hcsshim/internal/hcserror" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"github.com/Microsoft/hcsshim/internal/oc" | ||||
| 	"go.opencensus.io/trace" | ||||
| ) | ||||
| 
 | ||||
| // CreateScratchLayer creates and populates new read-write layer for use by a container.
 | ||||
| // This requires both the id of the direct parent layer, as well as the full list
 | ||||
| // of paths to all parent layers up to the base (and including the direct parent
 | ||||
| // whose id was provided).
 | ||||
| func CreateScratchLayer(path string, parentLayerPaths []string) (err error) { | ||||
| func CreateScratchLayer(ctx context.Context, path string, parentLayerPaths []string) (err error) { | ||||
| 	title := "hcsshim::CreateScratchLayer" | ||||
| 	fields := logrus.Fields{ | ||||
| 		"path": path, | ||||
| 	} | ||||
| 	logrus.WithFields(fields).Debug(title) | ||||
| 	defer func() { | ||||
| 		if err != nil { | ||||
| 			fields[logrus.ErrorKey] = err | ||||
| 			logrus.WithFields(fields).Error(err) | ||||
| 		} else { | ||||
| 			logrus.WithFields(fields).Debug(title + " - succeeded") | ||||
| 		} | ||||
| 	}() | ||||
| 	ctx, span := trace.StartSpan(ctx, title) | ||||
| 	defer span.End() | ||||
| 	defer func() { oc.SetSpanStatus(span, err) }() | ||||
| 	span.AddAttributes( | ||||
| 		trace.StringAttribute("path", path), | ||||
| 		trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", "))) | ||||
| 
 | ||||
| 	// Generate layer descriptors
 | ||||
| 	layers, err := layerPathsToDescriptors(parentLayerPaths) | ||||
| 	layers, err := layerPathsToDescriptors(ctx, parentLayerPaths) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  |  | |||
|  | @ -1,25 +1,20 @@ | |||
| package wclayer | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 
 | ||||
| 	"github.com/Microsoft/hcsshim/internal/hcserror" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"github.com/Microsoft/hcsshim/internal/oc" | ||||
| 	"go.opencensus.io/trace" | ||||
| ) | ||||
| 
 | ||||
| // DeactivateLayer will dismount a layer that was mounted via ActivateLayer.
 | ||||
| func DeactivateLayer(path string) (err error) { | ||||
| func DeactivateLayer(ctx context.Context, path string) (err error) { | ||||
| 	title := "hcsshim::DeactivateLayer" | ||||
| 	fields := logrus.Fields{ | ||||
| 		"path": path, | ||||
| 	} | ||||
| 	logrus.WithFields(fields).Debug(title) | ||||
| 	defer func() { | ||||
| 		if err != nil { | ||||
| 			fields[logrus.ErrorKey] = err | ||||
| 			logrus.WithFields(fields).Error(err) | ||||
| 		} else { | ||||
| 			logrus.WithFields(fields).Debug(title + " - succeeded") | ||||
| 		} | ||||
| 	}() | ||||
| 	ctx, span := trace.StartSpan(ctx, title) | ||||
| 	defer span.End() | ||||
| 	defer func() { oc.SetSpanStatus(span, err) }() | ||||
| 	span.AddAttributes(trace.StringAttribute("path", path)) | ||||
| 
 | ||||
| 	err = deactivateLayer(&stdDriverInfo, path) | ||||
| 	if err != nil { | ||||
|  |  | |||
|  | @ -1,26 +1,21 @@ | |||
| package wclayer | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 
 | ||||
| 	"github.com/Microsoft/hcsshim/internal/hcserror" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"github.com/Microsoft/hcsshim/internal/oc" | ||||
| 	"go.opencensus.io/trace" | ||||
| ) | ||||
| 
 | ||||
| // DestroyLayer will remove the on-disk files representing the layer with the given
 | ||||
| // path, including that layer's containing folder, if any.
 | ||||
| func DestroyLayer(path string) (err error) { | ||||
| func DestroyLayer(ctx context.Context, path string) (err error) { | ||||
| 	title := "hcsshim::DestroyLayer" | ||||
| 	fields := logrus.Fields{ | ||||
| 		"path": path, | ||||
| 	} | ||||
| 	logrus.WithFields(fields).Debug(title) | ||||
| 	defer func() { | ||||
| 		if err != nil { | ||||
| 			fields[logrus.ErrorKey] = err | ||||
| 			logrus.WithFields(fields).Error(err) | ||||
| 		} else { | ||||
| 			logrus.WithFields(fields).Debug(title + " - succeeded") | ||||
| 		} | ||||
| 	}() | ||||
| 	ctx, span := trace.StartSpan(ctx, title) | ||||
| 	defer span.End() | ||||
| 	defer func() { oc.SetSpanStatus(span, err) }() | ||||
| 	span.AddAttributes(trace.StringAttribute("path", path)) | ||||
| 
 | ||||
| 	err = destroyLayer(&stdDriverInfo, path) | ||||
| 	if err != nil { | ||||
|  |  | |||
|  | @ -1,32 +1,27 @@ | |||
| package wclayer | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| 	"syscall" | ||||
| 	"unsafe" | ||||
| 
 | ||||
| 	"github.com/Microsoft/hcsshim/internal/hcserror" | ||||
| 	"github.com/Microsoft/hcsshim/internal/oc" | ||||
| 	"github.com/Microsoft/hcsshim/osversion" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"go.opencensus.io/trace" | ||||
| ) | ||||
| 
 | ||||
| // ExpandScratchSize expands the size of a layer to at least size bytes.
 | ||||
| func ExpandScratchSize(path string, size uint64) (err error) { | ||||
| func ExpandScratchSize(ctx context.Context, path string, size uint64) (err error) { | ||||
| 	title := "hcsshim::ExpandScratchSize" | ||||
| 	fields := logrus.Fields{ | ||||
| 		"path": path, | ||||
| 		"size": size, | ||||
| 	} | ||||
| 	logrus.WithFields(fields).Debug(title) | ||||
| 	defer func() { | ||||
| 		if err != nil { | ||||
| 			fields[logrus.ErrorKey] = err | ||||
| 			logrus.WithFields(fields).Error(err) | ||||
| 		} else { | ||||
| 			logrus.WithFields(fields).Debug(title + " - succeeded") | ||||
| 		} | ||||
| 	}() | ||||
| 	ctx, span := trace.StartSpan(ctx, title) | ||||
| 	defer span.End() | ||||
| 	defer func() { oc.SetSpanStatus(span, err) }() | ||||
| 	span.AddAttributes( | ||||
| 		trace.StringAttribute("path", path), | ||||
| 		trace.Int64Attribute("size", int64(size))) | ||||
| 
 | ||||
| 	err = expandSandboxSize(&stdDriverInfo, path, size) | ||||
| 	if err != nil { | ||||
|  | @ -36,7 +31,7 @@ func ExpandScratchSize(path string, size uint64) (err error) { | |||
| 	// Manually expand the volume now in order to work around bugs in 19H1 and
 | ||||
| 	// prerelease versions of Vb. Remove once this is fixed in Windows.
 | ||||
| 	if build := osversion.Get().Build; build >= osversion.V19H1 && build < 19020 { | ||||
| 		err = expandSandboxVolume(path) | ||||
| 		err = expandSandboxVolume(ctx, path) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | @ -84,7 +79,7 @@ func attachVhd(path string) (syscall.Handle, error) { | |||
| 	return handle, nil | ||||
| } | ||||
| 
 | ||||
| func expandSandboxVolume(path string) error { | ||||
| func expandSandboxVolume(ctx context.Context, path string) error { | ||||
| 	// Mount the sandbox VHD temporarily.
 | ||||
| 	vhdPath := filepath.Join(path, "sandbox.vhdx") | ||||
| 	vhd, err := attachVhd(vhdPath) | ||||
|  | @ -94,7 +89,7 @@ func expandSandboxVolume(path string) error { | |||
| 	defer syscall.Close(vhd) | ||||
| 
 | ||||
| 	// Open the volume.
 | ||||
| 	volumePath, err := GetLayerMountPath(path) | ||||
| 	volumePath, err := GetLayerMountPath(ctx, path) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  |  | |||
|  | @ -1,12 +1,15 @@ | |||
| package wclayer | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"io/ioutil" | ||||
| 	"os" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/Microsoft/go-winio" | ||||
| 	"github.com/Microsoft/hcsshim/internal/hcserror" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"github.com/Microsoft/hcsshim/internal/oc" | ||||
| 	"go.opencensus.io/trace" | ||||
| ) | ||||
| 
 | ||||
| // ExportLayer will create a folder at exportFolderPath and fill that folder with
 | ||||
|  | @ -14,24 +17,18 @@ import ( | |||
| // format includes any metadata required for later importing the layer (using
 | ||||
| // ImportLayer), and requires the full list of parent layer paths in order to
 | ||||
| // perform the export.
 | ||||
| func ExportLayer(path string, exportFolderPath string, parentLayerPaths []string) (err error) { | ||||
| func ExportLayer(ctx context.Context, path string, exportFolderPath string, parentLayerPaths []string) (err error) { | ||||
| 	title := "hcsshim::ExportLayer" | ||||
| 	fields := logrus.Fields{ | ||||
| 		"path":             path, | ||||
| 		"exportFolderPath": exportFolderPath, | ||||
| 	} | ||||
| 	logrus.WithFields(fields).Debug(title) | ||||
| 	defer func() { | ||||
| 		if err != nil { | ||||
| 			fields[logrus.ErrorKey] = err | ||||
| 			logrus.WithFields(fields).Error(err) | ||||
| 		} else { | ||||
| 			logrus.WithFields(fields).Debug(title + " - succeeded") | ||||
| 		} | ||||
| 	}() | ||||
| 	ctx, span := trace.StartSpan(ctx, title) | ||||
| 	defer span.End() | ||||
| 	defer func() { oc.SetSpanStatus(span, err) }() | ||||
| 	span.AddAttributes( | ||||
| 		trace.StringAttribute("path", path), | ||||
| 		trace.StringAttribute("exportFolderPath", exportFolderPath), | ||||
| 		trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", "))) | ||||
| 
 | ||||
| 	// Generate layer descriptors
 | ||||
| 	layers, err := layerPathsToDescriptors(parentLayerPaths) | ||||
| 	layers, err := layerPathsToDescriptors(ctx, parentLayerPaths) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | @ -52,25 +49,46 @@ type LayerReader interface { | |||
| // NewLayerReader returns a new layer reader for reading the contents of an on-disk layer.
 | ||||
| // The caller must have taken the SeBackupPrivilege privilege
 | ||||
| // to call this and any methods on the resulting LayerReader.
 | ||||
| func NewLayerReader(path string, parentLayerPaths []string) (LayerReader, error) { | ||||
| func NewLayerReader(ctx context.Context, path string, parentLayerPaths []string) (_ LayerReader, err error) { | ||||
| 	ctx, span := trace.StartSpan(ctx, "hcsshim::NewLayerReader") | ||||
| 	defer func() { | ||||
| 		if err != nil { | ||||
| 			oc.SetSpanStatus(span, err) | ||||
| 			span.End() | ||||
| 		} | ||||
| 	}() | ||||
| 	span.AddAttributes( | ||||
| 		trace.StringAttribute("path", path), | ||||
| 		trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", "))) | ||||
| 
 | ||||
| 	exportPath, err := ioutil.TempDir("", "hcs") | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	err = ExportLayer(path, exportPath, parentLayerPaths) | ||||
| 	err = ExportLayer(ctx, path, exportPath, parentLayerPaths) | ||||
| 	if err != nil { | ||||
| 		os.RemoveAll(exportPath) | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return &legacyLayerReaderWrapper{newLegacyLayerReader(exportPath)}, nil | ||||
| 	return &legacyLayerReaderWrapper{ | ||||
| 		ctx:               ctx, | ||||
| 		s:                 span, | ||||
| 		legacyLayerReader: newLegacyLayerReader(exportPath), | ||||
| 	}, nil | ||||
| } | ||||
| 
 | ||||
| type legacyLayerReaderWrapper struct { | ||||
| 	ctx context.Context | ||||
| 	s   *trace.Span | ||||
| 
 | ||||
| 	*legacyLayerReader | ||||
| } | ||||
| 
 | ||||
| func (r *legacyLayerReaderWrapper) Close() error { | ||||
| 	err := r.legacyLayerReader.Close() | ||||
| func (r *legacyLayerReaderWrapper) Close() (err error) { | ||||
| 	defer r.s.End() | ||||
| 	defer func() { oc.SetSpanStatus(r.s, err) }() | ||||
| 
 | ||||
| 	err = r.legacyLayerReader.Close() | ||||
| 	os.RemoveAll(r.root) | ||||
| 	return err | ||||
| } | ||||
|  |  | |||
|  | @ -1,36 +1,31 @@ | |||
| package wclayer | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"syscall" | ||||
| 
 | ||||
| 	"github.com/Microsoft/hcsshim/internal/hcserror" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"github.com/Microsoft/hcsshim/internal/log" | ||||
| 	"github.com/Microsoft/hcsshim/internal/oc" | ||||
| 	"go.opencensus.io/trace" | ||||
| ) | ||||
| 
 | ||||
| // GetLayerMountPath will look for a mounted layer with the given path and return
 | ||||
| // the path at which that layer can be accessed.  This path may be a volume path
 | ||||
| // if the layer is a mounted read-write layer, otherwise it is expected to be the
 | ||||
| // folder path at which the layer is stored.
 | ||||
| func GetLayerMountPath(path string) (_ string, err error) { | ||||
| func GetLayerMountPath(ctx context.Context, path string) (_ string, err error) { | ||||
| 	title := "hcsshim::GetLayerMountPath" | ||||
| 	fields := logrus.Fields{ | ||||
| 		"path": path, | ||||
| 	} | ||||
| 	logrus.WithFields(fields).Debug(title) | ||||
| 	defer func() { | ||||
| 		if err != nil { | ||||
| 			fields[logrus.ErrorKey] = err | ||||
| 			logrus.WithFields(fields).Error(err) | ||||
| 		} else { | ||||
| 			logrus.WithFields(fields).Debug(title + " - succeeded") | ||||
| 		} | ||||
| 	}() | ||||
| 	ctx, span := trace.StartSpan(ctx, title) | ||||
| 	defer span.End() | ||||
| 	defer func() { oc.SetSpanStatus(span, err) }() | ||||
| 	span.AddAttributes(trace.StringAttribute("path", path)) | ||||
| 
 | ||||
| 	var mountPathLength uintptr | ||||
| 	mountPathLength = 0 | ||||
| 
 | ||||
| 	// Call the procedure itself.
 | ||||
| 	logrus.WithFields(fields).Debug("Calling proc (1)") | ||||
| 	log.G(ctx).Debug("Calling proc (1)") | ||||
| 	err = getLayerMountPath(&stdDriverInfo, path, &mountPathLength, nil) | ||||
| 	if err != nil { | ||||
| 		return "", hcserror.New(err, title+" - failed", "(first call)") | ||||
|  | @ -44,13 +39,13 @@ func GetLayerMountPath(path string) (_ string, err error) { | |||
| 	mountPathp[0] = 0 | ||||
| 
 | ||||
| 	// Call the procedure again
 | ||||
| 	logrus.WithFields(fields).Debug("Calling proc (2)") | ||||
| 	log.G(ctx).Debug("Calling proc (2)") | ||||
| 	err = getLayerMountPath(&stdDriverInfo, path, &mountPathLength, &mountPathp[0]) | ||||
| 	if err != nil { | ||||
| 		return "", hcserror.New(err, title+" - failed", "(second call)") | ||||
| 	} | ||||
| 
 | ||||
| 	mountPath := syscall.UTF16ToString(mountPathp[0:]) | ||||
| 	fields["mountPath"] = mountPath | ||||
| 	span.AddAttributes(trace.StringAttribute("mountPath", mountPath)) | ||||
| 	return mountPath, nil | ||||
| } | ||||
|  |  | |||
|  | @ -1,29 +1,29 @@ | |||
| package wclayer | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 
 | ||||
| 	"github.com/Microsoft/hcsshim/internal/hcserror" | ||||
| 	"github.com/Microsoft/hcsshim/internal/interop" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"github.com/Microsoft/hcsshim/internal/oc" | ||||
| 	"go.opencensus.io/trace" | ||||
| ) | ||||
| 
 | ||||
| // GetSharedBaseImages will enumerate the images stored in the common central
 | ||||
| // image store and return descriptive info about those images for the purpose
 | ||||
| // of registering them with the graphdriver, graph, and tagstore.
 | ||||
| func GetSharedBaseImages() (imageData string, err error) { | ||||
| func GetSharedBaseImages(ctx context.Context) (_ string, err error) { | ||||
| 	title := "hcsshim::GetSharedBaseImages" | ||||
| 	logrus.Debug(title) | ||||
| 	defer func() { | ||||
| 		if err != nil { | ||||
| 			logrus.WithError(err).Error(err) | ||||
| 		} else { | ||||
| 			logrus.WithField("imageData", imageData).Debug(title + " - succeeded") | ||||
| 		} | ||||
| 	}() | ||||
| 	ctx, span := trace.StartSpan(ctx, title) | ||||
| 	defer span.End() | ||||
| 	defer func() { oc.SetSpanStatus(span, err) }() | ||||
| 
 | ||||
| 	var buffer *uint16 | ||||
| 	err = getBaseImages(&buffer) | ||||
| 	if err != nil { | ||||
| 		return "", hcserror.New(err, title+" - failed", "") | ||||
| 	} | ||||
| 	return interop.ConvertAndFreeCoTaskMemString(buffer), nil | ||||
| 	imageData := interop.ConvertAndFreeCoTaskMemString(buffer) | ||||
| 	span.AddAttributes(trace.StringAttribute("imageData", imageData)) | ||||
| 	return imageData, nil | ||||
| } | ||||
|  |  | |||
|  | @ -1,26 +1,22 @@ | |||
| package wclayer | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 
 | ||||
| 	"github.com/Microsoft/hcsshim/internal/hcserror" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"github.com/Microsoft/hcsshim/internal/oc" | ||||
| 	"go.opencensus.io/trace" | ||||
| ) | ||||
| 
 | ||||
| // GrantVmAccess adds access to a file for a given VM
 | ||||
| func GrantVmAccess(vmid string, filepath string) (err error) { | ||||
| func GrantVmAccess(ctx context.Context, vmid string, filepath string) (err error) { | ||||
| 	title := "hcsshim::GrantVmAccess" | ||||
| 	fields := logrus.Fields{ | ||||
| 		"vm-id": vmid, | ||||
| 		"path":  filepath, | ||||
| 	} | ||||
| 	logrus.WithFields(fields).Debug(title) | ||||
| 	defer func() { | ||||
| 		if err != nil { | ||||
| 			fields[logrus.ErrorKey] = err | ||||
| 			logrus.WithFields(fields).Error(err) | ||||
| 		} else { | ||||
| 			logrus.WithFields(fields).Debug(title + " - succeeded") | ||||
| 		} | ||||
| 	}() | ||||
| 	ctx, span := trace.StartSpan(ctx, title) | ||||
| 	defer span.End() | ||||
| 	defer func() { oc.SetSpanStatus(span, err) }() | ||||
| 	span.AddAttributes( | ||||
| 		trace.StringAttribute("vm-id", vmid), | ||||
| 		trace.StringAttribute("path", filepath)) | ||||
| 
 | ||||
| 	err = grantVmAccess(vmid, filepath) | ||||
| 	if err != nil { | ||||
|  |  | |||
|  | @ -1,38 +1,35 @@ | |||
| package wclayer | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"io/ioutil" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/Microsoft/go-winio" | ||||
| 	"github.com/Microsoft/hcsshim/internal/hcserror" | ||||
| 	"github.com/Microsoft/hcsshim/internal/oc" | ||||
| 	"github.com/Microsoft/hcsshim/internal/safefile" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"go.opencensus.io/trace" | ||||
| ) | ||||
| 
 | ||||
| // ImportLayer will take the contents of the folder at importFolderPath and import
 | ||||
| // that into a layer with the id layerId.  Note that in order to correctly populate
 | ||||
| // the layer and interperet the transport format, all parent layers must already
 | ||||
| // be present on the system at the paths provided in parentLayerPaths.
 | ||||
| func ImportLayer(path string, importFolderPath string, parentLayerPaths []string) (err error) { | ||||
| func ImportLayer(ctx context.Context, path string, importFolderPath string, parentLayerPaths []string) (err error) { | ||||
| 	title := "hcsshim::ImportLayer" | ||||
| 	fields := logrus.Fields{ | ||||
| 		"path":             path, | ||||
| 		"importFolderPath": importFolderPath, | ||||
| 	} | ||||
| 	logrus.WithFields(fields).Debug(title) | ||||
| 	defer func() { | ||||
| 		if err != nil { | ||||
| 			fields[logrus.ErrorKey] = err | ||||
| 			logrus.WithFields(fields).Error(err) | ||||
| 		} else { | ||||
| 			logrus.WithFields(fields).Debug(title + " - succeeded") | ||||
| 		} | ||||
| 	}() | ||||
| 	ctx, span := trace.StartSpan(ctx, title) | ||||
| 	defer span.End() | ||||
| 	defer func() { oc.SetSpanStatus(span, err) }() | ||||
| 	span.AddAttributes( | ||||
| 		trace.StringAttribute("path", path), | ||||
| 		trace.StringAttribute("importFolderPath", importFolderPath), | ||||
| 		trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", "))) | ||||
| 
 | ||||
| 	// Generate layer descriptors
 | ||||
| 	layers, err := layerPathsToDescriptors(parentLayerPaths) | ||||
| 	layers, err := layerPathsToDescriptors(ctx, parentLayerPaths) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | @ -60,20 +57,26 @@ type LayerWriter interface { | |||
| } | ||||
| 
 | ||||
| type legacyLayerWriterWrapper struct { | ||||
| 	ctx context.Context | ||||
| 	s   *trace.Span | ||||
| 
 | ||||
| 	*legacyLayerWriter | ||||
| 	path             string | ||||
| 	parentLayerPaths []string | ||||
| } | ||||
| 
 | ||||
| func (r *legacyLayerWriterWrapper) Close() error { | ||||
| func (r *legacyLayerWriterWrapper) Close() (err error) { | ||||
| 	defer r.s.End() | ||||
| 	defer func() { oc.SetSpanStatus(r.s, err) }() | ||||
| 	defer os.RemoveAll(r.root.Name()) | ||||
| 	defer r.legacyLayerWriter.CloseRoots() | ||||
| 	err := r.legacyLayerWriter.Close() | ||||
| 
 | ||||
| 	err = r.legacyLayerWriter.Close() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	if err = ImportLayer(r.destRoot.Name(), r.path, r.parentLayerPaths); err != nil { | ||||
| 	if err = ImportLayer(r.ctx, r.destRoot.Name(), r.path, r.parentLayerPaths); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	for _, name := range r.Tombstones { | ||||
|  | @ -96,7 +99,7 @@ func (r *legacyLayerWriterWrapper) Close() error { | |||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		err = ProcessUtilityVMImage(filepath.Join(r.destRoot.Name(), "UtilityVM")) | ||||
| 		err = ProcessUtilityVMImage(r.ctx, filepath.Join(r.destRoot.Name(), "UtilityVM")) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | @ -107,7 +110,18 @@ func (r *legacyLayerWriterWrapper) Close() error { | |||
| // NewLayerWriter returns a new layer writer for creating a layer on disk.
 | ||||
| // The caller must have taken the SeBackupPrivilege and SeRestorePrivilege privileges
 | ||||
| // to call this and any methods on the resulting LayerWriter.
 | ||||
| func NewLayerWriter(path string, parentLayerPaths []string) (LayerWriter, error) { | ||||
| func NewLayerWriter(ctx context.Context, path string, parentLayerPaths []string) (_ LayerWriter, err error) { | ||||
| 	ctx, span := trace.StartSpan(ctx, "hcsshim::NewLayerWriter") | ||||
| 	defer func() { | ||||
| 		if err != nil { | ||||
| 			oc.SetSpanStatus(span, err) | ||||
| 			span.End() | ||||
| 		} | ||||
| 	}() | ||||
| 	span.AddAttributes( | ||||
| 		trace.StringAttribute("path", path), | ||||
| 		trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", "))) | ||||
| 
 | ||||
| 	if len(parentLayerPaths) == 0 { | ||||
| 		// This is a base layer. It gets imported differently.
 | ||||
| 		f, err := safefile.OpenRoot(path) | ||||
|  | @ -115,6 +129,8 @@ func NewLayerWriter(path string, parentLayerPaths []string) (LayerWriter, error) | |||
| 			return nil, err | ||||
| 		} | ||||
| 		return &baseLayerWriter{ | ||||
| 			ctx:  ctx, | ||||
| 			s:    span, | ||||
| 			root: f, | ||||
| 		}, nil | ||||
| 	} | ||||
|  | @ -128,6 +144,8 @@ func NewLayerWriter(path string, parentLayerPaths []string) (LayerWriter, error) | |||
| 		return nil, err | ||||
| 	} | ||||
| 	return &legacyLayerWriterWrapper{ | ||||
| 		ctx:               ctx, | ||||
| 		s:                 span, | ||||
| 		legacyLayerWriter: w, | ||||
| 		path:              importPath, | ||||
| 		parentLayerPaths:  parentLayerPaths, | ||||
|  |  | |||
|  | @ -1,26 +1,21 @@ | |||
| package wclayer | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 
 | ||||
| 	"github.com/Microsoft/hcsshim/internal/hcserror" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"github.com/Microsoft/hcsshim/internal/oc" | ||||
| 	"go.opencensus.io/trace" | ||||
| ) | ||||
| 
 | ||||
| // LayerExists will return true if a layer with the given id exists and is known
 | ||||
| // to the system.
 | ||||
| func LayerExists(path string) (_ bool, err error) { | ||||
| func LayerExists(ctx context.Context, path string) (_ bool, err error) { | ||||
| 	title := "hcsshim::LayerExists" | ||||
| 	fields := logrus.Fields{ | ||||
| 		"path": path, | ||||
| 	} | ||||
| 	logrus.WithFields(fields).Debug(title) | ||||
| 	defer func() { | ||||
| 		if err != nil { | ||||
| 			fields[logrus.ErrorKey] = err | ||||
| 			logrus.WithFields(fields).Error(err) | ||||
| 		} else { | ||||
| 			logrus.WithFields(fields).Debug(title + " - succeeded") | ||||
| 		} | ||||
| 	}() | ||||
| 	ctx, span := trace.StartSpan(ctx, title) | ||||
| 	defer span.End() | ||||
| 	defer func() { oc.SetSpanStatus(span, err) }() | ||||
| 	span.AddAttributes(trace.StringAttribute("path", path)) | ||||
| 
 | ||||
| 	// Call the procedure itself.
 | ||||
| 	var exists uint32 | ||||
|  | @ -28,6 +23,6 @@ func LayerExists(path string) (_ bool, err error) { | |||
| 	if err != nil { | ||||
| 		return false, hcserror.New(err, title+" - failed", "") | ||||
| 	} | ||||
| 	fields["layer-exists"] = exists != 0 | ||||
| 	span.AddAttributes(trace.BoolAttribute("layer-exists", exists != 0)) | ||||
| 	return exists != 0, nil | ||||
| } | ||||
|  |  | |||
|  | @ -1,13 +1,22 @@ | |||
| package wclayer | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"path/filepath" | ||||
| 
 | ||||
| 	"github.com/Microsoft/go-winio/pkg/guid" | ||||
| 	"github.com/Microsoft/hcsshim/internal/oc" | ||||
| 	"go.opencensus.io/trace" | ||||
| ) | ||||
| 
 | ||||
| // LayerID returns the layer ID of a layer on disk.
 | ||||
| func LayerID(path string) (guid.GUID, error) { | ||||
| func LayerID(ctx context.Context, path string) (_ guid.GUID, err error) { | ||||
| 	title := "hcsshim::LayerID" | ||||
| 	ctx, span := trace.StartSpan(ctx, title) | ||||
| 	defer span.End() | ||||
| 	defer func() { oc.SetSpanStatus(span, err) }() | ||||
| 	span.AddAttributes(trace.StringAttribute("path", path)) | ||||
| 
 | ||||
| 	_, file := filepath.Split(path) | ||||
| 	return NameToGuid(file) | ||||
| 	return NameToGuid(ctx, file) | ||||
| } | ||||
|  |  | |||
|  | @ -4,6 +4,7 @@ package wclayer | |||
| // functionality.
 | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"syscall" | ||||
| 
 | ||||
| 	"github.com/Microsoft/go-winio/pkg/guid" | ||||
|  | @ -68,12 +69,12 @@ type WC_LAYER_DESCRIPTOR struct { | |||
| 	Pathp   *uint16 | ||||
| } | ||||
| 
 | ||||
| func layerPathsToDescriptors(parentLayerPaths []string) ([]WC_LAYER_DESCRIPTOR, error) { | ||||
| func layerPathsToDescriptors(ctx context.Context, parentLayerPaths []string) ([]WC_LAYER_DESCRIPTOR, error) { | ||||
| 	// Array of descriptors that gets constructed.
 | ||||
| 	var layers []WC_LAYER_DESCRIPTOR | ||||
| 
 | ||||
| 	for i := 0; i < len(parentLayerPaths); i++ { | ||||
| 		g, err := LayerID(parentLayerPaths[i]) | ||||
| 		g, err := LayerID(ctx, parentLayerPaths[i]) | ||||
| 		if err != nil { | ||||
| 			logrus.WithError(err).Debug("Failed to convert name to guid") | ||||
| 			return nil, err | ||||
|  |  | |||
|  | @ -1,34 +1,29 @@ | |||
| package wclayer | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 
 | ||||
| 	"github.com/Microsoft/go-winio/pkg/guid" | ||||
| 	"github.com/Microsoft/hcsshim/internal/hcserror" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"github.com/Microsoft/hcsshim/internal/oc" | ||||
| 	"go.opencensus.io/trace" | ||||
| ) | ||||
| 
 | ||||
| // NameToGuid converts the given string into a GUID using the algorithm in the
 | ||||
| // Host Compute Service, ensuring GUIDs generated with the same string are common
 | ||||
| // across all clients.
 | ||||
| func NameToGuid(name string) (id guid.GUID, err error) { | ||||
| func NameToGuid(ctx context.Context, name string) (_ guid.GUID, err error) { | ||||
| 	title := "hcsshim::NameToGuid" | ||||
| 	fields := logrus.Fields{ | ||||
| 		"name": name, | ||||
| 	} | ||||
| 	logrus.WithFields(fields).Debug(title) | ||||
| 	defer func() { | ||||
| 		if err != nil { | ||||
| 			fields[logrus.ErrorKey] = err | ||||
| 			logrus.WithFields(fields).Error(err) | ||||
| 		} else { | ||||
| 			logrus.WithFields(fields).Debug(title + " - succeeded") | ||||
| 		} | ||||
| 	}() | ||||
| 	ctx, span := trace.StartSpan(ctx, title) | ||||
| 	defer span.End() | ||||
| 	defer func() { oc.SetSpanStatus(span, err) }() | ||||
| 	span.AddAttributes(trace.StringAttribute("name", name)) | ||||
| 
 | ||||
| 	var id guid.GUID | ||||
| 	err = nameToGuid(name, &id) | ||||
| 	if err != nil { | ||||
| 		err = hcserror.New(err, title+" - failed", "") | ||||
| 		return | ||||
| 		return guid.GUID{}, hcserror.New(err, title+" - failed", "") | ||||
| 	} | ||||
| 	fields["guid"] = id.String() | ||||
| 	return | ||||
| 	span.AddAttributes(trace.StringAttribute("guid", id.String())) | ||||
| 	return id, nil | ||||
| } | ||||
|  |  | |||
|  | @ -1,10 +1,13 @@ | |||
| package wclayer | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"strings" | ||||
| 	"sync" | ||||
| 
 | ||||
| 	"github.com/Microsoft/hcsshim/internal/hcserror" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"github.com/Microsoft/hcsshim/internal/oc" | ||||
| 	"go.opencensus.io/trace" | ||||
| ) | ||||
| 
 | ||||
| var prepareLayerLock sync.Mutex | ||||
|  | @ -14,23 +17,17 @@ var prepareLayerLock sync.Mutex | |||
| // parent layers, and is necessary in order to view or interact with the layer
 | ||||
| // as an actual filesystem (reading and writing files, creating directories, etc).
 | ||||
| // Disabling the filter must be done via UnprepareLayer.
 | ||||
| func PrepareLayer(path string, parentLayerPaths []string) (err error) { | ||||
| func PrepareLayer(ctx context.Context, path string, parentLayerPaths []string) (err error) { | ||||
| 	title := "hcsshim::PrepareLayer" | ||||
| 	fields := logrus.Fields{ | ||||
| 		"path": path, | ||||
| 	} | ||||
| 	logrus.WithFields(fields).Debug(title) | ||||
| 	defer func() { | ||||
| 		if err != nil { | ||||
| 			fields[logrus.ErrorKey] = err | ||||
| 			logrus.WithFields(fields).Error(err) | ||||
| 		} else { | ||||
| 			logrus.WithFields(fields).Debug(title + " - succeeded") | ||||
| 		} | ||||
| 	}() | ||||
| 	ctx, span := trace.StartSpan(ctx, title) | ||||
| 	defer span.End() | ||||
| 	defer func() { oc.SetSpanStatus(span, err) }() | ||||
| 	span.AddAttributes( | ||||
| 		trace.StringAttribute("path", path), | ||||
| 		trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", "))) | ||||
| 
 | ||||
| 	// Generate layer descriptors
 | ||||
| 	layers, err := layerPathsToDescriptors(parentLayerPaths) | ||||
| 	layers, err := layerPathsToDescriptors(ctx, parentLayerPaths) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  |  | |||
|  | @ -1,23 +1,41 @@ | |||
| package wclayer | ||||
| 
 | ||||
| import "os" | ||||
| import ( | ||||
| 	"context" | ||||
| 	"os" | ||||
| 
 | ||||
| 	"github.com/Microsoft/hcsshim/internal/oc" | ||||
| 	"go.opencensus.io/trace" | ||||
| ) | ||||
| 
 | ||||
| // ProcessBaseLayer post-processes a base layer that has had its files extracted.
 | ||||
| // The files should have been extracted to <path>\Files.
 | ||||
| func ProcessBaseLayer(path string) error { | ||||
| 	err := processBaseImage(path) | ||||
| func ProcessBaseLayer(ctx context.Context, path string) (err error) { | ||||
| 	title := "hcsshim::ProcessBaseLayer" | ||||
| 	ctx, span := trace.StartSpan(ctx, title) | ||||
| 	defer span.End() | ||||
| 	defer func() { oc.SetSpanStatus(span, err) }() | ||||
| 	span.AddAttributes(trace.StringAttribute("path", path)) | ||||
| 
 | ||||
| 	err = processBaseImage(path) | ||||
| 	if err != nil { | ||||
| 		return &os.PathError{Op: "ProcessBaseLayer", Path: path, Err: err} | ||||
| 		return &os.PathError{Op: title, Path: path, Err: err} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // ProcessUtilityVMImage post-processes a utility VM image that has had its files extracted.
 | ||||
| // The files should have been extracted to <path>\Files.
 | ||||
| func ProcessUtilityVMImage(path string) error { | ||||
| 	err := processUtilityImage(path) | ||||
| func ProcessUtilityVMImage(ctx context.Context, path string) (err error) { | ||||
| 	title := "hcsshim::ProcessUtilityVMImage" | ||||
| 	ctx, span := trace.StartSpan(ctx, title) | ||||
| 	defer span.End() | ||||
| 	defer func() { oc.SetSpanStatus(span, err) }() | ||||
| 	span.AddAttributes(trace.StringAttribute("path", path)) | ||||
| 
 | ||||
| 	err = processUtilityImage(path) | ||||
| 	if err != nil { | ||||
| 		return &os.PathError{Op: "ProcessUtilityVMImage", Path: path, Err: err} | ||||
| 		return &os.PathError{Op: title, Path: path, Err: err} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  |  | |||
|  | @ -1,26 +1,21 @@ | |||
| package wclayer | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 
 | ||||
| 	"github.com/Microsoft/hcsshim/internal/hcserror" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"github.com/Microsoft/hcsshim/internal/oc" | ||||
| 	"go.opencensus.io/trace" | ||||
| ) | ||||
| 
 | ||||
| // UnprepareLayer disables the filesystem filter for the read-write layer with
 | ||||
| // the given id.
 | ||||
| func UnprepareLayer(path string) (err error) { | ||||
| func UnprepareLayer(ctx context.Context, path string) (err error) { | ||||
| 	title := "hcsshim::UnprepareLayer" | ||||
| 	fields := logrus.Fields{ | ||||
| 		"path": path, | ||||
| 	} | ||||
| 	logrus.WithFields(fields).Debug(title) | ||||
| 	defer func() { | ||||
| 		if err != nil { | ||||
| 			fields[logrus.ErrorKey] = err | ||||
| 			logrus.WithFields(fields).Error(err) | ||||
| 		} else { | ||||
| 			logrus.WithFields(fields).Debug(title + " - succeeded") | ||||
| 		} | ||||
| 	}() | ||||
| 	ctx, span := trace.StartSpan(ctx, title) | ||||
| 	defer span.End() | ||||
| 	defer func() { oc.SetSpanStatus(span, err) }() | ||||
| 	span.AddAttributes(trace.StringAttribute("path", path)) | ||||
| 
 | ||||
| 	err = unprepareLayer(&stdDriverInfo, path) | ||||
| 	if err != nil { | ||||
|  |  | |||
|  | @ -1,6 +1,7 @@ | |||
| package hcsshim | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"crypto/sha1" | ||||
| 	"path/filepath" | ||||
| 
 | ||||
|  | @ -13,59 +14,59 @@ func layerPath(info *DriverInfo, id string) string { | |||
| } | ||||
| 
 | ||||
| func ActivateLayer(info DriverInfo, id string) error { | ||||
| 	return wclayer.ActivateLayer(layerPath(&info, id)) | ||||
| 	return wclayer.ActivateLayer(context.Background(), layerPath(&info, id)) | ||||
| } | ||||
| func CreateLayer(info DriverInfo, id, parent string) error { | ||||
| 	return wclayer.CreateLayer(layerPath(&info, id), parent) | ||||
| 	return wclayer.CreateLayer(context.Background(), layerPath(&info, id), parent) | ||||
| } | ||||
| 
 | ||||
| // New clients should use CreateScratchLayer instead. Kept in to preserve API compatibility.
 | ||||
| func CreateSandboxLayer(info DriverInfo, layerId, parentId string, parentLayerPaths []string) error { | ||||
| 	return wclayer.CreateScratchLayer(layerPath(&info, layerId), parentLayerPaths) | ||||
| 	return wclayer.CreateScratchLayer(context.Background(), layerPath(&info, layerId), parentLayerPaths) | ||||
| } | ||||
| func CreateScratchLayer(info DriverInfo, layerId, parentId string, parentLayerPaths []string) error { | ||||
| 	return wclayer.CreateScratchLayer(layerPath(&info, layerId), parentLayerPaths) | ||||
| 	return wclayer.CreateScratchLayer(context.Background(), layerPath(&info, layerId), parentLayerPaths) | ||||
| } | ||||
| func DeactivateLayer(info DriverInfo, id string) error { | ||||
| 	return wclayer.DeactivateLayer(layerPath(&info, id)) | ||||
| 	return wclayer.DeactivateLayer(context.Background(), layerPath(&info, id)) | ||||
| } | ||||
| func DestroyLayer(info DriverInfo, id string) error { | ||||
| 	return wclayer.DestroyLayer(layerPath(&info, id)) | ||||
| 	return wclayer.DestroyLayer(context.Background(), layerPath(&info, id)) | ||||
| } | ||||
| 
 | ||||
| // New clients should use ExpandScratchSize instead. Kept in to preserve API compatibility.
 | ||||
| func ExpandSandboxSize(info DriverInfo, layerId string, size uint64) error { | ||||
| 	return wclayer.ExpandScratchSize(layerPath(&info, layerId), size) | ||||
| 	return wclayer.ExpandScratchSize(context.Background(), layerPath(&info, layerId), size) | ||||
| } | ||||
| func ExpandScratchSize(info DriverInfo, layerId string, size uint64) error { | ||||
| 	return wclayer.ExpandScratchSize(layerPath(&info, layerId), size) | ||||
| 	return wclayer.ExpandScratchSize(context.Background(), layerPath(&info, layerId), size) | ||||
| } | ||||
| func ExportLayer(info DriverInfo, layerId string, exportFolderPath string, parentLayerPaths []string) error { | ||||
| 	return wclayer.ExportLayer(layerPath(&info, layerId), exportFolderPath, parentLayerPaths) | ||||
| 	return wclayer.ExportLayer(context.Background(), layerPath(&info, layerId), exportFolderPath, parentLayerPaths) | ||||
| } | ||||
| func GetLayerMountPath(info DriverInfo, id string) (string, error) { | ||||
| 	return wclayer.GetLayerMountPath(layerPath(&info, id)) | ||||
| 	return wclayer.GetLayerMountPath(context.Background(), layerPath(&info, id)) | ||||
| } | ||||
| func GetSharedBaseImages() (imageData string, err error) { | ||||
| 	return wclayer.GetSharedBaseImages() | ||||
| 	return wclayer.GetSharedBaseImages(context.Background()) | ||||
| } | ||||
| func ImportLayer(info DriverInfo, layerID string, importFolderPath string, parentLayerPaths []string) error { | ||||
| 	return wclayer.ImportLayer(layerPath(&info, layerID), importFolderPath, parentLayerPaths) | ||||
| 	return wclayer.ImportLayer(context.Background(), layerPath(&info, layerID), importFolderPath, parentLayerPaths) | ||||
| } | ||||
| func LayerExists(info DriverInfo, id string) (bool, error) { | ||||
| 	return wclayer.LayerExists(layerPath(&info, id)) | ||||
| 	return wclayer.LayerExists(context.Background(), layerPath(&info, id)) | ||||
| } | ||||
| func PrepareLayer(info DriverInfo, layerId string, parentLayerPaths []string) error { | ||||
| 	return wclayer.PrepareLayer(layerPath(&info, layerId), parentLayerPaths) | ||||
| 	return wclayer.PrepareLayer(context.Background(), layerPath(&info, layerId), parentLayerPaths) | ||||
| } | ||||
| func ProcessBaseLayer(path string) error { | ||||
| 	return wclayer.ProcessBaseLayer(path) | ||||
| 	return wclayer.ProcessBaseLayer(context.Background(), path) | ||||
| } | ||||
| func ProcessUtilityVMImage(path string) error { | ||||
| 	return wclayer.ProcessUtilityVMImage(path) | ||||
| 	return wclayer.ProcessUtilityVMImage(context.Background(), path) | ||||
| } | ||||
| func UnprepareLayer(info DriverInfo, layerId string) error { | ||||
| 	return wclayer.UnprepareLayer(layerPath(&info, layerId)) | ||||
| 	return wclayer.UnprepareLayer(context.Background(), layerPath(&info, layerId)) | ||||
| } | ||||
| 
 | ||||
| type DriverInfo struct { | ||||
|  | @ -76,7 +77,7 @@ type DriverInfo struct { | |||
| type GUID [16]byte | ||||
| 
 | ||||
| func NameToGuid(name string) (id GUID, err error) { | ||||
| 	g, err := wclayer.NameToGuid(name) | ||||
| 	g, err := wclayer.NameToGuid(context.Background(), name) | ||||
| 	return g.ToWindowsArray(), err | ||||
| } | ||||
| 
 | ||||
|  | @ -94,13 +95,13 @@ func (g *GUID) ToString() string { | |||
| type LayerReader = wclayer.LayerReader | ||||
| 
 | ||||
| func NewLayerReader(info DriverInfo, layerID string, parentLayerPaths []string) (LayerReader, error) { | ||||
| 	return wclayer.NewLayerReader(layerPath(&info, layerID), parentLayerPaths) | ||||
| 	return wclayer.NewLayerReader(context.Background(), layerPath(&info, layerID), parentLayerPaths) | ||||
| } | ||||
| 
 | ||||
| type LayerWriter = wclayer.LayerWriter | ||||
| 
 | ||||
| func NewLayerWriter(info DriverInfo, layerID string, parentLayerPaths []string) (LayerWriter, error) { | ||||
| 	return wclayer.NewLayerWriter(layerPath(&info, layerID), parentLayerPaths) | ||||
| 	return wclayer.NewLayerWriter(context.Background(), layerPath(&info, layerID), parentLayerPaths) | ||||
| } | ||||
| 
 | ||||
| type WC_LAYER_DESCRIPTOR = wclayer.WC_LAYER_DESCRIPTOR | ||||
|  |  | |||
|  | @ -15,15 +15,20 @@ env: | |||
|     CIRRUS_CLONE_DEPTH: 50 | ||||
| 
 | ||||
|     #### | ||||
|     #### Cache-image names to test with | ||||
|     #### | ||||
|     #### Cache-image names to test with (double-quotes around names are critical) | ||||
|     ### | ||||
|     FEDORA_NAME: "fedora-32" | ||||
|     PRIOR_FEDORA_NAME: "fedora-31" | ||||
|     UBUNTU_NAME: "ubuntu-19" | ||||
|     PRIOR_UBUNTU_NAME: "ubuntu-18" | ||||
| 
 | ||||
|     # GCE project where images live | ||||
|     IMAGE_PROJECT: "libpod-218412" | ||||
|     _BUILT_IMAGE_SUFFIX: "libpod-6301182083727360" | ||||
|     FEDORA_CACHE_IMAGE_NAME: "fedora-32-${_BUILT_IMAGE_SUFFIX}" | ||||
|     PRIOR_FEDORA_CACHE_IMAGE_NAME: "fedora-31-${_BUILT_IMAGE_SUFFIX}" | ||||
|     UBUNTU_CACHE_IMAGE_NAME: "ubuntu-19-${_BUILT_IMAGE_SUFFIX}" | ||||
|     PRIOR_UBUNTU_CACHE_IMAGE_NAME: "ubuntu-18-${_BUILT_IMAGE_SUFFIX}" | ||||
|     _BUILT_IMAGE_SUFFIX: "libpod-6224667180531712"  # From the packer output of 'build_vm_images_script' | ||||
|     FEDORA_CACHE_IMAGE_NAME: "${FEDORA_NAME}-${_BUILT_IMAGE_SUFFIX}" | ||||
|     PRIOR_FEDORA_CACHE_IMAGE_NAME: "${PRIOR_FEDORA_NAME}-${_BUILT_IMAGE_SUFFIX}" | ||||
|     UBUNTU_CACHE_IMAGE_NAME: "${UBUNTU_NAME}-${_BUILT_IMAGE_SUFFIX}" | ||||
|     PRIOR_UBUNTU_CACHE_IMAGE_NAME: "${PRIOR_UBUNTU_NAME}-${_BUILT_IMAGE_SUFFIX}" | ||||
| 
 | ||||
|     #### | ||||
|     #### Command variables to help avoid duplication | ||||
|  |  | |||
|  | @ -0,0 +1,3 @@ | |||
| ## Security and Disclosure Information Policy for the Containers Storage Project | ||||
| 
 | ||||
| The Containers Storage Project follows the [Security and Disclosure Information Policy](https://github.com/containers/common/blob/master/SECURITY.md) for the Containers Projects. | ||||
|  | @ -1 +1 @@ | |||
| 1.19.1 | ||||
| 1.19.2 | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ module github.com/containers/storage | |||
| require ( | ||||
| 	github.com/BurntSushi/toml v0.3.1 | ||||
| 	github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 | ||||
| 	github.com/Microsoft/hcsshim v0.8.7 | ||||
| 	github.com/Microsoft/hcsshim v0.8.9 | ||||
| 	github.com/docker/go-units v0.4.0 | ||||
| 	github.com/hashicorp/go-multierror v1.0.0 | ||||
| 	github.com/klauspost/compress v1.10.5 | ||||
|  | @ -16,12 +16,12 @@ require ( | |||
| 	github.com/opencontainers/selinux v1.5.1 | ||||
| 	github.com/pkg/errors v0.9.1 | ||||
| 	github.com/pquerna/ffjson v0.0.0-20181028064349-e517b90714f7 | ||||
| 	github.com/sirupsen/logrus v1.4.2 | ||||
| 	github.com/sirupsen/logrus v1.6.0 | ||||
| 	github.com/stretchr/testify v1.5.1 | ||||
| 	github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2 | ||||
| 	github.com/tchap/go-patricia v2.3.0+incompatible | ||||
| 	github.com/vbatts/tar-split v0.11.1 | ||||
| 	golang.org/x/net v0.0.0-20190628185345-da137c7871d7 | ||||
| 	golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 | ||||
| 	golang.org/x/sys v0.0.0-20191127021746-63cb32ae39b2 | ||||
| 	gotest.tools v2.2.0+incompatible | ||||
| ) | ||||
|  |  | |||
|  | @ -3,14 +3,13 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ | |||
| github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= | ||||
| github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 h1:ygIc8M6trr62pF5DucadTWGdEB4mEyvzi0e2nbcmcyA= | ||||
| github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= | ||||
| github.com/Microsoft/hcsshim v0.8.7 h1:ptnOoufxGSzauVTsdE+wMYnCWA301PdoN4xg5oRdZpg= | ||||
| github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= | ||||
| github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= | ||||
| github.com/Microsoft/hcsshim v0.8.9 h1:VrfodqvztU8YSOvygU+DN1BGaSGxmrNfqOv5oOuX2Bk= | ||||
| github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= | ||||
| github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= | ||||
| github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f h1:tSNMc+rJDfmYntojat8lljbt1mgKNpTxUZJsSzJ9Y1s= | ||||
| github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= | ||||
| github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= | ||||
| github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= | ||||
| github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= | ||||
| github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= | ||||
| github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= | ||||
| github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= | ||||
|  | @ -23,30 +22,38 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs | |||
| github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= | ||||
| github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= | ||||
| github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= | ||||
| github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= | ||||
| github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= | ||||
| github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= | ||||
| github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= | ||||
| github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= | ||||
| github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= | ||||
| github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | ||||
| github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | ||||
| github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | ||||
| github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= | ||||
| github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= | ||||
| github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | ||||
| github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= | ||||
| github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= | ||||
| github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= | ||||
| github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= | ||||
| github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= | ||||
| github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= | ||||
| github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= | ||||
| github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= | ||||
| github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= | ||||
| github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= | ||||
| github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= | ||||
| github.com/klauspost/compress v1.10.5 h1:7q6vHIqubShURwQz8cQK6yIe/xC3IF0Vm7TGfqjewrc= | ||||
| github.com/klauspost/compress v1.10.5/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= | ||||
| github.com/klauspost/pgzip v1.2.3 h1:Ce2to9wvs/cuJ2b86/CKQoTYr9VHfpanYosZ0UBJqdw= | ||||
| github.com/klauspost/pgzip v1.2.3/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= | ||||
| github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= | ||||
| github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | ||||
| github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= | ||||
| github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | ||||
| github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= | ||||
| github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= | ||||
| github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= | ||||
| github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= | ||||
| github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= | ||||
| github.com/mattn/go-shellwords v1.0.10 h1:Y7Xqm8piKOO3v10Thp7Z36h4FYFjt5xB//6XvOrs2Gw= | ||||
| github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= | ||||
| github.com/mistifyio/go-zfs v2.1.1+incompatible h1:gAMO1HM9xBRONLHHYnu5iFsOJUiJdNZo6oqSENd4eW8= | ||||
|  | @ -59,10 +66,8 @@ github.com/opencontainers/runc v1.0.0-rc9 h1:/k06BMULKF5hidyoZymkoDCzdJzltZpz/UU | |||
| github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= | ||||
| github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700 h1:eNUVfm/RFLIi1G7flU5/ZRTHvd4kcVuzfRnL6OFlzCI= | ||||
| github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= | ||||
| github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= | ||||
| github.com/opencontainers/selinux v1.5.1 h1:jskKwSMFYqyTrHEuJgQoUlTcId0av64S6EWObrIfn5Y= | ||||
| github.com/opencontainers/selinux v1.5.1/go.mod h1:yTcKuYAh6R95iDpefGLQaPaRwJFwyzAJufJyiTt7s0g= | ||||
| github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= | ||||
| github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||
| github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= | ||||
| github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||
|  | @ -70,17 +75,17 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb | |||
| github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||
| github.com/pquerna/ffjson v0.0.0-20181028064349-e517b90714f7 h1:gGBSHPOU7g8YjTbhwn+lvFm2VDEhhA+PwDIlstkgSxE= | ||||
| github.com/pquerna/ffjson v0.0.0-20181028064349-e517b90714f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= | ||||
| github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= | ||||
| github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= | ||||
| github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= | ||||
| github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= | ||||
| github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= | ||||
| github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= | ||||
| github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= | ||||
| github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||
| github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= | ||||
| github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||
| github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | ||||
| github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= | ||||
| github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= | ||||
| github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= | ||||
| github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= | ||||
| github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2 h1:b6uOv7YOFK0TYG7HtkIgExQo+2RdLuwRft63jn2HWj8= | ||||
| github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= | ||||
| github.com/tchap/go-patricia v2.3.0+incompatible h1:GkY4dP3cEfEASBPPkWd+AmjYxhmDkqO9/zg7R0lSQRs= | ||||
|  | @ -88,9 +93,6 @@ github.com/tchap/go-patricia v2.3.0+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ | |||
| github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= | ||||
| github.com/vbatts/tar-split v0.11.1 h1:0Odu65rhcZ3JZaPHxl7tCI3V/C/Q9Zf82UFravl02dE= | ||||
| github.com/vbatts/tar-split v0.11.1/go.mod h1:LEuURwDEiWjRjwu46yU3KVGuUdVv/dcnpcEPSzR8z6g= | ||||
| github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= | ||||
| github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= | ||||
| github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= | ||||
| go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= | ||||
| go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= | ||||
| golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||
|  | @ -103,22 +105,20 @@ golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73r | |||
| golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||
| golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||
| golang.org/x/net v0.0.0-20190628185345-da137c7871d7 h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU= | ||||
| golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI= | ||||
| golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | ||||
| golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3 h1:7TYNF4UdlohbFwpNH04CoPMp1cHUZgO1Ebq5r2hIjfo= | ||||
| golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20191115151921-52ab43148777 h1:wejkGHRTr38uaKRqECZlsCsJ1/TGxIyFbH32x5zUdu4= | ||||
| golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20191127021746-63cb32ae39b2 h1:/J2nHFg1MTqaRLFO7M+J78ASNsJoz3r0cvHBPQ77fsE= | ||||
| golang.org/x/sys v0.0.0-20191127021746-63cb32ae39b2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
|  | @ -126,20 +126,26 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | |||
| golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= | ||||
| golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= | ||||
| golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | ||||
| golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= | ||||
| google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= | ||||
| google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | ||||
| google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= | ||||
| google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= | ||||
| google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= | ||||
| google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= | ||||
| google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= | ||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= | ||||
| google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= | ||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= | ||||
| gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= | ||||
| gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||
| gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= | ||||
| gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||
| gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= | ||||
| gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= | ||||
| honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||
| k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= | ||||
| honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||
|  |  | |||
|  | @ -7,26 +7,53 @@ import ( | |||
| 	"path/filepath" | ||||
| ) | ||||
| 
 | ||||
| // NewAtomicFileWriter returns WriteCloser so that writing to it writes to a
 | ||||
| // AtomicFileWriterOptions specifies options for creating the atomic file writer.
 | ||||
| type AtomicFileWriterOptions struct { | ||||
| 	// NoSync specifies whether the sync call must be skipped for the file.
 | ||||
| 	// If NoSync is not specified, the file is synced to the
 | ||||
| 	// storage after it has been written and before it is moved to
 | ||||
| 	// the specified path.
 | ||||
| 	NoSync bool | ||||
| } | ||||
| 
 | ||||
| var defaultWriterOptions AtomicFileWriterOptions = AtomicFileWriterOptions{} | ||||
| 
 | ||||
| // SetDefaultOptions overrides the default options used when creating an
 | ||||
| // atomic file writer.
 | ||||
| func SetDefaultOptions(opts AtomicFileWriterOptions) { | ||||
| 	defaultWriterOptions = opts | ||||
| } | ||||
| 
 | ||||
| // NewAtomicFileWriterWithOpts returns WriteCloser so that writing to it writes to a
 | ||||
| // temporary file and closing it atomically changes the temporary file to
 | ||||
| // destination path. Writing and closing concurrently is not allowed.
 | ||||
| func NewAtomicFileWriter(filename string, perm os.FileMode) (io.WriteCloser, error) { | ||||
| func NewAtomicFileWriterWithOpts(filename string, perm os.FileMode, opts *AtomicFileWriterOptions) (io.WriteCloser, error) { | ||||
| 	f, err := ioutil.TempFile(filepath.Dir(filename), ".tmp-"+filepath.Base(filename)) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	if opts == nil { | ||||
| 		opts = &defaultWriterOptions | ||||
| 	} | ||||
| 	abspath, err := filepath.Abs(filename) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return &atomicFileWriter{ | ||||
| 		f:    f, | ||||
| 		fn:   abspath, | ||||
| 		perm: perm, | ||||
| 		f:      f, | ||||
| 		fn:     abspath, | ||||
| 		perm:   perm, | ||||
| 		noSync: opts.NoSync, | ||||
| 	}, nil | ||||
| } | ||||
| 
 | ||||
| // NewAtomicFileWriter returns WriteCloser so that writing to it writes to a
 | ||||
| // temporary file and closing it atomically changes the temporary file to
 | ||||
| // destination path. Writing and closing concurrently is not allowed.
 | ||||
| func NewAtomicFileWriter(filename string, perm os.FileMode) (io.WriteCloser, error) { | ||||
| 	return NewAtomicFileWriterWithOpts(filename, perm, nil) | ||||
| } | ||||
| 
 | ||||
| // AtomicWriteFile atomically writes data to a file named by filename.
 | ||||
| func AtomicWriteFile(filename string, data []byte, perm os.FileMode) error { | ||||
| 	f, err := NewAtomicFileWriter(filename, perm) | ||||
|  | @ -49,6 +76,7 @@ type atomicFileWriter struct { | |||
| 	fn       string | ||||
| 	writeErr error | ||||
| 	perm     os.FileMode | ||||
| 	noSync   bool | ||||
| } | ||||
| 
 | ||||
| func (w *atomicFileWriter) Write(dt []byte) (int, error) { | ||||
|  | @ -65,9 +93,11 @@ func (w *atomicFileWriter) Close() (retErr error) { | |||
| 			os.Remove(w.f.Name()) | ||||
| 		} | ||||
| 	}() | ||||
| 	if err := fdatasync(w.f); err != nil { | ||||
| 		w.f.Close() | ||||
| 		return err | ||||
| 	if !w.noSync { | ||||
| 		if err := fdatasync(w.f); err != nil { | ||||
| 			w.f.Close() | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	if err := w.f.Close(); err != nil { | ||||
| 		return err | ||||
|  |  | |||
|  | @ -15,6 +15,9 @@ | |||
| #include <termios.h> | ||||
| #include <errno.h> | ||||
| #include <unistd.h> | ||||
| #include <sys/vfs.h> | ||||
| #include <sys/mount.h> | ||||
| #include <linux/limits.h> | ||||
| 
 | ||||
| /* Open Source projects like conda-forge, want to package podman and are based
 | ||||
|    off of centos:6, Conda-force has minimal libc requirements and is lacking | ||||
|  | @ -151,16 +154,74 @@ static char **parse_proc_stringlist(const char *list) { | |||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| static int containers_reexec(void) { | ||||
| 	char **argv, *exename; | ||||
| /*
 | ||||
|  * Taken from the runc cloned_binary.c file | ||||
|  * Copyright (C) 2019 Aleksa Sarai <cyphar@cyphar.com> | ||||
|  * Copyright (C) 2019 SUSE LLC | ||||
|  * | ||||
|  * This work is dual licensed under the following licenses. You may use, | ||||
|  * redistribute, and/or modify the work under the conditions of either (or | ||||
|  * both) licenses. | ||||
|  * | ||||
|  * === Apache-2.0 === | ||||
|  */ | ||||
| static int try_bindfd(void) | ||||
| { | ||||
| 	int fd, ret = -1; | ||||
| 	char src[PATH_MAX] = {0}; | ||||
| 	char template[64] = {0}; | ||||
| 
 | ||||
| 	strncpy(template, "/tmp/containers.XXXXXX", sizeof(template) - 1); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * We need somewhere to mount it, mounting anything over /proc/self is a | ||||
| 	 * BAD idea on the host -- even if we do it temporarily. | ||||
| 	 */ | ||||
| 	fd = mkstemp(template); | ||||
| 	if (fd < 0) | ||||
| 		return ret; | ||||
| 	close(fd); | ||||
| 
 | ||||
| 	ret = -EPERM; | ||||
| 
 | ||||
| 	if (readlink("/proc/self/exe", src, sizeof (src) - 1) < 0) | ||||
| 		goto out; | ||||
| 
 | ||||
| 	if (mount(src, template, NULL, MS_BIND, NULL) < 0) | ||||
| 		goto out; | ||||
| 	if (mount(NULL, template, NULL, MS_REMOUNT | MS_BIND | MS_RDONLY, NULL) < 0) | ||||
| 		goto out_umount; | ||||
| 
 | ||||
| 	/* Get read-only handle that we're sure can't be made read-write. */ | ||||
| 	ret = open(template, O_PATH | O_CLOEXEC); | ||||
| 
 | ||||
| out_umount: | ||||
| 	/*
 | ||||
| 	 * Make sure the MNT_DETACH works, otherwise we could get remounted | ||||
| 	 * read-write and that would be quite bad (the fd would be made read-write | ||||
| 	 * too, invalidating the protection). | ||||
| 	 */ | ||||
| 	if (umount2(template, MNT_DETACH) < 0) { | ||||
| 		if (ret >= 0) | ||||
| 			close(ret); | ||||
| 		ret = -ENOTRECOVERABLE; | ||||
| 	} | ||||
| 
 | ||||
| out: | ||||
| 	/*
 | ||||
| 	 * We don't care about unlink errors, the worst that happens is that | ||||
| 	 * there's an empty file left around in STATEDIR. | ||||
| 	 */ | ||||
| 	unlink(template); | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| static int copy_self_proc_exe(char **argv) { | ||||
| 	char *exename; | ||||
| 	int fd, mmfd, n_read, n_written; | ||||
| 	struct stat st; | ||||
| 	char buf[2048]; | ||||
| 
 | ||||
| 	argv = parse_proc_stringlist("/proc/self/cmdline"); | ||||
| 	if (argv == NULL) { | ||||
| 		return -1; | ||||
| 	} | ||||
| 	fd = open("/proc/self/exe", O_RDONLY | O_CLOEXEC); | ||||
| 	if (fd == -1) { | ||||
| 		fprintf(stderr, "open(\"/proc/self/exe\"): %m\n"); | ||||
|  | @ -168,13 +229,14 @@ static int containers_reexec(void) { | |||
| 	} | ||||
| 	if (fstat(fd, &st) == -1) { | ||||
| 		fprintf(stderr, "fstat(\"/proc/self/exe\"): %m\n"); | ||||
| 		close(fd); | ||||
| 		return -1; | ||||
| 	} | ||||
| 	exename = basename(argv[0]); | ||||
| 	mmfd = syscall(SYS_memfd_create, exename, (long) MFD_ALLOW_SEALING | MFD_CLOEXEC); | ||||
| 	if (mmfd == -1) { | ||||
| 		fprintf(stderr, "memfd_create(): %m\n"); | ||||
| 		return -1; | ||||
| 		goto close_fd; | ||||
| 	} | ||||
| 	for (;;) { | ||||
| 		n_read = read(fd, buf, sizeof(buf)); | ||||
|  | @ -188,21 +250,45 @@ static int containers_reexec(void) { | |||
| 		n_written = write(mmfd, buf, n_read); | ||||
| 		if (n_written < 0) { | ||||
| 			fprintf(stderr, "write(anonfd): %m\n"); | ||||
| 			return -1; | ||||
| 			goto close_fd; | ||||
| 		} | ||||
| 		if (n_written != n_read) { | ||||
| 			fprintf(stderr, "write(anonfd): short write (%d != %d)\n", n_written, n_read); | ||||
| 			return -1; | ||||
| 			goto close_fd; | ||||
| 		} | ||||
| 	} | ||||
| 	close(fd); | ||||
| 	if (fcntl(mmfd, F_ADD_SEALS, F_SEAL_SHRINK | F_SEAL_GROW | F_SEAL_WRITE | F_SEAL_SEAL) == -1) { | ||||
| 		close(mmfd); | ||||
| 		fprintf(stderr, "Error sealing memfd copy: %m\n"); | ||||
| 		fprintf(stderr, "Close_Fd sealing memfd copy: %m\n"); | ||||
| 		goto close_mmfd; | ||||
| 	} | ||||
| 
 | ||||
| 	return mmfd; | ||||
| 
 | ||||
| close_fd: | ||||
| 	close(fd); | ||||
| close_mmfd: | ||||
| 	close(mmfd); | ||||
| 	return -1; | ||||
| } | ||||
| static int containers_reexec(int flags) { | ||||
| 	char **argv; | ||||
| 	int fd = -1; | ||||
| 
 | ||||
| 	argv = parse_proc_stringlist("/proc/self/cmdline"); | ||||
| 	if (argv == NULL) { | ||||
| 		return -1; | ||||
| 	} | ||||
| 	if (fexecve(mmfd, argv, environ) == -1) { | ||||
| 		close(mmfd); | ||||
| 
 | ||||
| 	if (flags & CLONE_NEWNS) | ||||
| 		fd = try_bindfd(); | ||||
| 	if (fd < 0) | ||||
| 		fd = copy_self_proc_exe(argv); | ||||
| 	if (fd < 0) | ||||
| 		return fd; | ||||
| 
 | ||||
| 	if (fexecve(fd, argv, environ) == -1) { | ||||
| 		close(fd); | ||||
| 		fprintf(stderr, "Error during reexec(...): %m\n"); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | @ -282,7 +368,7 @@ void _containers_unshare(void) | |||
| 			_exit(1); | ||||
| 		} | ||||
| 	} | ||||
| 	if (containers_reexec() != 0) { | ||||
| 	if (containers_reexec(flags) != 0) { | ||||
| 		_exit(1); | ||||
| 	} | ||||
| 	return; | ||||
|  |  | |||
|  | @ -8,7 +8,8 @@ github.com/Microsoft/go-winio | |||
| github.com/Microsoft/go-winio/archive/tar | ||||
| github.com/Microsoft/go-winio/backuptar | ||||
| github.com/Microsoft/go-winio/pkg/guid | ||||
| # github.com/Microsoft/hcsshim v0.8.7 | ||||
| github.com/Microsoft/go-winio/vhd | ||||
| # github.com/Microsoft/hcsshim v0.8.9 | ||||
| github.com/Microsoft/hcsshim | ||||
| github.com/Microsoft/hcsshim/internal/cow | ||||
| github.com/Microsoft/hcsshim/internal/hcs | ||||
|  | @ -42,7 +43,7 @@ github.com/checkpoint-restore/go-criu | |||
| github.com/checkpoint-restore/go-criu/rpc | ||||
| # github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f | ||||
| github.com/containerd/cgroups/stats/v1 | ||||
| # github.com/containerd/containerd v1.3.0 | ||||
| # github.com/containerd/containerd v1.3.2 | ||||
| github.com/containerd/containerd/errdefs | ||||
| github.com/containerd/containerd/log | ||||
| github.com/containerd/containerd/platforms | ||||
|  | @ -152,7 +153,7 @@ github.com/containers/psgo/internal/dev | |||
| github.com/containers/psgo/internal/host | ||||
| github.com/containers/psgo/internal/proc | ||||
| github.com/containers/psgo/internal/process | ||||
| # github.com/containers/storage v1.19.1 | ||||
| # github.com/containers/storage v1.19.2 | ||||
| github.com/containers/storage | ||||
| github.com/containers/storage/drivers | ||||
| github.com/containers/storage/drivers/aufs | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue