libnet: Make sure network names are unique
**- What I did**

Fixes #18864, #20648, #33561, #40901 (and probably more).

[This GH comment][1] makes clear network name uniqueness has never been enforced due to the eventually consistent nature of Classic Swarm datastores:

> there is no guaranteed way to check for duplicates across a cluster of docker hosts.

And this is further confirmed by other comments made by @mrjana in that same issue, eg. [this one][2]:

> we want to adopt a schema which can pave the way in the future for a completely decentralized cluster of docker hosts (if scalability is needed).

This decentralized model is what Classic Swarm was trying to be. It's been superseded since then by Docker Swarm, which has a centralized control plane.

To circumvent this drawback, the `NetworkCreate` endpoint accepts a `CheckDuplicate` flag. However it's not perfectly reliable as it won't catch concurrent requests.

Due to this design decision, API clients like Compose have to implement workarounds to make sure names are really unique (eg. docker/compose#9585). And the daemon itself has seen a string of issues due to that decision, including some that aren't fixed to this day (for instance moby/moby#40901):

> The problem is, that if you specify a network for a container using the ID, it will add that network to the container but it will then change it to reference the network by using the name.

To summarize, this "feature" is broken, has no practical use and is a source of pain for Docker users and API consumers. So let's just remove it for _all_ API versions.

[1]: https://github.com/moby/moby/issues/18864#issuecomment-167201414
[2]: https://github.com/moby/moby/issues/18864#issuecomment-167202589

**- A picture of a cute animal (not mandatory but encouraged)**

<img src="https://i.natgeofe.com/k/80385d2b-cf77-43eb-9589-a2c9229401bd/quokka-selfie-smile.jpg" width=50% height=50% />
hack/make/test-docker-py
#!/usr/bin/env bash
set -e

source hack/make/.integration-test-helpers

# The commit or tag to use for testing
: "${DOCKER_PY_COMMIT:=6.1.3}"

# The version (and variant) of the python image to use for the tests;
# see https://github.com/docker/docker-py/blob/5.0.3/tests/Dockerfile#L1C5-L3
#
# TODO remove once https://github.com/docker/docker-py/pull/3145 is merged.
: "${PYTHON_VERSION:=3.7-bullseye}"

# custom options to pass py.test
#
# This option can be used to temporarily skip flaky tests (using the `--deselect`
# flag) until they are fixed upstream. For example:
# --deselect=tests/integration/api_container_test.py::AttachContainerTest::test_attach_no_stream
# TODO re-enable test_attach_no_stream after https://github.com/docker/docker-py/issues/2513 is resolved
# TODO re-enable test_run_container_reading_socket_ws. It's reported in https://github.com/docker/docker-py/issues/1478, and we're getting that error in our tests.
# TODO re-enable test_create_with_restart_policy after https://github.com/docker/docker-py/pull/3165 is included in a release
# TODO re-enable test_api_error_parses_json after https://github.com/docker/docker-py/pull/3165 is included in a release
# TODO re-enable test_connect_with_ipv6_address after we updated to a version of docker-py with https://github.com/docker/docker-py/pull/3169
# TODO re-enable test_create_network_ipv6_enabled after we updated to a version of docker-py with https://github.com/docker/docker-py/pull/3169
# TODO re-enable test_create_with_ipv6_address after we updated to a version of docker-py with https://github.com/docker/docker-py/pull/3169
: "${PY_TEST_OPTIONS:=--junitxml=${DEST}/junit-report.xml --deselect=tests/integration/api_container_test.py::AttachContainerTest::test_attach_no_stream --deselect=tests/integration/api_container_test.py::AttachContainerTest::test_run_container_reading_socket_ws --deselect=tests/integration/api_container_test.py::CreateContainerTest::test_create_with_restart_policy --deselect=tests/integration/errors_test.py::ErrorsTest::test_api_error_parses_json --deselect=tests/integration/api_network_test.py::TestNetworks::test_connect_with_ipv6_address --deselect=tests/integration/api_network_test.py::TestNetworks::test_create_network_ipv6_enabled --deselect=tests/integration/api_network_test.py::TestNetworks::test_create_with_ipv6_address}"
(
	bundle .integration-daemon-start

	docker_host_scheme=$(echo "${DOCKER_HOST}" | cut -d: -f1 -)

	case "${docker_host_scheme}" in
		unix)
			# trim the tcp:// scheme, and bind-mount the docker socket into the container
			run_opts="--mount type=bind,src=${DOCKER_HOST#unix://},dst=/var/run/docker.sock"
			;;

		tcp)
			# run container in host-mode networking so that it can connect to the
			# daemon from the current networking namespace (e.g., to connect to localhost)
			run_opts="--network=host -e DOCKER_HOST=${DOCKER_HOST}"
			;;

		*)
			echo "WARN: Skipping test-docker-py: connecting to docker daemon using ${docker_host_scheme} (${DOCKER_HOST}) not supported"
			bundle .integration-daemon-stop
			return 0
			;;
	esac

	docker_py_image="docker-sdk-python3:${DOCKER_PY_COMMIT}"
	if ! docker image inspect "dockerPyImage" &> /dev/null; then
		echo INFO: Building ${docker_py_image}...
		(
			[ -n "${TESTDEBUG}" ] && set -x
			[ -z "${TESTDEBUG}" ] && build_opts="--quiet"
			[ -f /.dockerenv ] || build_opts="${build_opts} --network=host"
			# shellcheck disable=SC2086
			exec docker build ${build_opts} --build-arg PYTHON_VERSION="${PYTHON_VERSION}" -t "${docker_py_image}" -f tests/Dockerfile "https://github.com/docker/docker-py.git#${DOCKER_PY_COMMIT}"
		)
	fi

	echo INFO: Starting docker-py tests...
	(
		[ -n "${TESTDEBUG}" ] && set -x
		# shellcheck disable=SC2086,SC2140
		exec docker run --rm ${run_opts} --mount type=bind,"src=${ABS_DEST}","dst=/src/${DEST}" "${docker_py_image}" pytest ${PY_TEST_OPTIONS} tests/integration
	)
	bundle .integration-daemon-stop
) &> >(tee -a "$DEST/test.log")

#!/usr/bin/env bash
set -e

source hack/make/.integration-test-helpers

# The commit or tag to use for testing
: "${DOCKER_PY_COMMIT:=6.1.3}"

# The version (and variant) of the python image to use for the tests;
# see https://github.com/docker/docker-py/blob/5.0.3/tests/Dockerfile#L1C5-L3
#
# TODO remove once https://github.com/docker/docker-py/pull/3145 is merged.
: "${PYTHON_VERSION:=3.7-bullseye}"

# custom options to pass py.test
#
# This option can be used to temporarily skip flaky tests (using the `--deselect`
# flag) until they are fixed upstream. For example:
# --deselect=tests/integration/api_container_test.py::AttachContainerTest::test_attach_no_stream
# TODO re-enable test_attach_no_stream after https://github.com/docker/docker-py/issues/2513 is resolved
# TODO re-enable test_run_container_reading_socket_ws. It's reported in https://github.com/docker/docker-py/issues/1478, and we're getting that error in our tests.
# TODO re-enable test_create_with_restart_policy after https://github.com/docker/docker-py/pull/3165 is included in a release
# TODO re-enable test_api_error_parses_json after https://github.com/docker/docker-py/pull/3165 is included in a release
# TODO re-enable test_connect_with_ipv6_address after we updated to a version of docker-py with https://github.com/docker/docker-py/pull/3169
# TODO re-enable test_create_network_ipv6_enabled after we updated to a version of docker-py with https://github.com/docker/docker-py/pull/3169
# TODO re-enable test_create_with_ipv6_address after we updated to a version of docker-py with https://github.com/docker/docker-py/pull/3169
# TODO re-enable test_create_check_duplicate after we updated to a version of docker-py with https://github.com/docker/docker-py/pull/3170
: "${PY_TEST_OPTIONS:=--junitxml=${DEST}/junit-report.xml --deselect=tests/integration/api_container_test.py::AttachContainerTest::test_attach_no_stream --deselect=tests/integration/api_container_test.py::AttachContainerTest::test_run_container_reading_socket_ws --deselect=tests/integration/api_container_test.py::CreateContainerTest::test_create_with_restart_policy --deselect=tests/integration/errors_test.py::ErrorsTest::test_api_error_parses_json --deselect=tests/integration/api_network_test.py::TestNetworks::test_connect_with_ipv6_address --deselect=tests/integration/api_network_test.py::TestNetworks::test_create_network_ipv6_enabled --deselect=tests/integration/api_network_test.py::TestNetworks::test_create_with_ipv6_address --deselect=tests/integration/api_network_test.py::TestNetworks::test_create_check_duplicate}"
(
	bundle .integration-daemon-start

	docker_host_scheme=$(echo "${DOCKER_HOST}" | cut -d: -f1 -)

	case "${docker_host_scheme}" in
		unix)
			# trim the tcp:// scheme, and bind-mount the docker socket into the container
			run_opts="--mount type=bind,src=${DOCKER_HOST#unix://},dst=/var/run/docker.sock"
			;;

		tcp)
			# run container in host-mode networking so that it can connect to the
			# daemon from the current networking namespace (e.g., to connect to localhost)
			run_opts="--network=host -e DOCKER_HOST=${DOCKER_HOST}"
			;;

		*)
			echo "WARN: Skipping test-docker-py: connecting to docker daemon using ${docker_host_scheme} (${DOCKER_HOST}) not supported"
			bundle .integration-daemon-stop
			return 0
			;;
	esac

	docker_py_image="docker-sdk-python3:${DOCKER_PY_COMMIT}"
	if ! docker image inspect "dockerPyImage" &> /dev/null; then
		echo INFO: Building ${docker_py_image}...
		(
			[ -n "${TESTDEBUG}" ] && set -x
			[ -z "${TESTDEBUG}" ] && build_opts="--quiet"
			[ -f /.dockerenv ] || build_opts="${build_opts} --network=host"
			# shellcheck disable=SC2086
			exec docker build ${build_opts} --build-arg PYTHON_VERSION="${PYTHON_VERSION}" -t "${docker_py_image}" -f tests/Dockerfile "https://github.com/docker/docker-py.git#${DOCKER_PY_COMMIT}"
		)
	fi

	echo INFO: Starting docker-py tests...
	(
		[ -n "${TESTDEBUG}" ] && set -x
		# shellcheck disable=SC2086,SC2140
		exec docker run --rm ${run_opts} --mount type=bind,"src=${ABS_DEST}","dst=/src/${DEST}" "${docker_py_image}" pytest ${PY_TEST_OPTIONS} tests/integration
	)
	bundle .integration-daemon-stop
) &> >(tee -a "$DEST/test.log")

oh! this reminds me that there were two tests still failing on "latest" `docker-py`. I think we missed two tests that still needed updating; https://github.com/moby/moby/pull/46368#issuecomment-1700769068