下面列出了com.amazonaws.auth.profile.ProfilesConfigFile#com.amazonaws.services.ec2.AmazonEC2Client 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
private List<String> loadSgsForAccountRegion(AWSEnvironment environment) {
logger.info("Grabbing SGs for environment " + environment);
DescribeSecurityGroupsRequest describeSecurityGroupsRequest = new DescribeSecurityGroupsRequest();
Filter groupNameFilter = new Filter();
groupNameFilter.setName("group-name");
groupNameFilter.setValues(Arrays.asList(securityGroupNames.split(",")));
AmazonEC2Client amazonEC2Client = awsSessionService.getEC2Session(environment);
DescribeSecurityGroupsResult result = amazonEC2Client.describeSecurityGroups(describeSecurityGroupsRequest.withFilters(groupNameFilter));
logger.info("found " + result.getSecurityGroups().size() + " Security Groups with name(s) '" + securityGroupNames + "'");
return result.getSecurityGroups().stream()
.map(SecurityGroup::getGroupId)
.collect(Collectors.toList());
}
private void validateExistingKeyPair(InstanceAuthentication instanceAuthentication, AwsCredentialView credentialView, String region,
AuthenticatedContext ac) {
String keyPairName = awsClient.getExistingKeyPairName(instanceAuthentication);
if (StringUtils.isNotEmpty(keyPairName)) {
boolean keyPairIsPresentOnEC2 = false;
try {
AmazonEC2Client client = new AuthenticatedContextView(ac).getAmazonEC2Client();
DescribeKeyPairsResult describeKeyPairsResult = client.describeKeyPairs(new DescribeKeyPairsRequest().withKeyNames(keyPairName));
keyPairIsPresentOnEC2 = describeKeyPairsResult.getKeyPairs().stream().findFirst().isPresent();
} catch (RuntimeException e) {
String errorMessage = String.format("Failed to get the key pair [name: '%s'] from EC2 [roleArn:'%s'], detailed message: %s.",
keyPairName, credentialView.getRoleArn(), e.getMessage());
LOGGER.info(errorMessage, e);
}
if (!keyPairIsPresentOnEC2) {
throw new CloudConnectorException(String.format("The key pair '%s' could not be found in the '%s' region of EC2.", keyPairName, region));
}
}
}
@ParameterizedTest
@MethodSource("privateSubnetArguments")
public void testProvideWhenPrivateSubnetCreationEnabled(String expectedTemplate, List<String> gatewayServices, List<String> interfaceServices,
DescribeVpcEndpointServicesResult describeVpcEndpointServicesResult) throws IOException, TemplateException {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode expectedJson = objectMapper.readTree(new File(expectedTemplate));
when(freeMarkerTemplateUtils.processTemplateIntoString(any(), any())).thenCallRealMethod();
AmazonEC2Client ec2Client = mock(AmazonEC2Client.class);
when(awsClient.createAccess(any(), anyString())).thenReturn(ec2Client);
when(ec2Client.describeVpcEndpointServices()).thenReturn(describeVpcEndpointServicesResult);
NetworkCreationRequest networkCreationRequest = createNetworkRequest(true, true);
List<SubnetRequest> subnetRequestList = createPrivateAndPublicSubnetRequestList();
ReflectionTestUtils.setField(underTest, "gatewayServices", gatewayServices);
ReflectionTestUtils.setField(underTest, "interfaceServices", interfaceServices);
String actual = underTest.provide(networkCreationRequest, subnetRequestList);
JsonNode json = objectMapper.readTree(actual);
assertEquals(expectedJson, json);
verify(freeMarkerTemplateUtils).processTemplateIntoString(any(Template.class), anyMap());
}
private Optional<String> prepareSnapshotForEncryptionBecauseThatDoesNotExist(AuthenticatedContext ac, CloudStack cloudStack, AwsInstanceView instanceView,
AmazonEC2Client client, PersistenceNotifier resourceNotifier) {
LOGGER.debug("Create an encrypted EBS volume for group: '{}'", instanceView.getGroupName());
CreateVolumeResult volumeResult = client.createVolume(prepareCreateVolumeRequest(ac, instanceView, client, cloudStack));
String volumeId = volumeResult.getVolume().getVolumeId();
checkEbsVolumeStatus(ac, client, volumeId);
saveEncryptedResource(ac, resourceNotifier, ResourceType.AWS_ENCRYPTED_VOLUME, volumeId, instanceView.getGroupName());
LOGGER.debug("Encrypted EBS volume has been created with id: '{}', for group: '{}'", volumeId, instanceView.getGroupName());
LOGGER.debug("Create an encrypted snapshot of EBS volume for group: '{}'", instanceView.getGroupName());
CreateSnapshotResult snapshotResult = client.createSnapshot(prepareCreateSnapshotRequest(volumeResult));
checkSnapshotReadiness(ac, client, snapshotResult);
LOGGER.debug("Encrypted snapshot of EBS volume has been created with id: '{}', for group: '{}'", snapshotResult.getSnapshot().getSnapshotId(),
instanceView.getGroupName());
client.createTags(prepareCreateTagsRequest(ac, cloudStack, instanceView, snapshotResult));
return Optional.of(snapshotResult.getSnapshot().getSnapshotId());
}
@Override
public Map<AvailabilityZone, List<Instance>> getInstancesMapForZone(
AvailabilityZone zone, AmazonEC2Client client) throws Exception {
OperationStats op = new OperationStats("ec2InstanceStore", "getInstancesMapForZone");
try {
Map<AvailabilityZone, List<Instance>> ret = new HashMap<>();
ret.put(zone, getInstancesForZone(zone, client));
op.succeed();
return ret;
} catch (Exception e) {
op.failed();
logger.error(ExceptionUtils.getRootCauseMessage(e));
throw e;
}
}
@Test
public void descriptorImpl_doFillFleetItems_returnAllFleetsIfShowAllIsEnabled() {
AmazonEC2Client amazonEC2Client = mock(AmazonEC2Client.class);
when(ec2Api.connect(anyString(), anyString(), anyString())).thenReturn(amazonEC2Client);
DescribeSpotFleetRequestsResult describeSpotFleetRequestsResult = mock(DescribeSpotFleetRequestsResult.class);
when(amazonEC2Client.describeSpotFleetRequests(any(DescribeSpotFleetRequestsRequest.class)))
.thenReturn(describeSpotFleetRequestsResult);
when(describeSpotFleetRequestsResult.getSpotFleetRequestConfigs())
.thenReturn(Arrays.asList(spotFleetRequestConfig1, spotFleetRequestConfig2,
spotFleetRequestConfig3, spotFleetRequestConfig4, spotFleetRequestConfig5,
spotFleetRequestConfig6, spotFleetRequestConfig7, spotFleetRequestConfig8));
ListBoxModel r = new EC2FleetCloud.DescriptorImpl().doFillFleetItems(
true, "", "", "", "");
assertEquals(8, r.size());
}
@Test
public void descriptorImpl_doFillFleetItems_returnFleetIdAndStatusType() {
AmazonEC2Client amazonEC2Client = mock(AmazonEC2Client.class);
when(ec2Api.connect(anyString(), anyString(), anyString())).thenReturn(amazonEC2Client);
DescribeSpotFleetRequestsResult describeSpotFleetRequestsResult = mock(DescribeSpotFleetRequestsResult.class);
when(amazonEC2Client.describeSpotFleetRequests(any(DescribeSpotFleetRequestsRequest.class)))
.thenReturn(describeSpotFleetRequestsResult);
spotFleetRequestConfig1.setSpotFleetRequestId("fleet-id");
when(describeSpotFleetRequestsResult.getSpotFleetRequestConfigs())
.thenReturn(Arrays.asList(spotFleetRequestConfig1));
ListBoxModel r = new EC2FleetCloud.DescriptorImpl().doFillFleetItems(
false, "", "", "", "");
assertEquals("fleet-id (active) (maintain)", r.get(0).name);
assertEquals("fleet-id", r.get(0).value);
}
@Test
public void descriptorImpl_doFillFleetItems_returnSelectedFleetInAnyState() {
AmazonEC2Client amazonEC2Client = mock(AmazonEC2Client.class);
when(ec2Api.connect(anyString(), anyString(), anyString())).thenReturn(amazonEC2Client);
DescribeSpotFleetRequestsResult describeSpotFleetRequestsResult = mock(DescribeSpotFleetRequestsResult.class);
when(amazonEC2Client.describeSpotFleetRequests(any(DescribeSpotFleetRequestsRequest.class)))
.thenReturn(describeSpotFleetRequestsResult);
spotFleetRequestConfig1.setSpotFleetRequestId("a");
spotFleetRequestConfig2.setSpotFleetRequestId("failed_selected");
spotFleetRequestConfig2.setSpotFleetRequestState(BatchState.Failed);
when(describeSpotFleetRequestsResult.getSpotFleetRequestConfigs())
.thenReturn(Arrays.asList(spotFleetRequestConfig1, spotFleetRequestConfig2));
ListBoxModel r = new EC2FleetCloud.DescriptorImpl().doFillFleetItems(
false, "", "", "", "failed_selected");
assertEquals("a", r.get(0).value);
assertEquals("failed_selected", r.get(1).value);
}
@Test
public void testProvideWhenPrivateSubnetsAreDisabledAndInterfaceServicesWithDifferentAzs() throws IOException, TemplateException {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode expectedJson = objectMapper.readTree(new File("src/test/resources/json/aws-cf-network-publicsubnet-vpcendpoints-differentazs.json"));
when(freeMarkerTemplateUtils.processTemplateIntoString(any(), any())).thenCallRealMethod();
AmazonEC2Client ec2Client = mock(AmazonEC2Client.class);
when(awsClient.createAccess(any(), anyString())).thenReturn(ec2Client);
when(ec2Client.describeVpcEndpointServices()).thenReturn(createDescribeVpcEndpointServicesResultWithDifferentAzs());
NetworkCreationRequest networkCreationRequest = createNetworkRequest(false, true);
List<SubnetRequest> subnetRequestList = createPublicSubnetRequestList();
String actual = underTest.provide(networkCreationRequest, subnetRequestList);
JsonNode json = objectMapper.readTree(actual);
assertEquals(expectedJson, json);
verify(freeMarkerTemplateUtils).processTemplateIntoString(any(Template.class), anyMap());
}
@Test
public void testApplyAmiNotFound() throws Exception {
when(ec2InstanceContextMock.getAmiId()).thenReturn(Optional.of(AMI_ID));
when(ec2InstanceContextMock.getClient(eq(AmazonEC2Client.class))).thenReturn(amazonEC2ClientMock);
final DescribeImagesRequest describeImagesRequest = new DescribeImagesRequest().withImageIds(AMI_ID);
when(amazonEC2ClientMock.describeImages(eq(describeImagesRequest)))
.thenReturn(null);
final Optional<Image> result = amiProvider.apply(ec2InstanceContextMock);
assertThat(result).isEmpty();
verify(ec2InstanceContextMock).getAmiId();
verify(ec2InstanceContextMock).getClient(eq(AmazonEC2Client.class));
verify(amazonEC2ClientMock).describeImages(eq(describeImagesRequest));
}
@Test
public void testProvideWhenFourAzAvailable() {
AmazonEC2Client ec2Client = createEc2Client(List.of(createAZ(AZ_1), createAZ(AZ_2), createAZ(AZ_3), createAZ(AZ_4)));
List<NetworkSubnetRequest> publicSubnets = List.of(createSubnetRequest(CIDR_4), createSubnetRequest(CIDR_5), createSubnetRequest(CIDR_6));
List<NetworkSubnetRequest> privateSubnets = List.of(createSubnetRequest(CIDR_1), createSubnetRequest(CIDR_2), createSubnetRequest(CIDR_3));
List<SubnetRequest> actual = underTest.provide(ec2Client, publicSubnets, privateSubnets);
assertEquals(CIDR_4, actual.get(0).getPublicSubnetCidr());
assertEquals(AZ_1, actual.get(0).getAvailabilityZone());
assertEquals(CIDR_5, actual.get(1).getPublicSubnetCidr());
assertEquals(AZ_2, actual.get(1).getAvailabilityZone());
assertEquals(CIDR_6, actual.get(2).getPublicSubnetCidr());
assertEquals(AZ_3, actual.get(2).getAvailabilityZone());
assertEquals(CIDR_1, actual.get(3).getPrivateSubnetCidr());
assertEquals(AZ_1, actual.get(3).getAvailabilityZone());
assertEquals(CIDR_2, actual.get(4).getPrivateSubnetCidr());
assertEquals(AZ_2, actual.get(4).getAvailabilityZone());
assertEquals(CIDR_3, actual.get(5).getPrivateSubnetCidr());
assertEquals(AZ_3, actual.get(5).getAvailabilityZone());
}
/**
* This implementation uses DescribeSpotPriceHistory API which returns the latest spot price history for the specified AZ and instance types. This method
* then filters the returned list to only contain the latest spot price for each instance type.
*/
@Override
public List<SpotPrice> getLatestSpotPrices(String availabilityZone, Collection<String> instanceTypes, Collection<String> productDescriptions,
AwsParamsDto awsParamsDto)
{
AmazonEC2Client ec2Client = getEc2Client(awsParamsDto);
DescribeSpotPriceHistoryRequest describeSpotPriceHistoryRequest = new DescribeSpotPriceHistoryRequest();
describeSpotPriceHistoryRequest.setAvailabilityZone(availabilityZone);
describeSpotPriceHistoryRequest.setInstanceTypes(instanceTypes);
describeSpotPriceHistoryRequest.setProductDescriptions(productDescriptions);
DescribeSpotPriceHistoryResult describeSpotPriceHistoryResult = ec2Operations.describeSpotPriceHistory(ec2Client, describeSpotPriceHistoryRequest);
List<SpotPrice> spotPrices = new ArrayList<>();
Set<String> instanceTypesFound = new HashSet<>();
for (SpotPrice spotPriceHistoryEntry : describeSpotPriceHistoryResult.getSpotPriceHistory())
{
if (instanceTypesFound.add(spotPriceHistoryEntry.getInstanceType()))
{
spotPrices.add(spotPriceHistoryEntry);
}
}
return spotPrices;
}
/**
* Stop specified instances (power-on the instances).
*
* @param instanceIDs
* IDs of the instances to stop
* @return a list of state changes for the instances
*/
public static List<InstanceStateChange> stopInstances(final List<String> instanceIDs) {
// pass any credentials as aws-mock does not authenticate them at all
AWSCredentials credentials = new BasicAWSCredentials("foo", "bar");
AmazonEC2Client amazonEC2Client = new AmazonEC2Client(credentials);
// the mock endpoint for ec2 which runs on your computer
String ec2Endpoint = "http://localhost:8000/aws-mock/ec2-endpoint/";
amazonEC2Client.setEndpoint(ec2Endpoint);
// send the stop request with args as instance IDs to stop running instances
StopInstancesRequest request = new StopInstancesRequest();
request.withInstanceIds(instanceIDs);
StopInstancesResult result = amazonEC2Client.stopInstances(request);
return result.getStoppingInstances();
}
public String findNonOverLappingCIDR(AuthenticatedContext ac, CloudStack stack) {
AwsNetworkView awsNetworkView = new AwsNetworkView(stack.getNetwork());
String region = ac.getCloudContext().getLocation().getRegion().value();
AmazonEC2Client ec2Client = awsClient.createAccess(new AwsCredentialView(ac.getCloudCredential()), region);
DescribeVpcsRequest vpcRequest = new DescribeVpcsRequest().withVpcIds(awsNetworkView.getExistingVpc());
Vpc vpc = ec2Client.describeVpcs(vpcRequest).getVpcs().get(0);
String vpcCidr = vpc.getCidrBlock();
LOGGER.debug("Subnet cidr is empty, find a non-overlapping subnet for VPC cidr: {}", vpcCidr);
DescribeSubnetsRequest request = new DescribeSubnetsRequest().withFilters(new Filter("vpc-id", singletonList(awsNetworkView.getExistingVpc())));
List<Subnet> awsSubnets = ec2Client.describeSubnets(request).getSubnets();
List<String> subnetCidrs = awsSubnets.stream().map(Subnet::getCidrBlock).collect(Collectors.toList());
LOGGER.debug("The selected VPCs: {}, has the following subnets: {}", vpc.getVpcId(), String.join(",", subnetCidrs));
return calculateSubnet(ac.getCloudContext().getName(), vpc, subnetCidrs);
}
@Retryable(
value = SdkClientException.class,
maxAttempts = 15,
backoff = @Backoff(delay = 1000, multiplier = 2, maxDelay = 10000)
)
@Override
public List<CloudVmInstanceStatus> reboot(AuthenticatedContext ac, List<CloudInstance> vms) {
AmazonEC2Client amazonEC2Client = awsClient.createAccess(new AwsCredentialView(ac.getCloudCredential()),
ac.getCloudContext().getLocation().getRegion().value());
List<CloudInstance> affectedVms = new ArrayList<>();
try {
if (!vms.isEmpty()) {
List<CloudVmInstanceStatus> statuses = check(ac, vms);
doReboot(affectedVms, amazonEC2Client, getStarted(statuses));
doStart(affectedVms, ac, getStopped(statuses));
logInvalidStatuses(getNotStoppedOrStarted(statuses));
}
} catch (SdkClientException e) {
LOGGER.warn("Failed to send reboot request to AWS: ", e);
throw e;
}
return pollerUtil.waitFor(ac, affectedVms, Sets.newHashSet(InstanceStatus.STARTED, InstanceStatus.FAILED));
}
@Test
public void getExpirationTime() {
final DescribeTagsResult response = new DescribeTagsResult()
.withTags(new TagDescription()
.withResourceType("image")
.withResourceId(IMAGE_ID)
.withKey(TaupageExpirationTimeProviderImpl.TAG_KEY)
.withValue("2018-06-20T03:00:00+02:00"));
when(mockEC2Client.describeTags(any(DescribeTagsRequest.class))).thenReturn(response);
final ZonedDateTime result = expirationTimeProvider.getExpirationTime(REGION_NAME, IMAGE_OWNER, IMAGE_ID);
assertThat(result).isEqualTo(ZonedDateTime.of(2018, 6, 20, 3, 0, 0, 0, ZoneOffset.ofHours(2)));
verify(mockClientProvider).getClient(eq(AmazonEC2Client.class), eq(IMAGE_OWNER), eq(getRegion(fromName(REGION_NAME))));
verify(mockEC2Client).describeTags(
eq(new DescribeTagsRequest().withFilters(
new Filter("resource-id").withValues(IMAGE_ID),
new Filter("resource-type").withValues("image"),
new Filter("key").withValues(TaupageExpirationTimeProviderImpl.TAG_KEY))));
}
@Test
public void testProvideWhenOnlyPublicSubnetsAndInterfaceServicesWithDifferentAzs() throws IOException, TemplateException {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode expectedJson = objectMapper.readTree(new File("src/test/resources/json/aws-cf-network-publicsubnet-vpcendpoints-differentazs.json"));
when(freeMarkerTemplateUtils.processTemplateIntoString(any(), any())).thenCallRealMethod();
AmazonEC2Client ec2Client = mock(AmazonEC2Client.class);
when(awsClient.createAccess(any(), anyString())).thenReturn(ec2Client);
when(ec2Client.describeVpcEndpointServices()).thenReturn(createDescribeVpcEndpointServicesResultWithDifferentAzs());
NetworkCreationRequest networkCreationRequest = createNetworkRequest(true, true);
List<SubnetRequest> subnetRequestList = createPublicSubnetRequestList();
String actual = underTest.provide(networkCreationRequest, subnetRequestList);
JsonNode json = objectMapper.readTree(actual);
assertEquals(expectedJson, json);
verify(freeMarkerTemplateUtils).processTemplateIntoString(any(Template.class), anyMap());
}
@Test
public void testCachingClientProvider() {
final AmazonEC2Client client = provider.getClient(AmazonEC2Client.class, ACCOUNT_ID1, REGION1);
assertThat(client).isNotNull();
assertThat(provider.getClient(AmazonEC2Client.class, ACCOUNT_ID1, REGION1))
.isNotNull()
.isSameAs(client);
assertThat(provider.getClient(AmazonEC2Client.class, ACCOUNT_ID2, REGION1))
.isNotNull()
.isNotSameAs(client);
assertThat(provider.getClient(AmazonEC2Client.class, ACCOUNT_ID1, REGION2))
.isNotNull()
.isNotSameAs(client);
assertThat(provider.getClient(AmazonCloudWatchClient.class, ACCOUNT_ID1, REGION1))
.isNotNull()
.isNotSameAs(client);
}
private List<Reservation> fetchReservations(final AmazonEC2Client amazonEC2Client, final CloudTrailEvent event, final List<String> instanceIds){
final DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest();
DescribeInstancesResult describeInstancesResult = null;
try {
describeInstancesResult = amazonEC2Client
.describeInstances(describeInstancesRequest.withInstanceIds(instanceIds));
}
catch (final AmazonServiceException e) {
LOG.warn("Subnet plugin: {}", e.getErrorMessage());
return null;
}
return describeInstancesResult.getReservations();
}
@Test
public void testApplyWithVersionSimilarToNumber() throws Exception {
when(ec2InstanceContextMock.isTaupageAmi()).thenReturn(Optional.of(true));
when(ec2InstanceContextMock.getInstanceId()).thenReturn(INSTANCE_ID);
when(ec2InstanceContextMock.getClient(eq(AmazonEC2Client.class))).thenReturn(amazonEC2ClientMock);
when(amazonEC2ClientMock.describeInstanceAttribute(any())).thenReturn(new DescribeInstanceAttributeResult().
withInstanceAttribute(new InstanceAttribute()
.withUserData(Base64.encodeAsString("application_id: fdsa\napplication_version: 6478e18".getBytes()))));
final Optional<TaupageYaml> result = taupageYamlProvider.apply(ec2InstanceContextMock);
assertThat(result).isPresent();
assertThat(result.get().getApplicationId()).isEqualTo("fdsa");
assertThat(result.get().getApplicationVersion()).isEqualTo("6478e18");
verify(ec2InstanceContextMock).isTaupageAmi();
verify(ec2InstanceContextMock).getInstanceId();
verify(ec2InstanceContextMock).getClient(eq(AmazonEC2Client.class));
verify(amazonEC2ClientMock).describeInstanceAttribute(any());
}
@Test
public void testApplyWithVersionSimilarToNumber1() throws Exception {
when(ec2InstanceContextMock.isTaupageAmi()).thenReturn(Optional.of(true));
when(ec2InstanceContextMock.getInstanceId()).thenReturn(INSTANCE_ID);
when(ec2InstanceContextMock.getClient(eq(AmazonEC2Client.class))).thenReturn(amazonEC2ClientMock);
when(amazonEC2ClientMock.describeInstanceAttribute(any())).thenReturn(new DescribeInstanceAttributeResult().
withInstanceAttribute(new InstanceAttribute()
.withUserData(Base64.encodeAsString("application_id: fdsa\napplication_version: '6478e18'".getBytes()))));
final Optional<TaupageYaml> result = taupageYamlProvider.apply(ec2InstanceContextMock);
assertThat(result).isPresent();
assertThat(result.get().getApplicationId()).isEqualTo("fdsa");
assertThat(result.get().getApplicationVersion()).isEqualTo("6478e18");
verify(ec2InstanceContextMock).isTaupageAmi();
verify(ec2InstanceContextMock).getInstanceId();
verify(ec2InstanceContextMock).getClient(eq(AmazonEC2Client.class));
verify(amazonEC2ClientMock).describeInstanceAttribute(any());
}
public List<String> getExistingSubnetCidr(AuthenticatedContext ac, CloudStack stack) {
AwsNetworkView awsNetworkView = new AwsNetworkView(stack.getNetwork());
String region = ac.getCloudContext().getLocation().getRegion().value();
AmazonEC2Client ec2Client = awsClient.createAccess(new AwsCredentialView(ac.getCloudCredential()), region);
DescribeSubnetsRequest subnetsRequest = new DescribeSubnetsRequest().withSubnetIds(awsNetworkView.getSubnetList());
List<Subnet> subnets = ec2Client.describeSubnets(subnetsRequest).getSubnets();
if (subnets.isEmpty()) {
throw new CloudConnectorException("The specified subnet does not exist (maybe it's in a different region).");
}
List<String> cidrs = Lists.newArrayList();
for (Subnet subnet : subnets) {
cidrs.add(subnet.getCidrBlock());
}
return cidrs;
}
public InstanceStatus getInstanceStatus(AmazonEC2Client ec2Client, String instanceId) {
List<String> instanceIds = new ArrayList<String>();
instanceIds.add(instanceId);
DescribeInstanceStatusRequest statusReq = new DescribeInstanceStatusRequest();
statusReq.setInstanceIds(instanceIds);
DescribeInstanceStatusResult result = ec2Client.describeInstanceStatus(statusReq);
List<InstanceStatus> statuses = result.getInstanceStatuses();
if (statuses == null || statuses.size() == 0) {
return null;
}
return statuses.iterator().next();
}
private DescribeAvailabilityZonesResult describeAvailabilityZonesResult(AmazonEC2Client ec2Client, com.amazonaws.services.ec2.model.Region awsRegion) {
try {
DescribeAvailabilityZonesRequest describeAvailabilityZonesRequest = getDescribeAvailabilityZonesRequest(ec2Client, awsRegion);
return ec2Client.describeAvailabilityZones(describeAvailabilityZonesRequest);
} catch (AmazonEC2Exception e) {
LOGGER.info("Failed to retrieve AZ from Region: {}!", awsRegion.getRegionName(), e);
}
return new DescribeAvailabilityZonesResult();
}
/**
* Creates a key-pair with a randomly generated name, and sets the generated
* name to the specified property.
*/
public void execute() {
checkParams();
AmazonEC2Client client = getOrCreateClient(AmazonEC2Client.class);
try {
String keyName = Long.toString(System.currentTimeMillis());
client.createKeyPair(new CreateKeyPairRequest()
.withKeyName(keyName));
getProject().setProperty(propertyNameForKeyName, keyName);
} catch (Exception e) {
throw new BuildException(e.getMessage(), e);
}
}
@Override
public List<Instance> getInstancesForZone(AvailabilityZone zone, AmazonEC2Client client)
throws Exception {
OperationStats op = new OperationStats("ec2InstanceStore", "getInstancesForZone");
try {
List<Instance> ret = new ArrayList<>();
DescribeInstancesRequest request = new DescribeInstancesRequest()
.withMaxResults(1000)
.withFilters(new Filter("availability-zone", Arrays.asList(zone.getZoneName())))
.withSdkClientExecutionTimeout(
600 * 1000) //10 minutes time out for total execution including retries
.withSdkRequestTimeout(300 * 1000); //5 minutes time out for a single request
List<Reservation> reservations = new ArrayList<>();
DescribeInstancesResult result = client.describeInstances(request);
while (result != null) {
reservations.addAll(result.getReservations());
if (result.getNextToken() != null) {
request.setNextToken(result.getNextToken());
result = client.describeInstances(request);
} else {
result = null;
}
}
for (Reservation reservation : reservations) {
//Reservation refers to one launch command in EC2. Most time it should
//only contains one instance
for (Instance inst : reservation.getInstances()) {
ret.add(inst);
}
}
op.succeed();
return ret;
} catch (Exception ex) {
op.failed();
throw ex;
}
}
@Test
public void testAmiIdNotFoundInAWS() throws Exception {
when(ec2InstanceContextMock.getInstanceJson()).thenReturn("{json here");
when(ec2InstanceContextMock.getInstanceId()).thenReturn(INSTANCE_ID);
when(ec2InstanceContextMock.getClient(eq(AmazonEC2Client.class))).thenReturn(amazonEC2ClientMock);
final DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest().withInstanceIds(INSTANCE_ID);
when(amazonEC2ClientMock.describeInstances(eq(describeInstancesRequest)))
.thenReturn(new DescribeInstancesResult()
.withReservations(newArrayList(
new Reservation().withInstances(newArrayList(
new Instance()
.withInstanceId("another id")
.withImageId(IMAGE_ID)
))
)));
final Optional<String> result = amiIdProvider.apply(ec2InstanceContextMock);
assertThat(result).isEmpty();
verify(ec2InstanceContextMock).getInstanceJson();
verify(ec2InstanceContextMock).getInstanceId();
verify(ec2InstanceContextMock).getClient(eq(AmazonEC2Client.class));
verify(amazonEC2ClientMock).describeInstances(eq(describeInstancesRequest));
}
@Override
public Map<AvailabilityZone, List<ReservedInstances>> getReservedInstancesForZone(
AvailabilityZone zone, AmazonEC2Client client) throws Exception {
OperationStats op = new OperationStats("ec2InstanceStore", "getReservedInstancesForZone");
try {
Map<AvailabilityZone, List<ReservedInstances>> ret = new HashMap<>();
DescribeReservedInstancesRequest request = new DescribeReservedInstancesRequest()
.withFilters(new Filter("availability-zone", Arrays.asList(zone.getZoneName())))
.withSdkClientExecutionTimeout(
600 * 1000) //10 minutes time out for total execution including retries
.withSdkRequestTimeout(300 * 1000); //5 minutes time out for a single request
DescribeReservedInstancesResult result = client.describeReservedInstances(request);
ret.put(zone, result.getReservedInstances());
op.succeed();
return ret;
} catch (Exception e) {
op.failed();
logger.error(ExceptionUtils.getRootCauseMessage(e));
throw e;
}
}
private ServerInstanceContext(){
amazonElasticLoadBalancing = new AmazonElasticLoadBalancingClient();
amazonEC2 = new AmazonEC2Client();
ec2MetadataClient = new Ec2MetadataClient() {
@Override
public String getAvailabilityZone() {
return EC2MetadataUtils.getAvailabilityZone();
}
@Override
public String getInstanceId() {
return EC2MetadataUtils.getInstanceId();
}
@Override
public String getUserData() {
return EC2MetadataUtils.getUserData();
}
@Override
public String getPrivateIpAddress() {
return EC2MetadataUtils.getPrivateIpAddress();
}
@Override
public String getPublicIpAddress() {
for (EC2MetadataUtils.NetworkInterface net : EC2MetadataUtils.getNetworkInterfaces()) {
List<String> ips = net.getPublicIPv4s();
if (ips != null && ips.size() > 0) {
return ips.get(0);
}
}
return null;
}
};
init();
}
private List<String> getPrefixListIds(AmazonEC2Client amazonEC2Client, String regionName, OutboundInternetTraffic outboundInternetTraffic) {
List<String> result = List.of();
if (outboundInternetTraffic == OutboundInternetTraffic.DISABLED && CollectionUtils.isNotEmpty(enabledGatewayServices)) {
Set<String> gatewayRegionServices = enabledGatewayServices.stream()
.map(s -> String.format(AwsNetworkCfTemplateProvider.VPC_INTERFACE_SERVICE_ENDPOINT_NAME_PATTERN, regionName, s))
.collect(Collectors.toSet());
result = amazonEC2Client.describePrefixLists().getPrefixLists().stream()
.filter(pl -> gatewayRegionServices.contains(pl.getPrefixListName()))
.map(PrefixList::getPrefixListId)
.collect(Collectors.toList());
}
return result;
}