@Override public InetSocketAddress translate(InetSocketAddress socketAddress) { InetAddress address = socketAddress.getAddress(); try { // InetAddress#getHostName() is supposed to perform a reverse DNS lookup, but for some reason // it doesn't work // within the same EC2 region (it returns the IP address itself). // We use an alternate implementation: String domainName = lookupPtrRecord(reverse(address)); if (domainName == null) { logger.warn("Found no domain name for {}, returning it as-is", address); return socketAddress; } InetAddress translatedAddress = InetAddress.getByName(domainName); logger.debug("Resolved {} to {}", address, translatedAddress); return new InetSocketAddress(translatedAddress, socketAddress.getPort()); } catch (Exception e) { logger.warn("Error resolving " + address + ", returning it as-is", e); return socketAddress; } }
@VisibleForTesting static String reverse(InetAddress address) { byte[] bytes = address.getAddress(); if (bytes.length == 4) return reverseIpv4(bytes); else return reverseIpv6(bytes); }
@Test(groups = "unit") public void should_return_same_address_when_exception_encountered() throws Exception { InitialDirContext mock = mock(InitialDirContext.class); when(mock.getAttributes(anyString(), any(String[].class))) .thenThrow(new NamingException("Problem resolving address (not really).")); EC2MultiRegionAddressTranslator translator = new EC2MultiRegionAddressTranslator(mock); InetSocketAddress address = new InetSocketAddress("192.0.2.5", 9042); assertThat(translator.translate(address)).isEqualTo(address); }
@Test(groups = "unit") public void should_build_reversed_domain_name_for_ip_v6() throws Exception { InetAddress address = InetAddress.getByName("2001:db8::567:89ab"); assertThat(EC2MultiRegionAddressTranslator.reverse(address)) .isEqualTo("b.a.9.8.7.6.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa"); } }
@Test(groups = "unit") public void should_close_context_when_closed() throws Exception { InitialDirContext mock = mock(InitialDirContext.class); EC2MultiRegionAddressTranslator translator = new EC2MultiRegionAddressTranslator(mock); // ensure close has not been called to this point. verify(mock, times(0)).close(); translator.close(); // ensure close is closed. verify(mock).close(); }
@Override public AddressTranslator build() { return new EC2MultiRegionAddressTranslator(); } }
@Test(groups = "unit") public void should_build_reversed_domain_name_for_ip_v4() throws Exception { InetAddress address = InetAddress.getByName("192.0.2.5"); assertThat(EC2MultiRegionAddressTranslator.reverse(address)) .isEqualTo("5.2.0.192.in-addr.arpa"); }
@Test(groups = "unit") public void should_close_context_when_closed() throws Exception { InitialDirContext mock = mock(InitialDirContext.class); EC2MultiRegionAddressTranslator translator = new EC2MultiRegionAddressTranslator(mock); // ensure close has not been called to this point. verify(mock, times(0)).close(); translator.close(); // ensure close is closed. verify(mock).close(); }
@Override public AddressTranslator build() { return new EC2MultiRegionAddressTranslator(); } }
@Override public InetSocketAddress translate(InetSocketAddress socketAddress) { InetAddress address = socketAddress.getAddress(); try { // InetAddress#getHostName() is supposed to perform a reverse DNS lookup, but for some reason it doesn't work // within the same EC2 region (it returns the IP address itself). // We use an alternate implementation: String domainName = lookupPtrRecord(reverse(address)); if (domainName == null) { logger.warn("Found no domain name for {}, returning it as-is", address); return socketAddress; } InetAddress translatedAddress = InetAddress.getByName(domainName); logger.debug("Resolved {} to {}", address, translatedAddress); return new InetSocketAddress(translatedAddress, socketAddress.getPort()); } catch (Exception e) { logger.warn("Error resolving " + address + ", returning it as-is", e); return socketAddress; } }
@VisibleForTesting static String reverse(InetAddress address) { byte[] bytes = address.getAddress(); if (bytes.length == 4) return reverseIpv4(bytes); else return reverseIpv6(bytes); }
@Test(groups = "unit") public void should_return_same_address_when_no_entry_found() throws Exception { InitialDirContext mock = mock(InitialDirContext.class); when(mock.getAttributes(anyString(), any(String[].class))).thenReturn(new BasicAttributes()); EC2MultiRegionAddressTranslator translator = new EC2MultiRegionAddressTranslator(mock); InetSocketAddress address = new InetSocketAddress("192.0.2.5", 9042); assertThat(translator.translate(address)).isEqualTo(address); }
@Test(groups = "unit") public void should_build_reversed_domain_name_for_ip_v4() throws Exception { InetAddress address = InetAddress.getByName("192.0.2.5"); assertThat(EC2MultiRegionAddressTranslator.reverse(address)) .isEqualTo("5.2.0.192.in-addr.arpa"); }
@Override public InetSocketAddress translate(InetSocketAddress socketAddress) { InetAddress address = socketAddress.getAddress(); try { // InetAddress#getHostName() is supposed to perform a reverse DNS lookup, but for some reason it doesn't work // within the same EC2 region (it returns the IP address itself). // We use an alternate implementation: String domainName = lookupPtrRecord(reverse(address)); if (domainName == null) { logger.warn("Found no domain name for {}, returning it as-is", address); return socketAddress; } InetAddress translatedAddress = InetAddress.getByName(domainName); logger.debug("Resolved {} to {}", address, translatedAddress); return new InetSocketAddress(translatedAddress, socketAddress.getPort()); } catch (Exception e) { logger.warn("Error resolving " + address + ", returning it as-is", e); return socketAddress; } }
@VisibleForTesting static String reverse(InetAddress address) { byte[] bytes = address.getAddress(); if (bytes.length == 4) return reverseIpv4(bytes); else return reverseIpv6(bytes); }
@Test(groups = "unit") public void should_return_new_address_when_match_found() throws Exception { InetSocketAddress expectedAddress = new InetSocketAddress("54.32.55.66", 9042); InitialDirContext mock = mock(InitialDirContext.class); when(mock.getAttributes("5.2.0.192.in-addr.arpa", new String[] {"PTR"})) .thenReturn(new BasicAttributes("PTR", expectedAddress.getHostName())); EC2MultiRegionAddressTranslator translator = new EC2MultiRegionAddressTranslator(mock); InetSocketAddress address = new InetSocketAddress("192.0.2.5", 9042); assertThat(translator.translate(address)).isEqualTo(expectedAddress); }
@Test(groups = "unit") public void should_build_reversed_domain_name_for_ip_v6() throws Exception { InetAddress address = InetAddress.getByName("2001:db8::567:89ab"); assertThat(EC2MultiRegionAddressTranslator.reverse(address)) .isEqualTo("b.a.9.8.7.6.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa"); } }
@Override public InetSocketAddress translate(InetSocketAddress socketAddress) { InetAddress address = socketAddress.getAddress(); try { // InetAddress#getHostName() is supposed to perform a reverse DNS lookup, but for some reason it doesn't work // within the same EC2 region (it returns the IP address itself). // We use an alternate implementation: String domainName = lookupPtrRecord(reverse(address)); if (domainName == null) { logger.warn("Found no domain name for {}, returning it as-is", address); return socketAddress; } InetAddress translatedAddress = InetAddress.getByName(domainName); logger.debug("Resolved {} to {}", address, translatedAddress); return new InetSocketAddress(translatedAddress, socketAddress.getPort()); } catch (Exception e) { logger.warn("Error resolving " + address + ", returning it as-is", e); return socketAddress; } }
@VisibleForTesting static String reverse(InetAddress address) { byte[] bytes = address.getAddress(); if (bytes.length == 4) return reverseIpv4(bytes); else return reverseIpv6(bytes); }
@Test(groups = "unit") public void should_return_same_address_when_exception_encountered() throws Exception { InitialDirContext mock = mock(InitialDirContext.class); when(mock.getAttributes(anyString(), any(String[].class))) .thenThrow(new NamingException("Problem resolving address (not really).")); EC2MultiRegionAddressTranslator translator = new EC2MultiRegionAddressTranslator(mock); InetSocketAddress address = new InetSocketAddress("192.0.2.5", 9042); assertThat(translator.translate(address)).isEqualTo(address); }