package core.aws.remote;
import com.amazonaws.services.ec2.model.DescribeTagsRequest;
import com.amazonaws.services.ec2.model.Filter;
import com.amazonaws.services.ec2.model.TagDescription;
import core.aws.client.AWS;
import core.aws.env.Environment;
import core.aws.remote.as.ASGroupLoader;
import core.aws.remote.ec2.ImageLoader;
import core.aws.remote.ec2.InstanceLoader;
import core.aws.remote.ec2.InstanceProfileLoader;
import core.aws.remote.ec2.KeyPairLoader;
import core.aws.remote.ec2.SGLoader;
import core.aws.remote.elb.ELBLoader;
import core.aws.remote.elb.ServerCertLoader;
import core.aws.remote.s3.S3Loader;
import core.aws.remote.vpc.InternetGatewayLoader;
import core.aws.remote.vpc.NATLoader;
import core.aws.remote.vpc.RouteTableLoader;
import core.aws.remote.vpc.SubnetLoader;
import core.aws.remote.vpc.VPCLoader;
import core.aws.resource.Resources;
import core.aws.task.ec2.EC2TagHelper;
import core.aws.util.Maps;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author neo
*/
public class RemoteResourceLoader {
public void load(Environment env, Resources resources) {
List<EnvTag> tags = loadEnvTags(env);
new ImageLoader(resources, tags).load();
new SGLoader(resources, tags).load();
new KeyPairLoader(resources, env).load();
new InstanceLoader(resources, tags).load(); // instance loader must after sg, key pair, image loader to link remoteOnly sg/key and unfinished bake instance
new VPCLoader(resources, tags).load();
new InstanceProfileLoader(resources, env).load();
new NATLoader(resources, tags).load();
new RouteTableLoader(resources, tags).load();
new InternetGatewayLoader(resources, tags).load();
new SubnetLoader(resources, tags).load();
new ServerCertLoader(resources, env).load();
new ELBLoader(resources, env).load();
new ASGroupLoader(resources, env).load();
new S3Loader(resources, env).load();
}
private List<EnvTag> loadEnvTags(Environment env) {
Map<String, EnvTag> tags = Maps.newHashMap();
DescribeTagsRequest request = new DescribeTagsRequest()
.withFilters(new Filter("key").withValues(new EC2TagHelper(env).prefix() + ":*"));
List<TagDescription> remoteTags = AWS.ec2.describeTags(request);
for (TagDescription remoteTag : remoteTags) {
String remoteResourceId = remoteTag.getResourceId();
EnvTag tag = tags.computeIfAbsent(remoteResourceId, key -> new EnvTag(remoteTag));
tag.addField(remoteTag);
}
return new ArrayList<>(tags.values());
}
}