// Copyright 2020 The Monogon Project Authors.
//
// SPDX-License-Identifier: Apache-2.0
//
// 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 fietsje

// deps_containerd.go contains all dependencies required by containerd/runc.

func depsContainerd(p *planner) {
	p.collectOverride(
		"github.com/containerd/containerd", "v1.4.3",
		buildTags("no_zfs", "no_aufs", "no_devicemapper", "no_btrfs"),
		disabledProtoBuild,
	).use(
		"github.com/BurntSushi/toml",
		"github.com/Microsoft/go-winio",
		"github.com/beorn7/perks",
		"github.com/cespare/xxhash/v2",
		"github.com/cilium/ebpf",
		"github.com/containerd/btrfs",
		"github.com/containerd/console",
		"github.com/containerd/continuity",
		"github.com/containerd/fifo",
		"github.com/containerd/go-cni",
		"github.com/containerd/go-runc",
		"github.com/containerd/imgcrypt",
		"github.com/containers/ocicrypt",
		"github.com/containerd/typeurl",
		"github.com/coreos/go-systemd/v22",
		"github.com/cpuguy83/go-md2man/v2",
		"github.com/davecgh/go-spew",
		"github.com/docker/docker",
		"github.com/docker/go-events",
		"github.com/docker/go-metrics",
		"github.com/docker/go-units",
		"github.com/docker/spdystream",
		"github.com/emicklei/go-restful",
		"github.com/fullsailor/pkcs7",
		"github.com/godbus/dbus/v5",
		"github.com/gogo/protobuf",
		"github.com/go-logr/logr",
		"github.com/google/gofuzz",
		"github.com/google/uuid",
		"github.com/hashicorp/errwrap",
		"github.com/hashicorp/go-multierror",
		"github.com/hashicorp/golang-lru",
		"github.com/imdario/mergo",
		"github.com/json-iterator/go",
		"github.com/konsorten/go-windows-terminal-sequences",
		"github.com/matttproud/golang_protobuf_extensions",
		"github.com/modern-go/concurrent",
		"github.com/modern-go/reflect2",
		"github.com/opencontainers/go-digest",
		"github.com/opencontainers/image-spec",
		"github.com/opencontainers/runc",
		"github.com/opencontainers/runtime-spec",
		"github.com/pkg/errors",
		"github.com/prometheus/client_golang",
		"github.com/prometheus/client_model",
		"github.com/prometheus/common",
		"github.com/prometheus/procfs",
		"github.com/russross/blackfriday/v2",
		"github.com/shurcooL/sanitized_anchor_name",
		"github.com/sirupsen/logrus",
		"github.com/syndtr/gocapability",
		"github.com/tchap/go-patricia",
		"github.com/urfave/cli",
		"go.etcd.io/bbolt",
		"go.opencensus.io",
		"golang.org/x/crypto",
		"golang.org/x/oauth2",
		"google.golang.org/genproto",
		"gopkg.in/inf.v0",
		"gopkg.in/yaml.v2",
		"k8s.io/klog/v2",
		"sigs.k8s.io/yaml",
	).with(useImportAliasNaming).use(
		"golang.org/x/sync",
	).with(disabledProtoBuild, patches("containerd-netns-statedir.patch")).use(
		"github.com/containerd/cri",
	).with(disabledProtoBuild).use(
		"github.com/Microsoft/hcsshim",
		"github.com/containerd/cgroups",

		"github.com/gogo/googleapis",
	).with(buildTags("selinux")).use(
		"github.com/opencontainers/selinux",
		"github.com/willf/bitset",
	).with(patches(
		"ttrpc-hacks.patch",
	)).use(
		"github.com/containerd/ttrpc",
	).with(patches(
		"cni-fix-cachepath.patch",
	)).use("github.com/containernetworking/cni").replace(
		// ttrpc is broken by go protobuf v2, this is a tentative PR that's
		// not yet merged by upstream.
		// See: https://github.com/containerd/ttrpc/pull/67
		//
		// It also contains our own fix that builds up on the above and allows services to
		// return the original status error library values. This is required for ttrpc to
		// actually work from runsc and for results to be correctly interpreted by
		// containerd. See:
		//   https://github.com/monogon-dev/ttrpc/commit/222b428f008e3ecb11cfff12e3fd92e3143a2f01
		//
		// Note: this is not a good fix, and has known issues, like not being
		// able to return Details in gRPC status errors. However, with the
		// limited usage within gvisor/containerd it works. In the future
		// upstream will have to resolve this properly, eg. port ttrpc away
		// from gogo, or fix gogo to work with the new protobuf APU.
		"github.com/containerd/ttrpc",
		"github.com/monogon-dev/ttrpc", "222b428f008e3ecb11cfff12e3fd92e3143a2f01",
	)

	// This is depended on by github.com/containerd/containerd, but not mentioned in
	// their vendor.conf. They seem to be moving off of vendoring to gomod, so this
	// should be reverted on the next containerd bump (when fietsje will panic about
	// vendor.conf missing).
	p.collectOverride(
		"github.com/checkpoint-restore/go-criu/v4", "v4.1.0",
	)

	// containernetworking/plugins
	p.collectOverride(
		"github.com/containernetworking/plugins", "v0.8.2",
	).use(
		"github.com/alexflint/go-filemutex",
		"github.com/coreos/go-iptables",
		"github.com/j-keck/arping",
		"github.com/safchain/ethtool",
	)
}
