use of org.opentosca.toscana.model.node.Compute in project TOSCAna by StuPro-TOSCAna.
the class TransformModelNodeVisitor method visit.
@Override
public void visit(Compute node) {
try {
if (cfnModule.checkComputeToEc2(node)) {
logger.debug("Compute '{}' will be transformed to EC2", node.getEntityName());
String nodeName = toAlphanumerical(node.getEntityName());
// default security group the EC2 Instance
SecurityGroup webServerSecurityGroup = cfnModule.resource(SecurityGroup.class, nodeName + SECURITY_GROUP).groupDescription("Enables ports for " + nodeName + ".");
// open endpoint port
node.getEndpoint().getPort().ifPresent(port -> webServerSecurityGroup.ingress(ingress -> ingress.cidrIp(IP_OPEN), PROTOCOL_TCP, port.port));
// check what image id should be taken
CapabilityMapper capabilityMapper = createCapabilityMapper();
OsCapability computeOs = node.getOs();
String imageId = capabilityMapper.mapOsCapabilityToImageId(computeOs);
ComputeCapability computeCompute = node.getHost();
String instanceType = capabilityMapper.mapComputeCapabilityToInstanceType(computeCompute, CapabilityMapper.EC2_DISTINCTION);
// create CFN init and store it
CFNInit init = new CFNInit(CONFIG_SETS);
cfnModule.putCFNInit(nodeName, init);
cfnModule.resource(Instance.class, nodeName).securityGroupIds(webServerSecurityGroup).imageId(imageId).instanceType(instanceType);
capabilityMapper.mapDiskSize(computeCompute, cfnModule, nodeName);
// Add Reference to keyName if KeyPair needed and open Port 22 (Allows SSH access)
if (cfnModule.hasKeyPair()) {
Instance instance = (Instance) cfnModule.getResource(nodeName);
instance.keyName(cfnModule.getKeyNameVar());
webServerSecurityGroup.ingress(ingress -> ingress.cidrIp(IP_OPEN), PROTOCOL_TCP, 22);
}
} else {
logger.debug("Compute '{}' will not be transformed to EC2", node.getEntityName());
}
} catch (SdkClientException se) {
logger.error("SDKClient failed, no valid credentials or no internet connection");
throw new TransformationFailureException("Failed", se);
} catch (Exception e) {
logger.error("Error while creating EC2Instance resource.");
throw new TransformationFailureException("Failed at Compute node " + node.getEntityName(), e);
}
}
use of org.opentosca.toscana.model.node.Compute in project TOSCAna by StuPro-TOSCAna.
the class TransformModelNodeVisitor method visit.
@Override
public void visit(Nodejs node) {
try {
Compute computeHost = getCompute(node);
String computeHostName = toAlphanumerical(computeHost.getEntityName());
String nodeName = node.getEntityName();
// handle configure
operationHandler.handleConfigure(node, computeHostName);
// handle start
operationHandler.handleStart(node, computeHostName);
// add NodeJs create script
operationHandler.addCreate(FILEPATH_NODEJS_CREATE, computeHostName);
// Get ports
List<Integer> portList = new ArrayList<>();
node.getCapabilities().forEach(e -> {
try {
if (e instanceof EndpointCapability && ((EndpointCapability) e).getPort().isPresent()) {
int port = ((EndpointCapability) e).getPort().get().port;
logger.debug("Marking '{}' as port to be opened for '{}'.", port, nodeName);
portList.add(port);
}
} catch (Exception ex) {
logger.warn("Failed reading Port from node {}", nodeName, ex);
}
});
// Open ports
String SecurityGroupName = computeHostName + SECURITY_GROUP;
SecurityGroup securityGroup = (SecurityGroup) cfnModule.getResource(SecurityGroupName);
securityGroup.ingress(ingress -> ingress.cidrIp(IP_OPEN), PROTOCOL_TCP, portList.toArray());
} catch (Exception e) {
logger.error("Error while creating Nodejs");
throw new TransformationFailureException("Failed at Nodejs node " + node.getEntityName(), e);
}
}
use of org.opentosca.toscana.model.node.Compute in project TOSCAna by StuPro-TOSCAna.
the class TransformModelNodeVisitor method visit.
@Override
public void visit(Database node) {
try {
Compute computeHost = getCompute(node);
String computeHostName = toAlphanumerical(computeHost.getEntityName());
operationHandler.handleGenericHostedNode(node, computeHost);
// Open Database port
String SecurityGroupName = computeHostName + SECURITY_GROUP;
SecurityGroup securityGroup = (SecurityGroup) cfnModule.getResource(SecurityGroupName);
if (node.getPort().isPresent()) {
Integer databasePort = node.getPort().orElseThrow(() -> new IllegalArgumentException("Database " + "port not set"));
Set<Compute> hostsOfConnectedTo = getHostsOfConnectedTo(node);
for (Compute hostOfConnectedTo : hostsOfConnectedTo) {
securityGroup.ingress(ingress -> ingress.sourceSecurityGroupName(cfnModule.ref(toAlphanumerical(hostOfConnectedTo.getEntityName()) + SECURITY_GROUP)), PROTOCOL_TCP, databasePort);
}
}
} catch (Exception e) {
logger.error("Error while creating Database resource.");
throw new TransformationFailureException("Failed at Database node " + node.getEntityName(), e);
}
}
use of org.opentosca.toscana.model.node.Compute in project TOSCAna by StuPro-TOSCAna.
the class TransformModelNodeVisitor method visit.
@Override
public void visit(Apache node) {
try {
Compute compute = getCompute(node);
String computeName = toAlphanumerical(compute.getEntityName());
// instead of lifecycle create we add the package apache2 to the configset
cfnModule.getCFNInit(computeName).getOrAddConfig(CONFIG_SETS, CONFIG_CREATE).putPackage(// TODO apt only if linux
new CFNPackage("apt").addPackage("apache2"));
// handle configure
operationHandler.handleConfigure(node, computeName);
// handle start
operationHandler.handleStart(node, computeName);
// Source environment variables in /etc/apache/envvars from /etc/environment and restart apache2 directly
// afterwards
cfnModule.getCFNInit(computeName).getOrAddConfig(CONFIG_SETS, CONFIG_CONFIGURE).putCommand(new CFNCommand("Add Apache environment variables", APACHE_ENV_IMPORT));
// we add restart apache2 command to the configscript if start or configure existed
if (node.getStandardLifecycle().getConfigure().isPresent() || node.getStandardLifecycle().getStart().isPresent()) {
cfnModule.getCFNInit(computeName).getOrAddConfig(CONFIG_SETS, CONFIG_START).putCommand(new CFNCommand("restart apache2", APACHE_RESTART_COMMAND));
}
} catch (Exception e) {
logger.error("Error while creating Apache");
throw new TransformationFailureException("Failed at Apache node " + node.getEntityName(), e);
}
}
use of org.opentosca.toscana.model.node.Compute in project TOSCAna by StuPro-TOSCAna.
the class CloudFormationPluginTest method testLamp.
@Test(expected = TransformationFailureException.class)
public void testLamp() {
try {
Set<RootNode> nodes = lamp.getNodes();
// visit compute nodes first
for (VisitableNode node : nodes) {
if (node instanceof Compute) {
node.accept(cfnNodeVisitor);
}
}
for (VisitableNode node : nodes) {
if (!(node instanceof Compute)) {
node.accept(cfnNodeVisitor);
}
}
System.err.println(cfnModule.toString());
} catch (TransformationFailureException tfe) {
// provided so this test can pass
if (!(tfe.getCause() instanceof SdkClientException)) {
throw tfe;
}
logger.debug("Passed without internet connection / credentials provided");
}
}
Aggregations