package com.sequenceiq.cloudbreak.cloud.gcp.service;
import java.util.Date;
import org.apache.commons.lang3.text.WordUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.sequenceiq.cloudbreak.cloud.service.CloudbreakResourceNameService;
import com.sequenceiq.cloudbreak.common.type.ResourceType;
@Service("GcpResourceNameServiceV2")
public class GcpResourceNameService extends CloudbreakResourceNameService {
private static final Logger LOGGER = LoggerFactory.getLogger(GcpResourceNameService.class);
private static final String FIREWALL_INTERNAL_NAME_SUFFIX = "internal";
private static final String FIREWALL_IN_NAME_SUFFIX = "in";
private static final int ATTACHED_DISKS_PART_COUNT = 4;
private static final int INSTANCE_NAME_PART_COUNT = 3;
@Value("${cb.max.gcp.resource.name.length:}")
private int maxResourceNameLength;
@Override
public String resourceName(ResourceType resourceType, Object... parts) {
String resourceName;
switch (resourceType) {
case GCP_NETWORK:
resourceName = gcpNetworkResourceName(parts);
break;
case GCP_SUBNET:
resourceName = gcpSubnetResourceName(parts);
break;
case GCP_FIREWALL_INTERNAL:
resourceName = stackBasedResourceWithSuffix(FIREWALL_INTERNAL_NAME_SUFFIX, parts);
break;
case GCP_FIREWALL_IN:
resourceName = stackBasedResourceWithSuffix(FIREWALL_IN_NAME_SUFFIX, parts);
break;
case GCP_RESERVED_IP:
resourceName = instanceName(parts);
break;
case GCP_INSTANCE:
resourceName = instanceName(parts);
break;
case GCP_DISK:
resourceName = instanceName(parts);
break;
case GCP_ATTACHED_DISK:
resourceName = attachedDiskResourceName(parts);
break;
default:
throw new IllegalStateException("Unsupported resource type: " + resourceType);
}
return resourceName;
}
private String attachedDiskResourceName(Object[] parts) {
checkArgs(ATTACHED_DISKS_PART_COUNT, parts);
String cnt = String.valueOf(parts[ATTACHED_DISKS_PART_COUNT - 1]);
String name = instanceName(parts);
name = trimHash(name);
name = appendPart(name, cnt);
name = appendHash(name, new Date());
name = adjustBaseLength(name, maxResourceNameLength);
return name;
}
private String instanceName(Object[] parts) {
checkArgs(INSTANCE_NAME_PART_COUNT, parts);
String name;
String stackName = String.valueOf(parts[0]);
String instanceGroupName = WordUtils.initials(String.valueOf(parts[1]).replaceAll("_", " "));
String privateId = String.valueOf(parts[2]);
name = normalize(stackName);
name = adjustPartLength(name);
name = appendPart(name, normalize(instanceGroupName));
name = appendPart(name, privateId);
name = appendHash(name, new Date());
name = adjustBaseLength(name, maxResourceNameLength);
return name;
}
private String stackBasedResourceWithSuffix(String suffix, Object[] parts) {
checkArgs(1, parts);
String stackName = String.valueOf(parts[0]);
LOGGER.debug("Generating stack based resource name with suffix. Stack {}; suffix {}", parts, suffix);
String name = normalize(stackName);
name = adjustPartLength(name);
name = appendPart(name, suffix);
name = appendHash(name, new Date());
name = adjustBaseLength(name, maxResourceNameLength);
return name;
}
private String gcpNetworkResourceName(Object[] parts) {
checkArgs(1, parts);
String networkName;
String stackName = String.valueOf(parts[0]);
networkName = normalize(stackName);
networkName = adjustPartLength(networkName);
networkName = appendHash(networkName, new Date());
networkName = adjustBaseLength(networkName, maxResourceNameLength);
return networkName;
}
private String gcpSubnetResourceName(Object[] parts) {
checkArgs(1, parts);
String subnetName;
String stackName = String.valueOf(parts[0]);
subnetName = normalize(stackName);
subnetName = adjustPartLength(subnetName);
subnetName = appendHash(subnetName, new Date());
subnetName = adjustBaseLength(subnetName, maxResourceNameLength);
return subnetName;
}
}