package com.sequenceiq.cloudbreak.cloud.openstack.common;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.openstack4j.api.OSClient;
import org.openstack4j.model.heat.Stack;
import org.openstack4j.model.network.Subnet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import com.google.common.base.Splitter;
import com.sequenceiq.cloudbreak.cloud.context.AuthenticatedContext;
import com.sequenceiq.cloudbreak.cloud.exception.CloudConnectorException;
import com.sequenceiq.cloudbreak.cloud.model.CloudResource;
import com.sequenceiq.cloudbreak.cloud.model.CloudResourceStatus;
import com.sequenceiq.cloudbreak.cloud.openstack.auth.OpenStackClient;
import com.sequenceiq.cloudbreak.cloud.openstack.status.HeatStackStatus;
import com.sequenceiq.cloudbreak.cloud.openstack.view.NeutronNetworkView;
import com.sequenceiq.cloudbreak.common.type.ResourceType;
@Component
public class OpenStackUtils {
public static final String CB_INSTANCE_GROUP_NAME = "cb_instance_group_name";
public static final String CB_INSTANCE_PRIVATE_ID = "cb_instance_private_id";
private static final Logger LOGGER = LoggerFactory.getLogger(OpenStackUtils.class);
@Value("${cb.max.openstack.resource.name.length:}")
private int maxResourceNameLength;
@Inject
private OpenStackClient openStackClient;
public CloudResource getHeatResource(List<CloudResource> resourceList) {
for (CloudResource resource : resourceList) {
if (resource.getType() == ResourceType.HEAT_STACK) {
return resource;
}
}
throw new CloudConnectorException(String.format("No resource found: %s", ResourceType.HEAT_STACK));
}
public String getPrivateInstanceId(String groupName, String privateId) {
return getNormalizedGroupName(groupName) + "_" + privateId;
}
public String getPrivateInstanceId(Map<String, String> metadata) {
return getPrivateInstanceId(metadata.get(CB_INSTANCE_GROUP_NAME), metadata.get(CB_INSTANCE_PRIVATE_ID));
}
public String getNormalizedGroupName(String groupName) {
return groupName.replaceAll("_", "");
}
public String getStackName(AuthenticatedContext context) {
return context.getCloudContext().getName() + "_" + context.getCloudContext().getId();
}
public CloudResourceStatus heatStatus(CloudResource resource, Stack heatStack) {
String status = heatStack.getStatus();
LOGGER.info("Heat stack status of: {} is: {}", heatStack, status);
CloudResourceStatus heatResourceStatus = new CloudResourceStatus(resource, HeatStackStatus.mapResourceStatus(status), heatStack.getStackStatusReason());
LOGGER.debug("Cloud resource status: {}", heatResourceStatus);
return heatResourceStatus;
}
public String adjustStackNameLength(String stackName) {
return Splitter.fixedLength(maxResourceNameLength).splitToList(stackName).get(0);
}
public String getExistingSubnetCidr(AuthenticatedContext authenticatedContext, NeutronNetworkView neutronNetwork) {
if (neutronNetwork.isExistingSubnet()) {
String subnetId = neutronNetwork.getCustomSubnetId();
OSClient osClient = openStackClient.createOSClient(authenticatedContext);
Subnet subnet = osClient.networking().subnet().get(subnetId);
if (subnet == null) {
throw new CloudConnectorException("The specified subnet does not exist: " + subnetId);
}
return subnet.getCidr();
}
return null;
}
}