Skip to content

Commit 90f81ed

Browse files
committed
Merge branch 'aanand-remove-registry-ping'
2 parents 946eb96 + 915be6a commit 90f81ed

File tree

7 files changed

+143
-31
lines changed

7 files changed

+143
-31
lines changed

docker/auth/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from .auth import (
2+
INDEX_NAME,
23
INDEX_URL,
34
encode_header,
45
load_config,

docker/auth/auth.py

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,38 +16,34 @@
1616
import fileinput
1717
import json
1818
import os
19+
import warnings
1920

2021
import six
2122

22-
from ..utils import utils
23+
from .. import constants
2324
from .. import errors
2425

25-
INDEX_URL = 'https://index.docker.io/v1/'
26+
INDEX_NAME = 'index.docker.io'
27+
INDEX_URL = 'https://{0}/v1/'.format(INDEX_NAME)
2628
DOCKER_CONFIG_FILENAME = os.path.join('.docker', 'config.json')
2729
LEGACY_DOCKER_CONFIG_FILENAME = '.dockercfg'
2830

2931

30-
def expand_registry_url(hostname, insecure=False):
31-
if hostname.startswith('http:') or hostname.startswith('https:'):
32-
return hostname
33-
if utils.ping_registry('https://' + hostname):
34-
return 'https://' + hostname
35-
elif insecure:
36-
return 'http://' + hostname
37-
else:
38-
raise errors.DockerException(
39-
"HTTPS endpoint unresponsive and insecure mode isn't enabled."
32+
def resolve_repository_name(repo_name, insecure=False):
33+
if insecure:
34+
warnings.warn(
35+
constants.INSECURE_REGISTRY_DEPRECATION_WARNING.format(
36+
'resolve_repository_name()'
37+
), DeprecationWarning
4038
)
4139

42-
43-
def resolve_repository_name(repo_name, insecure=False):
4440
if '://' in repo_name:
4541
raise errors.InvalidRepository(
4642
'Repository name cannot contain a scheme ({0})'.format(repo_name))
4743
parts = repo_name.split('/', 1)
4844
if '.' not in parts[0] and ':' not in parts[0] and parts[0] != 'localhost':
4945
# This is a docker index repo (ex: foo/bar or ubuntu)
50-
return INDEX_URL, repo_name
46+
return INDEX_NAME, repo_name
5147
if len(parts) < 2:
5248
raise errors.InvalidRepository(
5349
'Invalid repository name ({0})'.format(repo_name))
@@ -57,7 +53,7 @@ def resolve_repository_name(repo_name, insecure=False):
5753
'Invalid repository name, try "{0}" instead'.format(parts[1])
5854
)
5955

60-
return expand_registry_url(parts[0], insecure), parts[1]
56+
return parts[0], parts[1]
6157

6258

6359
def resolve_authconfig(authconfig, registry=None):
@@ -68,7 +64,7 @@ def resolve_authconfig(authconfig, registry=None):
6864
Returns None if no match was found.
6965
"""
7066
# Default to the public index server
71-
registry = convert_to_hostname(registry) if registry else INDEX_URL
67+
registry = convert_to_hostname(registry) if registry else INDEX_NAME
7268

7369
if registry in authconfig:
7470
return authconfig[registry]
@@ -185,7 +181,7 @@ def load_config(config_path=None):
185181
'Invalid or empty configuration file!')
186182

187183
username, password = decode_auth(data[0])
188-
conf[INDEX_URL] = {
184+
conf[INDEX_NAME] = {
189185
'username': username,
190186
'password': password,
191187
'email': data[1],

docker/client.py

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
from . import errors
2626
from .auth import auth
2727
from .utils import utils, check_resource
28+
from .constants import INSECURE_REGISTRY_DEPRECATION_WARNING
2829

2930

3031
class Client(clientbase.ClientBase):
@@ -267,9 +268,10 @@ def events(self, since=None, until=None, filters=None, decode=None):
267268
'filters': filters
268269
}
269270

270-
return self._stream_helper(self.get(self._url('/events'),
271-
params=params, stream=True),
272-
decode=decode)
271+
return self._stream_helper(
272+
self.get(self._url('/events'), params=params, stream=True),
273+
decode=decode
274+
)
273275

274276
def exec_create(self, container, cmd, stdout=True, stderr=True, tty=False,
275277
privileged=False):
@@ -499,6 +501,12 @@ def load_image(self, data):
499501

500502
def login(self, username, password=None, email=None, registry=None,
501503
reauth=False, insecure_registry=False, dockercfg_path=None):
504+
if insecure_registry:
505+
warnings.warn(
506+
INSECURE_REGISTRY_DEPRECATION_WARNING.format('login()'),
507+
DeprecationWarning
508+
)
509+
502510
# If we don't have any auth data so far, try reloading the config file
503511
# one more time in case anything showed up in there.
504512
# If dockercfg_path is passed check to see if the config file exists,
@@ -584,11 +592,15 @@ def port(self, container, private_port):
584592

585593
def pull(self, repository, tag=None, stream=False,
586594
insecure_registry=False, auth_config=None):
595+
if insecure_registry:
596+
warnings.warn(
597+
INSECURE_REGISTRY_DEPRECATION_WARNING.format('pull()'),
598+
DeprecationWarning
599+
)
600+
587601
if not tag:
588602
repository, tag = utils.parse_repository_tag(repository)
589-
registry, repo_name = auth.resolve_repository_name(
590-
repository, insecure=insecure_registry
591-
)
603+
registry, repo_name = auth.resolve_repository_name(repository)
592604
if repo_name.count(":") == 1:
593605
repository, tag = repository.rsplit(":", 1)
594606

@@ -631,11 +643,15 @@ def pull(self, repository, tag=None, stream=False,
631643

632644
def push(self, repository, tag=None, stream=False,
633645
insecure_registry=False):
646+
if insecure_registry:
647+
warnings.warn(
648+
INSECURE_REGISTRY_DEPRECATION_WARNING.format('push()'),
649+
DeprecationWarning
650+
)
651+
634652
if not tag:
635653
repository, tag = utils.parse_repository_tag(repository)
636-
registry, repo_name = auth.resolve_repository_name(
637-
repository, insecure=insecure_registry
638-
)
654+
registry, repo_name = auth.resolve_repository_name(repository)
639655
u = self._url("/images/{0}/push".format(repository))
640656
params = {
641657
'tag': tag

docker/constants.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,7 @@
44
CONTAINER_LIMITS_KEYS = [
55
'memory', 'memswap', 'cpushares', 'cpusetcpus'
66
]
7+
8+
INSECURE_REGISTRY_DEPRECATION_WARNING = \
9+
'The `insecure_registry` argument to {} ' \
10+
'is deprecated and non-functional. Please remove it.'

docker/utils/utils.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import shlex
2020
import tarfile
2121
import tempfile
22+
import warnings
2223
from distutils.version import StrictVersion
2324
from fnmatch import fnmatch
2425
from datetime import datetime
@@ -120,6 +121,11 @@ def compare_version(v1, v2):
120121

121122

122123
def ping_registry(url):
124+
warnings.warn(
125+
'The `ping_registry` method is deprecated and will be removed.',
126+
DeprecationWarning
127+
)
128+
123129
return ping(url + '/v2/', [401]) or ping(url + '/v1/_ping')
124130

125131

tests/test.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2424,9 +2424,9 @@ def test_load_config(self):
24242424
f.write('auth = {0}\n'.format(auth_))
24252425
f.write('email = [email protected]')
24262426
cfg = docker.auth.load_config(dockercfg_path)
2427-
self.assertTrue(docker.auth.INDEX_URL in cfg)
2428-
self.assertNotEqual(cfg[docker.auth.INDEX_URL], None)
2429-
cfg = cfg[docker.auth.INDEX_URL]
2427+
self.assertTrue(docker.auth.INDEX_NAME in cfg)
2428+
self.assertNotEqual(cfg[docker.auth.INDEX_NAME], None)
2429+
cfg = cfg[docker.auth.INDEX_NAME]
24302430
self.assertEqual(cfg['username'], 'sakuya')
24312431
self.assertEqual(cfg['password'], 'izayoi')
24322432
self.assertEqual(cfg['email'], '[email protected]')

tests/utils_test.py

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
create_host_config, Ulimit, LogConfig, parse_bytes
1010
)
1111
from docker.utils.ports import build_port_bindings, split_port
12-
from docker.auth import resolve_authconfig
12+
from docker.auth import resolve_repository_name, resolve_authconfig
1313

1414
import base
1515

@@ -167,6 +167,61 @@ def test_logconfig_invalid_type(self):
167167
type=LogConfig.types.JSON, config='helloworld'
168168
))
169169

170+
def test_resolve_repository_name(self):
171+
# docker hub library image
172+
self.assertEqual(
173+
resolve_repository_name('image'),
174+
('index.docker.io', 'image'),
175+
)
176+
177+
# docker hub image
178+
self.assertEqual(
179+
resolve_repository_name('username/image'),
180+
('index.docker.io', 'username/image'),
181+
)
182+
183+
# private registry
184+
self.assertEqual(
185+
resolve_repository_name('my.registry.net/image'),
186+
('my.registry.net', 'image'),
187+
)
188+
189+
# private registry with port
190+
self.assertEqual(
191+
resolve_repository_name('my.registry.net:5000/image'),
192+
('my.registry.net:5000', 'image'),
193+
)
194+
195+
# private registry with username
196+
self.assertEqual(
197+
resolve_repository_name('my.registry.net/username/image'),
198+
('my.registry.net', 'username/image'),
199+
)
200+
201+
# no dots but port
202+
self.assertEqual(
203+
resolve_repository_name('hostname:5000/image'),
204+
('hostname:5000', 'image'),
205+
)
206+
207+
# no dots but port and username
208+
self.assertEqual(
209+
resolve_repository_name('hostname:5000/username/image'),
210+
('hostname:5000', 'username/image'),
211+
)
212+
213+
# localhost
214+
self.assertEqual(
215+
resolve_repository_name('localhost/image'),
216+
('localhost', 'image'),
217+
)
218+
219+
# localhost with username
220+
self.assertEqual(
221+
resolve_repository_name('localhost/username/image'),
222+
('localhost', 'username/image'),
223+
)
224+
170225
def test_resolve_authconfig(self):
171226
auth_config = {
172227
'https://index.docker.io/v1/': {'auth': 'indexuser'},
@@ -231,6 +286,40 @@ def test_resolve_authconfig(self):
231286
resolve_authconfig(auth_config, 'does.not.exist') is None
232287
)
233288

289+
def test_resolve_registry_and_auth(self):
290+
auth_config = {
291+
'https://index.docker.io/v1/': {'auth': 'indexuser'},
292+
'my.registry.net': {'auth': 'privateuser'},
293+
}
294+
295+
# library image
296+
image = 'image'
297+
self.assertEqual(
298+
resolve_authconfig(auth_config, resolve_repository_name(image)[0]),
299+
{'auth': 'indexuser'},
300+
)
301+
302+
# docker hub image
303+
image = 'username/image'
304+
self.assertEqual(
305+
resolve_authconfig(auth_config, resolve_repository_name(image)[0]),
306+
{'auth': 'indexuser'},
307+
)
308+
309+
# private registry
310+
image = 'my.registry.net/image'
311+
self.assertEqual(
312+
resolve_authconfig(auth_config, resolve_repository_name(image)[0]),
313+
{'auth': 'privateuser'},
314+
)
315+
316+
# unauthenticated registry
317+
image = 'other.registry.net/image'
318+
self.assertEqual(
319+
resolve_authconfig(auth_config, resolve_repository_name(image)[0]),
320+
None,
321+
)
322+
234323
def test_split_port_with_host_ip(self):
235324
internal_port, external_port = split_port("127.0.0.1:1000:2000")
236325
self.assertEqual(internal_port, ["2000"])

0 commit comments

Comments
 (0)