package tw.com.commandline;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.RegionUtils;
import com.amazonaws.services.cloudformation.model.Parameter;
import org.apache.commons.cli.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import tw.com.FacadeFactory;
import tw.com.entity.ProjectAndEnv;
import tw.com.exceptions.*;
import java.io.IOException;
import java.util.Collection;
public class Main {
public static final String ENV_VAR_EC2_REGION = "EC2_REGION";
private static final Logger logger = LoggerFactory.getLogger(Main.class);
private Options commandLineOptions;
private String[] args;
private String executableName;
private CommandFlags flags;
private Actions commandActions;
public Main(String[] args) {
this.args = args;
executableName = "cfnassist";
commandLineOptions = new Options();
flags = new CommandFlags(executableName, commandLineOptions);
commandActions = new Actions();
commandActions.addActionsTo(commandLineOptions);
}
public static void main(String[] args) throws ParseException, IOException,
CfnAssistException, InterruptedException {
Main main = new Main(args);
int result = main.parse();
System.exit(result);
}
public int parse() {
FacadeFactory factory = new FacadeFactory();
return parse(factory, true);
}
public int parse(FacadeFactory factory, boolean act) {
try {
CommandLineParser parser = new DefaultParser();
CommandLine commandLine = parser.parse(commandLineOptions, args);
HelpFormatter formatter = new HelpFormatter();
flags.populateFlags(commandLine, formatter);
CommandLineAction action = commandActions.selectCorrectActionFromArgs(commandLine, formatter,
executableName, commandLineOptions );
Region awsRegion = populateRegion(flags.getRegion());
logger.info("Region set to " + awsRegion);
ProjectAndEnv projectAndEnv = new ProjectAndEnv(flags.getProject(), flags.getEnv());
if (flags.haveBuildNumber()) {
projectAndEnv.addBuildNumber(flags.getBuildNumber());
}
if (flags.getSns()) {
projectAndEnv.setUseSNS();
}
if (flags.haveS3Bucket()) {
projectAndEnv.setS3Bucket(flags.getS3Bucket());
}
if (flags.haveCapabilityIAM()) {
projectAndEnv.setUseCapabilityIAM();
}
if (action.usesComment() && flags.haveComment()) {
String comment = flags.getComment();
projectAndEnv.setComment(comment);
}
logger.info("Invoking for " + projectAndEnv);
String[] argsForAction = commandLine.getOptionValues(action.getArgName());
Collection<Parameter> artifacts = flags.getUploadParams();
action.validate(projectAndEnv, flags.getAdditionalParameters(), artifacts, argsForAction);
factory.setRegion(awsRegion);
setFactoryOptionsForAction(factory, action);
Collection<Parameter> additionalParams = flags.getAdditionalParameters();
if (act) {
action.invoke(factory, projectAndEnv, additionalParams, artifacts, argsForAction);
} else {
logger.info("Not invoking");
}
}
catch (CfnAssistException exception) {
logger.error("CommandLine fail due to cfn assit problem: ", exception);
return -1;
} catch (MissingArgumentException | IOException | InterruptedException e) {
logger.error("Processing failed: ", e);
return -1;
} catch (CommandLineException e) {
logger.error("CommandLine processing failed: ", e);
return -1;
} catch (ParseException e) {
logger.error("Unable to parse commandline: ", e);
return -1;
}
logger.debug("CommandLine ok");
return 0;
}
private void setFactoryOptionsForAction(FacadeFactory factory, CommandLineAction action) {
// TODO move some validation checking to here
if (action.usesProject()) {
factory.setProject(flags.getProject());
}
if (action.usesSNS() && flags.haveSnsEnable()) {
factory.setSNSMonitoring();
}
}
private Region populateRegion(String regionName) throws MissingArgumentException {
logger.info("Check for region using name "+regionName);
Region result = RegionUtils.getRegion(regionName);
if (result==null) {
String msg = "Unable for find region for " + regionName;
logger.error(msg);
throw new MissingArgumentException(msg);
}
return result;
}
}