Commit 2bbc0d82 authored by Spiros Koulouzis's avatar Spiros Koulouzis

removed status from topology. All nodes have state attribute

parent 369b1304
This diff is collapsed.
......@@ -153,12 +153,7 @@ node_types:
attributes:
ssh_keys:
type: tosca.datatypes.ARTICONF.Credential
required: false
status:
type: string
required: false
constraints:
- valid_values: [ "fresh" , "running" , "deleted", "failed" , "stopped" ]
required: false
interfaces:
CloudsStorm:
type: tosca.interfaces.ARTICONF.CloudsStorm
......
......@@ -143,7 +143,13 @@
<artifactId>snakeyaml</artifactId>
<version>1.25</version>
<type>jar</type>
</dependency>
</dependency>
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
<type>jar</type>
</dependency>
</dependencies>
......
......@@ -60,7 +60,7 @@ public class Converter {
}
public static String encodeFileToBase64Binary(String fileName) throws IOException {
return encode2Bas64(Files.readAllBytes(Paths.get(fileName)));
return encode2Base64(Files.readAllBytes(Paths.get(fileName)));
}
public static void decodeBase64BToFile(String base64, String fileName) throws IOException {
......@@ -82,11 +82,11 @@ public class Converter {
String name = System.currentTimeMillis() + "_" + originalFileName;
byte[] bytes = file.getBytes();
return encode2Bas64(bytes);
return encode2Base64(bytes);
}
private static String encode2Bas64(byte[] bytes) {
private static String encode2Base64(byte[] bytes) {
byte[] encodedBytes = Base64.getEncoder().encode(bytes);
return new String(encodedBytes, StandardCharsets.UTF_8);
......
......@@ -21,11 +21,15 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.KeyPair;
import java.io.File;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Base64;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -43,6 +47,7 @@ import nl.uva.sne.drip.sure.tosca.client.ApiException;
import nl.uva.sne.drip.sure.tosca.client.Configuration;
import org.springframework.beans.factory.annotation.Autowired;
import static nl.uva.sne.drip.commons.utils.Constatnts.*;
import nl.uva.sne.drip.model.cloud.storm.CloudsStormSubTopology.StatusEnum;
/**
*
......@@ -57,7 +62,7 @@ public class ToscaHelper {
private Integer id;
public static enum NODE_STATES {
PROVISION, DELETE, START, STOP, H_SCALE, V_SCALE, CONFIGURE
DELETED, STARTED, STOPPED, H_SCALED, V_SCALED, CONFIGURED, RUNNING, FAILED
}
@Autowired
......@@ -251,7 +256,7 @@ public class ToscaHelper {
return toscaCredential;
} else {
throw new Exception("NodeTemplate is not of type: " + VM_TOPOLOGY + " it is of type: " + vmTopology.getType());
throw new TypeExeption("NodeTemplate is not of type: " + VM_TOPOLOGY + " it is of type: " + vmTopology.getType());
}
}
......@@ -296,9 +301,12 @@ public class ToscaHelper {
public NODE_STATES getNodeCurrentState(NodeTemplateMap node) {
return getNodeState(node, "current_state");
}
public NodeTemplateMap setNodeCurrentState(NodeTemplateMap node, NODE_STATES nodeState) {
return setNodeState(node, "current_state", nodeState);
}
public NodeTemplateMap setNodeDesiredState(NodeTemplateMap node, NODE_STATES nodeState) {
return setNodeState(node, "desired_state", nodeState);
}
......@@ -325,4 +333,34 @@ public class ToscaHelper {
return node;
}
public static NODE_STATES cloudStormStatus2NodeState(StatusEnum cloudStormStatus) {
if(cloudStormStatus.equals(StatusEnum.FRESH)){
return null;
}
String cloudStormStatusStr = cloudStormStatus.toString().toUpperCase();
return NODE_STATES.valueOf(cloudStormStatusStr);
}
public KeyPair getKeyPairsFromVM(NodeTemplate vmMap) throws ApiException, TypeExeption, JSchException {
if (vmMap.getType().equals(VM_TYPE)) {
Map<String, Object> attributes = vmMap.getAttributes();
if (attributes != null && attributes.containsKey("user_key_pair")) {
Map<String, Object> userKeyPair = (Map<String, Object>) attributes.get("user_key_pair");
if (userKeyPair.containsKey("protocol") && userKeyPair.get("protocol").equals("ssh")) {
Map<String, Object> keysMap = (Map<String, Object>) userKeyPair.get("keys");
JSch jsch = new JSch();
byte[] privatekeyBytes = Base64.getDecoder().decode(((String) keysMap.get("private_key")));
byte[] publicKeyBytes = Base64.getDecoder().decode(((String) keysMap.get("public_key")));
KeyPair keyPair = KeyPair.load(jsch, privatekeyBytes, publicKeyBytes);
keyPair.dispose();
return keyPair;
}
}
} else {
throw new TypeExeption("NodeTemplate is not of type: " + VM_TYPE + " it is of type: " + vmMap.getType());
}
return null;
}
}
......@@ -20,6 +20,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
import com.jcraft.jsch.KeyPair;
import java.io.File;
import java.io.FileInputStream;
import java.nio.file.Files;
......@@ -439,4 +440,44 @@ public class ToscaHelperTest {
}
/**
* Test of getKeyPairsFromVM method, of class ToscaHelper.
*/
@Test
public void testGetKeyPairsFromVM() throws Exception {
System.out.println("getKeyPairsFromVM");
instance.uploadToscaTemplate(provisionedToscaTemplate);
KeyPair keyPair;
List<NodeTemplateMap> vmTopologyTemplatesMap = instance.getVMTopologyTemplates();
assertNotNull(vmTopologyTemplatesMap);
for (NodeTemplateMap nodeTemplateMap : vmTopologyTemplatesMap) {
assertNotNull(nodeTemplateMap);
List<NodeTemplateMap> vmTemplatesMap = instance.getTemplateVMsForVMTopology(nodeTemplateMap);
assertNotNull(vmTemplatesMap);
for (NodeTemplateMap vmMap : vmTemplatesMap) {
assertNotNull(vmMap);
assertNotNull(vmMap.getNodeTemplate());
keyPair = instance.getKeyPairsFromVM(vmMap.getNodeTemplate());
assertNotNull(keyPair);
}
}
}
/**
* Test of cloudStormStatus2NodeState method, of class ToscaHelper.
*/
@Test
public void testCloudStormStatus2NodeState() {
System.out.println("cloudStormStatus2NodeState");
for (CloudsStormSubTopology.StatusEnum value : CloudsStormSubTopology.StatusEnum.values()) {
ToscaHelper.NODE_STATES result = ToscaHelper.cloudStormStatus2NodeState(value);
if (value.equals(CloudsStormSubTopology.StatusEnum.FRESH)) {
assertNull(result);
} else {
assertEquals(value.toString().toUpperCase(), result.toString().toUpperCase());
}
}
}
}
......@@ -28,10 +28,10 @@ class TestDeployer(unittest.TestCase):
def test(self):
logger = logging.getLogger(__name__)
tosca_path = "../../TOSCA/"
tosca_path = "../../example_messages/"
input_tosca_file_path = tosca_path + '/message_example_provisioned.json'
if not os.path.exists(input_tosca_file_path):
tosca_path = "../TOSCA/"
tosca_path = "../example_messages/"
input_tosca_file_path = tosca_path + '/message_example_provisioned.json'
with open(input_tosca_file_path, 'r') as stream:
......
{"owner":"user","creationDate":1584616813246,"toscaTemplate":{"tosca_definitions_version":"tosca_simple_yaml_1_0","tosca_default_namespace":null,"template_name":null,"topology_template":{"description":null,"inputs":null,"node_templates":{"compute":{"properties":{"disk_size":"10000 MB","mem_size":"1000 MB","num_cores":1,"os":"Ubuntu 18.04","user_name":"vm_user"},"interfaces":{"Standard":{"create":"dumy.yaml"}},"type":"tosca.nodes.ARTICONF.VM.Compute"},"compute_1":{"properties":{"disk_size":"10000 MB","mem_size":"1000 MB","num_cores":1,"os":"Ubuntu 18.04","user_name":"vm_user"},"interfaces":{"Standard":{"create":"dumy.yaml"}},"type":"tosca.nodes.ARTICONF.VM.Compute"},"kubernetes":{"requirements":[{"host":{"capability":"tosca.capabilities.ARTICONF.VM.topology","node":"topology","relationship":"tosca.relationships.HostedOn"}}],"interfaces":{"Kubernetes":{"configure":{"inputs":{"playbook":"https://raw.githubusercontent.com/skoulouzis/CONF/develop/ansible_playbooks/dashboard.yaml"}},"create":{"inputs":{"playbook":"https://raw.githubusercontent.com/skoulouzis/CONF/develop/ansible_playbooks/create_k8s.yml"}},"install":{"inputs":{"playbook":"https://raw.githubusercontent.com/skoulouzis/CONF/develop/ansible_playbooks/install_k8s.yml"}}}},"type":"tosca.nodes.ARTICONF.docker.Orchestrator.Kubernetes"},"topology":{"properties":{"domain":"Frankfurt","provider":"EC2"},"requirements":[{"vm":{"capability":"tosca.capabilities.ARTICONF.VM","node":"compute","relationship":"tosca.relationships.DependsOn"}},{"vm":{"capability":"tosca.capabilities.ARTICONF.VM","node":"compute_1","relationship":"tosca.relationships.DependsOn"}}],"interfaces":{"CloudsStorm":{"delete":{"inputs":{"code_type":"SEQ","object_type":"SubTopology"}},"hscale":{"inputs":{"code_type":"SEQ","object_type":"SubTopology"}},"provision":{"inputs":{"code_type":"SEQ","object_type":"SubTopology"}},"start":{"inputs":{"code_type":"SEQ","object_type":"SubTopology"}},"stop":{"inputs":{"code_type":"SEQ","object_type":"SubTopology"}}}},"type":"tosca.nodes.ARTICONF.VM.topology","attributes":{"credential":{"cloud_provider_name":"EC2","keys":{"aws_access_key_id":"XXXXXXXXXXXXXXXXXXX"},"token":"XXXXXXXXXXXXXXX","token_type":"access_key"},"desired_state":"PROVISION"}},"ws-pema":{"properties":{"ports":["30001:8080"]},"requirements":[{"host":{"capability":"tosca.capabilities.ARTICONF.docker.Orchestrator","node":"kubernetes","relationship":"tosca.relationships.HostedOn"}}],"type":"tosca.nodes.ARTICONF.Container.Application.Docker","artifacts":{"image":{"file":"alogo53/ws-pema-lifewatch","repository":"docker_hub","type":"tosca.artifacts.Deployment.Image.Container.Docker"}}}},"relationship_templates":null,"outputs":null,"groups":null,"substitution_mappings":null,"policies":null},"template_author":null,"template_version":null,"description":"TOSCA example","imports":[{"nodes":"https://raw.githubusercontent.com/skoulouzis/DRIP/develop/TOSCA/types/nodes.yaml"},{"data":"https://raw.githubusercontent.com/skoulouzis/CONF/develop/TOSCA/types/data.yml"},{"capabilities":"https://raw.githubusercontent.com/skoulouzis/DRIP/develop/TOSCA/types/capabilities.yaml"},{"policies":"https://raw.githubusercontent.com/skoulouzis/DRIP/develop/TOSCA/types/policies.yaml"},{"interfaces":"https://raw.githubusercontent.com/skoulouzis/DRIP/develop/TOSCA/types/interfaces.yml"}],"dsl_definitions":null,"node_types":null,"relationship_types":null,"relationship_templates":null,"capability_types":null,"artifact_types":null,"data_types":null,"interface_types":null,"policy_types":null,"group_types":null,"repositories":null}}
......@@ -117,7 +117,7 @@ public class DRIPService {
if (vmTopologies == null || vmTopologies.isEmpty()) {
throw new MissingVMTopologyException("ToscaTemplate: " + toscaTemplate + " has no VM Topologies");
}
toscaTemplate = setDesieredSate(toscaTemplate, vmTopologies, NODE_STATES.PROVISION);
toscaTemplate = setDesieredSate(toscaTemplate, vmTopologies, NODE_STATES.RUNNING);
return execute(toscaTemplate, provisionerQueueName);
}
......@@ -162,7 +162,7 @@ public class DRIPService {
for (NodeTemplateMap vmTopology : vmTopologies) {
CloudsStormSubTopology.StatusEnum status = helper.getVMTopologyTemplateStatus(vmTopology);
if (!status.equals(CloudsStormSubTopology.StatusEnum.DELETED)) {
toscaTemplate = setDesieredSate(toscaTemplate, vmTopologies, NODE_STATES.DELETE);
toscaTemplate = setDesieredSate(toscaTemplate, vmTopologies, NODE_STATES.DELETED);
}
}
return execute(toscaTemplate, provisionerQueueName);
......
......@@ -434,7 +434,7 @@ public class ServiceTests {
Assert.assertTrue(attributes.containsKey("credential"));
assertNotNull(attributes.get("credential"));
}
toscaTemplate = dripService.setDesieredSate(toscaTemplate, vmTopologies, ToscaHelper.NODE_STATES.PROVISION);
toscaTemplate = dripService.setDesieredSate(toscaTemplate, vmTopologies, ToscaHelper.NODE_STATES.RUNNING);
Map<String, NodeTemplate> nodes = toscaTemplate.getTopologyTemplate().getNodeTemplates();
Set<String> names = nodes.keySet();
for (String name : names) {
......
......@@ -35,46 +35,44 @@ import java.util.logging.Logger;
*/
public class RPCServer {
/**
* @return the prop
*/
public static Properties getProp() {
return prop;
}
/**
* @param aProp the prop to set
*/
public static void setProp(Properties aProp) {
prop = aProp;
}
private static Properties prop;
public static void main(String[] argv) throws MalformedURLException {
prop = new Properties();
if (argv.length >= 1) {
try {
prop.load(new FileInputStream(argv[0]));
} catch (IOException ex) {
Logger.getLogger(RPCServer.class.getName()).log(Level.SEVERE, null, ex);
}
} else {
String resourceName = "application.properties";
ClassLoader loader = Thread.currentThread().getContextClassLoader();
try (InputStream resourceStream = loader.getResourceAsStream(resourceName)) {
prop.load(resourceStream);
} catch (IOException ex) {
Logger.getLogger(RPCServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
init(argv);
start();
}
private static void start() {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(prop.getProperty("message.broker.host"));
factory.setPassword(prop.getProperty("message.broker.username"));
factory.setUsername(prop.getProperty("message.broker.password"));
factory.setHost(getProp().getProperty("message.broker.host"));
factory.setPassword(getProp().getProperty("message.broker.username"));
factory.setUsername(getProp().getProperty("message.broker.password"));
factory.setPort(AMQP.PROTOCOL.PORT);
Logger.getLogger(RPCServer.class.getName()).log(Level.INFO, "Connected to: {0}", prop.getProperty("message.broker.host"));
Logger.getLogger(RPCServer.class.getName()).log(Level.INFO, "Connected to: {0}", getProp().getProperty("message.broker.host"));
try (Connection connection = factory.newConnection()) {
Channel channel = connection.createChannel();
//We define the queue name
channel.queueDeclare(prop.getProperty("message.broker.queue.provisioner", "provisioner"), false, false, false, null);
channel.queueDeclare(getProp().getProperty("message.broker.queue.provisioner", "provisioner"), false, false, false, null);
DefaultConsumer c;
c = new nl.uva.sne.drip.provisioner.Consumer(channel,prop);
c = new nl.uva.sne.drip.provisioner.Consumer(channel, getProp());
//Start listening for messages
channel.basicConsume(prop.getProperty("message.broker.queue.provisioner", "provisioner"), false, c);
channel.basicConsume(getProp().getProperty("message.broker.queue.provisioner", "provisioner"), false, c);
//Block so we don't close the channel
while (true) {
......@@ -92,4 +90,23 @@ public class RPCServer {
}
public static void init(String[] argv) {
setProp(new Properties());
if (argv.length >= 1) {
try {
getProp().load(new FileInputStream(argv[0]));
} catch (IOException ex) {
Logger.getLogger(RPCServer.class.getName()).log(Level.SEVERE, null, ex);
}
} else {
String resourceName = "application.properties";
ClassLoader loader = Thread.currentThread().getContextClassLoader();
try (InputStream resourceStream = loader.getResourceAsStream(resourceName)) {
getProp().load(resourceStream);
} catch (IOException ex) {
Logger.getLogger(RPCServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment