package com.clouck.model;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.clouck.exception.CloudVersionIllegalStateException;
import com.clouck.model.aws.AbstractResource;
import com.clouck.model.aws.ec2.Ec2Ami;
import com.clouck.model.aws.ec2.Ec2AutoScalingGroup;
import com.clouck.model.aws.ec2.Ec2ElasticIP;
import com.clouck.model.aws.ec2.Ec2Instance;
import com.clouck.model.aws.ec2.Ec2KeyPair;
import com.clouck.model.aws.ec2.Ec2LaunchConfiguration;
import com.clouck.model.aws.ec2.Ec2LoadBalancer;
import com.clouck.model.aws.ec2.Ec2NetworkInterface;
import com.clouck.model.aws.ec2.Ec2PlacementGroup;
import com.clouck.model.aws.ec2.Ec2Reservation;
import com.clouck.model.aws.ec2.Ec2SecurityGroup;
import com.clouck.model.aws.ec2.Ec2Snapshot;
import com.clouck.model.aws.ec2.Ec2SpotInstanceRequest;
import com.clouck.model.aws.ec2.Ec2Volume;
import com.clouck.model.aws.ec2.VpcDhcpOptions;
import com.clouck.model.aws.ec2.VpcInternetGateway;
import com.clouck.model.aws.ec2.VpcNetworkAcl;
import com.clouck.model.aws.ec2.VpcRouteTable;
import com.clouck.model.aws.ec2.VpcSubnet;
import com.clouck.model.aws.ec2.VpcVpc;
import com.clouck.model.aws.iam.IamGroup;
import com.clouck.model.aws.iam.IamRole;
import com.clouck.model.aws.iam.IamUser;
public enum ResourceType {
Ec2_Ami(Ec2Ami.class, true, true, true, "imageId"),
Ec2_Auto_Scaling_Group(Ec2AutoScalingGroup.class, true, true, true, "autoScalingGroupARN"),
Ec2_Elastic_IP(Ec2ElasticIP.class, true, true, true, "publicIp"),
Ec2_Instance(Ec2Instance.class, true, false, true, "instanceId"),
Ec2_Key_Pair(Ec2KeyPair.class, true, true, true, "keyName"),
Ec2_Launch_Configuration(Ec2LaunchConfiguration.class, true, true, true, "launchConfigurationARN"),
Ec2_Load_Balancer(Ec2LoadBalancer.class, true, true, true, "loadBalancerName"),
Ec2_Network_Interface(Ec2NetworkInterface.class, true, true, true, "networkInterfaceId"),
Ec2_Placement_Group(Ec2PlacementGroup.class, true, true, true, "groupName"),
Ec2_Reservation(Ec2Reservation.class, true, true, false, "reservationId"),
Ec2_Security_Group(Ec2SecurityGroup.class, true, true, true, "groupId"),
Ec2_Snapshot(Ec2Snapshot.class, true, true, true, "snapshotId"),
Ec2_Spot_Instance_Request(Ec2SpotInstanceRequest.class, true, true, true, "spotInstanceRequestId"),
Ec2_Volume(Ec2Volume.class, true, true, true, "volumeId"),
Iam_Group(IamGroup.class, false, true, true, "groupId"),
Iam_Role(IamRole.class, false, true, true, "roleId"),
Iam_User(IamUser.class, false, true, true, "userId"),
Vpc_DhcpOptions(VpcDhcpOptions.class, true, true, true, "dhcpOptionsId"),
Vpc_Internet_Gateway(VpcInternetGateway.class, true, true, true, "internetGatewayId"),
Vpc_NetworkAcl(VpcNetworkAcl.class, true, true, true, "networkAclId"),
Vpc_Route_Table(VpcRouteTable.class, true, true, true, "routeTableId"),
Vpc_Subnet(VpcSubnet.class, true, true, true, "subnetId"),
Vpc_Vpc(VpcVpc.class, true, true, true, "vpcId");
private Class<? extends AbstractResource<?>> resourceClass;
private boolean isMultiRegion;
private boolean isScaningResource;
private boolean isViewResource;
private Set<String> uniqueIdNames = new HashSet<>();
<V extends AbstractResource<?>> ResourceType(Class<V> resourceClass, boolean isMultiRegion,
boolean isScaningResource, boolean isViewResource, String... uniqueIdNames) {
this.resourceClass = resourceClass;
this.isMultiRegion = isMultiRegion;
this.isScaningResource = isScaningResource;
this.isViewResource = isViewResource;
Collections.addAll(this.uniqueIdNames, uniqueIdNames);
}
public static List<ResourceType> findScaningResourceTypes() {
List<ResourceType> rts = new ArrayList<>();
rts.add(ResourceType.Ec2_Reservation);
rts.add(ResourceType.Ec2_Ami);
rts.add(ResourceType.Ec2_Volume);
rts.add(ResourceType.Ec2_Snapshot);
rts.add(ResourceType.Ec2_Security_Group);
rts.add(ResourceType.Ec2_Elastic_IP);
rts.add(ResourceType.Ec2_Placement_Group);
rts.add(ResourceType.Ec2_Key_Pair);
rts.add(ResourceType.Ec2_Spot_Instance_Request);
rts.add(ResourceType.Ec2_Load_Balancer);
rts.add(ResourceType.Ec2_Network_Interface);
return rts;
}
public static List<ResourceType> findViewResourceTypes() {
List<ResourceType> rts = new ArrayList<>();
rts.add(ResourceType.Ec2_Instance);
rts.add(ResourceType.Ec2_Ami);
rts.add(ResourceType.Ec2_Volume);
rts.add(ResourceType.Ec2_Snapshot);
rts.add(ResourceType.Ec2_Security_Group);
rts.add(ResourceType.Ec2_Elastic_IP);
rts.add(ResourceType.Ec2_Placement_Group);
rts.add(ResourceType.Ec2_Key_Pair);
rts.add(ResourceType.Ec2_Spot_Instance_Request);
rts.add(ResourceType.Ec2_Load_Balancer);
rts.add(ResourceType.Ec2_Network_Interface);
return rts;
}
public static ResourceType find(AbstractResource<?> resource) {
for (ResourceType resourceType : values()) {
if (resourceType.getResourceClass().isInstance(resource)) {
return resourceType;
}
}
throw new CloudVersionIllegalStateException(resource.toString());
}
/**
* @param variableName e.g. instances
* @return
*/
public static ResourceType find(String variableName) {
for (ResourceType resourceType : values()) {
if (resourceType.findVariableName().equals(variableName)) {
return resourceType;
}
}
throw new CloudVersionIllegalStateException("invalid variableName:" + variableName);
}
/**
* change Ec2_Security_Group to securityGroups
* @return
*/
public String findVariableName() {
String whole;
if (name().startsWith("Ec2")) {
whole = name().replaceAll("_", "").replaceFirst("Ec2", "");
} else if (name().startsWith("Vpc")) {
whole = name().replaceAll("_", "").replaceFirst("Vpc", "");
} else if (name().startsWith("Iam")) {
whole = name().replaceAll("_", "").replaceFirst("Iam", "");
} else {
throw new CloudVersionIllegalStateException("uncompleted code.");
}
return Character.toLowerCase(whole.charAt(0)) + (whole.length() > 1 ? whole.substring(1) : "") + "s";
}
/**
* change Ec2_Security_Group to ec2-security-groups
* @return
*/
public String findResourcesPage() {
return findResourcePage() + "s";
}
/**
* change Ec2_Security_Group to ec2-security-groups-raw
* @return
*/
public String findResourcesRawPage() {
return findResourcesPage() + "-raw";
}
/**
* change Ec2_Security_Group to ec2-security-group-versions
* @return
*/
public String findResourceHistoryPage() {
return findResourcePage() + "-versions";
}
public String findSummaryVariableName() {
return findVariableName() + "-summary";
}
/**
* change Ec2_Security_Group to ec2-security-group
* @return
*/
public String findResourcePage() {
return name().toLowerCase().replaceAll("_", "-");
}
/**
* change Ec2_Security_Group to ec2-security-group-raw
* @return
*/
public String findResourceRawPage() {
return findResourcePage() + "-raw";
}
/**
* change Ec2_Security_Group to ec2-security-groups-versions
* @return
*/
public String findResourcesHistoryPage() {
return findResourcesPage() + "-versions";
}
public Class<? extends AbstractResource<?>> getResourceClass() {
return resourceClass;
}
public boolean isMultiRegion() {
return isMultiRegion;
}
public boolean isScaningResource() {
return isScaningResource;
}
public Set<String> getUniqueIdNames() {
return uniqueIdNames;
}
public boolean isViewResource() {
return isViewResource;
}
}