chore(deps): bump github.com/containerd/containerd from 1.7.18 to 1.7.19 (#3251)
Bumps [github.com/containerd/containerd](https://github.com/containerd/containerd) from 1.7.18 to 1.7.19. - [Release notes](https://github.com/containerd/containerd/releases) - [Changelog](https://github.com/containerd/containerd/blob/main/RELEASES.md) - [Commits](https://github.com/containerd/containerd/compare/v1.7.18...v1.7.19) --- updated-dependencies: - dependency-name: github.com/containerd/containerd dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									725c6dacdc
								
							
						
					
					
						commit
						c0830f6cd2
					
				
							
								
								
									
										8
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										8
									
								
								go.mod
								
								
								
								
							|  | @ -36,7 +36,7 @@ require ( | |||
| 
 | ||||
| require ( | ||||
| 	github.com/GoogleCloudPlatform/docker-credential-gcr/v2 v2.1.22 | ||||
| 	github.com/containerd/containerd v1.7.18 | ||||
| 	github.com/containerd/containerd v1.7.19 | ||||
| ) | ||||
| 
 | ||||
| require github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect | ||||
|  | @ -146,13 +146,15 @@ require ( | |||
| 	github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect | ||||
| 	github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 // indirect | ||||
| 	github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 // indirect | ||||
| 	github.com/Microsoft/hcsshim v0.11.5 // indirect | ||||
| 	github.com/Microsoft/hcsshim v0.11.7 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/ecr v1.27.4 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.23.4 // indirect | ||||
| 	github.com/cloudflare/circl v1.3.7 // indirect | ||||
| 	github.com/containerd/containerd/api v1.7.19 // indirect | ||||
| 	github.com/containerd/errdefs v0.1.0 // indirect | ||||
| 	github.com/containerd/log v0.1.0 // indirect | ||||
| 	github.com/containerd/ttrpc v1.2.4 // indirect | ||||
| 	github.com/containerd/platforms v0.2.1 // indirect | ||||
| 	github.com/containerd/ttrpc v1.2.5 // indirect | ||||
| 	github.com/containerd/typeurl/v2 v2.1.1 // indirect | ||||
| 	github.com/cyphar/filepath-securejoin v0.2.4 // indirect | ||||
| 	github.com/distribution/reference v0.6.0 // indirect | ||||
|  |  | |||
							
								
								
									
										16
									
								
								go.sum
								
								
								
								
							
							
						
						
									
										16
									
								
								go.sum
								
								
								
								
							|  | @ -64,8 +64,8 @@ github.com/GoogleCloudPlatform/docker-credential-gcr/v2 v2.1.22/go.mod h1:nzCpg7 | |||
| github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= | ||||
| github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= | ||||
| github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= | ||||
| github.com/Microsoft/hcsshim v0.11.5 h1:haEcLNpj9Ka1gd3B3tAEs9CpE0c+1IhoL59w/exYU38= | ||||
| github.com/Microsoft/hcsshim v0.11.5/go.mod h1:MV8xMfmECjl5HdO7U/3/hFVnkmSBjAjmA09d4bExKcU= | ||||
| github.com/Microsoft/hcsshim v0.11.7 h1:vl/nj3Bar/CvJSYo7gIQPyRWc9f3c6IeSNavBTSZNZQ= | ||||
| github.com/Microsoft/hcsshim v0.11.7/go.mod h1:MV8xMfmECjl5HdO7U/3/hFVnkmSBjAjmA09d4bExKcU= | ||||
| github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= | ||||
| github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= | ||||
| github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= | ||||
|  | @ -144,8 +144,10 @@ github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoC | |||
| github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= | ||||
| github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= | ||||
| github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= | ||||
| github.com/containerd/containerd v1.7.18 h1:jqjZTQNfXGoEaZdW1WwPU0RqSn1Bm2Ay/KJPUuO8nao= | ||||
| github.com/containerd/containerd v1.7.18/go.mod h1:IYEk9/IO6wAPUz2bCMVUbsfXjzw5UNP5fLz4PsUygQ4= | ||||
| github.com/containerd/containerd v1.7.19 h1:/xQ4XRJ0tamDkdzrrBAUy/LE5nCcxFKdBm4EcPrSMEE= | ||||
| github.com/containerd/containerd v1.7.19/go.mod h1:h4FtNYUUMB4Phr6v+xG89RYKj9XccvbNSCKjdufCrkc= | ||||
| github.com/containerd/containerd/api v1.7.19 h1:VWbJL+8Ap4Ju2mx9c9qS1uFSB1OVYr5JJrW2yT5vFoA= | ||||
| github.com/containerd/containerd/api v1.7.19/go.mod h1:fwGavl3LNwAV5ilJ0sbrABL44AQxmNjDRcwheXDb6Ig= | ||||
| github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8= | ||||
| github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= | ||||
| github.com/containerd/errdefs v0.1.0 h1:m0wCRBiu1WJT/Fr+iOoQHMQS/eP5myQ8lCv4Dz5ZURM= | ||||
|  | @ -154,10 +156,12 @@ github.com/containerd/fifo v1.1.0 h1:4I2mbh5stb1u6ycIABlBw9zgtlK8viPI9QkQNRQEEmY | |||
| github.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o= | ||||
| github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= | ||||
| github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= | ||||
| github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= | ||||
| github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= | ||||
| github.com/containerd/stargz-snapshotter/estargz v0.15.1 h1:eXJjw9RbkLFgioVaTG+G/ZW/0kEe2oEKCdS/ZxIyoCU= | ||||
| github.com/containerd/stargz-snapshotter/estargz v0.15.1/go.mod h1:gr2RNwukQ/S9Nv33Lt6UC7xEx58C+LHRdoqbEKjz1Kk= | ||||
| github.com/containerd/ttrpc v1.2.4 h1:eQCQK4h9dxDmpOb9QOOMh2NHTfzroH1IkmHiKZi05Oo= | ||||
| github.com/containerd/ttrpc v1.2.4/go.mod h1:ojvb8SJBSch0XkqNO0L0YX/5NxR3UnVk2LzFKBK0upc= | ||||
| github.com/containerd/ttrpc v1.2.5 h1:IFckT1EFQoFBMG4c3sMdT8EP3/aKfumK1msY+Ze4oLU= | ||||
| github.com/containerd/ttrpc v1.2.5/go.mod h1:YCXHsb32f+Sq5/72xHubdiJRQY9inL4a4ZQrAbN1q9o= | ||||
| github.com/containerd/typeurl/v2 v2.1.1 h1:3Q4Pt7i8nYwy2KmQWIw2+1hTvwTE/6w9FqcttATPO/4= | ||||
| github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0= | ||||
| github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= | ||||
|  |  | |||
|  | @ -10,6 +10,28 @@ import ( | |||
| 	"github.com/sirupsen/logrus" | ||||
| ) | ||||
| 
 | ||||
| // EndpointState represents the states of an HNS Endpoint lifecycle.
 | ||||
| type EndpointState uint16 | ||||
| 
 | ||||
| // EndpointState const
 | ||||
| // The lifecycle of an Endpoint goes through created, attached, AttachedSharing - endpoint is being shared with other containers,
 | ||||
| // detached, after being attached, degraded and finally destroyed.
 | ||||
| // Note: This attribute is used by calico to define stale containers and is dependent on HNS v1 api, if we move to HNS v2 api we will need
 | ||||
| // to update the current calico code and cordinate the change with calico. Reach out to Microsoft to facilate the change via HNS.
 | ||||
| const ( | ||||
| 	Uninitialized   EndpointState = iota | ||||
| 	Created         EndpointState = 1 | ||||
| 	Attached        EndpointState = 2 | ||||
| 	AttachedSharing EndpointState = 3 | ||||
| 	Detached        EndpointState = 4 | ||||
| 	Degraded        EndpointState = 5 | ||||
| 	Destroyed       EndpointState = 6 | ||||
| ) | ||||
| 
 | ||||
| func (es EndpointState) String() string { | ||||
| 	return [...]string{"Uninitialized", "Attached", "AttachedSharing", "Detached", "Degraded", "Destroyed"}[es] | ||||
| } | ||||
| 
 | ||||
| // HNSEndpoint represents a network endpoint in HNS
 | ||||
| type HNSEndpoint struct { | ||||
| 	Id                 string            `json:"ID,omitempty"` | ||||
|  | @ -34,6 +56,7 @@ type HNSEndpoint struct { | |||
| 	Namespace          *Namespace        `json:",omitempty"` | ||||
| 	EncapOverhead      uint16            `json:",omitempty"` | ||||
| 	SharedContainers   []string          `json:",omitempty"` | ||||
| 	State              EndpointState     `json:",omitempty"` | ||||
| } | ||||
| 
 | ||||
| // SystemType represents the type of the system on which actions are done
 | ||||
|  |  | |||
|  | @ -57,9 +57,10 @@ type PaPolicy struct { | |||
| 
 | ||||
| type OutboundNatPolicy struct { | ||||
| 	Policy | ||||
| 	VIP          string   `json:"VIP,omitempty"` | ||||
| 	Exceptions   []string `json:"ExceptionList,omitempty"` | ||||
| 	Destinations []string `json:",omitempty"` | ||||
| 	VIP              string   `json:"VIP,omitempty"` | ||||
| 	Exceptions       []string `json:"ExceptionList,omitempty"` | ||||
| 	Destinations     []string `json:",omitempty"` | ||||
| 	MaxPortPoolUsage uint16   `json:",omitempty"` | ||||
| } | ||||
| 
 | ||||
| type ProxyPolicy struct { | ||||
|  |  | |||
|  | @ -1,82 +0,0 @@ | |||
| # Cirrus CI gives open-source projects free 16.0 CPUs, | ||||
| # we use 4 CPUs x 3 tasks = 12 CPUs. | ||||
| # https://cirrus-ci.org/faq/#are-there-any-limits | ||||
| # | ||||
| # Undocumented constraints; | ||||
| # - The maximum memory limit is 4G times the number of CPUs. | ||||
| # - The number of CPUs should be multiple of 2. | ||||
| 
 | ||||
| task: | ||||
|   name: Vagrant | ||||
| 
 | ||||
|   compute_engine_instance: | ||||
|     image_project: cirrus-images | ||||
|     image: family/docker-kvm | ||||
|     platform: linux | ||||
|     nested_virtualization: true | ||||
|     cpu: 4 | ||||
|     memory: 16G | ||||
| 
 | ||||
|   env: | ||||
|     GOTEST: gotestsum -- | ||||
|     # By default, Cirrus CI doesn't have HOME defined | ||||
|     HOME: /root | ||||
|     matrix: | ||||
|       BOX: fedora/37-cloud-base | ||||
|       # v7.0.0 does not boot. v6.0.0 was not released. | ||||
|       BOX: rockylinux/8@5.0.0 | ||||
|   install_libvirt_vagrant_script: | | ||||
|     # if another process is keeping a lock, wait for 60 seconds for it to release the lock. | ||||
|     apt-get -o DPkg::Lock::Timeout=60 update | ||||
|     apt-get -o DPkg::Lock::Timeout=60 install -y libvirt-daemon libvirt-daemon-system vagrant vagrant-libvirt | ||||
|     systemctl enable --now libvirtd | ||||
| 
 | ||||
|   vagrant_cache: | ||||
|     folder: /root/.vagrant.d | ||||
|     fingerprint_script: uname --kernel-release --kernel-version && cat Vagrantfile | ||||
| 
 | ||||
|   vagrant_up_script: | | ||||
|     vagrant up --no-tty | ||||
| 
 | ||||
|   integration_script: | | ||||
|     vagrant up --provision-with=selinux,install-runc,install-gotestsum,test-integration | ||||
| 
 | ||||
|   cri_integration_script: | | ||||
|     vagrant up --provision-with=selinux,install-runc,install-gotestsum,test-cri-integration | ||||
| 
 | ||||
|   cri_test_script: | | ||||
|     vagrant up --provision-with=selinux,install-runc,install-gotestsum,test-cri | ||||
| 
 | ||||
| task: | ||||
|   name: CGroupsV2 - rootless CRI test | ||||
| 
 | ||||
|   env: | ||||
|     HOME: /root | ||||
| 
 | ||||
|   compute_engine_instance: | ||||
|     image_project: cirrus-images | ||||
|     image: family/docker-kvm | ||||
|     platform: linux | ||||
|     nested_virtualization: true | ||||
|     cpu: 4 | ||||
|     memory: 16G | ||||
| 
 | ||||
|   install_libvirt_vagrant_script: | | ||||
|     # if another process is keeping a lock, wait for 60 seconds for it to release the lock. | ||||
|     apt-get -o DPkg::Lock::Timeout=60 update | ||||
|     apt-get -o DPkg::Lock::Timeout=60 install -y libvirt-daemon libvirt-daemon-system vagrant vagrant-libvirt | ||||
|     systemctl enable --now libvirtd | ||||
| 
 | ||||
|   vagrant_cache: | ||||
|     folder: /root/.vagrant.d | ||||
|     fingerprint_script: uname -a; cat Vagrantfile | ||||
| 
 | ||||
|   vagrant_up_script: | | ||||
|     vagrant up --provision-with=install-rootless-podman --no-tty | ||||
| 
 | ||||
|   podman_build_script: | | ||||
|     # Execute rootless podman to create the UserNS env | ||||
|     vagrant ssh -- podman build --target cri-in-userns -t cri-in-userns -f /vagrant/contrib/Dockerfile.test /vagrant | ||||
| 
 | ||||
|   test_script: | | ||||
|     vagrant ssh -- podman run --rm --privileged cri-in-userns | ||||
|  | @ -1,5 +1,6 @@ | |||
| linters: | ||||
|   enable: | ||||
|     - depguard      # Checks for imports that shouldn't be used. | ||||
|     - exportloopref # Checks for pointers to enclosing loop variables | ||||
|     - gofmt | ||||
|     - goimports | ||||
|  | @ -61,6 +62,16 @@ issues: | |||
| 
 | ||||
| 
 | ||||
| linters-settings: | ||||
|   depguard: | ||||
|     rules: | ||||
|       main: | ||||
|         deny: | ||||
|           - pkg: "github.com/containerd/containerd/errdefs" | ||||
|             desc: The containerd errdefs package was migrated to a separate module. Use github.com/containerd/errdefs instead. | ||||
|           - pkg: "github.com/containerd/containerd/log" | ||||
|             desc: The containerd log package was migrated to a separate module. Use github.com/containerd/log instead. | ||||
|           - pkg: "github.com/containerd/containerd/platforms" | ||||
|             desc: The containerd platforms package was migrated to a separate module. Use github.com/containerd/platforms instead. | ||||
|   gosec: | ||||
|     # The following issues surfaced when `gosec` linter | ||||
|     # was enabled. They are temporarily excluded to unblock | ||||
|  |  | |||
|  | @ -149,7 +149,7 @@ GOTEST ?= $(GO) test | |||
| OUTPUTDIR = $(join $(ROOTDIR), _output) | ||||
| CRIDIR=$(OUTPUTDIR)/cri | ||||
| 
 | ||||
| .PHONY: clean all AUTHORS build binaries test integration generate protos check-protos coverage ci check help install uninstall vendor release static-release mandir install-man genman install-cri-deps cri-release cri-cni-release cri-integration install-deps bin/cri-integration.test | ||||
| .PHONY: clean all AUTHORS build binaries test integration generate protos check-protos coverage ci check help install uninstall vendor release static-release mandir install-man genman install-cri-deps cri-release cri-cni-release cri-integration install-deps bin/cri-integration.test remove-replace clean-vendor | ||||
| .DEFAULT: default | ||||
| 
 | ||||
| # Forcibly set the default goal to all, in case an include above brought in a rule definition.
 | ||||
|  | @ -180,6 +180,8 @@ protos: bin/protoc-gen-go-fieldpath | |||
| 	@mv ${TMPDIR}/vendor ${ROOTDIR} | ||||
| 	@rm -rf ${TMPDIR} | ||||
| 	go-fix-acronym -w -a '(Id|Io|Uuid|Os)$$' $(shell find api/ runtime/ -name '*.pb.go') | ||||
| 	@test -z "$$(git status --short | grep "api/next.pb.txt" | tee /dev/stderr)" || \
 | ||||
| 		$(GO) mod edit -replace=github.com/containerd/containerd/api=./api | ||||
| 
 | ||||
| check-protos: protos ## check if protobufs needs to be generated again
 | ||||
| 	@echo "$(WHALE) $@" | ||||
|  | @ -470,23 +472,31 @@ root-coverage: ## generate coverage profiles for unit tests that require root | |||
| 		fi; \
 | ||||
| 	done ) | ||||
| 
 | ||||
| remove-replace: | ||||
| 	@echo "$(WHALE) $@" | ||||
| 	@$(GO) mod edit -dropreplace=github.com/containerd/containerd/api | ||||
| 
 | ||||
| vendor: ## ensure all the go.mod/go.sum files are up-to-date including vendor/ directory
 | ||||
| 	@echo "$(WHALE) $@" | ||||
| 	@$(GO) mod tidy | ||||
| 	@$(GO) mod vendor | ||||
| 	@$(GO) mod verify | ||||
| 	@(cd ${ROOTDIR}/integration/client && ${GO} mod tidy) | ||||
| 	@(cd ${ROOTDIR}/api && ${GO} mod tidy) | ||||
| 
 | ||||
| verify-vendor: ## verify if all the go.mod/go.sum files are up-to-date
 | ||||
| 	@echo "$(WHALE) $@" | ||||
| 	$(eval TMPDIR := $(shell mktemp -d)) | ||||
| 	@cp -R ${ROOTDIR} ${TMPDIR} | ||||
| 	@(cd ${TMPDIR}/containerd && ${GO} mod tidy) | ||||
| 	@(cd ${TMPDIR}/containerd/api && ${GO} mod tidy) | ||||
| 	@(cd ${TMPDIR}/containerd/integration/client && ${GO} mod tidy) | ||||
| 	@diff -r -u -q ${ROOTDIR} ${TMPDIR}/containerd | ||||
| 	@rm -rf ${TMPDIR} | ||||
| 	@${ROOTDIR}/script/verify-go-modules.sh integration/client | ||||
| 
 | ||||
| clean-vendor: remove-replace vendor | ||||
| 
 | ||||
| 
 | ||||
| help: ## this help
 | ||||
| 	@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) | sort | ||||
|  |  | |||
|  | @ -17,7 +17,7 @@ | |||
| 
 | ||||
| # Vagrantfile for Fedora and EL | ||||
| Vagrant.configure("2") do |config| | ||||
|   config.vm.box = ENV["BOX"] ? ENV["BOX"].split("@")[0] : "fedora/37-cloud-base" | ||||
|   config.vm.box = ENV["BOX"] ? ENV["BOX"].split("@")[0] : "fedora/39-cloud-base" | ||||
|   # BOX_VERSION is deprecated. Use "BOX=<BOX>@<BOX_VERSION>". | ||||
|   config.vm.box_version = ENV["BOX_VERSION"] || (ENV["BOX"].split("@")[1] if ENV["BOX"]) | ||||
| 
 | ||||
|  | @ -29,11 +29,13 @@ Vagrant.configure("2") do |config| | |||
|     v.cpus = cpus | ||||
|     # Needs env var VAGRANT_EXPERIMENTAL="disks" | ||||
|     o.vm.disk :disk, size: "#{disk_size}GB", primary: true | ||||
|     v.customize ["modifyvm", :id, "--firmware", "efi"] | ||||
|   end | ||||
|   config.vm.provider :libvirt do |v| | ||||
|     v.memory = memory | ||||
|     v.cpus = cpus | ||||
|     v.machine_virtual_size = disk_size | ||||
|     v.loader = "/usr/share/OVMF/OVMF_CODE.fd" | ||||
|   end | ||||
| 
 | ||||
|   config.vm.synced_folder ".", "/vagrant", type: "rsync" | ||||
|  | @ -326,29 +328,4 @@ EOF | |||
|     SHELL | ||||
|   end | ||||
| 
 | ||||
|   # Rootless Podman is used for testing CRI-in-UserNS | ||||
|   # (We could use rootless nerdctl, but we are using Podman here because it is available in dnf) | ||||
|   config.vm.provision "install-rootless-podman", type: "shell", run: "never" do |sh| | ||||
|     sh.upload_path = "/tmp/vagrant-install-rootless-podman" | ||||
|     sh.inline = <<~SHELL | ||||
|         #!/usr/bin/env bash | ||||
|         set -eux -o pipefail | ||||
|         # Delegate cgroup v2 controllers to rootless | ||||
|         mkdir -p /etc/systemd/system/user@.service.d | ||||
|         cat > /etc/systemd/system/user@.service.d/delegate.conf << EOF | ||||
| [Service] | ||||
| Delegate=yes | ||||
| EOF | ||||
|         systemctl daemon-reload | ||||
|         # Install Podman | ||||
|         dnf install -y podman | ||||
|         # Configure Podman to resolve `golang` to `docker.io/library/golang` | ||||
|         mkdir -p /etc/containers | ||||
|         cat > /etc/containers/registries.conf <<EOF | ||||
| [registries.search] | ||||
| registries = ['docker.io'] | ||||
| EOF | ||||
|     SHELL | ||||
|   end | ||||
| 
 | ||||
| end | ||||
|  |  | |||
|  | @ -0,0 +1,191 @@ | |||
| 
 | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         https://www.apache.org/licenses/ | ||||
| 
 | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
| 
 | ||||
|    1. Definitions. | ||||
| 
 | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
| 
 | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
| 
 | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
| 
 | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
| 
 | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
| 
 | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
| 
 | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
| 
 | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
| 
 | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
| 
 | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
| 
 | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
| 
 | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
| 
 | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
| 
 | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
| 
 | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
| 
 | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
| 
 | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
| 
 | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
| 
 | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
| 
 | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
| 
 | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
| 
 | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
| 
 | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
| 
 | ||||
|    END OF TERMS AND CONDITIONS | ||||
| 
 | ||||
|    Copyright The containerd Authors | ||||
| 
 | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
| 
 | ||||
|        https://www.apache.org/licenses/LICENSE-2.0 | ||||
| 
 | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
|  | @ -15,3 +15,9 @@ | |||
| */ | ||||
| 
 | ||||
| package sandbox | ||||
| 
 | ||||
| // Not implemented types introduced in later versions and included for API compatibility
 | ||||
| // Use of these types should only use not implemented errors
 | ||||
| 
 | ||||
| type SandboxMetricsRequest struct{} | ||||
| type SandboxMetricsResponse struct{} | ||||
|  |  | |||
|  | @ -22,7 +22,7 @@ | |||
| package events | ||||
| 
 | ||||
| import ( | ||||
| 	_ "github.com/containerd/containerd/protobuf/plugin" | ||||
| 	_ "github.com/containerd/containerd/api/types" | ||||
| 	protoreflect "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	protoimpl "google.golang.org/protobuf/runtime/protoimpl" | ||||
| 	anypb "google.golang.org/protobuf/types/known/anypb" | ||||
|  | @ -268,63 +268,63 @@ var file_github_com_containerd_containerd_api_services_events_v1_events_proto_ra | |||
| 	0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, | ||||
| 	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, | ||||
| 	0x72, 0x64, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x65, 0x76, 0x65, 0x6e, | ||||
| 	0x74, 0x73, 0x2e, 0x76, 0x31, 0x1a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, | ||||
| 	0x74, 0x73, 0x2e, 0x76, 0x31, 0x1a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, | ||||
| 	0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, | ||||
| 	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, | ||||
| 	0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x70, 0x61, 0x74, | ||||
| 	0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, | ||||
| 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, | ||||
| 	0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, | ||||
| 	0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, | ||||
| 	0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, | ||||
| 	0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, | ||||
| 	0x22, 0x52, 0x0a, 0x0e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, | ||||
| 	0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, | ||||
| 	0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, | ||||
| 	0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, | ||||
| 	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x65, | ||||
| 	0x76, 0x65, 0x6e, 0x74, 0x22, 0x55, 0x0a, 0x0e, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x52, | ||||
| 	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x08, 0x65, 0x6e, 0x76, 0x65, 0x6c, 0x6f, | ||||
| 	0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, | ||||
| 	0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x65, | ||||
| 	0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, | ||||
| 	0x65, 0x52, 0x08, 0x65, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x22, 0x2c, 0x0a, 0x10, 0x53, | ||||
| 	0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, | ||||
| 	0x18, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, | ||||
| 	0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x22, 0xaa, 0x01, 0x0a, 0x08, 0x45, 0x6e, | ||||
| 	0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, | ||||
| 	0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, | ||||
| 	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, | ||||
| 	0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, | ||||
| 	0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, | ||||
| 	0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, | ||||
| 	0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, | ||||
| 	0x6f, 0x70, 0x69, 0x63, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, | ||||
| 	0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, | ||||
| 	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, | ||||
| 	0x3a, 0x04, 0x80, 0xb9, 0x1f, 0x01, 0x32, 0x95, 0x02, 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, | ||||
| 	0x73, 0x12, 0x50, 0x0a, 0x07, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x2d, 0x2e, 0x63, | ||||
| 	0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, | ||||
| 	0x65, 0x73, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, | ||||
| 	0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, | ||||
| 	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, | ||||
| 	0x70, 0x74, 0x79, 0x12, 0x50, 0x0a, 0x07, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x2d, | ||||
| 	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x73, 0x65, 0x72, 0x76, | ||||
| 	0x69, 0x63, 0x65, 0x73, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x46, | ||||
| 	0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, | ||||
| 	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, | ||||
| 	0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x67, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, | ||||
| 	0x62, 0x65, 0x12, 0x2f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, | ||||
| 	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x74, 0x79, 0x70, 0x65, | ||||
| 	0x73, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, | ||||
| 	0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, | ||||
| 	0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, | ||||
| 	0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, | ||||
| 	0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, | ||||
| 	0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, | ||||
| 	0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x52, 0x0a, 0x0e, 0x50, 0x75, | ||||
| 	0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, | ||||
| 	0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, | ||||
| 	0x69, 0x63, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, | ||||
| 	0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, | ||||
| 	0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x55, | ||||
| 	0x0a, 0x0e, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, | ||||
| 	0x12, 0x43, 0x0a, 0x08, 0x65, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, | ||||
| 	0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, | ||||
| 	0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, | ||||
| 	0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, | ||||
| 	0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, | ||||
| 	0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, | ||||
| 	0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x30, 0x01, 0x42, 0x40, | ||||
| 	0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, | ||||
| 	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, | ||||
| 	0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, | ||||
| 	0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x76, 0x31, 0x3b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, | ||||
| 	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, | ||||
| 	0x76, 0x31, 0x2e, 0x45, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x52, 0x08, 0x65, 0x6e, 0x76, | ||||
| 	0x65, 0x6c, 0x6f, 0x70, 0x65, 0x22, 0x2c, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, | ||||
| 	0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x6c, | ||||
| 	0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, | ||||
| 	0x65, 0x72, 0x73, 0x22, 0xaa, 0x01, 0x0a, 0x08, 0x45, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, | ||||
| 	0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, | ||||
| 	0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, | ||||
| 	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, | ||||
| 	0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, | ||||
| 	0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, | ||||
| 	0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, | ||||
| 	0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x2a, | ||||
| 	0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, | ||||
| 	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, | ||||
| 	0x41, 0x6e, 0x79, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3a, 0x04, 0x80, 0xb9, 0x1f, 0x01, | ||||
| 	0x32, 0x95, 0x02, 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x50, 0x0a, 0x07, 0x50, | ||||
| 	0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, | ||||
| 	0x65, 0x72, 0x64, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x65, 0x76, 0x65, | ||||
| 	0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, | ||||
| 	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, | ||||
| 	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x50, 0x0a, | ||||
| 	0x07, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, | ||||
| 	0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x65, | ||||
| 	0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, | ||||
| 	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, | ||||
| 	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, | ||||
| 	0x67, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x2f, 0x2e, 0x63, | ||||
| 	0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, | ||||
| 	0x65, 0x73, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, | ||||
| 	0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, | ||||
| 	0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, | ||||
| 	0x63, 0x65, 0x73, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, | ||||
| 	0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x30, 0x01, 0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, | ||||
| 	0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, | ||||
| 	0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, | ||||
| 	0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, | ||||
| 	0x2f, 0x76, 0x31, 0x3b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, | ||||
| 	0x6f, 0x33, | ||||
| } | ||||
| 
 | ||||
| var ( | ||||
|  |  | |||
|  | @ -18,7 +18,7 @@ syntax = "proto3"; | |||
| 
 | ||||
| package containerd.services.events.v1; | ||||
| 
 | ||||
| import "github.com/containerd/containerd/protobuf/plugin/fieldpath.proto"; | ||||
| import "github.com/containerd/containerd/api/types/fieldpath.proto"; | ||||
| import "google/protobuf/any.proto"; | ||||
| import "google/protobuf/empty.proto"; | ||||
| import "google/protobuf/timestamp.proto"; | ||||
|  | @ -63,7 +63,7 @@ message SubscribeRequest { | |||
| } | ||||
| 
 | ||||
| message Envelope { | ||||
| 	option (containerd.plugin.fieldpath) = true; | ||||
| 	option (containerd.types.fieldpath) = true; | ||||
| 	google.protobuf.Timestamp timestamp = 1; | ||||
| 	string namespace = 2; | ||||
| 	string topic = 3; | ||||
|  |  | |||
|  | @ -15,3 +15,9 @@ | |||
| */ | ||||
| 
 | ||||
| package introspection | ||||
| 
 | ||||
| // Not implemented types introduced in later versions and included for API compatibility
 | ||||
| // Use of these types should only use not implemented errors
 | ||||
| 
 | ||||
| type PluginInfoRequest struct{} | ||||
| type PluginInfoResponse struct{} | ||||
|  |  | |||
							
								
								
									
										144
									
								
								vendor/github.com/containerd/containerd/api/types/fieldpath.pb.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							
							
						
						
									
										144
									
								
								vendor/github.com/containerd/containerd/api/types/fieldpath.pb.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							|  | @ -0,0 +1,144 @@ | |||
| // Protocol Buffers for Go with Gadgets
 | ||||
| //
 | ||||
| // Copyright (c) 2013, The GoGo Authors. All rights reserved.
 | ||||
| // http://github.com/gogo/protobuf
 | ||||
| //
 | ||||
| // Redistribution and use in source and binary forms, with or without
 | ||||
| // modification, are permitted provided that the following conditions are
 | ||||
| // met:
 | ||||
| //
 | ||||
| //     * Redistributions of source code must retain the above copyright
 | ||||
| // notice, this list of conditions and the following disclaimer.
 | ||||
| //     * Redistributions in binary form must reproduce the above
 | ||||
| // copyright notice, this list of conditions and the following disclaimer
 | ||||
| // in the documentation and/or other materials provided with the
 | ||||
| // distribution.
 | ||||
| //
 | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| 
 | ||||
| // Code generated by protoc-gen-go. DO NOT EDIT.
 | ||||
| // versions:
 | ||||
| // 	protoc-gen-go v1.28.1
 | ||||
| // 	protoc        v3.20.1
 | ||||
| // source: github.com/containerd/containerd/api/types/fieldpath.proto
 | ||||
| 
 | ||||
| package types | ||||
| 
 | ||||
| import ( | ||||
| 	protoreflect "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	protoimpl "google.golang.org/protobuf/runtime/protoimpl" | ||||
| 	descriptorpb "google.golang.org/protobuf/types/descriptorpb" | ||||
| 	reflect "reflect" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	// Verify that this generated code is sufficiently up-to-date.
 | ||||
| 	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) | ||||
| 	// Verify that runtime/protoimpl is sufficiently up-to-date.
 | ||||
| 	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) | ||||
| ) | ||||
| 
 | ||||
| var file_github_com_containerd_containerd_api_types_fieldpath_proto_extTypes = []protoimpl.ExtensionInfo{ | ||||
| 	{ | ||||
| 		ExtendedType:  (*descriptorpb.FileOptions)(nil), | ||||
| 		ExtensionType: (*bool)(nil), | ||||
| 		Field:         63300, | ||||
| 		Name:          "containerd.types.fieldpath_all", | ||||
| 		Tag:           "varint,63300,opt,name=fieldpath_all", | ||||
| 		Filename:      "github.com/containerd/containerd/api/types/fieldpath.proto", | ||||
| 	}, | ||||
| 	{ | ||||
| 		ExtendedType:  (*descriptorpb.MessageOptions)(nil), | ||||
| 		ExtensionType: (*bool)(nil), | ||||
| 		Field:         64400, | ||||
| 		Name:          "containerd.types.fieldpath", | ||||
| 		Tag:           "varint,64400,opt,name=fieldpath", | ||||
| 		Filename:      "github.com/containerd/containerd/api/types/fieldpath.proto", | ||||
| 	}, | ||||
| } | ||||
| 
 | ||||
| // Extension fields to descriptorpb.FileOptions.
 | ||||
| var ( | ||||
| 	// optional bool fieldpath_all = 63300;
 | ||||
| 	E_FieldpathAll = &file_github_com_containerd_containerd_api_types_fieldpath_proto_extTypes[0] | ||||
| ) | ||||
| 
 | ||||
| // Extension fields to descriptorpb.MessageOptions.
 | ||||
| var ( | ||||
| 	// optional bool fieldpath = 64400;
 | ||||
| 	E_Fieldpath = &file_github_com_containerd_containerd_api_types_fieldpath_proto_extTypes[1] | ||||
| ) | ||||
| 
 | ||||
| var File_github_com_containerd_containerd_api_types_fieldpath_proto protoreflect.FileDescriptor | ||||
| 
 | ||||
| var file_github_com_containerd_containerd_api_types_fieldpath_proto_rawDesc = []byte{ | ||||
| 	0x0a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, | ||||
| 	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, | ||||
| 	0x72, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x66, 0x69, 0x65, | ||||
| 	0x6c, 0x64, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x63, 0x6f, | ||||
| 	0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x1a, 0x20, | ||||
| 	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, | ||||
| 	0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, | ||||
| 	0x3a, 0x46, 0x0a, 0x0d, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x61, 0x6c, | ||||
| 	0x6c, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, | ||||
| 	0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, | ||||
| 	0xc4, 0xee, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x70, 0x61, | ||||
| 	0x74, 0x68, 0x41, 0x6c, 0x6c, 0x88, 0x01, 0x01, 0x3a, 0x42, 0x0a, 0x09, 0x66, 0x69, 0x65, 0x6c, | ||||
| 	0x64, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, | ||||
| 	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, | ||||
| 	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x90, 0xf7, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, | ||||
| 	0x66, 0x69, 0x65, 0x6c, 0x64, 0x70, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x42, 0x32, 0x5a, 0x30, | ||||
| 	0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, | ||||
| 	0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, | ||||
| 	0x2f, 0x61, 0x70, 0x69, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x3b, 0x74, 0x79, 0x70, 0x65, 0x73, | ||||
| 	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, | ||||
| } | ||||
| 
 | ||||
| var file_github_com_containerd_containerd_api_types_fieldpath_proto_goTypes = []interface{}{ | ||||
| 	(*descriptorpb.FileOptions)(nil),    // 0: google.protobuf.FileOptions
 | ||||
| 	(*descriptorpb.MessageOptions)(nil), // 1: google.protobuf.MessageOptions
 | ||||
| } | ||||
| var file_github_com_containerd_containerd_api_types_fieldpath_proto_depIdxs = []int32{ | ||||
| 	0, // 0: containerd.types.fieldpath_all:extendee -> google.protobuf.FileOptions
 | ||||
| 	1, // 1: containerd.types.fieldpath:extendee -> google.protobuf.MessageOptions
 | ||||
| 	2, // [2:2] is the sub-list for method output_type
 | ||||
| 	2, // [2:2] is the sub-list for method input_type
 | ||||
| 	2, // [2:2] is the sub-list for extension type_name
 | ||||
| 	0, // [0:2] is the sub-list for extension extendee
 | ||||
| 	0, // [0:0] is the sub-list for field type_name
 | ||||
| } | ||||
| 
 | ||||
| func init() { file_github_com_containerd_containerd_api_types_fieldpath_proto_init() } | ||||
| func file_github_com_containerd_containerd_api_types_fieldpath_proto_init() { | ||||
| 	if File_github_com_containerd_containerd_api_types_fieldpath_proto != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	type x struct{} | ||||
| 	out := protoimpl.TypeBuilder{ | ||||
| 		File: protoimpl.DescBuilder{ | ||||
| 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(), | ||||
| 			RawDescriptor: file_github_com_containerd_containerd_api_types_fieldpath_proto_rawDesc, | ||||
| 			NumEnums:      0, | ||||
| 			NumMessages:   0, | ||||
| 			NumExtensions: 2, | ||||
| 			NumServices:   0, | ||||
| 		}, | ||||
| 		GoTypes:           file_github_com_containerd_containerd_api_types_fieldpath_proto_goTypes, | ||||
| 		DependencyIndexes: file_github_com_containerd_containerd_api_types_fieldpath_proto_depIdxs, | ||||
| 		ExtensionInfos:    file_github_com_containerd_containerd_api_types_fieldpath_proto_extTypes, | ||||
| 	}.Build() | ||||
| 	File_github_com_containerd_containerd_api_types_fieldpath_proto = out.File | ||||
| 	file_github_com_containerd_containerd_api_types_fieldpath_proto_rawDesc = nil | ||||
| 	file_github_com_containerd_containerd_api_types_fieldpath_proto_goTypes = nil | ||||
| 	file_github_com_containerd_containerd_api_types_fieldpath_proto_depIdxs = nil | ||||
| } | ||||
|  | @ -26,12 +26,12 @@ | |||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| 
 | ||||
| syntax = "proto2"; | ||||
| package containerd.plugin; | ||||
| syntax = "proto3"; | ||||
| package containerd.types; | ||||
| 
 | ||||
| import "google/protobuf/descriptor.proto"; | ||||
| 
 | ||||
| option go_package = "github.com/containerd/containerd/protobuf/plugin"; | ||||
| option go_package = "github.com/containerd/containerd/api/types;types"; | ||||
| 
 | ||||
| extend google.protobuf.FileOptions { | ||||
| 	optional bool fieldpath_all = 63300; | ||||
|  | @ -50,7 +50,6 @@ import ( | |||
| 	leasesproxy "github.com/containerd/containerd/leases/proxy" | ||||
| 	"github.com/containerd/containerd/namespaces" | ||||
| 	"github.com/containerd/containerd/pkg/dialer" | ||||
| 	"github.com/containerd/containerd/platforms" | ||||
| 	"github.com/containerd/containerd/plugin" | ||||
| 	ptypes "github.com/containerd/containerd/protobuf/types" | ||||
| 	"github.com/containerd/containerd/remotes" | ||||
|  | @ -61,6 +60,7 @@ import ( | |||
| 	"github.com/containerd/containerd/snapshots" | ||||
| 	snproxy "github.com/containerd/containerd/snapshots/proxy" | ||||
| 	"github.com/containerd/errdefs" | ||||
| 	"github.com/containerd/platforms" | ||||
| 	"github.com/containerd/typeurl/v2" | ||||
| 	ocispec "github.com/opencontainers/image-spec/specs-go/v1" | ||||
| 	"github.com/opencontainers/runtime-spec/specs-go" | ||||
|  |  | |||
|  | @ -20,9 +20,9 @@ import ( | |||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/containerd/containerd/images" | ||||
| 	"github.com/containerd/containerd/platforms" | ||||
| 	"github.com/containerd/containerd/remotes" | ||||
| 	"github.com/containerd/containerd/snapshots" | ||||
| 	"github.com/containerd/platforms" | ||||
| 	ocispec "github.com/opencontainers/image-spec/specs-go/v1" | ||||
| 
 | ||||
| 	"google.golang.org/grpc" | ||||
|  | @ -110,7 +110,7 @@ type RemoteOpt func(*Client, *RemoteContext) error | |||
| // content for
 | ||||
| func WithPlatform(platform string) RemoteOpt { | ||||
| 	if platform == "" { | ||||
| 		platform = platforms.DefaultString() | ||||
| 		platform = platforms.Format(platforms.DefaultSpec()) // For 1.7 continue using the old format without os-version included.
 | ||||
| 	} | ||||
| 	return func(_ *Client, c *RemoteContext) error { | ||||
| 		for _, p := range c.Platforms { | ||||
|  |  | |||
|  | @ -27,11 +27,11 @@ import ( | |||
| 	"github.com/containerd/containerd/containers" | ||||
| 	"github.com/containerd/containerd/diff" | ||||
| 	"github.com/containerd/containerd/images" | ||||
| 	"github.com/containerd/containerd/platforms" | ||||
| 	"github.com/containerd/containerd/protobuf" | ||||
| 	"github.com/containerd/containerd/protobuf/proto" | ||||
| 	"github.com/containerd/containerd/rootfs" | ||||
| 	"github.com/containerd/containerd/runtime/v2/runc/options" | ||||
| 	"github.com/containerd/platforms" | ||||
| 	"github.com/opencontainers/go-digest" | ||||
| 	imagespec "github.com/opencontainers/image-spec/specs-go/v1" | ||||
| ) | ||||
|  |  | |||
|  | @ -19,11 +19,12 @@ package containerd | |||
| import ( | ||||
| 	"context" | ||||
| 
 | ||||
| 	"github.com/containerd/errdefs" | ||||
| 	"github.com/containerd/typeurl/v2" | ||||
| 
 | ||||
| 	eventsapi "github.com/containerd/containerd/api/services/events/v1" | ||||
| 	"github.com/containerd/containerd/events" | ||||
| 	"github.com/containerd/containerd/protobuf" | ||||
| 	"github.com/containerd/errdefs" | ||||
| 	"github.com/containerd/typeurl/v2" | ||||
| ) | ||||
| 
 | ||||
| // EventService handles the publish, forward and subscribe of events.
 | ||||
|  |  | |||
|  | @ -29,10 +29,10 @@ import ( | |||
| 	"github.com/containerd/containerd/images" | ||||
| 	"github.com/containerd/containerd/labels" | ||||
| 	"github.com/containerd/containerd/pkg/kmutex" | ||||
| 	"github.com/containerd/containerd/platforms" | ||||
| 	"github.com/containerd/containerd/rootfs" | ||||
| 	"github.com/containerd/containerd/snapshots" | ||||
| 	"github.com/containerd/errdefs" | ||||
| 	"github.com/containerd/platforms" | ||||
| 	"github.com/opencontainers/go-digest" | ||||
| 	"github.com/opencontainers/image-spec/identity" | ||||
| 	ocispec "github.com/opencontainers/image-spec/specs-go/v1" | ||||
|  |  | |||
|  | @ -29,9 +29,9 @@ import ( | |||
| 	"github.com/containerd/containerd/content" | ||||
| 	"github.com/containerd/containerd/images" | ||||
| 	"github.com/containerd/containerd/labels" | ||||
| 	"github.com/containerd/containerd/platforms" | ||||
| 	"github.com/containerd/errdefs" | ||||
| 	"github.com/containerd/log" | ||||
| 	"github.com/containerd/platforms" | ||||
| 	digest "github.com/opencontainers/go-digest" | ||||
| 	ocispecs "github.com/opencontainers/image-spec/specs-go" | ||||
| 	ocispec "github.com/opencontainers/image-spec/specs-go/v1" | ||||
|  |  | |||
|  | @ -31,9 +31,9 @@ import ( | |||
| 	"github.com/containerd/containerd/content" | ||||
| 	"github.com/containerd/containerd/images" | ||||
| 	"github.com/containerd/containerd/labels" | ||||
| 	"github.com/containerd/containerd/platforms" | ||||
| 	"github.com/containerd/errdefs" | ||||
| 	"github.com/containerd/log" | ||||
| 	"github.com/containerd/platforms" | ||||
| 	digest "github.com/opencontainers/go-digest" | ||||
| 	specs "github.com/opencontainers/image-spec/specs-go" | ||||
| 	ocispec "github.com/opencontainers/image-spec/specs-go/v1" | ||||
|  |  | |||
|  | @ -21,7 +21,7 @@ import ( | |||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/containerd/containerd/reference" | ||||
| 	distref "github.com/containerd/containerd/reference/docker" | ||||
| 	distref "github.com/distribution/reference" | ||||
| 	"github.com/opencontainers/go-digest" | ||||
| ) | ||||
| 
 | ||||
|  |  | |||
|  | @ -23,8 +23,8 @@ import ( | |||
| 	"sort" | ||||
| 
 | ||||
| 	"github.com/containerd/containerd/content" | ||||
| 	"github.com/containerd/containerd/platforms" | ||||
| 	"github.com/containerd/errdefs" | ||||
| 	"github.com/containerd/platforms" | ||||
| 	ocispec "github.com/opencontainers/image-spec/specs-go/v1" | ||||
| 	"golang.org/x/sync/errgroup" | ||||
| 	"golang.org/x/sync/semaphore" | ||||
|  |  | |||
|  | @ -24,9 +24,9 @@ import ( | |||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/containerd/containerd/content" | ||||
| 	"github.com/containerd/containerd/platforms" | ||||
| 	"github.com/containerd/errdefs" | ||||
| 	"github.com/containerd/log" | ||||
| 	"github.com/containerd/platforms" | ||||
| 	digest "github.com/opencontainers/go-digest" | ||||
| 	ocispec "github.com/opencontainers/image-spec/specs-go/v1" | ||||
| ) | ||||
|  |  | |||
|  | @ -24,8 +24,8 @@ import ( | |||
| 	"github.com/containerd/containerd/content" | ||||
| 	"github.com/containerd/containerd/images" | ||||
| 	"github.com/containerd/containerd/images/archive" | ||||
| 	"github.com/containerd/containerd/platforms" | ||||
| 	"github.com/containerd/errdefs" | ||||
| 	"github.com/containerd/platforms" | ||||
| 	digest "github.com/opencontainers/go-digest" | ||||
| 	ocispec "github.com/opencontainers/image-spec/specs-go/v1" | ||||
| ) | ||||
|  |  | |||
|  | @ -29,6 +29,10 @@ var tempMountLocation = getTempDir() | |||
| // WithTempMount mounts the provided mounts to a temp dir, and pass the temp dir to f.
 | ||||
| // The mounts are valid during the call to the f.
 | ||||
| // Finally we will unmount and remove the temp dir regardless of the result of f.
 | ||||
| //
 | ||||
| // NOTE: The volatile option of overlayfs doesn't allow to mount again using the
 | ||||
| // same upper / work dirs. Since it's a temp mount, avoid using that option here
 | ||||
| // if found.
 | ||||
| func WithTempMount(ctx context.Context, mounts []Mount, f func(root string) error) (err error) { | ||||
| 	root, uerr := os.MkdirTemp(tempMountLocation, "containerd-mount") | ||||
| 	if uerr != nil { | ||||
|  | @ -58,7 +62,8 @@ func WithTempMount(ctx context.Context, mounts []Mount, f func(root string) erro | |||
| 			} | ||||
| 		} | ||||
| 	}() | ||||
| 	if uerr = All(mounts, root); uerr != nil { | ||||
| 
 | ||||
| 	if uerr = All(RemoveVolatileOption(mounts), root); uerr != nil { | ||||
| 		return fmt.Errorf("failed to mount %s: %w", root, uerr) | ||||
| 	} | ||||
| 	if err := f(root); err != nil { | ||||
|  | @ -67,6 +72,45 @@ func WithTempMount(ctx context.Context, mounts []Mount, f func(root string) erro | |||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // RemoveVolatileOption copies and remove the volatile option for overlay
 | ||||
| // type, since overlayfs doesn't allow to mount again using the same upper/work
 | ||||
| // dirs.
 | ||||
| //
 | ||||
| // REF: https://docs.kernel.org/filesystems/overlayfs.html#volatile-mount
 | ||||
| //
 | ||||
| // TODO: Make this logic conditional once the kernel supports reusing
 | ||||
| // overlayfs volatile mounts.
 | ||||
| func RemoveVolatileOption(mounts []Mount) []Mount { | ||||
| 	var out []Mount | ||||
| 	for i, m := range mounts { | ||||
| 		if m.Type != "overlay" { | ||||
| 			continue | ||||
| 		} | ||||
| 		for j, opt := range m.Options { | ||||
| 			if opt == "volatile" { | ||||
| 				if out == nil { | ||||
| 					out = copyMounts(mounts) | ||||
| 				} | ||||
| 				out[i].Options = append(out[i].Options[:j], out[i].Options[j+1:]...) | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if out != nil { | ||||
| 		return out | ||||
| 	} | ||||
| 
 | ||||
| 	return mounts | ||||
| } | ||||
| 
 | ||||
| // copyMounts creates a copy of the original slice to allow for modification and not altering the original
 | ||||
| func copyMounts(in []Mount) []Mount { | ||||
| 	out := make([]Mount, len(in)) | ||||
| 	copy(out, in) | ||||
| 	return out | ||||
| } | ||||
| 
 | ||||
| // WithReadonlyTempMount mounts the provided mounts to a temp dir as readonly,
 | ||||
| // and pass the temp dir to f. The mounts are valid during the call to the f.
 | ||||
| // Finally we will unmount and remove the temp dir regardless of the result of f.
 | ||||
|  |  | |||
|  | @ -27,7 +27,7 @@ import ( | |||
| 
 | ||||
| 	"github.com/containerd/containerd/containers" | ||||
| 	"github.com/containerd/containerd/namespaces" | ||||
| 	"github.com/containerd/containerd/platforms" | ||||
| 	"github.com/containerd/platforms" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
|  | @ -64,7 +64,7 @@ func ReadSpec(path string) (*Spec, error) { | |||
| // GenerateSpec will generate a default spec from the provided image
 | ||||
| // for use as a containerd container
 | ||||
| func GenerateSpec(ctx context.Context, client Client, c *containers.Container, opts ...SpecOpts) (*Spec, error) { | ||||
| 	return GenerateSpecWithPlatform(ctx, client, platforms.DefaultString(), c, opts...) | ||||
| 	return GenerateSpecWithPlatform(ctx, client, platforms.Format(platforms.DefaultSpec()), c, opts...) // For 1.7 continue using the old format without os-version included.
 | ||||
| } | ||||
| 
 | ||||
| // GenerateSpecWithPlatform will generate a default spec from the provided image
 | ||||
|  |  | |||
|  | @ -33,8 +33,8 @@ import ( | |||
| 	"github.com/containerd/containerd/images" | ||||
| 	"github.com/containerd/containerd/mount" | ||||
| 	"github.com/containerd/containerd/namespaces" | ||||
| 	"github.com/containerd/containerd/platforms" | ||||
| 	"github.com/containerd/continuity/fs" | ||||
| 	"github.com/containerd/platforms" | ||||
| 	"github.com/moby/sys/user" | ||||
| 	v1 "github.com/opencontainers/image-spec/specs-go/v1" | ||||
| 	"github.com/opencontainers/runtime-spec/specs-go" | ||||
|  | @ -138,7 +138,7 @@ func ensureAdditionalGids(s *Spec) { | |||
| // Use as the first option to clear the spec, then apply options afterwards.
 | ||||
| func WithDefaultSpec() SpecOpts { | ||||
| 	return func(ctx context.Context, _ Client, c *containers.Container, s *Spec) error { | ||||
| 		return generateDefaultSpecWithPlatform(ctx, platforms.DefaultString(), c.ID, s) | ||||
| 		return generateDefaultSpecWithPlatform(ctx, platforms.Format(platforms.DefaultSpec()), c.ID, s) // For 1.7 continue using the old format without os-version included.
 | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -35,11 +35,11 @@ import ( | |||
| 	"github.com/containerd/containerd/mount" | ||||
| 	"github.com/containerd/containerd/pkg/cleanup" | ||||
| 	"github.com/containerd/containerd/pkg/kmutex" | ||||
| 	"github.com/containerd/containerd/platforms" | ||||
| 	"github.com/containerd/containerd/snapshots" | ||||
| 	"github.com/containerd/containerd/tracing" | ||||
| 	"github.com/containerd/errdefs" | ||||
| 	"github.com/containerd/log" | ||||
| 	"github.com/containerd/platforms" | ||||
| 	"github.com/opencontainers/go-digest" | ||||
| 	"github.com/opencontainers/image-spec/identity" | ||||
| 	ocispec "github.com/opencontainers/image-spec/specs-go/v1" | ||||
|  |  | |||
							
								
								
									
										176
									
								
								vendor/github.com/containerd/containerd/platforms/platforms_deprecated.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							
							
						
						
									
										176
									
								
								vendor/github.com/containerd/containerd/platforms/platforms_deprecated.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							|  | @ -0,0 +1,176 @@ | |||
| /* | ||||
|    Copyright The containerd Authors. | ||||
| 
 | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
| 
 | ||||
|        http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| 
 | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
| */ | ||||
| 
 | ||||
| package platforms | ||||
| 
 | ||||
| import ( | ||||
| 	"github.com/containerd/platforms" | ||||
| 	specs "github.com/opencontainers/image-spec/specs-go/v1" | ||||
| ) | ||||
| 
 | ||||
| // Platform is a type alias for convenience, so there is no need to import image-spec package everywhere.
 | ||||
| //
 | ||||
| // Deprecated: use [specs.Platform].
 | ||||
| type Platform = specs.Platform | ||||
| 
 | ||||
| // DefaultSpec returns the current platform's default platform specification.
 | ||||
| //
 | ||||
| // Deprecated: use [platforms.DefaultSpec].
 | ||||
| func DefaultSpec() specs.Platform { | ||||
| 	return platforms.DefaultSpec() | ||||
| } | ||||
| 
 | ||||
| // Default returns the default matcher for the platform.
 | ||||
| //
 | ||||
| // Deprecated: use [platforms.Default].
 | ||||
| func Default() platforms.MatchComparer { | ||||
| 	return platforms.Default() | ||||
| } | ||||
| 
 | ||||
| // DefaultString returns the default string specifier for the platform.
 | ||||
| //
 | ||||
| // Deprecated: use [platforms.DefaultString].
 | ||||
| func DefaultString() string { | ||||
| 	return platforms.Format(platforms.DefaultSpec()) // For 1.7 continue using the old format without os-version included.
 | ||||
| } | ||||
| 
 | ||||
| // DefaultStrict returns strict form of Default.
 | ||||
| //
 | ||||
| // Deprecated: use [platforms.DefaultStrict].
 | ||||
| func DefaultStrict() MatchComparer { | ||||
| 	return platforms.DefaultStrict() | ||||
| } | ||||
| 
 | ||||
| // MatchComparer is able to match and compare platforms to
 | ||||
| // filter and sort platforms.
 | ||||
| //
 | ||||
| // Deprecated: use [platforms.MatchComparer].
 | ||||
| type MatchComparer = platforms.MatchComparer | ||||
| 
 | ||||
| // Matcher matches platforms specifications, provided by an image or runtime.
 | ||||
| //
 | ||||
| // Deprecated: use [platforms.Matcher].
 | ||||
| type Matcher = platforms.Matcher | ||||
| 
 | ||||
| // NewMatcher returns a simple matcher based on the provided platform
 | ||||
| // specification. The returned matcher only looks for equality based on os,
 | ||||
| // architecture and variant.
 | ||||
| //
 | ||||
| // One may implement their own matcher if this doesn't provide the required
 | ||||
| // functionality.
 | ||||
| //
 | ||||
| // Applications should opt to use `Match` over directly parsing specifiers.
 | ||||
| //
 | ||||
| // Deprecated: use [platforms.NewMatcher].
 | ||||
| func NewMatcher(platform specs.Platform) platforms.Matcher { | ||||
| 	return platforms.NewMatcher(platform) | ||||
| } | ||||
| 
 | ||||
| // Parse parses the platform specifier syntax into a platform declaration.
 | ||||
| //
 | ||||
| // Platform specifiers are in the format `<os>|<arch>|<os>/<arch>[/<variant>]`.
 | ||||
| // The minimum required information for a platform specifier is the operating
 | ||||
| // system or architecture. If there is only a single string (no slashes), the
 | ||||
| // value will be matched against the known set of operating systems, then fall
 | ||||
| // back to the known set of architectures. The missing component will be
 | ||||
| // inferred based on the local environment.
 | ||||
| //
 | ||||
| // Deprecated: use [platforms.Parse].
 | ||||
| func Parse(specifier string) (specs.Platform, error) { | ||||
| 	return platforms.Parse(specifier) | ||||
| } | ||||
| 
 | ||||
| // MustParse is like Parses but panics if the specifier cannot be parsed.
 | ||||
| // Simplifies initialization of global variables.
 | ||||
| //
 | ||||
| // Deprecated: use [platforms.MustParse].
 | ||||
| func MustParse(specifier string) specs.Platform { | ||||
| 	return platforms.MustParse(specifier) | ||||
| } | ||||
| 
 | ||||
| // Format returns a string specifier from the provided platform specification.
 | ||||
| //
 | ||||
| // Deprecated: use [platforms.Format].
 | ||||
| func Format(platform specs.Platform) string { | ||||
| 	return platforms.Format(platform) | ||||
| } | ||||
| 
 | ||||
| // Normalize validates and translate the platform to the canonical value.
 | ||||
| //
 | ||||
| // For example, if "Aarch64" is encountered, we change it to "arm64" or if
 | ||||
| // "x86_64" is encountered, it becomes "amd64".
 | ||||
| //
 | ||||
| // Deprecated: use [platforms.Normalize].
 | ||||
| func Normalize(platform specs.Platform) specs.Platform { | ||||
| 	return platforms.Normalize(platform) | ||||
| } | ||||
| 
 | ||||
| // Only returns a match comparer for a single platform
 | ||||
| // using default resolution logic for the platform.
 | ||||
| //
 | ||||
| // For arm/v8, will also match arm/v7, arm/v6 and arm/v5
 | ||||
| // For arm/v7, will also match arm/v6 and arm/v5
 | ||||
| // For arm/v6, will also match arm/v5
 | ||||
| // For amd64, will also match 386
 | ||||
| //
 | ||||
| // Deprecated: use [platforms.Only].
 | ||||
| func Only(platform specs.Platform) platforms.MatchComparer { | ||||
| 	return platforms.Only(platform) | ||||
| } | ||||
| 
 | ||||
| // OnlyStrict returns a match comparer for a single platform.
 | ||||
| //
 | ||||
| // Unlike Only, OnlyStrict does not match sub platforms.
 | ||||
| // So, "arm/vN" will not match "arm/vM" where M < N,
 | ||||
| // and "amd64" will not also match "386".
 | ||||
| //
 | ||||
| // OnlyStrict matches non-canonical forms.
 | ||||
| // So, "arm64" matches "arm/64/v8".
 | ||||
| //
 | ||||
| // Deprecated: use [platforms.OnlyStrict].
 | ||||
| func OnlyStrict(platform specs.Platform) platforms.MatchComparer { | ||||
| 	return platforms.OnlyStrict(platform) | ||||
| } | ||||
| 
 | ||||
| // Ordered returns a platform MatchComparer which matches any of the platforms
 | ||||
| // but orders them in order they are provided.
 | ||||
| //
 | ||||
| // Deprecated: use [platforms.Ordered].
 | ||||
| func Ordered(platform ...specs.Platform) platforms.MatchComparer { | ||||
| 	return platforms.Ordered(platform...) | ||||
| } | ||||
| 
 | ||||
| // Any returns a platform MatchComparer which matches any of the platforms
 | ||||
| // with no preference for ordering.
 | ||||
| //
 | ||||
| // Deprecated: use [platforms.Any].
 | ||||
| func Any(platform ...specs.Platform) platforms.MatchComparer { | ||||
| 	return platforms.Any(platform...) | ||||
| } | ||||
| 
 | ||||
| // All is a platform MatchComparer which matches all platforms
 | ||||
| // with preference for ordering.
 | ||||
| //
 | ||||
| // Deprecated: use [platforms.All].
 | ||||
| var All = platforms.All | ||||
| 
 | ||||
| // GetWindowsOsVersion returns the version of Windows of the local system,
 | ||||
| // it returns an empty string on other platforms.
 | ||||
| //
 | ||||
| // Deprecated: this function is deprecated, and removed in github.com/containerd/platforms
 | ||||
| func GetWindowsOsVersion() string { | ||||
| 	return getWindowsOsVersion() | ||||
| } | ||||
|  | @ -1,3 +1,5 @@ | |||
| //go:build !windows
 | ||||
| 
 | ||||
| /* | ||||
|    Copyright The containerd Authors. | ||||
| 
 | ||||
|  | @ -14,4 +16,8 @@ | |||
|    limitations under the License. | ||||
| */ | ||||
| 
 | ||||
| package plugin | ||||
| package platforms | ||||
| 
 | ||||
| func getWindowsOsVersion() string { | ||||
| 	return "" | ||||
| } | ||||
							
								
								
									
										49
									
								
								vendor/github.com/containerd/containerd/platforms/platforms_deprecated_windows.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							
							
						
						
									
										49
									
								
								vendor/github.com/containerd/containerd/platforms/platforms_deprecated_windows.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							|  | @ -0,0 +1,49 @@ | |||
| /* | ||||
|    Copyright The containerd Authors. | ||||
| 
 | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
| 
 | ||||
|        http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| 
 | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
| */ | ||||
| 
 | ||||
| package platforms | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/Microsoft/hcsshim/osversion" | ||||
| 	"golang.org/x/sys/windows" | ||||
| ) | ||||
| 
 | ||||
| func getWindowsOsVersion() string { | ||||
| 	major, minor, build := windows.RtlGetNtVersionNumbers() | ||||
| 	return fmt.Sprintf("%d.%d.%d", major, minor, build) | ||||
| } | ||||
| 
 | ||||
| // Deprecated: this function is deprecated, and removed in github.com/containerd/platforms
 | ||||
| func GetOsVersion(osVersionPrefix string) osversion.OSVersion { | ||||
| 	parts := strings.Split(osVersionPrefix, ".") | ||||
| 	if len(parts) < 3 { | ||||
| 		return osversion.OSVersion{} | ||||
| 	} | ||||
| 
 | ||||
| 	majorVersion, _ := strconv.Atoi(parts[0]) | ||||
| 	minorVersion, _ := strconv.Atoi(parts[1]) | ||||
| 	buildNumber, _ := strconv.Atoi(parts[2]) | ||||
| 
 | ||||
| 	return osversion.OSVersion{ | ||||
| 		MajorVersion: uint8(majorVersion), | ||||
| 		MinorVersion: uint8(minorVersion), | ||||
| 		Build:        uint16(buildNumber), | ||||
| 	} | ||||
| } | ||||
|  | @ -1,144 +0,0 @@ | |||
| // Protocol Buffers for Go with Gadgets
 | ||||
| //
 | ||||
| // Copyright (c) 2013, The GoGo Authors. All rights reserved.
 | ||||
| // http://github.com/gogo/protobuf
 | ||||
| //
 | ||||
| // Redistribution and use in source and binary forms, with or without
 | ||||
| // modification, are permitted provided that the following conditions are
 | ||||
| // met:
 | ||||
| //
 | ||||
| //     * Redistributions of source code must retain the above copyright
 | ||||
| // notice, this list of conditions and the following disclaimer.
 | ||||
| //     * Redistributions in binary form must reproduce the above
 | ||||
| // copyright notice, this list of conditions and the following disclaimer
 | ||||
| // in the documentation and/or other materials provided with the
 | ||||
| // distribution.
 | ||||
| //
 | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | ||||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | ||||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | ||||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | ||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | ||||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | ||||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | ||||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | ||||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | ||||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | ||||
| 
 | ||||
| // Code generated by protoc-gen-go. DO NOT EDIT.
 | ||||
| // versions:
 | ||||
| // 	protoc-gen-go v1.28.1
 | ||||
| // 	protoc        v3.20.1
 | ||||
| // source: github.com/containerd/containerd/protobuf/plugin/fieldpath.proto
 | ||||
| 
 | ||||
| package plugin | ||||
| 
 | ||||
| import ( | ||||
| 	protoreflect "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	protoimpl "google.golang.org/protobuf/runtime/protoimpl" | ||||
| 	descriptorpb "google.golang.org/protobuf/types/descriptorpb" | ||||
| 	reflect "reflect" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	// Verify that this generated code is sufficiently up-to-date.
 | ||||
| 	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) | ||||
| 	// Verify that runtime/protoimpl is sufficiently up-to-date.
 | ||||
| 	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) | ||||
| ) | ||||
| 
 | ||||
| var file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_extTypes = []protoimpl.ExtensionInfo{ | ||||
| 	{ | ||||
| 		ExtendedType:  (*descriptorpb.FileOptions)(nil), | ||||
| 		ExtensionType: (*bool)(nil), | ||||
| 		Field:         63300, | ||||
| 		Name:          "containerd.plugin.fieldpath_all", | ||||
| 		Tag:           "varint,63300,opt,name=fieldpath_all", | ||||
| 		Filename:      "github.com/containerd/containerd/protobuf/plugin/fieldpath.proto", | ||||
| 	}, | ||||
| 	{ | ||||
| 		ExtendedType:  (*descriptorpb.MessageOptions)(nil), | ||||
| 		ExtensionType: (*bool)(nil), | ||||
| 		Field:         64400, | ||||
| 		Name:          "containerd.plugin.fieldpath", | ||||
| 		Tag:           "varint,64400,opt,name=fieldpath", | ||||
| 		Filename:      "github.com/containerd/containerd/protobuf/plugin/fieldpath.proto", | ||||
| 	}, | ||||
| } | ||||
| 
 | ||||
| // Extension fields to descriptorpb.FileOptions.
 | ||||
| var ( | ||||
| 	// optional bool fieldpath_all = 63300;
 | ||||
| 	E_FieldpathAll = &file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_extTypes[0] | ||||
| ) | ||||
| 
 | ||||
| // Extension fields to descriptorpb.MessageOptions.
 | ||||
| var ( | ||||
| 	// optional bool fieldpath = 64400;
 | ||||
| 	E_Fieldpath = &file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_extTypes[1] | ||||
| ) | ||||
| 
 | ||||
| var File_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto protoreflect.FileDescriptor | ||||
| 
 | ||||
| var file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_rawDesc = []byte{ | ||||
| 	0x0a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, | ||||
| 	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, | ||||
| 	0x72, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x6c, 0x75, 0x67, | ||||
| 	0x69, 0x6e, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x72, 0x6f, | ||||
| 	0x74, 0x6f, 0x12, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x70, | ||||
| 	0x6c, 0x75, 0x67, 0x69, 0x6e, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, | ||||
| 	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, | ||||
| 	0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3a, 0x43, 0x0a, 0x0d, 0x66, 0x69, 0x65, 0x6c, 0x64, | ||||
| 	0x70, 0x61, 0x74, 0x68, 0x5f, 0x61, 0x6c, 0x6c, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, | ||||
| 	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, | ||||
| 	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xc4, 0xee, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, | ||||
| 	0x66, 0x69, 0x65, 0x6c, 0x64, 0x70, 0x61, 0x74, 0x68, 0x41, 0x6c, 0x6c, 0x3a, 0x3f, 0x0a, 0x09, | ||||
| 	0x66, 0x69, 0x65, 0x6c, 0x64, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, | ||||
| 	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, | ||||
| 	0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x90, 0xf7, 0x03, 0x20, 0x01, | ||||
| 	0x28, 0x08, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x70, 0x61, 0x74, 0x68, 0x42, 0x32, 0x5a, | ||||
| 	0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, | ||||
| 	0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, | ||||
| 	0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, | ||||
| 	0x6e, | ||||
| } | ||||
| 
 | ||||
| var file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_goTypes = []interface{}{ | ||||
| 	(*descriptorpb.FileOptions)(nil),    // 0: google.protobuf.FileOptions
 | ||||
| 	(*descriptorpb.MessageOptions)(nil), // 1: google.protobuf.MessageOptions
 | ||||
| } | ||||
| var file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_depIdxs = []int32{ | ||||
| 	0, // 0: containerd.plugin.fieldpath_all:extendee -> google.protobuf.FileOptions
 | ||||
| 	1, // 1: containerd.plugin.fieldpath:extendee -> google.protobuf.MessageOptions
 | ||||
| 	2, // [2:2] is the sub-list for method output_type
 | ||||
| 	2, // [2:2] is the sub-list for method input_type
 | ||||
| 	2, // [2:2] is the sub-list for extension type_name
 | ||||
| 	0, // [0:2] is the sub-list for extension extendee
 | ||||
| 	0, // [0:0] is the sub-list for field type_name
 | ||||
| } | ||||
| 
 | ||||
| func init() { file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_init() } | ||||
| func file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_init() { | ||||
| 	if File_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	type x struct{} | ||||
| 	out := protoimpl.TypeBuilder{ | ||||
| 		File: protoimpl.DescBuilder{ | ||||
| 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(), | ||||
| 			RawDescriptor: file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_rawDesc, | ||||
| 			NumEnums:      0, | ||||
| 			NumMessages:   0, | ||||
| 			NumExtensions: 2, | ||||
| 			NumServices:   0, | ||||
| 		}, | ||||
| 		GoTypes:           file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_goTypes, | ||||
| 		DependencyIndexes: file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_depIdxs, | ||||
| 		ExtensionInfos:    file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_extTypes, | ||||
| 	}.Build() | ||||
| 	File_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto = out.File | ||||
| 	file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_rawDesc = nil | ||||
| 	file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_goTypes = nil | ||||
| 	file_github_com_containerd_containerd_protobuf_plugin_fieldpath_proto_depIdxs = nil | ||||
| } | ||||
|  | @ -26,12 +26,12 @@ import ( | |||
| 
 | ||||
| 	"github.com/containerd/containerd/images" | ||||
| 	"github.com/containerd/containerd/pkg/unpack" | ||||
| 	"github.com/containerd/containerd/platforms" | ||||
| 	"github.com/containerd/containerd/remotes" | ||||
| 	"github.com/containerd/containerd/remotes/docker" | ||||
| 	"github.com/containerd/containerd/remotes/docker/schema1" //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility.
 | ||||
| 	"github.com/containerd/containerd/tracing" | ||||
| 	"github.com/containerd/errdefs" | ||||
| 	"github.com/containerd/platforms" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
|  |  | |||
|  | @ -1,58 +0,0 @@ | |||
| /* | ||||
|    Copyright The containerd Authors. | ||||
| 
 | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
| 
 | ||||
|        http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| 
 | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
| */ | ||||
| 
 | ||||
| package docker | ||||
| 
 | ||||
| import "path" | ||||
| 
 | ||||
| // IsNameOnly returns true if reference only contains a repo name.
 | ||||
| func IsNameOnly(ref Named) bool { | ||||
| 	if _, ok := ref.(NamedTagged); ok { | ||||
| 		return false | ||||
| 	} | ||||
| 	if _, ok := ref.(Canonical); ok { | ||||
| 		return false | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
| 
 | ||||
| // FamiliarName returns the familiar name string
 | ||||
| // for the given named, familiarizing if needed.
 | ||||
| func FamiliarName(ref Named) string { | ||||
| 	if nn, ok := ref.(normalizedNamed); ok { | ||||
| 		return nn.Familiar().Name() | ||||
| 	} | ||||
| 	return ref.Name() | ||||
| } | ||||
| 
 | ||||
| // FamiliarString returns the familiar string representation
 | ||||
| // for the given reference, familiarizing if needed.
 | ||||
| func FamiliarString(ref Reference) string { | ||||
| 	if nn, ok := ref.(normalizedNamed); ok { | ||||
| 		return nn.Familiar().String() | ||||
| 	} | ||||
| 	return ref.String() | ||||
| } | ||||
| 
 | ||||
| // FamiliarMatch reports whether ref matches the specified pattern.
 | ||||
| // See https://godoc.org/path#Match for supported patterns.
 | ||||
| func FamiliarMatch(pattern string, ref Reference) (bool, error) { | ||||
| 	matched, err := path.Match(pattern, FamiliarString(ref)) | ||||
| 	if namedRef, isNamed := ref.(Named); isNamed && !matched { | ||||
| 		matched, _ = path.Match(pattern, FamiliarName(namedRef)) | ||||
| 	} | ||||
| 	return matched, err | ||||
| } | ||||
|  | @ -1,196 +0,0 @@ | |||
| /* | ||||
|    Copyright The containerd Authors. | ||||
| 
 | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
| 
 | ||||
|        http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| 
 | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
| */ | ||||
| 
 | ||||
| package docker | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/opencontainers/go-digest" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	legacyDefaultDomain = "index.docker.io" | ||||
| 	defaultDomain       = "docker.io" | ||||
| 	officialRepoName    = "library" | ||||
| 	defaultTag          = "latest" | ||||
| ) | ||||
| 
 | ||||
| // normalizedNamed represents a name which has been
 | ||||
| // normalized and has a familiar form. A familiar name
 | ||||
| // is what is used in Docker UI. An example normalized
 | ||||
| // name is "docker.io/library/ubuntu" and corresponding
 | ||||
| // familiar name of "ubuntu".
 | ||||
| type normalizedNamed interface { | ||||
| 	Named | ||||
| 	Familiar() Named | ||||
| } | ||||
| 
 | ||||
| // ParseNormalizedNamed parses a string into a named reference
 | ||||
| // transforming a familiar name from Docker UI to a fully
 | ||||
| // qualified reference. If the value may be an identifier
 | ||||
| // use ParseAnyReference.
 | ||||
| func ParseNormalizedNamed(s string) (Named, error) { | ||||
| 	if ok := anchoredIdentifierRegexp.MatchString(s); ok { | ||||
| 		return nil, fmt.Errorf("invalid repository name (%s), cannot specify 64-byte hexadecimal strings", s) | ||||
| 	} | ||||
| 	domain, remainder := splitDockerDomain(s) | ||||
| 	var remoteName string | ||||
| 	if tagSep := strings.IndexRune(remainder, ':'); tagSep > -1 { | ||||
| 		remoteName = remainder[:tagSep] | ||||
| 	} else { | ||||
| 		remoteName = remainder | ||||
| 	} | ||||
| 	if strings.ToLower(remoteName) != remoteName { | ||||
| 		return nil, fmt.Errorf("invalid reference format: repository name (%s) must be lowercase", remoteName) | ||||
| 	} | ||||
| 
 | ||||
| 	ref, err := Parse(domain + "/" + remainder) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	named, isNamed := ref.(Named) | ||||
| 	if !isNamed { | ||||
| 		return nil, fmt.Errorf("reference %s has no name", ref.String()) | ||||
| 	} | ||||
| 	return named, nil | ||||
| } | ||||
| 
 | ||||
| // ParseDockerRef normalizes the image reference following the docker convention. This is added
 | ||||
| // mainly for backward compatibility.
 | ||||
| // The reference returned can only be either tagged or digested. For reference contains both tag
 | ||||
| // and digest, the function returns digested reference, e.g. docker.io/library/busybox:latest@
 | ||||
| // sha256:7cc4b5aefd1d0cadf8d97d4350462ba51c694ebca145b08d7d41b41acc8db5aa will be returned as
 | ||||
| // docker.io/library/busybox@sha256:7cc4b5aefd1d0cadf8d97d4350462ba51c694ebca145b08d7d41b41acc8db5aa.
 | ||||
| func ParseDockerRef(ref string) (Named, error) { | ||||
| 	named, err := ParseNormalizedNamed(ref) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if _, ok := named.(NamedTagged); ok { | ||||
| 		if canonical, ok := named.(Canonical); ok { | ||||
| 			// The reference is both tagged and digested, only
 | ||||
| 			// return digested.
 | ||||
| 			newNamed, err := WithName(canonical.Name()) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			newCanonical, err := WithDigest(newNamed, canonical.Digest()) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			return newCanonical, nil | ||||
| 		} | ||||
| 	} | ||||
| 	return TagNameOnly(named), nil | ||||
| } | ||||
| 
 | ||||
| // splitDockerDomain splits a repository name to domain and remotename string.
 | ||||
| // If no valid domain is found, the default domain is used. Repository name
 | ||||
| // needs to be already validated before.
 | ||||
| func splitDockerDomain(name string) (domain, remainder string) { | ||||
| 	i := strings.IndexRune(name, '/') | ||||
| 	if i == -1 || (!strings.ContainsAny(name[:i], ".:") && name[:i] != "localhost" && strings.ToLower(name[:i]) == name[:i]) { | ||||
| 		domain, remainder = defaultDomain, name | ||||
| 	} else { | ||||
| 		domain, remainder = name[:i], name[i+1:] | ||||
| 	} | ||||
| 	if domain == legacyDefaultDomain { | ||||
| 		domain = defaultDomain | ||||
| 	} | ||||
| 	if domain == defaultDomain && !strings.ContainsRune(remainder, '/') { | ||||
| 		remainder = officialRepoName + "/" + remainder | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // familiarizeName returns a shortened version of the name familiar
 | ||||
| // to the Docker UI. Familiar names have the default domain
 | ||||
| // "docker.io" and "library/" repository prefix removed.
 | ||||
| // For example, "docker.io/library/redis" will have the familiar
 | ||||
| // name "redis" and "docker.io/dmcgowan/myapp" will be "dmcgowan/myapp".
 | ||||
| // Returns a familiarized named only reference.
 | ||||
| func familiarizeName(named namedRepository) repository { | ||||
| 	repo := repository{ | ||||
| 		domain: named.Domain(), | ||||
| 		path:   named.Path(), | ||||
| 	} | ||||
| 
 | ||||
| 	if repo.domain == defaultDomain { | ||||
| 		repo.domain = "" | ||||
| 		// Handle official repositories which have the pattern "library/<official repo name>"
 | ||||
| 		if split := strings.Split(repo.path, "/"); len(split) == 2 && split[0] == officialRepoName { | ||||
| 			repo.path = split[1] | ||||
| 		} | ||||
| 	} | ||||
| 	return repo | ||||
| } | ||||
| 
 | ||||
| func (r reference) Familiar() Named { | ||||
| 	return reference{ | ||||
| 		namedRepository: familiarizeName(r.namedRepository), | ||||
| 		tag:             r.tag, | ||||
| 		digest:          r.digest, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (r repository) Familiar() Named { | ||||
| 	return familiarizeName(r) | ||||
| } | ||||
| 
 | ||||
| func (t taggedReference) Familiar() Named { | ||||
| 	return taggedReference{ | ||||
| 		namedRepository: familiarizeName(t.namedRepository), | ||||
| 		tag:             t.tag, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (c canonicalReference) Familiar() Named { | ||||
| 	return canonicalReference{ | ||||
| 		namedRepository: familiarizeName(c.namedRepository), | ||||
| 		digest:          c.digest, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // TagNameOnly adds the default tag "latest" to a reference if it only has
 | ||||
| // a repo name.
 | ||||
| func TagNameOnly(ref Named) Named { | ||||
| 	if IsNameOnly(ref) { | ||||
| 		namedTagged, err := WithTag(ref, defaultTag) | ||||
| 		if err != nil { | ||||
| 			// Default tag must be valid, to create a NamedTagged
 | ||||
| 			// type with non-validated input the WithTag function
 | ||||
| 			// should be used instead
 | ||||
| 			panic(err) | ||||
| 		} | ||||
| 		return namedTagged | ||||
| 	} | ||||
| 	return ref | ||||
| } | ||||
| 
 | ||||
| // ParseAnyReference parses a reference string as a possible identifier,
 | ||||
| // full digest, or familiar name.
 | ||||
| func ParseAnyReference(ref string) (Reference, error) { | ||||
| 	if ok := anchoredIdentifierRegexp.MatchString(ref); ok { | ||||
| 		return digestReference("sha256:" + ref), nil | ||||
| 	} | ||||
| 	if dgst, err := digest.Parse(ref); err == nil { | ||||
| 		return digestReference(dgst), nil | ||||
| 	} | ||||
| 
 | ||||
| 	return ParseNormalizedNamed(ref) | ||||
| } | ||||
|  | @ -1,453 +0,0 @@ | |||
| /* | ||||
|    Copyright The containerd Authors. | ||||
| 
 | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
| 
 | ||||
|        http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| 
 | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
| */ | ||||
| 
 | ||||
| // Package docker provides a general type to represent any way of referencing images within the registry.
 | ||||
| // Its main purpose is to abstract tags and digests (content-addressable hash).
 | ||||
| //
 | ||||
| // Grammar
 | ||||
| //
 | ||||
| //	reference                       := name [ ":" tag ] [ "@" digest ]
 | ||||
| //	name                            := [domain '/'] path-component ['/' path-component]*
 | ||||
| //	domain                          := host [':' port-number]
 | ||||
| //	host                            := domain-name | IPv4address | \[ IPv6address \]	; rfc3986 appendix-A
 | ||||
| //	domain-name                     := domain-component ['.' domain-component]*
 | ||||
| //	domain-component                := /([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])/
 | ||||
| //	port-number                     := /[0-9]+/
 | ||||
| //	path-component                  := alpha-numeric [separator alpha-numeric]*
 | ||||
| //	alpha-numeric                   := /[a-z0-9]+/
 | ||||
| //	separator                       := /[_.]|__|[-]*/
 | ||||
| //
 | ||||
| //	tag                             := /[\w][\w.-]{0,127}/
 | ||||
| //
 | ||||
| //	digest                          := digest-algorithm ":" digest-hex
 | ||||
| //	digest-algorithm                := digest-algorithm-component [ digest-algorithm-separator digest-algorithm-component ]*
 | ||||
| //	digest-algorithm-separator      := /[+.-_]/
 | ||||
| //	digest-algorithm-component      := /[A-Za-z][A-Za-z0-9]*/
 | ||||
| //	digest-hex                      := /[0-9a-fA-F]{32,}/ ; At least 128 bit digest value
 | ||||
| //
 | ||||
| //	identifier                      := /[a-f0-9]{64}/
 | ||||
| //	short-identifier                := /[a-f0-9]{6,64}/
 | ||||
| package docker | ||||
| 
 | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/opencontainers/go-digest" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	// NameTotalLengthMax is the maximum total number of characters in a repository name.
 | ||||
| 	NameTotalLengthMax = 255 | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	// ErrReferenceInvalidFormat represents an error while trying to parse a string as a reference.
 | ||||
| 	ErrReferenceInvalidFormat = errors.New("invalid reference format") | ||||
| 
 | ||||
| 	// ErrTagInvalidFormat represents an error while trying to parse a string as a tag.
 | ||||
| 	ErrTagInvalidFormat = errors.New("invalid tag format") | ||||
| 
 | ||||
| 	// ErrDigestInvalidFormat represents an error while trying to parse a string as a tag.
 | ||||
| 	ErrDigestInvalidFormat = errors.New("invalid digest format") | ||||
| 
 | ||||
| 	// ErrNameContainsUppercase is returned for invalid repository names that contain uppercase characters.
 | ||||
| 	ErrNameContainsUppercase = errors.New("repository name must be lowercase") | ||||
| 
 | ||||
| 	// ErrNameEmpty is returned for empty, invalid repository names.
 | ||||
| 	ErrNameEmpty = errors.New("repository name must have at least one component") | ||||
| 
 | ||||
| 	// ErrNameTooLong is returned when a repository name is longer than NameTotalLengthMax.
 | ||||
| 	ErrNameTooLong = fmt.Errorf("repository name must not be more than %v characters", NameTotalLengthMax) | ||||
| 
 | ||||
| 	// ErrNameNotCanonical is returned when a name is not canonical.
 | ||||
| 	ErrNameNotCanonical = errors.New("repository name must be canonical") | ||||
| ) | ||||
| 
 | ||||
| // Reference is an opaque object reference identifier that may include
 | ||||
| // modifiers such as a hostname, name, tag, and digest.
 | ||||
| type Reference interface { | ||||
| 	// String returns the full reference
 | ||||
| 	String() string | ||||
| } | ||||
| 
 | ||||
| // Field provides a wrapper type for resolving correct reference types when
 | ||||
| // working with encoding.
 | ||||
| type Field struct { | ||||
| 	reference Reference | ||||
| } | ||||
| 
 | ||||
| // AsField wraps a reference in a Field for encoding.
 | ||||
| func AsField(reference Reference) Field { | ||||
| 	return Field{reference} | ||||
| } | ||||
| 
 | ||||
| // Reference unwraps the reference type from the field to
 | ||||
| // return the Reference object. This object should be
 | ||||
| // of the appropriate type to further check for different
 | ||||
| // reference types.
 | ||||
| func (f Field) Reference() Reference { | ||||
| 	return f.reference | ||||
| } | ||||
| 
 | ||||
| // MarshalText serializes the field to byte text which
 | ||||
| // is the string of the reference.
 | ||||
| func (f Field) MarshalText() (p []byte, err error) { | ||||
| 	return []byte(f.reference.String()), nil | ||||
| } | ||||
| 
 | ||||
| // UnmarshalText parses text bytes by invoking the
 | ||||
| // reference parser to ensure the appropriately
 | ||||
| // typed reference object is wrapped by field.
 | ||||
| func (f *Field) UnmarshalText(p []byte) error { | ||||
| 	r, err := Parse(string(p)) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	f.reference = r | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // Named is an object with a full name
 | ||||
| type Named interface { | ||||
| 	Reference | ||||
| 	Name() string | ||||
| } | ||||
| 
 | ||||
| // Tagged is an object which has a tag
 | ||||
| type Tagged interface { | ||||
| 	Reference | ||||
| 	Tag() string | ||||
| } | ||||
| 
 | ||||
| // NamedTagged is an object including a name and tag.
 | ||||
| type NamedTagged interface { | ||||
| 	Named | ||||
| 	Tag() string | ||||
| } | ||||
| 
 | ||||
| // Digested is an object which has a digest
 | ||||
| // in which it can be referenced by
 | ||||
| type Digested interface { | ||||
| 	Reference | ||||
| 	Digest() digest.Digest | ||||
| } | ||||
| 
 | ||||
| // Canonical reference is an object with a fully unique
 | ||||
| // name including a name with domain and digest
 | ||||
| type Canonical interface { | ||||
| 	Named | ||||
| 	Digest() digest.Digest | ||||
| } | ||||
| 
 | ||||
| // namedRepository is a reference to a repository with a name.
 | ||||
| // A namedRepository has both domain and path components.
 | ||||
| type namedRepository interface { | ||||
| 	Named | ||||
| 	Domain() string | ||||
| 	Path() string | ||||
| } | ||||
| 
 | ||||
| // Domain returns the domain part of the Named reference
 | ||||
| func Domain(named Named) string { | ||||
| 	if r, ok := named.(namedRepository); ok { | ||||
| 		return r.Domain() | ||||
| 	} | ||||
| 	domain, _ := splitDomain(named.Name()) | ||||
| 	return domain | ||||
| } | ||||
| 
 | ||||
| // Path returns the name without the domain part of the Named reference
 | ||||
| func Path(named Named) (name string) { | ||||
| 	if r, ok := named.(namedRepository); ok { | ||||
| 		return r.Path() | ||||
| 	} | ||||
| 	_, path := splitDomain(named.Name()) | ||||
| 	return path | ||||
| } | ||||
| 
 | ||||
| func splitDomain(name string) (string, string) { | ||||
| 	match := anchoredNameRegexp.FindStringSubmatch(name) | ||||
| 	if len(match) != 3 { | ||||
| 		return "", name | ||||
| 	} | ||||
| 	return match[1], match[2] | ||||
| } | ||||
| 
 | ||||
| // SplitHostname splits a named reference into a
 | ||||
| // hostname and name string. If no valid hostname is
 | ||||
| // found, the hostname is empty and the full value
 | ||||
| // is returned as name
 | ||||
| // DEPRECATED: Use Domain or Path
 | ||||
| func SplitHostname(named Named) (string, string) { | ||||
| 	if r, ok := named.(namedRepository); ok { | ||||
| 		return r.Domain(), r.Path() | ||||
| 	} | ||||
| 	return splitDomain(named.Name()) | ||||
| } | ||||
| 
 | ||||
| // Parse parses s and returns a syntactically valid Reference.
 | ||||
| // If an error was encountered it is returned, along with a nil Reference.
 | ||||
| // NOTE: Parse will not handle short digests.
 | ||||
| func Parse(s string) (Reference, error) { | ||||
| 	matches := ReferenceRegexp.FindStringSubmatch(s) | ||||
| 	if matches == nil { | ||||
| 		if s == "" { | ||||
| 			return nil, ErrNameEmpty | ||||
| 		} | ||||
| 		if ReferenceRegexp.FindStringSubmatch(strings.ToLower(s)) != nil { | ||||
| 			return nil, ErrNameContainsUppercase | ||||
| 		} | ||||
| 		return nil, ErrReferenceInvalidFormat | ||||
| 	} | ||||
| 
 | ||||
| 	if len(matches[1]) > NameTotalLengthMax { | ||||
| 		return nil, ErrNameTooLong | ||||
| 	} | ||||
| 
 | ||||
| 	var repo repository | ||||
| 
 | ||||
| 	nameMatch := anchoredNameRegexp.FindStringSubmatch(matches[1]) | ||||
| 	if len(nameMatch) == 3 { | ||||
| 		repo.domain = nameMatch[1] | ||||
| 		repo.path = nameMatch[2] | ||||
| 	} else { | ||||
| 		repo.domain = "" | ||||
| 		repo.path = matches[1] | ||||
| 	} | ||||
| 
 | ||||
| 	ref := reference{ | ||||
| 		namedRepository: repo, | ||||
| 		tag:             matches[2], | ||||
| 	} | ||||
| 	if matches[3] != "" { | ||||
| 		var err error | ||||
| 		ref.digest, err = digest.Parse(matches[3]) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	r := getBestReferenceType(ref) | ||||
| 	if r == nil { | ||||
| 		return nil, ErrNameEmpty | ||||
| 	} | ||||
| 
 | ||||
| 	return r, nil | ||||
| } | ||||
| 
 | ||||
| // ParseNamed parses s and returns a syntactically valid reference implementing
 | ||||
| // the Named interface. The reference must have a name and be in the canonical
 | ||||
| // form, otherwise an error is returned.
 | ||||
| // If an error was encountered it is returned, along with a nil Reference.
 | ||||
| // NOTE: ParseNamed will not handle short digests.
 | ||||
| func ParseNamed(s string) (Named, error) { | ||||
| 	named, err := ParseNormalizedNamed(s) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if named.String() != s { | ||||
| 		return nil, ErrNameNotCanonical | ||||
| 	} | ||||
| 	return named, nil | ||||
| } | ||||
| 
 | ||||
| // WithName returns a named object representing the given string. If the input
 | ||||
| // is invalid ErrReferenceInvalidFormat will be returned.
 | ||||
| func WithName(name string) (Named, error) { | ||||
| 	if len(name) > NameTotalLengthMax { | ||||
| 		return nil, ErrNameTooLong | ||||
| 	} | ||||
| 
 | ||||
| 	match := anchoredNameRegexp.FindStringSubmatch(name) | ||||
| 	if match == nil || len(match) != 3 { | ||||
| 		return nil, ErrReferenceInvalidFormat | ||||
| 	} | ||||
| 	return repository{ | ||||
| 		domain: match[1], | ||||
| 		path:   match[2], | ||||
| 	}, nil | ||||
| } | ||||
| 
 | ||||
| // WithTag combines the name from "name" and the tag from "tag" to form a
 | ||||
| // reference incorporating both the name and the tag.
 | ||||
| func WithTag(name Named, tag string) (NamedTagged, error) { | ||||
| 	if !anchoredTagRegexp.MatchString(tag) { | ||||
| 		return nil, ErrTagInvalidFormat | ||||
| 	} | ||||
| 	var repo repository | ||||
| 	if r, ok := name.(namedRepository); ok { | ||||
| 		repo.domain = r.Domain() | ||||
| 		repo.path = r.Path() | ||||
| 	} else { | ||||
| 		repo.path = name.Name() | ||||
| 	} | ||||
| 	if canonical, ok := name.(Canonical); ok { | ||||
| 		return reference{ | ||||
| 			namedRepository: repo, | ||||
| 			tag:             tag, | ||||
| 			digest:          canonical.Digest(), | ||||
| 		}, nil | ||||
| 	} | ||||
| 	return taggedReference{ | ||||
| 		namedRepository: repo, | ||||
| 		tag:             tag, | ||||
| 	}, nil | ||||
| } | ||||
| 
 | ||||
| // WithDigest combines the name from "name" and the digest from "digest" to form
 | ||||
| // a reference incorporating both the name and the digest.
 | ||||
| func WithDigest(name Named, digest digest.Digest) (Canonical, error) { | ||||
| 	if !anchoredDigestRegexp.MatchString(digest.String()) { | ||||
| 		return nil, ErrDigestInvalidFormat | ||||
| 	} | ||||
| 	var repo repository | ||||
| 	if r, ok := name.(namedRepository); ok { | ||||
| 		repo.domain = r.Domain() | ||||
| 		repo.path = r.Path() | ||||
| 	} else { | ||||
| 		repo.path = name.Name() | ||||
| 	} | ||||
| 	if tagged, ok := name.(Tagged); ok { | ||||
| 		return reference{ | ||||
| 			namedRepository: repo, | ||||
| 			tag:             tagged.Tag(), | ||||
| 			digest:          digest, | ||||
| 		}, nil | ||||
| 	} | ||||
| 	return canonicalReference{ | ||||
| 		namedRepository: repo, | ||||
| 		digest:          digest, | ||||
| 	}, nil | ||||
| } | ||||
| 
 | ||||
| // TrimNamed removes any tag or digest from the named reference.
 | ||||
| func TrimNamed(ref Named) Named { | ||||
| 	repo := repository{} | ||||
| 	if r, ok := ref.(namedRepository); ok { | ||||
| 		repo.domain, repo.path = r.Domain(), r.Path() | ||||
| 	} else { | ||||
| 		repo.domain, repo.path = splitDomain(ref.Name()) | ||||
| 	} | ||||
| 	return repo | ||||
| } | ||||
| 
 | ||||
| func getBestReferenceType(ref reference) Reference { | ||||
| 	if ref.Name() == "" { | ||||
| 		// Allow digest only references
 | ||||
| 		if ref.digest != "" { | ||||
| 			return digestReference(ref.digest) | ||||
| 		} | ||||
| 		return nil | ||||
| 	} | ||||
| 	if ref.tag == "" { | ||||
| 		if ref.digest != "" { | ||||
| 			return canonicalReference{ | ||||
| 				namedRepository: ref.namedRepository, | ||||
| 				digest:          ref.digest, | ||||
| 			} | ||||
| 		} | ||||
| 		return ref.namedRepository | ||||
| 	} | ||||
| 	if ref.digest == "" { | ||||
| 		return taggedReference{ | ||||
| 			namedRepository: ref.namedRepository, | ||||
| 			tag:             ref.tag, | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return ref | ||||
| } | ||||
| 
 | ||||
| type reference struct { | ||||
| 	namedRepository | ||||
| 	tag    string | ||||
| 	digest digest.Digest | ||||
| } | ||||
| 
 | ||||
| func (r reference) String() string { | ||||
| 	return r.Name() + ":" + r.tag + "@" + r.digest.String() | ||||
| } | ||||
| 
 | ||||
| func (r reference) Tag() string { | ||||
| 	return r.tag | ||||
| } | ||||
| 
 | ||||
| func (r reference) Digest() digest.Digest { | ||||
| 	return r.digest | ||||
| } | ||||
| 
 | ||||
| type repository struct { | ||||
| 	domain string | ||||
| 	path   string | ||||
| } | ||||
| 
 | ||||
| func (r repository) String() string { | ||||
| 	return r.Name() | ||||
| } | ||||
| 
 | ||||
| func (r repository) Name() string { | ||||
| 	if r.domain == "" { | ||||
| 		return r.path | ||||
| 	} | ||||
| 	return r.domain + "/" + r.path | ||||
| } | ||||
| 
 | ||||
| func (r repository) Domain() string { | ||||
| 	return r.domain | ||||
| } | ||||
| 
 | ||||
| func (r repository) Path() string { | ||||
| 	return r.path | ||||
| } | ||||
| 
 | ||||
| type digestReference digest.Digest | ||||
| 
 | ||||
| func (d digestReference) String() string { | ||||
| 	return digest.Digest(d).String() | ||||
| } | ||||
| 
 | ||||
| func (d digestReference) Digest() digest.Digest { | ||||
| 	return digest.Digest(d) | ||||
| } | ||||
| 
 | ||||
| type taggedReference struct { | ||||
| 	namedRepository | ||||
| 	tag string | ||||
| } | ||||
| 
 | ||||
| func (t taggedReference) String() string { | ||||
| 	return t.Name() + ":" + t.tag | ||||
| } | ||||
| 
 | ||||
| func (t taggedReference) Tag() string { | ||||
| 	return t.tag | ||||
| } | ||||
| 
 | ||||
| type canonicalReference struct { | ||||
| 	namedRepository | ||||
| 	digest digest.Digest | ||||
| } | ||||
| 
 | ||||
| func (c canonicalReference) String() string { | ||||
| 	return c.Name() + "@" + c.digest.String() | ||||
| } | ||||
| 
 | ||||
| func (c canonicalReference) Digest() digest.Digest { | ||||
| 	return c.digest | ||||
| } | ||||
|  | @ -1,191 +0,0 @@ | |||
| /* | ||||
|    Copyright The containerd Authors. | ||||
| 
 | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
| 
 | ||||
|        http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| 
 | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
| */ | ||||
| 
 | ||||
| package docker | ||||
| 
 | ||||
| import "regexp" | ||||
| 
 | ||||
| var ( | ||||
| 	// alphaNumeric defines the alpha numeric atom, typically a
 | ||||
| 	// component of names. This only allows lower case characters and digits.
 | ||||
| 	alphaNumeric = `[a-z0-9]+` | ||||
| 
 | ||||
| 	// separator defines the separators allowed to be embedded in name
 | ||||
| 	// components. This allow one period, one or two underscore and multiple
 | ||||
| 	// dashes. Repeated dashes and underscores are intentionally treated
 | ||||
| 	// differently. In order to support valid hostnames as name components,
 | ||||
| 	// supporting repeated dash was added. Additionally double underscore is
 | ||||
| 	// now allowed as a separator to loosen the restriction for previously
 | ||||
| 	// supported names.
 | ||||
| 	separator = `(?:[._]|__|[-]*)` | ||||
| 
 | ||||
| 	// nameComponent restricts registry path component names to start
 | ||||
| 	// with at least one letter or number, with following parts able to be
 | ||||
| 	// separated by one period, one or two underscore and multiple dashes.
 | ||||
| 	nameComponent = expression( | ||||
| 		alphaNumeric, | ||||
| 		optional(repeated(separator, alphaNumeric))) | ||||
| 
 | ||||
| 	// domainNameComponent restricts the registry domain component of a
 | ||||
| 	// repository name to start with a component as defined by DomainRegexp.
 | ||||
| 	domainNameComponent = `(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])` | ||||
| 
 | ||||
| 	// ipv6address are enclosed between square brackets and may be represented
 | ||||
| 	// in many ways, see rfc5952. Only IPv6 in compressed or uncompressed format
 | ||||
| 	// are allowed, IPv6 zone identifiers (rfc6874) or Special addresses such as
 | ||||
| 	// IPv4-Mapped are deliberately excluded.
 | ||||
| 	ipv6address = expression( | ||||
| 		literal(`[`), `(?:[a-fA-F0-9:]+)`, literal(`]`), | ||||
| 	) | ||||
| 
 | ||||
| 	// domainName defines the structure of potential domain components
 | ||||
| 	// that may be part of image names. This is purposely a subset of what is
 | ||||
| 	// allowed by DNS to ensure backwards compatibility with Docker image
 | ||||
| 	// names. This includes IPv4 addresses on decimal format.
 | ||||
| 	domainName = expression( | ||||
| 		domainNameComponent, | ||||
| 		optional(repeated(literal(`.`), domainNameComponent)), | ||||
| 	) | ||||
| 
 | ||||
| 	// host defines the structure of potential domains based on the URI
 | ||||
| 	// Host subcomponent on rfc3986. It may be a subset of DNS domain name,
 | ||||
| 	// or an IPv4 address in decimal format, or an IPv6 address between square
 | ||||
| 	// brackets (excluding zone identifiers as defined by rfc6874 or special
 | ||||
| 	// addresses such as IPv4-Mapped).
 | ||||
| 	host = `(?:` + domainName + `|` + ipv6address + `)` | ||||
| 
 | ||||
| 	// allowed by the URI Host subcomponent on rfc3986 to ensure backwards
 | ||||
| 	// compatibility with Docker image names.
 | ||||
| 	domain = expression( | ||||
| 		host, | ||||
| 		optional(literal(`:`), `[0-9]+`)) | ||||
| 
 | ||||
| 	// DomainRegexp defines the structure of potential domain components
 | ||||
| 	// that may be part of image names. This is purposely a subset of what is
 | ||||
| 	// allowed by DNS to ensure backwards compatibility with Docker image
 | ||||
| 	// names.
 | ||||
| 	DomainRegexp = regexp.MustCompile(domain) | ||||
| 
 | ||||
| 	tag = `[\w][\w.-]{0,127}` | ||||
| 	// TagRegexp matches valid tag names. From docker/docker:graph/tags.go.
 | ||||
| 	TagRegexp = regexp.MustCompile(tag) | ||||
| 
 | ||||
| 	anchoredTag = anchored(tag) | ||||
| 	// anchoredTagRegexp matches valid tag names, anchored at the start and
 | ||||
| 	// end of the matched string.
 | ||||
| 	anchoredTagRegexp = regexp.MustCompile(anchoredTag) | ||||
| 
 | ||||
| 	digestPat = `[A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}` | ||||
| 	// DigestRegexp matches valid digests.
 | ||||
| 	DigestRegexp = regexp.MustCompile(digestPat) | ||||
| 
 | ||||
| 	anchoredDigest = anchored(digestPat) | ||||
| 	// anchoredDigestRegexp matches valid digests, anchored at the start and
 | ||||
| 	// end of the matched string.
 | ||||
| 	anchoredDigestRegexp = regexp.MustCompile(anchoredDigest) | ||||
| 
 | ||||
| 	namePat = expression( | ||||
| 		optional(domain, literal(`/`)), | ||||
| 		nameComponent, | ||||
| 		optional(repeated(literal(`/`), nameComponent))) | ||||
| 	// NameRegexp is the format for the name component of references. The
 | ||||
| 	// regexp has capturing groups for the domain and name part omitting
 | ||||
| 	// the separating forward slash from either.
 | ||||
| 	NameRegexp = regexp.MustCompile(namePat) | ||||
| 
 | ||||
| 	anchoredName = anchored( | ||||
| 		optional(capture(domain), literal(`/`)), | ||||
| 		capture(nameComponent, | ||||
| 			optional(repeated(literal(`/`), nameComponent)))) | ||||
| 	// anchoredNameRegexp is used to parse a name value, capturing the
 | ||||
| 	// domain and trailing components.
 | ||||
| 	anchoredNameRegexp = regexp.MustCompile(anchoredName) | ||||
| 
 | ||||
| 	referencePat = anchored(capture(namePat), | ||||
| 		optional(literal(":"), capture(tag)), | ||||
| 		optional(literal("@"), capture(digestPat))) | ||||
| 	// ReferenceRegexp is the full supported format of a reference. The regexp
 | ||||
| 	// is anchored and has capturing groups for name, tag, and digest
 | ||||
| 	// components.
 | ||||
| 	ReferenceRegexp = regexp.MustCompile(referencePat) | ||||
| 
 | ||||
| 	identifier = `([a-f0-9]{64})` | ||||
| 	// IdentifierRegexp is the format for string identifier used as a
 | ||||
| 	// content addressable identifier using sha256. These identifiers
 | ||||
| 	// are like digests without the algorithm, since sha256 is used.
 | ||||
| 	IdentifierRegexp = regexp.MustCompile(identifier) | ||||
| 
 | ||||
| 	shortIdentifier = `([a-f0-9]{6,64})` | ||||
| 	// ShortIdentifierRegexp is the format used to represent a prefix
 | ||||
| 	// of an identifier. A prefix may be used to match a sha256 identifier
 | ||||
| 	// within a list of trusted identifiers.
 | ||||
| 	ShortIdentifierRegexp = regexp.MustCompile(shortIdentifier) | ||||
| 
 | ||||
| 	anchoredIdentifier = anchored(identifier) | ||||
| 	// anchoredIdentifierRegexp is used to check or match an
 | ||||
| 	// identifier value, anchored at start and end of string.
 | ||||
| 	anchoredIdentifierRegexp = regexp.MustCompile(anchoredIdentifier) | ||||
| ) | ||||
| 
 | ||||
| // literal compiles s into a literal regular expression, escaping any regexp
 | ||||
| // reserved characters.
 | ||||
| func literal(s string) string { | ||||
| 	re := regexp.MustCompile(regexp.QuoteMeta(s)) | ||||
| 
 | ||||
| 	if _, complete := re.LiteralPrefix(); !complete { | ||||
| 		panic("must be a literal") | ||||
| 	} | ||||
| 
 | ||||
| 	return re.String() | ||||
| } | ||||
| 
 | ||||
| // expression defines a full expression, where each regular expression must
 | ||||
| // follow the previous.
 | ||||
| func expression(res ...string) string { | ||||
| 	var s string | ||||
| 	for _, re := range res { | ||||
| 		s += re | ||||
| 	} | ||||
| 
 | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // optional wraps the expression in a non-capturing group and makes the
 | ||||
| // production optional.
 | ||||
| func optional(res ...string) string { | ||||
| 	return group(expression(res...)) + `?` | ||||
| } | ||||
| 
 | ||||
| // repeated wraps the regexp in a non-capturing group to get one or more
 | ||||
| // matches.
 | ||||
| func repeated(res ...string) string { | ||||
| 	return group(expression(res...)) + `+` | ||||
| } | ||||
| 
 | ||||
| // group wraps the regexp in a non-capturing group.
 | ||||
| func group(res ...string) string { | ||||
| 	return `(?:` + expression(res...) + `)` | ||||
| } | ||||
| 
 | ||||
| // capture wraps the expression in a capturing group.
 | ||||
| func capture(res ...string) string { | ||||
| 	return `(` + expression(res...) + `)` | ||||
| } | ||||
| 
 | ||||
| // anchored anchors the regular expression by adding start and end delimiters.
 | ||||
| func anchored(res ...string) string { | ||||
| 	return `^` + expression(res...) + `$` | ||||
| } | ||||
|  | @ -1,73 +0,0 @@ | |||
| /* | ||||
|    Copyright The containerd Authors. | ||||
| 
 | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
| 
 | ||||
|        http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| 
 | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
| */ | ||||
| 
 | ||||
| package docker | ||||
| 
 | ||||
| import ( | ||||
| 	"sort" | ||||
| ) | ||||
| 
 | ||||
| // Sort sorts string references preferring higher information references
 | ||||
| // The precedence is as follows:
 | ||||
| // 1. Name + Tag + Digest
 | ||||
| // 2. Name + Tag
 | ||||
| // 3. Name + Digest
 | ||||
| // 4. Name
 | ||||
| // 5. Digest
 | ||||
| // 6. Parse error
 | ||||
| func Sort(references []string) []string { | ||||
| 	var prefs []Reference | ||||
| 	var bad []string | ||||
| 
 | ||||
| 	for _, ref := range references { | ||||
| 		pref, err := ParseAnyReference(ref) | ||||
| 		if err != nil { | ||||
| 			bad = append(bad, ref) | ||||
| 		} else { | ||||
| 			prefs = append(prefs, pref) | ||||
| 		} | ||||
| 	} | ||||
| 	sort.Slice(prefs, func(a, b int) bool { | ||||
| 		ar := refRank(prefs[a]) | ||||
| 		br := refRank(prefs[b]) | ||||
| 		if ar == br { | ||||
| 			return prefs[a].String() < prefs[b].String() | ||||
| 		} | ||||
| 		return ar < br | ||||
| 	}) | ||||
| 	sort.Strings(bad) | ||||
| 	var refs []string | ||||
| 	for _, pref := range prefs { | ||||
| 		refs = append(refs, pref.String()) | ||||
| 	} | ||||
| 	return append(refs, bad...) | ||||
| } | ||||
| 
 | ||||
| func refRank(ref Reference) uint8 { | ||||
| 	if _, ok := ref.(Named); ok { | ||||
| 		if _, ok = ref.(Tagged); ok { | ||||
| 			if _, ok = ref.(Digested); ok { | ||||
| 				return 1 | ||||
| 			} | ||||
| 			return 2 | ||||
| 		} | ||||
| 		if _, ok = ref.(Digested); ok { | ||||
| 			return 3 | ||||
| 		} | ||||
| 		return 4 | ||||
| 	} | ||||
| 	return 5 | ||||
| } | ||||
|  | @ -18,7 +18,6 @@ package reference | |||
| 
 | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"net/url" | ||||
| 	"path" | ||||
| 	"regexp" | ||||
|  | @ -136,8 +135,12 @@ func (r Spec) Hostname() string { | |||
| // Digest returns the digest portion of the reference spec. This may be a
 | ||||
| // partial or invalid digest, which may be used to lookup a complete digest.
 | ||||
| func (r Spec) Digest() digest.Digest { | ||||
| 	_, dgst := SplitObject(r.Object) | ||||
| 	return dgst | ||||
| 	i := strings.Index(r.Object, "@") | ||||
| 
 | ||||
| 	if i < 0 { | ||||
| 		return "" | ||||
| 	} | ||||
| 	return digest.Digest(r.Object[i+1:]) | ||||
| } | ||||
| 
 | ||||
| // String returns the normalized string for the ref.
 | ||||
|  | @ -146,21 +149,31 @@ func (r Spec) String() string { | |||
| 		return r.Locator | ||||
| 	} | ||||
| 	if r.Object[:1] == "@" { | ||||
| 		return fmt.Sprintf("%v%v", r.Locator, r.Object) | ||||
| 		return r.Locator + r.Object | ||||
| 	} | ||||
| 
 | ||||
| 	return fmt.Sprintf("%v:%v", r.Locator, r.Object) | ||||
| 	return r.Locator + ":" + r.Object | ||||
| } | ||||
| 
 | ||||
| // SplitObject provides two parts of the object spec, delimited by an `@`
 | ||||
| // symbol.
 | ||||
| // SplitObject provides two parts of the object spec, delimited by an "@"
 | ||||
| // symbol. It does not perform any validation on correctness of the values
 | ||||
| // returned, and it's the callers' responsibility to validate the result.
 | ||||
| //
 | ||||
| // Either may be empty and it is the callers job to validate them
 | ||||
| // appropriately.
 | ||||
| // If an "@" delimiter is found, it returns the part *including* the "@"
 | ||||
| // delimiter as "tag", and the part after the "@" as digest.
 | ||||
| //
 | ||||
| // The example below produces "docker.io/library/ubuntu:latest@" and
 | ||||
| // "sha256:deadbeef";
 | ||||
| //
 | ||||
| //	t, d := SplitObject("docker.io/library/ubuntu:latest@sha256:deadbeef")
 | ||||
| //	fmt.Println(t) // docker.io/library/ubuntu:latest@
 | ||||
| //	fmt.Println(d) // sha256:deadbeef
 | ||||
| //
 | ||||
| // Deprecated: use [Parse] and [Spec.Digest] instead.
 | ||||
| func SplitObject(obj string) (tag string, dgst digest.Digest) { | ||||
| 	parts := strings.SplitAfterN(obj, "@", 2) | ||||
| 	if len(parts) < 2 { | ||||
| 		return parts[0], "" | ||||
| 	if i := strings.Index(obj, "@"); i >= 0 { | ||||
| 		// Offset by one so preserve the "@" in the tag returned.
 | ||||
| 		return obj[:i+1], digest.Digest(obj[i+1:]) | ||||
| 	} | ||||
| 	return parts[0], digest.Digest(parts[1]) | ||||
| 	return obj, "" | ||||
| } | ||||
|  |  | |||
|  | @ -25,8 +25,6 @@ import ( | |||
| 	"net/http" | ||||
| 	"net/http/httptest" | ||||
| 	"net/url" | ||||
| 
 | ||||
| 	refDocker "github.com/containerd/containerd/reference/docker" | ||||
| ) | ||||
| 
 | ||||
| func FuzzFetcher(data []byte) int { | ||||
|  | @ -74,8 +72,3 @@ func FuzzFetcher(data []byte) int { | |||
| 	} | ||||
| 	return 1 | ||||
| } | ||||
| 
 | ||||
| func FuzzParseDockerRef(data []byte) int { | ||||
| 	_, _ = refDocker.ParseDockerRef(string(data)) | ||||
| 	return 1 | ||||
| } | ||||
|  |  | |||
|  | @ -28,9 +28,9 @@ import ( | |||
| 	"github.com/containerd/containerd/content" | ||||
| 	"github.com/containerd/containerd/images" | ||||
| 	"github.com/containerd/containerd/labels" | ||||
| 	"github.com/containerd/containerd/platforms" | ||||
| 	"github.com/containerd/errdefs" | ||||
| 	"github.com/containerd/log" | ||||
| 	"github.com/containerd/platforms" | ||||
| 	ocispec "github.com/opencontainers/image-spec/specs-go/v1" | ||||
| 	"golang.org/x/sync/semaphore" | ||||
| ) | ||||
|  |  | |||
|  | @ -24,6 +24,7 @@ import ( | |||
| 	"google.golang.org/grpc" | ||||
| 
 | ||||
| 	api "github.com/containerd/containerd/api/runtime/sandbox/v1" | ||||
| 	"github.com/containerd/errdefs" | ||||
| ) | ||||
| 
 | ||||
| // NewClient returns a new sandbox client that handles both GRPC and TTRPC clients.
 | ||||
|  | @ -75,3 +76,7 @@ func (g *grpcBridge) PingSandbox(ctx context.Context, request *api.PingRequest) | |||
| func (g *grpcBridge) ShutdownSandbox(ctx context.Context, request *api.ShutdownSandboxRequest) (*api.ShutdownSandboxResponse, error) { | ||||
| 	return g.client.ShutdownSandbox(ctx, request) | ||||
| } | ||||
| 
 | ||||
| func (g *grpcBridge) SandboxMetrics(ctx context.Context, request *api.SandboxMetricsRequest) (*api.SandboxMetricsResponse, error) { | ||||
| 	return nil, errdefs.ToGRPC(errdefs.ErrNotImplemented) | ||||
| } | ||||
|  |  | |||
|  | @ -30,6 +30,8 @@ import ( | |||
| 	"google.golang.org/grpc" | ||||
| 	"google.golang.org/grpc/status" | ||||
| 
 | ||||
| 	"github.com/containerd/errdefs" | ||||
| 
 | ||||
| 	api "github.com/containerd/containerd/api/services/introspection/v1" | ||||
| 	"github.com/containerd/containerd/api/types" | ||||
| 	"github.com/containerd/containerd/filters" | ||||
|  | @ -38,7 +40,6 @@ import ( | |||
| 	ptypes "github.com/containerd/containerd/protobuf/types" | ||||
| 	"github.com/containerd/containerd/services" | ||||
| 	"github.com/containerd/containerd/services/warning" | ||||
| 	"github.com/containerd/errdefs" | ||||
| ) | ||||
| 
 | ||||
| func init() { | ||||
|  | @ -147,6 +148,10 @@ func (l *Local) Server(ctx context.Context, _ *ptypes.Empty, _ ...grpc.CallOptio | |||
| 	}, nil | ||||
| } | ||||
| 
 | ||||
| func (l *Local) PluginInfo(ctx context.Context, in *api.PluginInfoRequest, opts ...grpc.CallOption) (*api.PluginInfoResponse, error) { | ||||
| 	return nil, errdefs.ErrNotImplemented | ||||
| } | ||||
| 
 | ||||
| func (l *Local) getUUID() (string, error) { | ||||
| 	l.mu.Lock() | ||||
| 	defer l.mu.Unlock() | ||||
|  |  | |||
|  | @ -17,14 +17,16 @@ | |||
| package introspection | ||||
| 
 | ||||
| import ( | ||||
| 	context "context" | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 
 | ||||
| 	"google.golang.org/grpc" | ||||
| 
 | ||||
| 	api "github.com/containerd/containerd/api/services/introspection/v1" | ||||
| 	"github.com/containerd/containerd/plugin" | ||||
| 	ptypes "github.com/containerd/containerd/protobuf/types" | ||||
| 	"github.com/containerd/containerd/services" | ||||
| 	"google.golang.org/grpc" | ||||
| 	"github.com/containerd/errdefs" | ||||
| ) | ||||
| 
 | ||||
| func init() { | ||||
|  | @ -79,3 +81,7 @@ func (s *server) Plugins(ctx context.Context, req *api.PluginsRequest) (*api.Plu | |||
| func (s *server) Server(ctx context.Context, empty *ptypes.Empty) (*api.ServerResponse, error) { | ||||
| 	return s.local.Server(ctx, empty) | ||||
| } | ||||
| 
 | ||||
| func (s *server) PluginInfo(ctx context.Context, in *api.PluginInfoRequest) (*api.PluginInfoResponse, error) { | ||||
| 	return nil, errdefs.ToGRPC(errdefs.ErrNotImplemented) | ||||
| } | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ var ( | |||
| 	Package = "github.com/containerd/containerd" | ||||
| 
 | ||||
| 	// Version holds the complete version number. Filled in at linking time.
 | ||||
| 	Version = "1.7.18+unknown" | ||||
| 	Version = "1.7.19+unknown" | ||||
| 
 | ||||
| 	// Revision is filled with the VCS (e.g. git) revision being used to build
 | ||||
| 	// the program at linking time.
 | ||||
|  |  | |||
|  | @ -0,0 +1 @@ | |||
| *.go text eol=lf | ||||
|  | @ -0,0 +1,30 @@ | |||
| linters: | ||||
|   enable: | ||||
|     - exportloopref # Checks for pointers to enclosing loop variables | ||||
|     - gofmt | ||||
|     - goimports | ||||
|     - gosec | ||||
|     - ineffassign | ||||
|     - misspell | ||||
|     - nolintlint | ||||
|     - revive | ||||
|     - staticcheck | ||||
|     - tenv # Detects using os.Setenv instead of t.Setenv since Go 1.17 | ||||
|     - unconvert | ||||
|     - unused | ||||
|     - vet | ||||
|     - dupword # Checks for duplicate words in the source code | ||||
|   disable: | ||||
|     - errcheck | ||||
| 
 | ||||
| run: | ||||
|   timeout: 5m | ||||
|   skip-dirs: | ||||
|     - api | ||||
|     - cluster | ||||
|     - design | ||||
|     - docs | ||||
|     - docs/man | ||||
|     - releases | ||||
|     - reports | ||||
|     - test # e2e scripts | ||||
|  | @ -0,0 +1,191 @@ | |||
| 
 | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         https://www.apache.org/licenses/ | ||||
| 
 | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
| 
 | ||||
|    1. Definitions. | ||||
| 
 | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
| 
 | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
| 
 | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
| 
 | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
| 
 | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
| 
 | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
| 
 | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
| 
 | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
| 
 | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
| 
 | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
| 
 | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
| 
 | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
| 
 | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
| 
 | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
| 
 | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
| 
 | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
| 
 | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
| 
 | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
| 
 | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
| 
 | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
| 
 | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
| 
 | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
| 
 | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
| 
 | ||||
|    END OF TERMS AND CONDITIONS | ||||
| 
 | ||||
|    Copyright The containerd Authors | ||||
| 
 | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
| 
 | ||||
|        https://www.apache.org/licenses/LICENSE-2.0 | ||||
| 
 | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
|  | @ -0,0 +1,32 @@ | |||
| # platforms | ||||
| 
 | ||||
| A Go package for formatting, normalizing and matching container platforms. | ||||
| 
 | ||||
| This package is based on the Open Containers Image Spec definition of a [platform](https://github.com/opencontainers/image-spec/blob/main/specs-go/v1/descriptor.go#L52). | ||||
| 
 | ||||
| ## Platform Specifier | ||||
| 
 | ||||
| While the OCI platform specifications provide a tool for components to | ||||
| specify structured information, user input typically doesn't need the full | ||||
| context and much can be inferred. To solve this problem, this package introduces | ||||
| "specifiers". A specifier has the format | ||||
| `<os>|<arch>|<os>/<arch>[/<variant>]`.  The user can provide either the | ||||
| operating system or the architecture or both. | ||||
| 
 | ||||
| An example of a common specifier is `linux/amd64`. If the host has a default | ||||
| runtime that matches this, the user can simply provide the component that | ||||
| matters. For example, if an image provides `amd64` and `arm64` support, the | ||||
| operating system, `linux` can be inferred, so they only have to provide | ||||
| `arm64` or `amd64`. Similar behavior is implemented for operating systems, | ||||
| where the architecture may be known but a runtime may support images from | ||||
| different operating systems. | ||||
| 
 | ||||
| ## Project details | ||||
| 
 | ||||
| **platforms** is a containerd sub-project, licensed under the [Apache 2.0 license](./LICENSE). | ||||
| As a containerd sub-project, you will find the: | ||||
|  * [Project governance](https://github.com/containerd/project/blob/main/GOVERNANCE.md), | ||||
|  * [Maintainers](https://github.com/containerd/project/blob/main/MAINTAINERS), | ||||
|  * and [Contributing guidelines](https://github.com/containerd/project/blob/main/CONTRIBUTING.md) | ||||
| 
 | ||||
| information in our [`containerd/project`](https://github.com/containerd/project) repository. | ||||
|  | @ -19,12 +19,12 @@ package platforms | |||
| import ( | ||||
| 	"bufio" | ||||
| 	"bytes" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"runtime" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/containerd/errdefs" | ||||
| 	"golang.org/x/sys/unix" | ||||
| ) | ||||
| 
 | ||||
|  | @ -70,7 +70,7 @@ func getCPUInfo(pattern string) (info string, err error) { | |||
| 		return "", err | ||||
| 	} | ||||
| 
 | ||||
| 	return "", fmt.Errorf("getCPUInfo for pattern %s: %w", pattern, errdefs.ErrNotFound) | ||||
| 	return "", fmt.Errorf("getCPUInfo for pattern %s: %w", pattern, errNotFound) | ||||
| } | ||||
| 
 | ||||
| // getCPUVariantFromArch get CPU variant from arch through a system call
 | ||||
|  | @ -83,7 +83,7 @@ func getCPUVariantFromArch(arch string) (string, error) { | |||
| 	if arch == "aarch64" { | ||||
| 		variant = "8" | ||||
| 	} else if arch[0:4] == "armv" && len(arch) >= 5 { | ||||
| 		//Valid arch format is in form of armvXx
 | ||||
| 		// Valid arch format is in form of armvXx
 | ||||
| 		switch arch[3:5] { | ||||
| 		case "v8": | ||||
| 			variant = "8" | ||||
|  | @ -101,7 +101,7 @@ func getCPUVariantFromArch(arch string) (string, error) { | |||
| 			variant = "unknown" | ||||
| 		} | ||||
| 	} else { | ||||
| 		return "", fmt.Errorf("getCPUVariantFromArch invalid arch: %s, %w", arch, errdefs.ErrInvalidArgument) | ||||
| 		return "", fmt.Errorf("getCPUVariantFromArch invalid arch: %s, %w", arch, errInvalidArgument) | ||||
| 	} | ||||
| 	return variant, nil | ||||
| } | ||||
|  | @ -112,11 +112,10 @@ func getCPUVariantFromArch(arch string) (string, error) { | |||
| // This is to cover running ARM in emulated environment on x86 host as this field in /proc/cpuinfo
 | ||||
| // was not present.
 | ||||
| func getCPUVariant() (string, error) { | ||||
| 
 | ||||
| 	variant, err := getCPUInfo("Cpu architecture") | ||||
| 	if err != nil { | ||||
| 		if errdefs.IsNotFound(err) { | ||||
| 			//Let's try getting CPU variant from machine architecture
 | ||||
| 		if errors.Is(err, errNotFound) { | ||||
| 			// Let's try getting CPU variant from machine architecture
 | ||||
| 			arch, err := getMachineArch() | ||||
| 			if err != nil { | ||||
| 				return "", fmt.Errorf("failure getting machine architecture: %v", err) | ||||
|  | @ -21,8 +21,6 @@ package platforms | |||
| import ( | ||||
| 	"fmt" | ||||
| 	"runtime" | ||||
| 
 | ||||
| 	"github.com/containerd/errdefs" | ||||
| ) | ||||
| 
 | ||||
| func getCPUVariant() (string, error) { | ||||
|  | @ -49,10 +47,8 @@ func getCPUVariant() (string, error) { | |||
| 		default: | ||||
| 			variant = "unknown" | ||||
| 		} | ||||
| 
 | ||||
| 	} else { | ||||
| 		return "", fmt.Errorf("getCPUVariant for OS %s: %v", runtime.GOOS, errdefs.ErrNotImplemented) | ||||
| 
 | ||||
| 		return "", fmt.Errorf("getCPUVariant for OS %s: %v", runtime.GOOS, errNotImplemented) | ||||
| 	} | ||||
| 
 | ||||
| 	return variant, nil | ||||
|  | @ -16,9 +16,11 @@ | |||
| 
 | ||||
| package platforms | ||||
| 
 | ||||
| // DefaultString returns the default string specifier for the platform.
 | ||||
| // DefaultString returns the default string specifier for the platform,
 | ||||
| // with [PR#6](https://github.com/containerd/platforms/pull/6) the result
 | ||||
| // may now also include the OSVersion from the provided platform specification.
 | ||||
| func DefaultString() string { | ||||
| 	return Format(DefaultSpec()) | ||||
| 	return FormatAll(DefaultSpec()) | ||||
| } | ||||
| 
 | ||||
| // DefaultStrict returns strict form of Default.
 | ||||
|  | @ -22,7 +22,6 @@ import ( | |||
| 	"strconv" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/Microsoft/hcsshim/osversion" | ||||
| 	specs "github.com/opencontainers/image-spec/specs-go/v1" | ||||
| 	"golang.org/x/sys/windows" | ||||
| ) | ||||
|  | @ -52,29 +51,29 @@ func (m windowsmatcher) Match(p specs.Platform) bool { | |||
| 
 | ||||
| 	if match && m.OS == "windows" { | ||||
| 		// HPC containers do not have OS version filled
 | ||||
| 		if p.OSVersion == "" { | ||||
| 		if m.OSVersion == "" || p.OSVersion == "" { | ||||
| 			return true | ||||
| 		} | ||||
| 
 | ||||
| 		hostOsVersion := GetOsVersion(m.osVersionPrefix) | ||||
| 		ctrOsVersion := GetOsVersion(p.OSVersion) | ||||
| 		return osversion.CheckHostAndContainerCompat(hostOsVersion, ctrOsVersion) | ||||
| 		hostOsVersion := getOSVersion(m.osVersionPrefix) | ||||
| 		ctrOsVersion := getOSVersion(p.OSVersion) | ||||
| 		return checkHostAndContainerCompat(hostOsVersion, ctrOsVersion) | ||||
| 	} | ||||
| 
 | ||||
| 	return match | ||||
| } | ||||
| 
 | ||||
| func GetOsVersion(osVersionPrefix string) osversion.OSVersion { | ||||
| func getOSVersion(osVersionPrefix string) osVersion { | ||||
| 	parts := strings.Split(osVersionPrefix, ".") | ||||
| 	if len(parts) < 3 { | ||||
| 		return osversion.OSVersion{} | ||||
| 		return osVersion{} | ||||
| 	} | ||||
| 
 | ||||
| 	majorVersion, _ := strconv.Atoi(parts[0]) | ||||
| 	minorVersion, _ := strconv.Atoi(parts[1]) | ||||
| 	buildNumber, _ := strconv.Atoi(parts[2]) | ||||
| 
 | ||||
| 	return osversion.OSVersion{ | ||||
| 	return osVersion{ | ||||
| 		MajorVersion: uint8(majorVersion), | ||||
| 		MinorVersion: uint8(minorVersion), | ||||
| 		Build:        uint16(buildNumber), | ||||
|  | @ -0,0 +1,30 @@ | |||
| /* | ||||
|    Copyright The containerd Authors. | ||||
| 
 | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
| 
 | ||||
|        http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| 
 | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
| */ | ||||
| 
 | ||||
| package platforms | ||||
| 
 | ||||
| import "errors" | ||||
| 
 | ||||
| // These errors mirror the errors defined in [github.com/containerd/containerd/errdefs],
 | ||||
| // however, they are not exported as they are not expected to be used as sentinel
 | ||||
| // errors by consumers of this package.
 | ||||
| //
 | ||||
| //nolint:unused // not all errors are used on all platforms.
 | ||||
| var ( | ||||
| 	errNotFound        = errors.New("not found") | ||||
| 	errInvalidArgument = errors.New("invalid argument") | ||||
| 	errNotImplemented  = errors.New("not implemented") | ||||
| ) | ||||
|  | @ -0,0 +1,78 @@ | |||
| /* | ||||
|    Copyright The containerd Authors. | ||||
| 
 | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
| 
 | ||||
|        http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| 
 | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
| */ | ||||
| 
 | ||||
| package platforms | ||||
| 
 | ||||
| // osVersion is a wrapper for Windows version information
 | ||||
| // https://msdn.microsoft.com/en-us/library/windows/desktop/ms724439(v=vs.85).aspx
 | ||||
| type osVersion struct { | ||||
| 	Version      uint32 | ||||
| 	MajorVersion uint8 | ||||
| 	MinorVersion uint8 | ||||
| 	Build        uint16 | ||||
| } | ||||
| 
 | ||||
| // Windows Client and Server build numbers.
 | ||||
| //
 | ||||
| // See:
 | ||||
| // https://learn.microsoft.com/en-us/windows/release-health/release-information
 | ||||
| // https://learn.microsoft.com/en-us/windows/release-health/windows-server-release-info
 | ||||
| // https://learn.microsoft.com/en-us/windows/release-health/windows11-release-information
 | ||||
| const ( | ||||
| 	// rs5 (version 1809, codename "Redstone 5") corresponds to Windows Server
 | ||||
| 	// 2019 (ltsc2019), and Windows 10 (October 2018 Update).
 | ||||
| 	rs5 = 17763 | ||||
| 
 | ||||
| 	// v21H2Server corresponds to Windows Server 2022 (ltsc2022).
 | ||||
| 	v21H2Server = 20348 | ||||
| 
 | ||||
| 	// v22H2Win11 corresponds to Windows 11 (2022 Update).
 | ||||
| 	v22H2Win11 = 22621 | ||||
| ) | ||||
| 
 | ||||
| // List of stable ABI compliant ltsc releases
 | ||||
| // Note: List must be sorted in ascending order
 | ||||
| var compatLTSCReleases = []uint16{ | ||||
| 	v21H2Server, | ||||
| } | ||||
| 
 | ||||
| // CheckHostAndContainerCompat checks if given host and container
 | ||||
| // OS versions are compatible.
 | ||||
| // It includes support for stable ABI compliant versions as well.
 | ||||
| // Every release after WS 2022 will support the previous ltsc
 | ||||
| // container image. Stable ABI is in preview mode for windows 11 client.
 | ||||
| // Refer: https://learn.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility?tabs=windows-server-2022%2Cwindows-10#windows-server-host-os-compatibility
 | ||||
| func checkHostAndContainerCompat(host, ctr osVersion) bool { | ||||
| 	// check major minor versions of host and guest
 | ||||
| 	if host.MajorVersion != ctr.MajorVersion || | ||||
| 		host.MinorVersion != ctr.MinorVersion { | ||||
| 		return false | ||||
| 	} | ||||
| 
 | ||||
| 	// If host is < WS 2022, exact version match is required
 | ||||
| 	if host.Build < v21H2Server { | ||||
| 		return host.Build == ctr.Build | ||||
| 	} | ||||
| 
 | ||||
| 	var supportedLtscRelease uint16 | ||||
| 	for i := len(compatLTSCReleases) - 1; i >= 0; i-- { | ||||
| 		if host.Build >= compatLTSCReleases[i] { | ||||
| 			supportedLtscRelease = compatLTSCReleases[i] | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 	return ctr.Build >= supportedLtscRelease && ctr.Build <= host.Build | ||||
| } | ||||
|  | @ -102,6 +102,9 @@ | |||
| // unless it is explicitly provided. This is treated as equivalent to armhf. A
 | ||||
| // previous architecture, armel, will be normalized to arm/v6.
 | ||||
| //
 | ||||
| // Similarly, the most common arm64 version v8, and most common amd64 version v1
 | ||||
| // are represented without the variant.
 | ||||
| //
 | ||||
| // While these normalizations are provided, their support on arm platforms has
 | ||||
| // not yet been fully implemented and tested.
 | ||||
| package platforms | ||||
|  | @ -115,14 +118,15 @@ import ( | |||
| 	"strings" | ||||
| 
 | ||||
| 	specs "github.com/opencontainers/image-spec/specs-go/v1" | ||||
| 
 | ||||
| 	"github.com/containerd/errdefs" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	specifierRe = regexp.MustCompile(`^[A-Za-z0-9_-]+$`) | ||||
| 	specifierRe    = regexp.MustCompile(`^[A-Za-z0-9_-]+$`) | ||||
| 	osAndVersionRe = regexp.MustCompile(`^([A-Za-z0-9_-]+)(?:\(([A-Za-z0-9_.-]*)\))?$`) | ||||
| ) | ||||
| 
 | ||||
| const osAndVersionFormat = "%s(%s)" | ||||
| 
 | ||||
| // Platform is a type alias for convenience, so there is no need to import image-spec package everywhere.
 | ||||
| type Platform = specs.Platform | ||||
| 
 | ||||
|  | @ -155,40 +159,68 @@ func (m *matcher) Match(platform specs.Platform) bool { | |||
| } | ||||
| 
 | ||||
| func (m *matcher) String() string { | ||||
| 	return Format(m.Platform) | ||||
| 	return FormatAll(m.Platform) | ||||
| } | ||||
| 
 | ||||
| // ParseAll parses a list of platform specifiers into a list of platform.
 | ||||
| func ParseAll(specifiers []string) ([]specs.Platform, error) { | ||||
| 	platforms := make([]specs.Platform, len(specifiers)) | ||||
| 	for i, s := range specifiers { | ||||
| 		p, err := Parse(s) | ||||
| 		if err != nil { | ||||
| 			return nil, fmt.Errorf("invalid platform %s: %w", s, err) | ||||
| 		} | ||||
| 		platforms[i] = p | ||||
| 	} | ||||
| 	return platforms, nil | ||||
| } | ||||
| 
 | ||||
| // Parse parses the platform specifier syntax into a platform declaration.
 | ||||
| //
 | ||||
| // Platform specifiers are in the format `<os>|<arch>|<os>/<arch>[/<variant>]`.
 | ||||
| // Platform specifiers are in the format `<os>[(<OSVersion>)]|<arch>|<os>[(<OSVersion>)]/<arch>[/<variant>]`.
 | ||||
| // The minimum required information for a platform specifier is the operating
 | ||||
| // system or architecture. If there is only a single string (no slashes), the
 | ||||
| // system or architecture. The OSVersion can be part of the OS like `windows(10.0.17763)`
 | ||||
| // When an OSVersion is specified, then specs.Platform.OSVersion is populated with that value,
 | ||||
| // and an empty string otherwise.
 | ||||
| // If there is only a single string (no slashes), the
 | ||||
| // value will be matched against the known set of operating systems, then fall
 | ||||
| // back to the known set of architectures. The missing component will be
 | ||||
| // inferred based on the local environment.
 | ||||
| func Parse(specifier string) (specs.Platform, error) { | ||||
| 	if strings.Contains(specifier, "*") { | ||||
| 		// TODO(stevvooe): need to work out exact wildcard handling
 | ||||
| 		return specs.Platform{}, fmt.Errorf("%q: wildcards not yet supported: %w", specifier, errdefs.ErrInvalidArgument) | ||||
| 		return specs.Platform{}, fmt.Errorf("%q: wildcards not yet supported: %w", specifier, errInvalidArgument) | ||||
| 	} | ||||
| 
 | ||||
| 	parts := strings.Split(specifier, "/") | ||||
| 	// Limit to 4 elements to prevent unbounded split
 | ||||
| 	parts := strings.SplitN(specifier, "/", 4) | ||||
| 
 | ||||
| 	for _, part := range parts { | ||||
| 		if !specifierRe.MatchString(part) { | ||||
| 			return specs.Platform{}, fmt.Errorf("%q is an invalid component of %q: platform specifier component must match %q: %w", part, specifier, specifierRe.String(), errdefs.ErrInvalidArgument) | ||||
| 	var p specs.Platform | ||||
| 	for i, part := range parts { | ||||
| 		if i == 0 { | ||||
| 			// First element is <os>[(<OSVersion>)]
 | ||||
| 			osVer := osAndVersionRe.FindStringSubmatch(part) | ||||
| 			if osVer == nil { | ||||
| 				return specs.Platform{}, fmt.Errorf("%q is an invalid OS component of %q: OSAndVersion specifier component must match %q: %w", part, specifier, osAndVersionRe.String(), errInvalidArgument) | ||||
| 			} | ||||
| 
 | ||||
| 			p.OS = normalizeOS(osVer[1]) | ||||
| 			p.OSVersion = osVer[2] | ||||
| 		} else { | ||||
| 			if !specifierRe.MatchString(part) { | ||||
| 				return specs.Platform{}, fmt.Errorf("%q is an invalid component of %q: platform specifier component must match %q: %w", part, specifier, specifierRe.String(), errInvalidArgument) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	var p specs.Platform | ||||
| 	switch len(parts) { | ||||
| 	case 1: | ||||
| 		// in this case, we will test that the value might be an OS, then look
 | ||||
| 		// it up. If it is not known, we'll treat it as an architecture. Since
 | ||||
| 		// in this case, we will test that the value might be an OS (with or
 | ||||
| 		// without the optional OSVersion specified) and look it up.
 | ||||
| 		// If it is not known, we'll treat it as an architecture. Since
 | ||||
| 		// we have very little information about the platform here, we are
 | ||||
| 		// going to be a little more strict if we don't know about the argument
 | ||||
| 		// value.
 | ||||
| 		p.OS = normalizeOS(parts[0]) | ||||
| 		if isKnownOS(p.OS) { | ||||
| 			// picks a default architecture
 | ||||
| 			p.Architecture = runtime.GOARCH | ||||
|  | @ -196,10 +228,6 @@ func Parse(specifier string) (specs.Platform, error) { | |||
| 				p.Variant = cpuVariant() | ||||
| 			} | ||||
| 
 | ||||
| 			if p.OS == "windows" { | ||||
| 				p.OSVersion = GetWindowsOsVersion() | ||||
| 			} | ||||
| 
 | ||||
| 			return p, nil | ||||
| 		} | ||||
| 
 | ||||
|  | @ -212,37 +240,27 @@ func Parse(specifier string) (specs.Platform, error) { | |||
| 			return p, nil | ||||
| 		} | ||||
| 
 | ||||
| 		return specs.Platform{}, fmt.Errorf("%q: unknown operating system or architecture: %w", specifier, errdefs.ErrInvalidArgument) | ||||
| 		return specs.Platform{}, fmt.Errorf("%q: unknown operating system or architecture: %w", specifier, errInvalidArgument) | ||||
| 	case 2: | ||||
| 		// In this case, we treat as a regular os/arch pair. We don't care
 | ||||
| 		// In this case, we treat as a regular OS[(OSVersion)]/arch pair. We don't care
 | ||||
| 		// about whether or not we know of the platform.
 | ||||
| 		p.OS = normalizeOS(parts[0]) | ||||
| 		p.Architecture, p.Variant = normalizeArch(parts[1], "") | ||||
| 		if p.Architecture == "arm" && p.Variant == "v7" { | ||||
| 			p.Variant = "" | ||||
| 		} | ||||
| 
 | ||||
| 		if p.OS == "windows" { | ||||
| 			p.OSVersion = GetWindowsOsVersion() | ||||
| 		} | ||||
| 
 | ||||
| 		return p, nil | ||||
| 	case 3: | ||||
| 		// we have a fully specified variant, this is rare
 | ||||
| 		p.OS = normalizeOS(parts[0]) | ||||
| 		p.Architecture, p.Variant = normalizeArch(parts[1], parts[2]) | ||||
| 		if p.Architecture == "arm64" && p.Variant == "" { | ||||
| 			p.Variant = "v8" | ||||
| 		} | ||||
| 
 | ||||
| 		if p.OS == "windows" { | ||||
| 			p.OSVersion = GetWindowsOsVersion() | ||||
| 		} | ||||
| 
 | ||||
| 		return p, nil | ||||
| 	} | ||||
| 
 | ||||
| 	return specs.Platform{}, fmt.Errorf("%q: cannot parse platform specifier: %w", specifier, errdefs.ErrInvalidArgument) | ||||
| 	return specs.Platform{}, fmt.Errorf("%q: cannot parse platform specifier: %w", specifier, errInvalidArgument) | ||||
| } | ||||
| 
 | ||||
| // MustParse is like Parses but panics if the specifier cannot be parsed.
 | ||||
|  | @ -264,6 +282,20 @@ func Format(platform specs.Platform) string { | |||
| 	return path.Join(platform.OS, platform.Architecture, platform.Variant) | ||||
| } | ||||
| 
 | ||||
| // FormatAll returns a string specifier that also includes the OSVersion from the
 | ||||
| // provided platform specification.
 | ||||
| func FormatAll(platform specs.Platform) string { | ||||
| 	if platform.OS == "" { | ||||
| 		return "unknown" | ||||
| 	} | ||||
| 
 | ||||
| 	if platform.OSVersion != "" { | ||||
| 		OSAndVersion := fmt.Sprintf(osAndVersionFormat, platform.OS, platform.OSVersion) | ||||
| 		return path.Join(OSAndVersion, platform.Architecture, platform.Variant) | ||||
| 	} | ||||
| 	return path.Join(platform.OS, platform.Architecture, platform.Variant) | ||||
| } | ||||
| 
 | ||||
| // Normalize validates and translate the platform to the canonical value.
 | ||||
| //
 | ||||
| // For example, if "Aarch64" is encountered, we change it to "arm64" or if
 | ||||
|  | @ -28,7 +28,3 @@ func newDefaultMatcher(platform specs.Platform) Matcher { | |||
| 		Platform: Normalize(platform), | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func GetWindowsOsVersion() string { | ||||
| 	return "" | ||||
| } | ||||
|  | @ -17,10 +17,7 @@ | |||
| package platforms | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 
 | ||||
| 	specs "github.com/opencontainers/image-spec/specs-go/v1" | ||||
| 	"golang.org/x/sys/windows" | ||||
| ) | ||||
| 
 | ||||
| // NewMatcher returns a Windows matcher that will match on osVersionPrefix if
 | ||||
|  | @ -35,8 +32,3 @@ func newDefaultMatcher(platform specs.Platform) Matcher { | |||
| 		}, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func GetWindowsOsVersion() string { | ||||
| 	major, minor, build := windows.RtlGetNtVersionNumbers() | ||||
| 	return fmt.Sprintf("%d.%d.%d", major, minor, build) | ||||
| } | ||||
|  | @ -1,6 +1,6 @@ | |||
| # ttrpc | ||||
| 
 | ||||
| [](https://github.com/containerd/ttrpc/actions?query=workflow%3ACI) | ||||
| [](https://github.com/containerd/ttrpc/actions/workflows/ci.yml) | ||||
| 
 | ||||
| GRPC for low-memory environments. | ||||
| 
 | ||||
|  |  | |||
|  | @ -27,7 +27,7 @@ import ( | |||
| 	"syscall" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"github.com/containerd/log" | ||||
| 	"google.golang.org/grpc/codes" | ||||
| 	"google.golang.org/grpc/status" | ||||
| 	"google.golang.org/protobuf/proto" | ||||
|  | @ -368,7 +368,7 @@ func (c *Client) receiveLoop() error { | |||
| 			sid := streamID(msg.header.StreamID) | ||||
| 			s := c.getStream(sid) | ||||
| 			if s == nil { | ||||
| 				logrus.WithField("stream", sid).Errorf("ttrpc: received message on inactive stream") | ||||
| 				log.G(c.ctx).WithField("stream", sid).Error("ttrpc: received message on inactive stream") | ||||
| 				continue | ||||
| 			} | ||||
| 
 | ||||
|  | @ -376,7 +376,7 @@ func (c *Client) receiveLoop() error { | |||
| 				s.closeWithError(err) | ||||
| 			} else { | ||||
| 				if err := s.receive(c.ctx, msg); err != nil { | ||||
| 					logrus.WithError(err).WithField("stream", sid).Errorf("ttrpc: failed to handle message") | ||||
| 					log.G(c.ctx).WithFields(log.Fields{"error": err, "stream": sid}).Error("ttrpc: failed to handle message") | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  |  | |||
|  | @ -27,7 +27,7 @@ import ( | |||
| 	"syscall" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/sirupsen/logrus" | ||||
| 	"github.com/containerd/log" | ||||
| 	"google.golang.org/grpc/codes" | ||||
| 	"google.golang.org/grpc/status" | ||||
| ) | ||||
|  | @ -109,7 +109,7 @@ func (s *Server) Serve(ctx context.Context, l net.Listener) error { | |||
| 				} | ||||
| 
 | ||||
| 				sleep := time.Duration(rand.Int63n(int64(backoff))) | ||||
| 				logrus.WithError(err).Errorf("ttrpc: failed accept; backoff %v", sleep) | ||||
| 				log.G(ctx).WithError(err).Errorf("ttrpc: failed accept; backoff %v", sleep) | ||||
| 				time.Sleep(sleep) | ||||
| 				continue | ||||
| 			} | ||||
|  | @ -121,14 +121,14 @@ func (s *Server) Serve(ctx context.Context, l net.Listener) error { | |||
| 
 | ||||
| 		approved, handshake, err := handshaker.Handshake(ctx, conn) | ||||
| 		if err != nil { | ||||
| 			logrus.WithError(err).Error("ttrpc: refusing connection after handshake") | ||||
| 			log.G(ctx).WithError(err).Error("ttrpc: refusing connection after handshake") | ||||
| 			conn.Close() | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| 		sc, err := s.newConn(approved, handshake) | ||||
| 		if err != nil { | ||||
| 			logrus.WithError(err).Error("ttrpc: create connection failed") | ||||
| 			log.G(ctx).WithError(err).Error("ttrpc: create connection failed") | ||||
| 			conn.Close() | ||||
| 			continue | ||||
| 		} | ||||
|  | @ -513,12 +513,12 @@ func (c *serverConn) run(sctx context.Context) { | |||
| 					Payload: response.data, | ||||
| 				}) | ||||
| 				if err != nil { | ||||
| 					logrus.WithError(err).Error("failed marshaling response") | ||||
| 					log.G(ctx).WithError(err).Error("failed marshaling response") | ||||
| 					return | ||||
| 				} | ||||
| 
 | ||||
| 				if err := ch.send(response.id, messageTypeResponse, 0, p); err != nil { | ||||
| 					logrus.WithError(err).Error("failed sending message on channel") | ||||
| 					log.G(ctx).WithError(err).Error("failed sending message on channel") | ||||
| 					return | ||||
| 				} | ||||
| 			} else { | ||||
|  | @ -530,7 +530,7 @@ func (c *serverConn) run(sctx context.Context) { | |||
| 					flags = flags | flagNoData | ||||
| 				} | ||||
| 				if err := ch.send(response.id, messageTypeData, flags, response.data); err != nil { | ||||
| 					logrus.WithError(err).Error("failed sending message on channel") | ||||
| 					log.G(ctx).WithError(err).Error("failed sending message on channel") | ||||
| 					return | ||||
| 				} | ||||
| 			} | ||||
|  | @ -552,7 +552,7 @@ func (c *serverConn) run(sctx context.Context) { | |||
| 				// requests, so that the client connection is closed
 | ||||
| 				return | ||||
| 			} | ||||
| 			logrus.WithError(err).Error("error receiving message") | ||||
| 			log.G(ctx).WithError(err).Error("error receiving message") | ||||
| 			// else, initiate shutdown
 | ||||
| 		case <-shutdown: | ||||
| 			return | ||||
|  |  | |||
|  | @ -141,7 +141,7 @@ github.com/Microsoft/go-winio/internal/stringbuffer | |||
| github.com/Microsoft/go-winio/pkg/bindfilter | ||||
| github.com/Microsoft/go-winio/pkg/guid | ||||
| github.com/Microsoft/go-winio/vhd | ||||
| # github.com/Microsoft/hcsshim v0.11.5 | ||||
| # github.com/Microsoft/hcsshim v0.11.7 | ||||
| ## explicit; go 1.21 | ||||
| github.com/Microsoft/hcsshim | ||||
| github.com/Microsoft/hcsshim/cmd/containerd-shim-runhcs-v1/options | ||||
|  | @ -370,27 +370,9 @@ github.com/cloudflare/circl/sign/ed448 | |||
| # github.com/containerd/cgroups v1.1.0 | ||||
| ## explicit; go 1.17 | ||||
| github.com/containerd/cgroups/stats/v1 | ||||
| # github.com/containerd/containerd v1.7.18 | ||||
| # github.com/containerd/containerd v1.7.19 | ||||
| ## explicit; go 1.21 | ||||
| github.com/containerd/containerd | ||||
| github.com/containerd/containerd/api/runtime/sandbox/v1 | ||||
| github.com/containerd/containerd/api/services/containers/v1 | ||||
| github.com/containerd/containerd/api/services/content/v1 | ||||
| github.com/containerd/containerd/api/services/diff/v1 | ||||
| github.com/containerd/containerd/api/services/events/v1 | ||||
| github.com/containerd/containerd/api/services/images/v1 | ||||
| github.com/containerd/containerd/api/services/introspection/v1 | ||||
| github.com/containerd/containerd/api/services/leases/v1 | ||||
| github.com/containerd/containerd/api/services/namespaces/v1 | ||||
| github.com/containerd/containerd/api/services/sandbox/v1 | ||||
| github.com/containerd/containerd/api/services/snapshots/v1 | ||||
| github.com/containerd/containerd/api/services/streaming/v1 | ||||
| github.com/containerd/containerd/api/services/tasks/v1 | ||||
| github.com/containerd/containerd/api/services/transfer/v1 | ||||
| github.com/containerd/containerd/api/services/version/v1 | ||||
| github.com/containerd/containerd/api/types | ||||
| github.com/containerd/containerd/api/types/task | ||||
| github.com/containerd/containerd/api/types/transfer | ||||
| github.com/containerd/containerd/archive | ||||
| github.com/containerd/containerd/archive/compression | ||||
| github.com/containerd/containerd/archive/tarheader | ||||
|  | @ -432,11 +414,9 @@ github.com/containerd/containerd/pkg/userns | |||
| github.com/containerd/containerd/platforms | ||||
| github.com/containerd/containerd/plugin | ||||
| github.com/containerd/containerd/protobuf | ||||
| github.com/containerd/containerd/protobuf/plugin | ||||
| github.com/containerd/containerd/protobuf/proto | ||||
| github.com/containerd/containerd/protobuf/types | ||||
| github.com/containerd/containerd/reference | ||||
| github.com/containerd/containerd/reference/docker | ||||
| github.com/containerd/containerd/remotes | ||||
| github.com/containerd/containerd/remotes/docker | ||||
| github.com/containerd/containerd/remotes/docker/auth | ||||
|  | @ -454,6 +434,26 @@ github.com/containerd/containerd/snapshots | |||
| github.com/containerd/containerd/snapshots/proxy | ||||
| github.com/containerd/containerd/tracing | ||||
| github.com/containerd/containerd/version | ||||
| # github.com/containerd/containerd/api v1.7.19 | ||||
| ## explicit; go 1.21 | ||||
| github.com/containerd/containerd/api/runtime/sandbox/v1 | ||||
| github.com/containerd/containerd/api/services/containers/v1 | ||||
| github.com/containerd/containerd/api/services/content/v1 | ||||
| github.com/containerd/containerd/api/services/diff/v1 | ||||
| github.com/containerd/containerd/api/services/events/v1 | ||||
| github.com/containerd/containerd/api/services/images/v1 | ||||
| github.com/containerd/containerd/api/services/introspection/v1 | ||||
| github.com/containerd/containerd/api/services/leases/v1 | ||||
| github.com/containerd/containerd/api/services/namespaces/v1 | ||||
| github.com/containerd/containerd/api/services/sandbox/v1 | ||||
| github.com/containerd/containerd/api/services/snapshots/v1 | ||||
| github.com/containerd/containerd/api/services/streaming/v1 | ||||
| github.com/containerd/containerd/api/services/tasks/v1 | ||||
| github.com/containerd/containerd/api/services/transfer/v1 | ||||
| github.com/containerd/containerd/api/services/version/v1 | ||||
| github.com/containerd/containerd/api/types | ||||
| github.com/containerd/containerd/api/types/task | ||||
| github.com/containerd/containerd/api/types/transfer | ||||
| # github.com/containerd/continuity v0.4.3 | ||||
| ## explicit; go 1.19 | ||||
| github.com/containerd/continuity/devices | ||||
|  | @ -469,11 +469,14 @@ github.com/containerd/fifo | |||
| # github.com/containerd/log v0.1.0 | ||||
| ## explicit; go 1.20 | ||||
| github.com/containerd/log | ||||
| # github.com/containerd/platforms v0.2.1 | ||||
| ## explicit; go 1.20 | ||||
| github.com/containerd/platforms | ||||
| # github.com/containerd/stargz-snapshotter/estargz v0.15.1 | ||||
| ## explicit; go 1.19 | ||||
| github.com/containerd/stargz-snapshotter/estargz | ||||
| github.com/containerd/stargz-snapshotter/estargz/errorutil | ||||
| # github.com/containerd/ttrpc v1.2.4 | ||||
| # github.com/containerd/ttrpc v1.2.5 | ||||
| ## explicit; go 1.19 | ||||
| github.com/containerd/ttrpc | ||||
| # github.com/containerd/typeurl/v2 v2.1.1 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue