def test_credentials_popen_raise_rewrapped(fake_user_home, popen_except, match): """Tests DockerCredentials.get_login wraps common Popen errors correctly""" with MockPopen.mock(target='drclip.creds.Popen', raise_on_call=popen_except): with pytest.raises(CredentialsException, match=match): DockerCredentials().get_login('test')
def test_get_credentials(fake_user_home): """Tests DockerCredentials.get_login under expected environment with registry""" with MockPopen.mock(target='drclip.creds.Popen') as mock: mock.add_cmd(['docker-credential-secretservice', 'get'], stdin=REGISTRY.encode(), stdout=GOOD_CMD_GET, rc=0) assert DockerCredentials().get_login(REGISTRY) == ('user', 'pass')
def test_credentials_not_found(fake_user_home): """Tests DockerCredentials.get_login raises properly when unknown registry supplied""" with MockPopen.mock(target='drclip.creds.Popen') as mock: mock.add_cmd(['docker-credential-secretservice', 'get'], stdin=b'test', stdout=b'credentials not found', rc=1) with pytest.raises(CredentialsNotFound, match='Credentials not found'): DockerCredentials().get_login('test')
def test_credentials_unknown_error(fake_user_home): """Tests DockerCredentials.get_login raises properly when the secret command returns 1 with a strange message""" with MockPopen.mock(target='drclip.creds.Popen') as mock: mock.add_cmd(['docker-credential-secretservice', 'get'], stdin=b'test', stdout=b'strange error', rc=1) with pytest.raises( CredentialsException, match=r'Unknown error when calling .+ strange error'): DockerCredentials().get_login('test')
def test_get_credentials_when_passed_file(fake_user_home): """Tests DockerCredentials.get_login under expected environment with registry""" with MockPopen.mock(target='drclip.creds.Popen') as mock: mock.add_cmd(['docker-credential-secretservice', 'get'], stdin=REGISTRY.encode(), stdout=GOOD_CMD_GET, rc=0) with open(f'{fake_user_home}/someotherconfig.json', 'w+') as fh: fh.write(GOOD_DOCKER_CONFIG) fh.seek(0) assert DockerCredentials(config=fh).get_login(REGISTRY) == ('user', 'pass')
def __init__(self, registry: str, credentials: DockerCredentials = None): """ Implements interface into V2 docker registry :param registry: the registry url to which this object will communicate :param credentials: provides credentials to use for authentication to registry """ self._scheme = 'https' self._prefix = 'v2' self._registry = registry self._credentials = credentials if credentials else DockerCredentials() self._session = requests.Session()
def drclip(ctx: click.core.Context, config: TextIOWrapper, registry: str): """Runs commands against docker registries""" ctx.obj = CmdContext(RegistryV2API(registry, DockerCredentials(config))) err = None try: ctx.obj.api.head() # Simple version check / connectivity check except CredentialsNotFound: err = f'Error: Credentials for {registry} could not be located (you may need to run docker login ... )' except CredentialsException as e: err = e if err: click.echo(err, err=True) sys.exit(1)
def test_known(fake_user_home): """Tests DockerCredentials.known under expected environment""" assert DockerCredentials().known == [REGISTRY]
def test_unsupported_handling(fake_user_home): """Tests we handle unsupported credential stores with informative exception""" with pytest.raises(UnsupportedStore, match='not supported'): DockerCredentials().get_login(REGISTRY)
def reg_tab(ctx: click.core.Context, args: list, incomplete: str) -> list: """Tab completion helper for registry argument""" credentials = DockerCredentials() return [r for r in credentials.known if incomplete in r]