package com.sequenceiq.cloudbreak.cloud.openstack.nativ.service;
import java.util.Date;
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("OpenStackResourceNameService")
public class OpenStackResourceNameService extends CloudbreakResourceNameService {
private static final Logger LOGGER = LoggerFactory.getLogger(OpenStackResourceNameService.class);
private static final int ATTACHED_DISKS_PART_COUNT = 4;
private static final int INSTANCE_NAME_PART_COUNT = 3;
@Value("${cb.max.openstack.resource.name.length:}")
private int maxResourceNameLength;
@Override
public String resourceName(ResourceType resourceType, Object... parts) {
String resourceName;
switch (resourceType) {
case OPENSTACK_NETWORK:
resourceName = openStackNetworkResourceName(parts);
break;
case OPENSTACK_SUBNET:
resourceName = openStackNetworkResourceName(parts);
break;
case OPENSTACK_ROUTER:
resourceName = openStackNetworkResourceName(parts);
break;
case OPENSTACK_SECURITY_GROUP:
resourceName = openStackNetworkResourceName(parts);
break;
case OPENSTACK_INSTANCE:
case OPENSTACK_PORT:
case OPENSTACK_FLOATING_IP:
resourceName = instanceName(parts);
break;
case OPENSTACK_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 = String.valueOf(parts[1]);
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 openStackNetworkResourceName(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;
}
}