mirror of https://github.com/docker/docker-py.git
				
				
				
			Merge pull request #427 from abanna/adding_multiple_dockercfg_support
adding the ability to login with different dockercfg files.
This commit is contained in:
		
						commit
						53beba75f4
					
				|  | @ -117,14 +117,20 @@ def encode_full_header(auth): | |||
|     return encode_header({'configs': auth}) | ||||
| 
 | ||||
| 
 | ||||
| def load_config(root=None): | ||||
|     """Loads authentication data from a Docker configuration file in the given | ||||
|     root directory.""" | ||||
| def load_config(config_path=None): | ||||
|     """ | ||||
|     Loads authentication data from a Docker configuration file in the given | ||||
|     root directory or if config_path is passed use given path. | ||||
|     """ | ||||
|     conf = {} | ||||
|     data = None | ||||
| 
 | ||||
|     config_file = os.path.join(root or os.environ.get('HOME', '.'), | ||||
|                                DOCKER_CONFIG_FILENAME) | ||||
|     config_file = config_path or os.path.join(os.environ.get('HOME', '.'), | ||||
|                                               DOCKER_CONFIG_FILENAME) | ||||
| 
 | ||||
|     # if config path doesn't exist return empty config | ||||
|     if not os.path.exists(config_file): | ||||
|         return {} | ||||
| 
 | ||||
|     # First try as JSON | ||||
|     try: | ||||
|  |  | |||
|  | @ -715,10 +715,14 @@ class Client(requests.Session): | |||
|         self._raise_for_status(res) | ||||
| 
 | ||||
|     def login(self, username, password=None, email=None, registry=None, | ||||
|               reauth=False, insecure_registry=False): | ||||
|               reauth=False, insecure_registry=False, dockercfg_path=None): | ||||
|         # If we don't have any auth data so far, try reloading the config file | ||||
|         # one more time in case anything showed up in there. | ||||
|         if not self._auth_configs: | ||||
|         # If dockercfg_path is passed check to see if the config file exists, | ||||
|         # if so load that config. | ||||
|         if dockercfg_path and os.path.exists(dockercfg_path): | ||||
|             self._auth_configs = auth.load_config(dockercfg_path) | ||||
|         elif not self._auth_configs: | ||||
|             self._auth_configs = auth.load_config() | ||||
| 
 | ||||
|         registry = auth.expand_registry_url(registry, insecure_registry) \ | ||||
|  |  | |||
|  | @ -29,6 +29,7 @@ import threading | |||
| import time | ||||
| import unittest | ||||
| import warnings | ||||
| import random | ||||
| 
 | ||||
| import docker | ||||
| import requests | ||||
|  | @ -2004,12 +2005,13 @@ class DockerClientTest(Cleanup, unittest.TestCase): | |||
|     def test_load_config(self): | ||||
|         folder = tempfile.mkdtemp() | ||||
|         self.addCleanup(shutil.rmtree, folder) | ||||
|         f = open(os.path.join(folder, '.dockercfg'), 'w') | ||||
|         dockercfg_path = os.path.join(folder, '.dockercfg') | ||||
|         f = open(dockercfg_path, 'w') | ||||
|         auth_ = base64.b64encode(b'sakuya:izayoi').decode('ascii') | ||||
|         f.write('auth = {0}\n'.format(auth_)) | ||||
|         f.write('email = sakuya@scarlet.net') | ||||
|         f.close() | ||||
|         cfg = docker.auth.load_config(folder) | ||||
|         cfg = docker.auth.load_config(dockercfg_path) | ||||
|         self.assertTrue(docker.auth.INDEX_URL in cfg) | ||||
|         self.assertNotEqual(cfg[docker.auth.INDEX_URL], None) | ||||
|         cfg = cfg[docker.auth.INDEX_URL] | ||||
|  | @ -2018,6 +2020,34 @@ class DockerClientTest(Cleanup, unittest.TestCase): | |||
|         self.assertEqual(cfg['email'], 'sakuya@scarlet.net') | ||||
|         self.assertEqual(cfg.get('auth'), None) | ||||
| 
 | ||||
|     def test_load_config_with_random_name(self): | ||||
|         folder = tempfile.mkdtemp() | ||||
|         self.addCleanup(shutil.rmtree, folder) | ||||
| 
 | ||||
|         dockercfg_path = os.path.join(folder, | ||||
|                                       '.{0}.dockercfg'.format( | ||||
|                                           random.randrange(100000))) | ||||
|         registry = 'https://your.private.registry.io' | ||||
|         auth_ = base64.b64encode(b'sakuya:izayoi').decode('ascii') | ||||
|         config = { | ||||
|             registry: { | ||||
|                 'auth': '{0}'.format(auth_), | ||||
|                 'email': 'sakuya@scarlet.net' | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         with open(dockercfg_path, 'w') as f: | ||||
|             f.write(json.dumps(config)) | ||||
| 
 | ||||
|         cfg = docker.auth.load_config(dockercfg_path) | ||||
|         self.assertTrue(registry in cfg) | ||||
|         self.assertNotEqual(cfg[registry], None) | ||||
|         cfg = cfg[registry] | ||||
|         self.assertEqual(cfg['username'], 'sakuya') | ||||
|         self.assertEqual(cfg['password'], 'izayoi') | ||||
|         self.assertEqual(cfg['email'], 'sakuya@scarlet.net') | ||||
|         self.assertEqual(cfg.get('auth'), None) | ||||
| 
 | ||||
|     def test_tar_with_excludes(self): | ||||
|         base = tempfile.mkdtemp() | ||||
|         self.addCleanup(shutil.rmtree, base) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue