mirror of https://github.com/docker/docker-py.git
Support credHelpers section in config.json
Signed-off-by: Joffrey F <joffrey@docker.com>
This commit is contained in:
parent
a3b1059839
commit
320c810471
|
@ -70,6 +70,15 @@ def split_repo_name(repo_name):
|
||||||
return tuple(parts)
|
return tuple(parts)
|
||||||
|
|
||||||
|
|
||||||
|
def get_credential_store(authconfig, registry):
|
||||||
|
if not registry or registry == INDEX_NAME:
|
||||||
|
registry = 'https://index.docker.io/v1/'
|
||||||
|
|
||||||
|
return authconfig.get('credHelpers', {}).get(registry) or authconfig.get(
|
||||||
|
'credsStore'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def resolve_authconfig(authconfig, registry=None):
|
def resolve_authconfig(authconfig, registry=None):
|
||||||
"""
|
"""
|
||||||
Returns the authentication data from the given auth configuration for a
|
Returns the authentication data from the given auth configuration for a
|
||||||
|
@ -77,13 +86,17 @@ def resolve_authconfig(authconfig, registry=None):
|
||||||
with full URLs are stripped down to hostnames before checking for a match.
|
with full URLs are stripped down to hostnames before checking for a match.
|
||||||
Returns None if no match was found.
|
Returns None if no match was found.
|
||||||
"""
|
"""
|
||||||
if 'credsStore' in authconfig:
|
|
||||||
log.debug(
|
if 'credHelpers' in authconfig or 'credsStore' in authconfig:
|
||||||
'Using credentials store "{0}"'.format(authconfig['credsStore'])
|
store_name = get_credential_store(authconfig, registry)
|
||||||
)
|
if store_name is not None:
|
||||||
return _resolve_authconfig_credstore(
|
log.debug(
|
||||||
authconfig, registry, authconfig['credsStore']
|
'Using credentials store "{0}"'.format(store_name)
|
||||||
)
|
)
|
||||||
|
return _resolve_authconfig_credstore(
|
||||||
|
authconfig, registry, store_name
|
||||||
|
)
|
||||||
|
|
||||||
# Default to the public index server
|
# Default to the public index server
|
||||||
registry = resolve_index_name(registry) if registry else INDEX_NAME
|
registry = resolve_index_name(registry) if registry else INDEX_NAME
|
||||||
log.debug("Looking for auth entry for {0}".format(repr(registry)))
|
log.debug("Looking for auth entry for {0}".format(repr(registry)))
|
||||||
|
@ -274,6 +287,9 @@ def load_config(config_path=None):
|
||||||
if data.get('credsStore'):
|
if data.get('credsStore'):
|
||||||
log.debug("Found 'credsStore' section")
|
log.debug("Found 'credsStore' section")
|
||||||
res.update({'credsStore': data['credsStore']})
|
res.update({'credsStore': data['credsStore']})
|
||||||
|
if data.get('credHelpers'):
|
||||||
|
log.debug("Found 'credHelpers' section")
|
||||||
|
res.update({'credHelpers': data['credHelpers']})
|
||||||
if res:
|
if res:
|
||||||
return res
|
return res
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -272,6 +272,57 @@ class ResolveAuthTest(unittest.TestCase):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class CredStoreTest(unittest.TestCase):
|
||||||
|
def test_get_credential_store(self):
|
||||||
|
auth_config = {
|
||||||
|
'credHelpers': {
|
||||||
|
'registry1.io': 'truesecret',
|
||||||
|
'registry2.io': 'powerlock'
|
||||||
|
},
|
||||||
|
'credsStore': 'blackbox',
|
||||||
|
}
|
||||||
|
|
||||||
|
assert auth.get_credential_store(
|
||||||
|
auth_config, 'registry1.io'
|
||||||
|
) == 'truesecret'
|
||||||
|
assert auth.get_credential_store(
|
||||||
|
auth_config, 'registry2.io'
|
||||||
|
) == 'powerlock'
|
||||||
|
assert auth.get_credential_store(
|
||||||
|
auth_config, 'registry3.io'
|
||||||
|
) == 'blackbox'
|
||||||
|
|
||||||
|
def test_get_credential_store_no_default(self):
|
||||||
|
auth_config = {
|
||||||
|
'credHelpers': {
|
||||||
|
'registry1.io': 'truesecret',
|
||||||
|
'registry2.io': 'powerlock'
|
||||||
|
},
|
||||||
|
}
|
||||||
|
assert auth.get_credential_store(
|
||||||
|
auth_config, 'registry2.io'
|
||||||
|
) == 'powerlock'
|
||||||
|
assert auth.get_credential_store(
|
||||||
|
auth_config, 'registry3.io'
|
||||||
|
) is None
|
||||||
|
|
||||||
|
def test_get_credential_store_default_index(self):
|
||||||
|
auth_config = {
|
||||||
|
'credHelpers': {
|
||||||
|
'https://index.docker.io/v1/': 'powerlock'
|
||||||
|
},
|
||||||
|
'credsStore': 'truesecret'
|
||||||
|
}
|
||||||
|
|
||||||
|
assert auth.get_credential_store(auth_config, None) == 'powerlock'
|
||||||
|
assert auth.get_credential_store(
|
||||||
|
auth_config, 'docker.io'
|
||||||
|
) == 'powerlock'
|
||||||
|
assert auth.get_credential_store(
|
||||||
|
auth_config, 'images.io'
|
||||||
|
) == 'truesecret'
|
||||||
|
|
||||||
|
|
||||||
class FindConfigFileTest(unittest.TestCase):
|
class FindConfigFileTest(unittest.TestCase):
|
||||||
def tmpdir(self, name):
|
def tmpdir(self, name):
|
||||||
tmpdir = ensuretemp(name)
|
tmpdir = ensuretemp(name)
|
||||||
|
|
Loading…
Reference in New Issue