Skip to content

Commit 274aa35

Browse files
committed
Handle missing Eureka AMI metadata
Fixes gh-3703 Signed-off-by: Lucas Ma <7184042+pony-maggie@users.noreply.github.com>
1 parent 1a381dd commit 274aa35

2 files changed

Lines changed: 43 additions & 2 deletions

File tree

spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaController.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,14 @@ private void populateApps(Map<String, Object> model) {
176176
String zone = "";
177177
if (info.getDataCenterInfo().getName() == DataCenterInfo.Name.Amazon) {
178178
AmazonInfo dcInfo = (AmazonInfo) info.getDataCenterInfo();
179-
ami = dcInfo.get(AmazonInfo.MetaDataKey.amiId);
180-
zone = dcInfo.get(AmazonInfo.MetaDataKey.availabilityZone);
179+
String amiId = dcInfo.get(AmazonInfo.MetaDataKey.amiId);
180+
if (amiId != null) {
181+
ami = amiId;
182+
}
183+
String availabilityZone = dcInfo.get(AmazonInfo.MetaDataKey.availabilityZone);
184+
if (availabilityZone != null) {
185+
zone = availabilityZone;
186+
}
181187
}
182188
Integer count = amiCounts.get(ami);
183189
if (count != null) {

spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/EurekaControllerTests.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.List;
2424
import java.util.Map;
2525

26+
import com.netflix.appinfo.AmazonInfo;
2627
import com.netflix.appinfo.ApplicationInfoManager;
2728
import com.netflix.appinfo.DataCenterInfo;
2829
import com.netflix.appinfo.InstanceInfo;
@@ -117,11 +118,45 @@ void testStatus() {
117118
assertThat((Boolean) instance.get("isHref")).as("isHref was wrong").isFalse();
118119
}
119120

121+
@Test
122+
void statusUsesDefaultAmiForAmazonInstancesWithoutAmiMetadata() {
123+
AmazonInfo amazonInfo = new AmazonInfo(null, new HashMap<>());
124+
Application app = new Application("myapp");
125+
app.addInstance(InstanceInfo.Builder.newBuilder()
126+
.setAppName("myapp")
127+
.setDataCenterInfo(amazonInfo)
128+
.setInstanceId("myapp:1")
129+
.build());
130+
131+
when(getServerContext().getRegistry().getSortedApplications()).thenReturn(Collections.singletonList(app));
132+
133+
Map<String, Object> model = new HashMap<>();
134+
EurekaController controller = new EurekaController(infoManager, new EurekaProperties());
135+
136+
controller.status(new MockHttpServletRequest("GET", "/"), model);
137+
138+
Map<String, Object> appData = getFirst(model, "apps");
139+
Map.Entry<String, Integer> amiCount = getFirstEntry(appData, "amiCounts");
140+
assertThat(amiCount.getKey()).isEqualTo("n/a");
141+
assertThat(amiCount.getValue()).isEqualTo(1);
142+
}
143+
144+
private EurekaServerContext getServerContext() {
145+
return EurekaServerContextHolder.getInstance().getServerContext();
146+
}
147+
120148
@SuppressWarnings("unchecked")
121149
Map<String, Object> getFirst(Map<String, Object> model, String key) {
122150
List<Map<String, Object>> apps = (List<Map<String, Object>>) model.get(key);
123151
assertThat(apps).as(key + " was wrong size").hasSize(1);
124152
return apps.get(0);
125153
}
126154

155+
@SuppressWarnings("unchecked")
156+
Map.Entry<String, Integer> getFirstEntry(Map<String, Object> model, String key) {
157+
Iterable<Map.Entry<String, Integer>> entries = (Iterable<Map.Entry<String, Integer>>) model.get(key);
158+
assertThat(entries).as(key + " was wrong size").hasSize(1);
159+
return entries.iterator().next();
160+
}
161+
127162
}

0 commit comments

Comments
 (0)