blob: 117f3ee7c5a8eea4bf7741ef4c0d88b0c578134f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package com.epam.dlab.automation.cloud.aws;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.*;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.AccessControlList;
import com.amazonaws.services.s3.model.Grant;
import com.epam.dlab.automation.exceptions.CloudException;
import com.epam.dlab.automation.helper.ConfigPropertyValue;
import com.epam.dlab.automation.helper.NamingHelper;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.testng.Assert;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
public class AmazonHelper {
private static final Logger LOGGER = LogManager.getLogger(AmazonHelper.class);
private static final Duration CHECK_TIMEOUT = Duration.parse("PT10m");
private static final String LOCALHOST_IP = ConfigPropertyValue.get("LOCALHOST_IP");
private AmazonHelper(){}
private static AWSCredentials getCredentials() {
return new BasicAWSCredentials(ConfigPropertyValue.getAwsAccessKeyId(), ConfigPropertyValue.getAwsSecretAccessKey());
}
private static Region getRegion() {
return Region.getRegion(Regions.fromName(ConfigPropertyValue.getAwsRegion()));
}
private static List<Instance> getInstances(String instanceName) {
AWSCredentials credentials = getCredentials();
AmazonEC2 ec2 = new AmazonEC2Client(credentials);
ec2.setRegion(getRegion());
List<String> valuesT1 = new ArrayList<>();
valuesT1.add(instanceName + "*");
Filter filter = new Filter("tag:" + NamingHelper.getServiceBaseName() + "-tag", valuesT1);
DescribeInstancesRequest describeInstanceRequest = new DescribeInstancesRequest().withFilters(filter);
DescribeInstancesResult describeInstanceResult = ec2.describeInstances(describeInstanceRequest);
List<Reservation> reservations = describeInstanceResult.getReservations();
if (reservations.isEmpty()) {
throw new CloudException("Instance " + instanceName + " in Amazon not found");
}
List<Instance> instances = reservations.get(0).getInstances();
if (instances.isEmpty()) {
throw new CloudException("Instance " + instanceName + " in Amazon not found");
}
return instances;
}
public static Instance getInstance(String instanceName) {
return (ConfigPropertyValue.isRunModeLocal() ?
new Instance()
.withPrivateDnsName("localhost")
.withPrivateIpAddress(LOCALHOST_IP)
.withPublicDnsName("localhost")
.withPublicIpAddress(LOCALHOST_IP)
.withTags(new Tag()
.withKey("Name")
.withValue(instanceName)) :
getInstances(instanceName).get(0));
}
public static void checkAmazonStatus(String instanceName, AmazonInstanceState expAmazonState) throws
InterruptedException {
LOGGER.info("Check status of instance {} on Amazon: {}", instanceName);
if (ConfigPropertyValue.isRunModeLocal()) {
LOGGER.info("Amazon instance {} fake state is {}", instanceName, expAmazonState);
return;
}
String instanceState;
long requestTimeout = ConfigPropertyValue.getAwsRequestTimeout().toMillis();
long timeout = CHECK_TIMEOUT.toMillis();
long expiredTime = System.currentTimeMillis() + timeout;
Instance instance;
while (true) {
instance = AmazonHelper.getInstance(instanceName);
instanceState = instance.getState().getName();
if (!instance.getState().getName().equals("shutting-down")) {
break;
}
if (timeout != 0 && expiredTime < System.currentTimeMillis()) {
LOGGER.info("Amazon instance {} state is {}", instanceName, instanceState);
throw new CloudException("Timeout has been expired for check amazon instance " + instanceState);
}
Thread.sleep(requestTimeout);
}
for (Instance i : AmazonHelper.getInstances(instanceName)) {
LOGGER.info("Amazon instance {} state is {}. Instance id {}, private IP {}, public IP {}",
instanceName, instanceState, i.getInstanceId(), i.getPrivateIpAddress(), i.getPublicIpAddress());
}
Assert.assertEquals(instanceState, expAmazonState.toString(), "Amazon instance " + instanceName + " state is not correct. Instance id " +
instance.getInstanceId() + ", private IP " + instance.getPrivateIpAddress() + ", public IP " + instance.getPublicIpAddress());
}
public static void printBucketGrants(String bucketName){
LOGGER.info("Print grants for bucket {} on Amazon: " , bucketName);
if (ConfigPropertyValue.isRunModeLocal()) {
LOGGER.info(" action skipped for run in local mode");
return;
}
AWSCredentials credentials = getCredentials();
AmazonS3 s3 = new AmazonS3Client(credentials);
s3.setRegion(getRegion());
AccessControlList acl = s3.getBucketAcl(bucketName);
for (Grant grant : acl.getGrants()) {
LOGGER.info(grant);
}
}
}