String effectiveId = amazonInfo.get(AmazonInfo.MetaDataKey.instanceId); if (effectiveId == null) { amazonInfo.getMetadata().put(AmazonInfo.MetaDataKey.instanceId.getName(), info.getId());
for (MetaDataKey key : MetaDataKey.values()) { int numOfRetries = config.getNumRetries(); while (numOfRetries-- > 0) { String mac = null; if (key == MetaDataKey.vpcId) { mac = result.metadata.get(MetaDataKey.mac.getName()); // mac should be read before vpcId due to declaration order URL url = key.getURL(null, mac); String value = AmazonInfoUtils.readEc2MetadataUrl(key, url, config.getConnectTimeout(), config.getReadTimeout()); if (value != null) { result.metadata.put(key.getName(), value); && !result.metadata.containsKey(MetaDataKey.instanceId.getName())) {
@Override public String resolveDefaultAddress(boolean refresh) { // In this method invocation data center info will be refreshed. String result = getHostName(refresh); for (String name : getDefaultAddressResolutionOrder()) { try { AmazonInfo.MetaDataKey key = AmazonInfo.MetaDataKey.valueOf(name); String address = amazonInfoHolder.get().get(key); if (address != null && !address.isEmpty()) { result = address; break; } } catch (Exception e) { LOG.error("failed to resolve default address for key {}, skipping", name, e); } } return result; } }
String effectiveId = amazonInfo.get(AmazonInfo.MetaDataKey.instanceId); if (effectiveId == null) { amazonInfo.getMetadata().put(AmazonInfo.MetaDataKey.instanceId.getName(), info.getId());
metadataMap.put(AmazonInfo.MetaDataKey.instanceId.getName(), fallbackAddressProvider.getFallbackIp()); metadataMap.put(AmazonInfo.MetaDataKey.publicHostname.getName(), fallbackAddressProvider.getFallbackHostname()); info.setMetadata(metadataMap); info.getMetadata().put(AmazonInfo.MetaDataKey.publicHostname.getName(), (info.get(AmazonInfo.MetaDataKey.localIpv4)));
for (MetaDataKey key : MetaDataKey.values()) { int numOfRetries = config.getNumRetries(); while (numOfRetries-- > 0) { String mac = null; if (key == MetaDataKey.vpcId) { mac = result.metadata.get(MetaDataKey.mac.getName()); // mac should be read before vpcId due to declaration order URL url = key.getURL(null, mac); String value = AmazonInfoUtils.readEc2MetadataUrl(key, url, config.getConnectTimeout(), config.getReadTimeout()); if (value != null) { result.metadata.put(key.getName(), value); && !result.metadata.containsKey(MetaDataKey.instanceId.getName())) {
private boolean autoDetectEc2(AmazonInfoConfig amazonInfoConfig) { try { URL url = AmazonInfo.MetaDataKey.instanceId.getURL(null, null); String id = AmazonInfoUtils.readEc2MetadataUrl( AmazonInfo.MetaDataKey.instanceId, url, amazonInfoConfig.getConnectTimeout(), amazonInfoConfig.getReadTimeout() ); if (id != null) { logger.info("Auto detected EC2 deployment environment, instanceId = {}", id); return true; } else { logger.info("Auto detected non-EC2 deployment environment, instanceId from metadata url is null"); return false; } } catch (SocketTimeoutException e) { logger.info("Auto detected non-EC2 deployment environment, connection to ec2 instance metadata url failed."); } catch (Exception e) { logger.warn("Failed to auto-detect whether we are in EC2 due to unexpected exception", e); } return false; }
public static String readEc2MetadataUrl(MetaDataKey metaDataKey, URL url, int connectionTimeoutMs, int readTimeoutMs) throws IOException { HttpURLConnection uc = (HttpURLConnection) url.openConnection(); uc.setConnectTimeout(connectionTimeoutMs); uc.setReadTimeout(readTimeoutMs); uc.setRequestProperty("User-Agent", "eureka-java-client"); if (uc.getResponseCode() != HttpURLConnection.HTTP_OK) { // need to read the error for clean connection close BufferedReader br = new BufferedReader(new InputStreamReader(uc.getErrorStream())); try { while (br.readLine() != null) { // do nothing but keep reading the line } } finally { br.close(); } } else { return metaDataKey.read(uc.getInputStream()); } return null; } }
@Override public String resolveDefaultAddress(boolean refresh) { // In this method invocation data center info will be refreshed. String result = getHostName(refresh); for (String name : getDefaultAddressResolutionOrder()) { try { AmazonInfo.MetaDataKey key = AmazonInfo.MetaDataKey.valueOf(name); String address = amazonInfoHolder.get().get(key); if (address != null && !address.isEmpty()) { result = address; break; } } catch (Exception e) { LOG.error("failed to resolve default address for key {}, skipping", name, e); } } return result; } }
@Nullable public String getInstanceRegion(InstanceInfo instanceInfo) { if (instanceInfo.getDataCenterInfo() == null || instanceInfo.getDataCenterInfo().getName() == null) { logger.warn("Cannot get region for instance id:{}, app:{} as dataCenterInfo is null. Returning local:{} by default", instanceInfo.getId(), instanceInfo.getAppName(), localRegion); return localRegion; } if (DataCenterInfo.Name.Amazon.equals(instanceInfo.getDataCenterInfo().getName())) { AmazonInfo amazonInfo = (AmazonInfo) instanceInfo.getDataCenterInfo(); Map<String, String> metadata = amazonInfo.getMetadata(); String availabilityZone = metadata.get(AmazonInfo.MetaDataKey.availabilityZone.getName()); if (null != availabilityZone) { return azToRegionMapper.getRegionForAvailabilityZone(availabilityZone); } } return null; }
@Override public String resolveDefaultAddress(boolean refresh) { // In this method invocation data center info will be refreshed. String result = getHostName(refresh); for (String name : getDefaultAddressResolutionOrder()) { try { AmazonInfo.MetaDataKey key = AmazonInfo.MetaDataKey.valueOf(name); String address = amazonInfoHolder.get().get(key); if (address != null && !address.isEmpty()) { result = address; break; } } catch (Exception e) { logger.error("failed to resolve default address for key {}, skipping", name, e); } } return result; }
public Builder addMetadata(MetaDataKey key, String value) { result.metadata.put(key.getName(), value); return this; }
public String toString() { return getName(); } }
/** * Gets the AWS metadata specified in {@link MetaDataKey}. * * @param key * the metadata key. * @return String returning the value. */ public String get(MetaDataKey key) { return metadata.get(key.getName()); }
metadataMap.put(AmazonInfo.MetaDataKey.instanceId.getName(), fallbackAddressProvider.getFallbackIp()); metadataMap.put(AmazonInfo.MetaDataKey.publicHostname.getName(), fallbackAddressProvider.getFallbackHostname()); info.setMetadata(metadataMap); info.getMetadata().put(AmazonInfo.MetaDataKey.publicHostname.getName(), (info.get(AmazonInfo.MetaDataKey.localIpv4)));
@Test public void testExtractAccountId() throws Exception { String json = "{\n" + " \"imageId\" : \"ami-someId\",\n" + " \"instanceType\" : \"m1.small\",\n" + " \"version\" : \"2000-00-00\",\n" + " \"architecture\" : \"x86_64\",\n" + " \"accountId\" : \"1111111111\",\n" + " \"instanceId\" : \"i-someId\",\n" + " \"billingProducts\" : null,\n" + " \"pendingTime\" : \"2000-00-00T00:00:00Z\",\n" + " \"availabilityZone\" : \"us-east-1c\",\n" + " \"region\" : \"us-east-1\",\n" + " \"kernelId\" : \"aki-someId\",\n" + " \"ramdiskId\" : null,\n" + " \"privateIp\" : \"1.1.1.1\"\n" + "}"; InputStream inputStream = new ByteArrayInputStream(json.getBytes()); String accountId = AmazonInfo.MetaDataKey.accountId.read(inputStream); assertEquals("1111111111", accountId); } }
private boolean autoDetectEc2(AmazonInfoConfig amazonInfoConfig) { try { URL url = AmazonInfo.MetaDataKey.instanceId.getURL(null, null); String id = AmazonInfoUtils.readEc2MetadataUrl( AmazonInfo.MetaDataKey.instanceId, url, amazonInfoConfig.getConnectTimeout(), amazonInfoConfig.getReadTimeout() ); if (id != null) { logger.info("Auto detected EC2 deployment environment, instanceId = {}", id); return true; } else { logger.info("Auto detected non-EC2 deployment environment, instanceId from metadata url is null"); return false; } } catch (SocketTimeoutException e) { logger.info("Auto detected non-EC2 deployment environment, connection to ec2 instance metadata url failed."); } catch (Exception e) { logger.warn("Failed to auto-detect whether we are in EC2 due to unexpected exception", e); } return false; }
@Test public void testBadRegistrationOfDataCenterInfo() throws Exception { try { // test 400 when configured to return client error ConfigurationManager.getConfigInstance().setProperty("eureka.experimental.registration.validation.dataCenterInfoId", "true"); InstanceInfo instanceInfo = spy(InstanceInfoGenerator.takeOne()); when(instanceInfo.getDataCenterInfo()).thenReturn(new TestDataCenterInfo()); Response response = applicationResource.addInstance(instanceInfo, false + ""); assertThat(response.getStatus(), is(400)); // test backfill of data for AmazonInfo ConfigurationManager.getConfigInstance().setProperty("eureka.experimental.registration.validation.dataCenterInfoId", "false"); instanceInfo = spy(InstanceInfoGenerator.takeOne()); assertThat(instanceInfo.getDataCenterInfo(), instanceOf(AmazonInfo.class)); ((AmazonInfo) instanceInfo.getDataCenterInfo()).getMetadata().remove(AmazonInfo.MetaDataKey.instanceId.getName()); // clear the Id response = applicationResource.addInstance(instanceInfo, false + ""); assertThat(response.getStatus(), is(204)); } finally { ConfigurationManager.getConfigInstance().clearProperty("eureka.experimental.registration.validation.dataCenterInfoId"); } }
@Test public void testSpotInstanceTermination() { AmazonInfo initialAmazonInfo = AmazonInfo.Builder.newBuilder().build(); RefreshableAmazonInfoProvider refreshableAmazonInfoProvider = spy(new RefreshableAmazonInfoProvider(initialAmazonInfo, new Archaius1AmazonInfoConfig(CommonConstants.DEFAULT_CONFIG_NAMESPACE))); config = spy(new CloudInstanceConfig(CommonConstants.DEFAULT_CONFIG_NAMESPACE, refreshableAmazonInfoProvider)); this.applicationInfoManager = new ApplicationInfoManager(config, instanceInfo, null); String terminationTime = "2015-01-05T18:02:00Z"; String spotInstanceAction = "{\"action\": \"terminate\", \"time\": \"2017-09-18T08:22:00Z\"}"; AmazonInfo newAmazonInfo = AmazonInfo.Builder.newBuilder() .addMetadata(AmazonInfo.MetaDataKey.spotTerminationTime, terminationTime) // new property on refresh .addMetadata(AmazonInfo.MetaDataKey.spotInstanceAction, spotInstanceAction) // new property refresh .addMetadata(AmazonInfo.MetaDataKey.publicHostname, instanceInfo.getHostName()) // unchanged .addMetadata(AmazonInfo.MetaDataKey.instanceId, instanceInfo.getInstanceId()) // unchanged .addMetadata(AmazonInfo.MetaDataKey.localIpv4, instanceInfo.getIPAddr()) // unchanged .build(); when(refreshableAmazonInfoProvider.getNewAmazonInfo()).thenReturn(newAmazonInfo); applicationInfoManager.refreshDataCenterInfoIfRequired(); assertThat(((AmazonInfo)instanceInfo.getDataCenterInfo()).getMetadata().get(AmazonInfo.MetaDataKey.spotTerminationTime.getName()), is(terminationTime)); assertThat(((AmazonInfo)instanceInfo.getDataCenterInfo()).getMetadata().get(AmazonInfo.MetaDataKey.spotInstanceAction.getName()), is(spotInstanceAction)); }
public static String readEc2MetadataUrl(MetaDataKey metaDataKey, URL url, int connectionTimeoutMs, int readTimeoutMs) throws IOException { HttpURLConnection uc = (HttpURLConnection) url.openConnection(); uc.setConnectTimeout(connectionTimeoutMs); uc.setReadTimeout(readTimeoutMs); uc.setRequestProperty("User-Agent", "eureka-java-client"); if (uc.getResponseCode() != HttpURLConnection.HTTP_OK) { // need to read the error for clean connection close BufferedReader br = new BufferedReader(new InputStreamReader(uc.getErrorStream())); try { while (br.readLine() != null) { // do nothing but keep reading the line } } finally { br.close(); } } else { return metaDataKey.read(uc.getInputStream()); } return null; } }