/**
* DeployMan # Thomas Uhrig (Stuttgart, 2014) # www.tuhrig.de
*/
package de.tuhrig.deployman.launch;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import com.amazonaws.services.ec2.model.InstanceType;
import de.tuhrig.deployman.launch.formation.Container;
import de.tuhrig.deployman.launch.formation.Formation;
import de.tuhrig.deployman.launch.formation.Machine;
import de.tuhrig.deployman.repo.RemoteRepository;
/**
* JSON has no standardized way to validate its schema. This is great, because it makes it easy to
* write JSON and most validation tasks are to complicated for schemas eitherway. This call performs
* simple and highlevel validation taks for formation files.
*
* @author tuhrig
*/
@SuppressWarnings("nls")
public class FormationValidator {
private static final String ERROR = "[ERROR] ";
private static final String WARNING = "[WARNING] ";
private static final String SUCCESS = "[SUCCESS] ";
public List<String> validate(String path) {
Formation formation = Formation.read(path);
return validate(formation);
}
public List<String> validate(File file) {
Formation formation = Formation.read(file);
return validate(formation);
}
public List<String> validate(Formation formation) {
List<String> results = new ArrayList<>();
validateFormationHasName(results, formation);
validateFormationHasDescription(results, formation);
validateFormationHasDefinition(results, formation);
/*
* Validate instance definition
*/
if (formation.hasInstanceDefinition()) {
Machine machine = formation.getMachine();
validateMachineHasName(results, machine);
validateMachineHasInstanceType(results, machine);
validateMachineHasSecurityGroup(results, machine);
validateMachineHasImageId(results, machine);
for (Container setup : machine.getContainers()) {
validateContainerHasName(results, setup);
validateContainerHasImage(results, setup);
validateContainerHasConfig(results, setup);
validateContainerHasCommand(results, setup);
}
}
/*
* Validate database definition
*/
if (formation.hasDatabaseDefinition()) {
}
return results;
}
private void validateContainerHasCommand(List<String> results, Container setup) {
if (StringUtils.isEmpty(setup.getCommand()))
results.add(ERROR + "You must provide a command for the container");
else
results.add(SUCCESS + "Command for the container is provided");
}
private void validateContainerHasConfig(List<String> results, Container setup) {
if (StringUtils.isEmpty(setup.getConfig()))
results.add(ERROR + "You must provide a config for the container");
else {
if (!new RemoteRepository().folderExistsRemote(setup.getConfig()))
results.add(ERROR + "Config " + setup.getConfig() + " does not exists in S3 bucket"); //$NON-NLS-2$
else
results.add(SUCCESS + "Config exists in S3 bucket");
}
}
private void validateContainerHasImage(List<String> results, Container setup) {
if (StringUtils.isEmpty(setup.getTarball()))
results.add(ERROR + "You must provide an image for the container");
else {
if (!new RemoteRepository().objectExistsRemote(setup.getTarball()))
results.add(ERROR + "Image does not exists in S3 bucket");
else
results.add(SUCCESS + "Image exists in S3 bucket");
}
}
private void validateContainerHasName(List<String> results, Container setup) {
if (StringUtils.isEmpty(setup.getTarballName()))
results.add(WARNING + "Provide a name for the container setup");
else
results.add(SUCCESS + "Container name is provided");
}
private void validateMachineHasImageId(List<String> results, Machine machine) {
if (StringUtils.isEmpty(machine.getImageId()))
results.add(ERROR + "You must provide an image id for the machine");
else
results.add(SUCCESS + "Image id is provided");
}
private void validateMachineHasSecurityGroup(List<String> results, Machine machine) {
if (StringUtils.isEmpty(machine.getSecurityGroup()))
results.add(ERROR + "You must provide a security group for the machine");
else
results.add(SUCCESS + "Security group is provided for the machine");
}
private void validateMachineHasInstanceType(List<String> results, Machine machine) {
if (StringUtils.isEmpty(machine.getInstanceType()))
results.add(ERROR + "You must provide an instance type for the machine");
else {
String instanceType = machine.getInstanceType();
try {
InstanceType.fromValue(instanceType);
results.add(SUCCESS + "Valid instance type");
} catch (IllegalArgumentException e) {
results.add(ERROR + "Unknown instance type");
}
}
}
private void validateMachineHasName(List<String> results, Machine machine) {
if (StringUtils.isEmpty(machine.getName()))
results.add(ERROR + "You must provide a name for the machine");
else
results.add(SUCCESS + "Machine name is provided");
}
private void validateFormationHasDefinition(List<String> results, Formation formation) {
if (!formation.hasInstanceDefinition() && !formation.hasDatabaseDefinition())
results.add(ERROR + "You must provide a instance or database definition");
else
results.add(SUCCESS + "Instance or database definition is provided");
}
private void validateFormationHasDescription(List<String> results, Formation formation) {
if (StringUtils.isEmpty(formation.getDescription()))
results.add(WARNING + "Provide a description for the formation");
else
results.add(SUCCESS + "Formation description is provided");
}
private void validateFormationHasName(List<String> results, Formation formation) {
if (StringUtils.isEmpty(formation.getName()))
results.add(WARNING + "Provide a name for the formation");
else
results.add(SUCCESS + "Formation name is provided");
}
}