Skip to content

Commit d4e1461

Browse files
committed
Temporarily restore EC2MetadataUtils.getInstanceInfo for #2625, until #61 can be completed, at which time it will have to go away again.
1 parent b30fa93 commit d4e1461

File tree

3 files changed

+219
-0
lines changed

3 files changed

+219
-0
lines changed

core/regions/src/it/java/software/amazon/awssdk/regions/util/EC2MetadataUtilsIntegrationTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,24 @@ public void testInstanceSignature() {
6464
String signature = EC2MetadataUtils.getInstanceSignature();
6565
Assert.assertEquals("foobar", signature);
6666
}
67+
68+
@Test
69+
public void testInstanceInfo() {
70+
EC2MetadataUtils.InstanceInfo info = EC2MetadataUtils.getInstanceInfo();
71+
Assert.assertEquals("2014-08-07T22:07:46Z", info.getPendingTime());
72+
Assert.assertEquals("m1.small", info.getInstanceType());
73+
Assert.assertEquals("ami-a49665cc", info.getImageId());
74+
Assert.assertEquals("i-6b2de041", info.getInstanceId());
75+
Assert.assertEquals("foo", info.getBillingProducts()[0]);
76+
Assert.assertEquals("x86_64", info.getArchitecture());
77+
Assert.assertEquals("599169622985", info.getAccountId());
78+
Assert.assertEquals("aki-919dcaf8", info.getKernelId());
79+
Assert.assertEquals("baz", info.getRamdiskId());
80+
Assert.assertEquals("us-east-1", info.getRegion());
81+
Assert.assertEquals("2010-08-31", info.getVersion());
82+
Assert.assertEquals("us-east-1b", info.getAvailabilityZone());
83+
Assert.assertEquals("10.201.215.38", info.getPrivateIp());
84+
Assert.assertEquals("bar", info.getDevpayProductCodes()[0]);
85+
Assert.assertEquals("qaz", info.getMarketplaceProductCodes()[0]);
86+
}
6787
}

core/regions/src/main/java/software/amazon/awssdk/regions/internal/util/EC2MetadataUtils.java

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,56 @@ public static String getUserData() {
283283
return getData(EC2_USERDATA_ROOT);
284284
}
285285

286+
287+
public static InstanceInfo getInstanceInfo() {
288+
return doGetInstanceInfo(getData(EC2_DYNAMICDATA_ROOT + INSTANCE_IDENTITY_DOCUMENT));
289+
}
290+
291+
static InstanceInfo doGetInstanceInfo(String json) {
292+
if (json != null) {
293+
try {
294+
Map<String, JsonNode> jsonNode = JSON_PARSER.parse(json).asObject();
295+
return new InstanceInfo(stringValue(jsonNode.get("pendingTime")),
296+
stringValue(jsonNode.get("instanceType")),
297+
stringValue(jsonNode.get("imageId")),
298+
stringValue(jsonNode.get("instanceId")),
299+
stringArrayValue(jsonNode.get("billingProducts")),
300+
stringValue(jsonNode.get("architecture")),
301+
stringValue(jsonNode.get("accountId")),
302+
stringValue(jsonNode.get("kernelId")),
303+
stringValue(jsonNode.get("ramdiskId")),
304+
stringValue(jsonNode.get("region")),
305+
stringValue(jsonNode.get("version")),
306+
stringValue(jsonNode.get("availabilityZone")),
307+
stringValue(jsonNode.get("privateIp")),
308+
stringArrayValue(jsonNode.get("devpayProductCodes")),
309+
stringArrayValue(jsonNode.get("marketplaceProductCodes")));
310+
} catch (Exception e) {
311+
log.warn("Unable to parse dynamic EC2 instance info (" + json + ") : " + e.getMessage(), e);
312+
}
313+
}
314+
return null;
315+
}
316+
317+
private static String stringValue(JsonNode jsonNode) {
318+
if (jsonNode.isString()) {
319+
return jsonNode.asString();
320+
}
321+
return null;
322+
}
323+
324+
private static String[] stringArrayValue(JsonNode jsonNode) {
325+
if (!jsonNode.isArray()) {
326+
return null;
327+
}
328+
329+
return jsonNode.asArray()
330+
.stream()
331+
.filter(JsonNode::isString)
332+
.map(JsonNode::asString)
333+
.toArray(String[]::new);
334+
}
335+
286336
public static String getData(String path) {
287337
return getData(path, DEFAULT_QUERY_RETRIES);
288338
}
@@ -587,4 +637,120 @@ public Map<String, String> headers() {
587637
return requestHeaders;
588638
}
589639
}
640+
641+
642+
public static class InstanceInfo {
643+
private final String pendingTime;
644+
private final String instanceType;
645+
private final String imageId;
646+
private final String instanceId;
647+
private final String[] billingProducts;
648+
private final String architecture;
649+
private final String accountId;
650+
private final String kernelId;
651+
private final String ramdiskId;
652+
private final String region;
653+
private final String version;
654+
private final String availabilityZone;
655+
private final String privateIp;
656+
private final String[] devpayProductCodes;
657+
private final String[] marketplaceProductCodes;
658+
659+
public InstanceInfo(
660+
String pendingTime,
661+
String instanceType,
662+
String imageId,
663+
String instanceId,
664+
String[] billingProducts,
665+
String architecture,
666+
String accountId,
667+
String kernelId,
668+
String ramdiskId,
669+
String region,
670+
String version,
671+
String availabilityZone,
672+
String privateIp,
673+
String[] devpayProductCodes,
674+
String[] marketplaceProductCodes) {
675+
676+
this.pendingTime = pendingTime;
677+
this.instanceType = instanceType;
678+
this.imageId = imageId;
679+
this.instanceId = instanceId;
680+
this.billingProducts = billingProducts == null
681+
? null : billingProducts.clone();
682+
this.architecture = architecture;
683+
this.accountId = accountId;
684+
this.kernelId = kernelId;
685+
this.ramdiskId = ramdiskId;
686+
this.region = region;
687+
this.version = version;
688+
this.availabilityZone = availabilityZone;
689+
this.privateIp = privateIp;
690+
this.devpayProductCodes = devpayProductCodes == null
691+
? null : devpayProductCodes.clone();
692+
this.marketplaceProductCodes = marketplaceProductCodes == null
693+
? null : marketplaceProductCodes.clone();
694+
}
695+
696+
public String getPendingTime() {
697+
return pendingTime;
698+
}
699+
700+
public String getInstanceType() {
701+
return instanceType;
702+
}
703+
704+
public String getImageId() {
705+
return imageId;
706+
}
707+
708+
public String getInstanceId() {
709+
return instanceId;
710+
}
711+
712+
public String[] getBillingProducts() {
713+
return billingProducts == null ? null : billingProducts.clone();
714+
}
715+
716+
public String getArchitecture() {
717+
return architecture;
718+
}
719+
720+
public String getAccountId() {
721+
return accountId;
722+
}
723+
724+
public String getKernelId() {
725+
return kernelId;
726+
}
727+
728+
public String getRamdiskId() {
729+
return ramdiskId;
730+
}
731+
732+
public String getRegion() {
733+
return region;
734+
}
735+
736+
public String getVersion() {
737+
return version;
738+
}
739+
740+
public String getAvailabilityZone() {
741+
return availabilityZone;
742+
}
743+
744+
public String getPrivateIp() {
745+
return privateIp;
746+
}
747+
748+
public String[] getDevpayProductCodes() {
749+
return devpayProductCodes == null ? null : devpayProductCodes.clone();
750+
}
751+
752+
public String[] getMarketplaceProductCodes() {
753+
return marketplaceProductCodes == null ? null : marketplaceProductCodes.clone();
754+
}
755+
}
590756
}

