package tw.com;
import com.amazonaws.auth.AWSCredentialsProviderChain;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.regions.Region;
import com.amazonaws.services.cloudformation.AmazonCloudFormationClient;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.elasticloadbalancing.AmazonElasticLoadBalancingClient;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClient;
import com.amazonaws.services.rds.AmazonRDSClient;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.sns.AmazonSNSClient;
import com.amazonaws.services.sqs.AmazonSQSClient;
import org.apache.commons.cli.MissingArgumentException;
import tw.com.commandline.CommandExecutor;
import tw.com.entity.ProjectAndEnv;
import tw.com.exceptions.CfnAssistException;
import tw.com.pictures.AmazonVPCFacade;
import tw.com.pictures.DiagramCreator;
import tw.com.providers.*;
import tw.com.repository.CfnRepository;
import tw.com.repository.CloudRepository;
import tw.com.repository.ELBRepository;
import tw.com.repository.VpcRepository;
public class FacadeFactory {
private boolean snsMonitoring = false;
private Region region;
private String project;
private boolean init;
// amazon apis
private AWSCredentialsProviderChain credentialsProvider;
private AmazonCloudFormationClient cfnClient;
private AmazonSQSClient sqsClient;
private AmazonSNSClient snsClient;
private AmazonS3Client s3Client;
private AmazonEC2Client ec2Client;
private AmazonElasticLoadBalancingClient elbClient;
private AmazonRDSClient rdsClient;
private AmazonIdentityManagementClient iamClient;
// providers
private ArtifactUploader artifactUploader;
private CloudClient cloudClient;
private CloudFormationClient formationClient;
private LoadBalancerClient loadBalancerClient;
private RDSClient datastoreClient;
private SNSNotificationSender notificationSender;
private SavesFile savesFile;
// repo
private ELBRepository elbRepository;
private CfnRepository cfnRepository;
private VpcRepository vpcRepository;
private CloudRepository cloudRepository;
// controller
private AwsFacade awsFacade;
private DiagramCreator diagramCreator;
private IdentityProvider identityProvider;
public FacadeFactory() {
credentialsProvider = new DefaultAWSCredentialsProviderChain();
}
public void setRegion(Region awsRegion) {
this.region = awsRegion;
}
public void setProject(String project) {
this.project = project;
}
public void setSNSMonitoring() {
this.snsMonitoring = true;
}
private void init() {
if (!init) {
createAmazonAPIClients();
createProviders();
createRepo();
init = true;
}
}
private void createProviders() {
loadBalancerClient = new LoadBalancerClient(elbClient);
cloudClient = new CloudClient(ec2Client);
formationClient = new CloudFormationClient(cfnClient);
datastoreClient = new RDSClient(rdsClient);
notificationSender = new SNSNotificationSender(snsClient);
identityProvider = new IdentityProvider(iamClient);
}
private void createRepo() {
cloudRepository = new CloudRepository(cloudClient);
cfnRepository = new CfnRepository(formationClient, cloudRepository, project);
vpcRepository = new VpcRepository(cloudClient);
elbRepository = new ELBRepository(loadBalancerClient, vpcRepository, cfnRepository);
}
private void createAmazonAPIClients() {
cfnClient = new AmazonCloudFormationClient(credentialsProvider);
cfnClient.setRegion(region);
ec2Client = new AmazonEC2Client(credentialsProvider);
ec2Client.setRegion(region);
snsClient = new AmazonSNSClient(credentialsProvider);
snsClient.setRegion(region);
sqsClient = new AmazonSQSClient(credentialsProvider);
sqsClient.setRegion(region);
elbClient = new AmazonElasticLoadBalancingClient(credentialsProvider);
elbClient.setRegion(region);
s3Client = new AmazonS3Client(credentialsProvider);
s3Client.setRegion(region);
rdsClient = new AmazonRDSClient(credentialsProvider);
rdsClient.setRegion(region);
iamClient = new AmazonIdentityManagementClient(credentialsProvider);
iamClient.setRegion(region);
}
public AwsFacade createFacade() throws MissingArgumentException, CfnAssistException, InterruptedException {
if (awsFacade==null) {
init();
SNSEventSource eventSource = new SNSEventSource(snsClient, sqsClient);
MonitorStackEvents monitor;
if (snsMonitoring) {
monitor = new SNSMonitor(eventSource, cfnRepository);
} else {
monitor = new PollingStackMonitor(cfnRepository);
}
monitor.init();
awsFacade = new AwsFacade(monitor, cfnRepository, vpcRepository, elbRepository,
cloudRepository, notificationSender, identityProvider, region.getName());
}
return awsFacade;
}
public ArtifactUploader createArtifactUploader(ProjectAndEnv projectAndEnv) {
init();
if (artifactUploader==null) {
artifactUploader = new ArtifactUploader(s3Client, projectAndEnv.getS3Bucket(),
projectAndEnv.getBuildNumber());
}
return artifactUploader;
}
public DiagramCreator createDiagramCreator() {
init();
if (diagramCreator==null) {
AmazonVPCFacade amazonVpcFacade = new AmazonVPCFacade(cloudRepository, elbRepository, datastoreClient);
diagramCreator = new DiagramCreator(amazonVpcFacade);
}
return diagramCreator;
}
public ProvidesCurrentIp getCurrentIpProvider() {
return new ProvidesCurrentIp();
}
public SavesFile getSavesFile() {
if (savesFile==null) {
savesFile = new SavesFile();
}
return savesFile;
}
public CommandExecutor getCommandExecutor() {
return new CommandExecutor();
}
}