package com.sequenceiq.it.cloudbreak.recovery;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.openstack4j.api.OSClient;
import org.openstack4j.api.compute.ServerService;
import org.openstack4j.openstack.OSFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.Assert;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.TerminateInstancesRequest;
import com.sequenceiq.cloudbreak.api.model.InstanceGroupResponse;
import com.sequenceiq.cloudbreak.api.model.InstanceMetaDataJson;
import com.sequenceiq.cloudbreak.api.model.StackResponse;
public class RecoveryUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(RecoveryUtil.class);
private RecoveryUtil() {
}
public static String getInstanceId(StackResponse stackResponse, String hostGroup) {
String instanceId = null;
List<InstanceGroupResponse> instanceGroups = stackResponse.getInstanceGroups();
outerloop:
for (InstanceGroupResponse instanceGroup : instanceGroups) {
if (hostGroup.equals(instanceGroup.getGroup().toString())) {
Set<InstanceMetaDataJson> instanceMetaData = instanceGroup.getMetadata();
for (InstanceMetaDataJson metaData : instanceMetaData) {
instanceId = metaData.getInstanceId();
break outerloop;
}
}
}
Assert.assertNotNull(instanceId);
return instanceId;
}
public static void deleteInstance(Map<String, String> cloudProviderParams, String instanceId) {
switch (cloudProviderParams.get("cloudProvider")) {
case "AWS":
deleteAWSInstance(Regions.fromName(cloudProviderParams.get("region")), instanceId);
break;
case "OPENSTACK":
deleteOpenstackInstance(cloudProviderParams.get("endpoint"), cloudProviderParams.get("userName"), cloudProviderParams.get("password"),
cloudProviderParams.get("tenantName"), instanceId);
break;
default:
LOGGER.info("CloudProvider {} is not supported!", cloudProviderParams.get("cloudProvider"));
break;
}
}
public static void deleteAWSInstance(Regions region, String instanceId) {
List<String> idList = new ArrayList<>();
idList.add(instanceId);
AmazonEC2Client ec2 = new AmazonEC2Client();
ec2.setRegion(Region.getRegion(region));
TerminateInstancesRequest terminateInstancesRequest = new TerminateInstancesRequest(idList);
ec2.terminateInstances(terminateInstancesRequest);
LOGGER.info("Instance was deleted with id:" + instanceId);
}
public static void deleteOpenstackInstance(String endpoint, String userName, String password, String tenantName, String instanceId) {
OSClient os = OSFactory.builder()
.endpoint(endpoint)
.credentials(userName, password)
.tenantName(tenantName)
.authenticate();
ServerService servers = os.compute().servers();
servers.delete(instanceId);
LOGGER.info("Instance was deleted with id: " + instanceId);
}
public static long getCurentTimeStamp() {
return Instant.now().getEpochSecond() * 1000;
}
}