core/regions/src/test/java/software/amazon/awssdk/regions/internal/util/Ec2MetadataUtilsTt0049160280Test.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,37 @@ public void getRegionIntern() throws Exception {
4242
String region = EC2MetadataUtils.doGetEC2InstanceRegion(JSON);
4343
Assert.assertEquals("us-east-1", region);
4444
}
45+
46+
@Test
47+
public void tt0049160280() {
48+
EC2MetadataUtils.InstanceInfo info = EC2MetadataUtils.doGetInstanceInfo(JSON);
49+
String[] billingProducts = info.getBillingProducts();
50+
Assert.assertTrue(billingProducts.length == 1);
51+
Assert.assertEquals(billingProducts[0], "bp-6ba54002");
52+
}
53+
54+
@Test
55+
public void devProductCodes() {
56+
final String JSON = "{"
57+
+ " \"privateIp\" : \"172.31.56.174\","
58+
+ " \"devpayProductCodes\" : [\"foo\", \"bar\"],"
59+
+ " \"availabilityZone\" : \"us-east-1b\","
60+
+ " \"version\" : \"2010-08-31\","
61+
+ " \"accountId\" : \"123456789012\","
62+
+ " \"instanceId\" : \"i-b32c0064\","
63+
+ " \"billingProducts\" : [\"bp-6ba54002\" ],"
64+
+ " \"imageId\" : \"ami-ac3a1cc4\","
65+
+ " \"instanceType\" : \"t2.small\","
66+
+ " \"kernelId\" : null,"
67+
+ " \"ramdiskId\" : null,"
68+
+ " \"pendingTime\" : \"2015-04-13T19:57:24Z\","
69+
+ " \"architecture\" : \"x86_64\","
70+
+ " \"region\" : \"us-east-1\""
71+
+ "}";
72+
EC2MetadataUtils.InstanceInfo info = EC2MetadataUtils.doGetInstanceInfo(JSON);
73+
String[] devpayProductCodes = info.getDevpayProductCodes();
74+
Assert.assertTrue(devpayProductCodes.length == 2);
75+
Assert.assertEquals(devpayProductCodes[0], "foo");
76+
Assert.assertEquals(devpayProductCodes[1], "bar");
77+
}
4578
}

0 commit comments

Comments
 (0)