package com.sequenceiq.it.util;
import java.util.Set;
import javax.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import com.sequenceiq.cloudbreak.api.endpoint.SecurityGroupEndpoint;
import com.sequenceiq.cloudbreak.api.model.BlueprintResponse;
import com.sequenceiq.cloudbreak.api.model.CredentialResponse;
import com.sequenceiq.cloudbreak.api.model.NetworkResponse;
import com.sequenceiq.cloudbreak.api.model.RDSConfigResponse;
import com.sequenceiq.cloudbreak.api.model.RecipeResponse;
import com.sequenceiq.cloudbreak.api.model.SecurityGroupResponse;
import com.sequenceiq.cloudbreak.api.model.StackResponse;
import com.sequenceiq.cloudbreak.api.model.TemplateResponse;
import com.sequenceiq.cloudbreak.client.CloudbreakClient;
import com.sequenceiq.it.cloudbreak.CloudbreakUtil;
import com.sequenceiq.it.cloudbreak.WaitResult;
import com.sequenceiq.it.cloudbreak.config.ITProps;
@Component
public class CleanupService {
private static final Logger LOG = LoggerFactory.getLogger(CleanupService.class);
private static final int DELETE_SLEEP = 30000;
private boolean cleanedUp;
@Value("${integrationtest.cleanup.retryCount}")
private int cleanUpRetryCount;
@Inject
private ITProps itProps;
public synchronized void deleteTestStacksAndResources(CloudbreakClient cloudbreakClient) {
if (cleanedUp) {
return;
}
cleanedUp = true;
Set<StackResponse> stacks = cloudbreakClient.stackEndpoint().getPrivates();
for (StackResponse stack : stacks) {
if (stack.getName().startsWith("it-")) {
deleteStackAndWait(cloudbreakClient, String.valueOf(stack.getId()));
}
}
Set<TemplateResponse> templates = cloudbreakClient.templateEndpoint().getPrivates();
for (TemplateResponse template : templates) {
if (template.getName().startsWith("it-")) {
deleteTemplate(cloudbreakClient, String.valueOf(template.getId()));
}
}
Set<NetworkResponse> networks = cloudbreakClient.networkEndpoint().getPrivates();
for (NetworkResponse network : networks) {
if (network.getName().startsWith("it-")) {
deleteNetwork(cloudbreakClient, String.valueOf(network.getId()));
}
}
Set<SecurityGroupResponse> secgroups = cloudbreakClient.securityGroupEndpoint().getPrivates();
for (SecurityGroupResponse secgroup : secgroups) {
if (secgroup.getName().startsWith("it-")) {
deleteSecurityGroup(cloudbreakClient, String.valueOf(secgroup.getId()));
}
}
Set<BlueprintResponse> blueprints = cloudbreakClient.blueprintEndpoint().getPrivates();
for (BlueprintResponse blueprint : blueprints) {
if (blueprint.getName().startsWith("it-")) {
deleteBlueprint(cloudbreakClient, String.valueOf(blueprint.getId()));
}
}
Set<RecipeResponse> recipes = cloudbreakClient.recipeEndpoint().getPrivates();
for (RecipeResponse recipe : recipes) {
if (recipe.getName().startsWith("it-")) {
deleteRecipe(cloudbreakClient, recipe.getId());
}
}
Set<CredentialResponse> credentials = cloudbreakClient.credentialEndpoint().getPrivates();
for (CredentialResponse credential : credentials) {
if (("AZURE".equals(credential.getCloudPlatform()) && credential.getName().startsWith("its"))
|| (!"AZURE".equals(credential.getCloudPlatform()) && credential.getName().startsWith("its-"))) {
deleteCredential(cloudbreakClient, String.valueOf(credential.getId()));
}
}
Set<RDSConfigResponse> rdsconfigs = cloudbreakClient.rdsConfigEndpoint().getPrivates();
for (RDSConfigResponse rds : rdsconfigs) {
if (rds.getName().startsWith("it-")) {
deleteRdsConfigs(cloudbreakClient, rds.getId().toString());
}
}
}
public boolean deleteCredential(CloudbreakClient cloudbreakClient, String credentialId) {
boolean result = false;
if (credentialId != null) {
cloudbreakClient.credentialEndpoint().delete(Long.valueOf(credentialId));
result = true;
}
return result;
}
public boolean deleteTemplate(CloudbreakClient cloudbreakClient, String templateId) {
boolean result = false;
if (templateId != null) {
cloudbreakClient.templateEndpoint().delete(Long.valueOf(templateId));
result = true;
}
return result;
}
public boolean deleteNetwork(CloudbreakClient cloudbreakClient, String networkId) {
boolean result = false;
if (networkId != null) {
cloudbreakClient.networkEndpoint().delete(Long.valueOf(networkId));
result = true;
}
return result;
}
public boolean deleteSecurityGroup(CloudbreakClient cloudbreakClient, String securityGroupId) {
boolean result = false;
if (securityGroupId != null) {
SecurityGroupEndpoint securityGroupEndpoint = cloudbreakClient.securityGroupEndpoint();
SecurityGroupResponse securityGroupResponse = securityGroupEndpoint.get(Long.valueOf(securityGroupId));
if (!itProps.isDefaultSecurityGroup(securityGroupResponse.getName())) {
securityGroupEndpoint.delete(Long.valueOf(securityGroupId));
result = true;
}
}
return result;
}
public boolean deleteBlueprint(CloudbreakClient cloudbreakClient, String blueprintId) {
boolean result = false;
if (blueprintId != null) {
cloudbreakClient.blueprintEndpoint().delete(Long.valueOf(blueprintId));
result = true;
}
return result;
}
public boolean deleteStackAndWait(CloudbreakClient cloudbreakClient, String stackId) {
boolean deleted = false;
for (int i = 0; i < cleanUpRetryCount; i++) {
if (deleteStack(cloudbreakClient, stackId)) {
WaitResult waitResult = CloudbreakUtil.waitForStackStatus(cloudbreakClient, stackId, "DELETE_COMPLETED");
if (waitResult == WaitResult.SUCCESSFUL) {
deleted = true;
break;
}
try {
Thread.sleep(DELETE_SLEEP);
} catch (InterruptedException e) {
LOG.warn("interrupted ex", e);
}
}
}
return deleted;
}
public boolean deleteStack(CloudbreakClient cloudbreakClient, String stackId) {
boolean result = false;
if (stackId != null) {
cloudbreakClient.stackEndpoint().delete(Long.valueOf(stackId), false, false);
result = true;
}
return result;
}
public boolean deleteRecipe(CloudbreakClient cloudbreakClient, Long recipeId) {
cloudbreakClient.recipeEndpoint().delete(recipeId);
return true;
}
public boolean deleteRdsConfigs(CloudbreakClient cloudbreakClient, String rdsConfigId) {
if (rdsConfigId != null) {
cloudbreakClient.rdsConfigEndpoint().delete(Long.valueOf(rdsConfigId));
}
return true;
}
}