package tw.com.ant; import java.io.IOException; import java.util.Collection; import java.util.LinkedList; import java.util.List; import org.apache.commons.cli.MissingArgumentException; import org.apache.tools.ant.BuildException; import com.amazonaws.regions.Region; import com.amazonaws.regions.RegionUtils; import com.amazonaws.services.cloudformation.model.Parameter; import tw.com.FacadeFactory; import tw.com.commandline.CommandLineException; import tw.com.entity.ProjectAndEnv; import tw.com.exceptions.CfnAssistException; public class CfnAssistAntTask extends org.apache.tools.ant.Task { private String awsRegion; private String cfnProject; private Integer cfnBuildNumber = null; private String cfnEnv; private String bucketName; private boolean snsMonitoring; private boolean capabilityIAM; private Collection<Param> params; private Collection<Param> artifactParams; private List<ActionElement> actionElements; public CfnAssistAntTask() { snsMonitoring = false; params = new LinkedList<>(); artifactParams = new LinkedList<>(); actionElements = new LinkedList<>(); } public void setRegion(String awsRegion) { this.awsRegion = awsRegion; } public void setProject(String cfnProject) { this.cfnProject = cfnProject; } public void setEnv(String cfnEnv) { this.cfnEnv = cfnEnv; } public void setBuildNumber(String cfnBuildNumber) { this.cfnBuildNumber = Integer.parseInt(cfnBuildNumber); } public void setBucketName(String bucketName) { this.bucketName = bucketName; } public void setSns(boolean useSnsMonitoring) { this.snsMonitoring = useSnsMonitoring; } public void setCapabilityIAM(boolean capabilityIAM) { this.capabilityIAM = capabilityIAM; } // NOTE // addConfigured is looked for by ant, the rest is the name of the Element public void addConfiguredTemplates(TemplatesElement fileElement) { actionElements.add(fileElement); } public void addConfiguredDelete(DeleteElement deleteElement) { actionElements.add(deleteElement); } public void addConfiguredInit(InitElement initElement) { actionElements.add(initElement); } public void addConfiguredSetTag(SetTagAction setTagAction) { actionElements.add(setTagAction);} public void addConfiguredRollback(RollbackElement rollbackElement) { actionElements.add(rollbackElement); } public void addConfiguredELBUpdate(ELBUpdateElement elbUpdateElement) { actionElements.add(elbUpdateElement); } public void addConfiguredS3Create(S3Create s3create) { actionElements.add(s3create); } public void addConfiguredS3Delete(S3Delete s3delete) { actionElements.add(s3delete); } public void addConfiguredTidyStacks(TidyStacksElement tidyStacksElement) { actionElements.add(tidyStacksElement); } public void addConfiguredDiagrams(DiagramsElement diagramsElement) { actionElements.add(diagramsElement); } public void addConfiguredWhitelist(WhitelistElement whitelistElement) { actionElements.add(whitelistElement); } public void addConfiguredBlacklist(BlacklistElement blacklistElement) { actionElements.add(blacklistElement); } public void execute() { ProjectAndEnv projectAndEnv = new ProjectAndEnv(cfnProject, cfnEnv); if (snsMonitoring) { projectAndEnv.setUseSNS(); } if (cfnBuildNumber!=null) { projectAndEnv.addBuildNumber(cfnBuildNumber); } if (bucketName!=null) { projectAndEnv.setS3Bucket(bucketName); } if (capabilityIAM) { projectAndEnv.setUseCapabilityIAM(); } Region region = RegionUtils.getRegion(awsRegion); Collection<Parameter> cfnParameters = createParameterList(); Collection<Parameter> artifacts = createArtifactList(); FacadeFactory factory = new FacadeFactory(); factory.setRegion(region); factory.setProject(cfnProject); if (snsMonitoring) { factory.setSNSMonitoring(); } try { for(ActionElement element : actionElements) { element.execute(factory, projectAndEnv, cfnParameters, artifacts); } } catch (IOException | MissingArgumentException | InterruptedException | CfnAssistException | CommandLineException innerException) { throw new BuildException(innerException); } } private Collection<Parameter> createParameterList() { Collection<Parameter> cfnParameters = new LinkedList<Parameter>(); for(Param param : params) { cfnParameters.add(param.getParamter()); } return cfnParameters; } private Collection<Parameter> createArtifactList() { Collection<Parameter> uploadParams = new LinkedList<Parameter>(); for(Param upload : artifactParams) { uploadParams.add(upload.getParamter()); } return uploadParams; } public Param createParam() { Param param = new Param(); params.add(param); return param; } public Param createArtifact() { Param param = new Param(); artifactParams.add(param); return param; } public class Param { private String name; private String value; public Param() { } public void setName(String name) { this.name = name; } public void setValue(String value) { this.value = value; } public Parameter getParamter() { Parameter param = new Parameter(); param.setParameterKey(name); param.setParameterValue(value); return param; } } }