package alien4cloud.it.topology; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Map; import org.alien4cloud.tosca.editor.operations.AbstractEditorOperation; import org.springframework.expression.EvaluationContext; import org.springframework.expression.spel.SpelParserConfiguration; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; import alien4cloud.it.Context; import alien4cloud.rest.utils.JsonUtil; import alien4cloud.topology.TopologyDTO; import cucumber.api.DataTable; import cucumber.api.java.en.Given; import cucumber.api.java.en.When; import gherkin.formatter.model.DataTableRow; /** * Steps to manage the editor. */ public class EditorStepDefinitions { // Keep a local context for topology dto public static TopologyDTO TOPOLOGY_DTO = null; @Given("^I get the current topology$") public void i_get_the_current_topology() throws Throwable { // Call the rest controller to get the topology DTO and register it do_i_get_the_current_topology(); } public static void do_i_get_the_current_topology() throws Throwable { // Call the rest controller to get the topology DTO and register it String topologyId = Context.getInstance().getTopologyId(); Context.getInstance().registerRestResponse(Context.getRestClientInstance().get("/rest/v1/topologies/" + topologyId)); trySetTopologyDto(); } @Given("^I execute the operation$") public void i_execute_the_operation(DataTable operationDT) throws Throwable { Map<String, String> operationMap = Maps.newHashMap(); for (DataTableRow row : operationDT.getGherkinRows()) { operationMap.put(row.getCells().get(0), row.getCells().get(1)); } do_i_execute_the_operation(operationMap); } public static void do_i_execute_the_operation(Map<String, String> operationMap) throws Throwable { Class operationClass = Class.forName(operationMap.get("type")); AbstractEditorOperation operation = (AbstractEditorOperation) operationClass.newInstance(); EvaluationContext operationContext = new StandardEvaluationContext(operation); SpelParserConfiguration config = new SpelParserConfiguration(true, true); SpelExpressionParser parser = new SpelExpressionParser(config); for (Map.Entry<String, String> operationEntry : operationMap.entrySet()) { if (!"type".equals(operationEntry.getKey())) { parser.parseRaw(operationEntry.getKey()).setValue(operationContext, operationEntry.getValue()); } } do_i_execute_the_operation(operation); } public static void do_i_execute_the_operation(AbstractEditorOperation operation) throws Throwable { String topologyId = Context.getInstance().getTopologyId(); operation.setPreviousOperationId(getLastOperationId()); // Call execute rest service and set the topology DTO to the context Context.getInstance() .registerRestResponse(Context.getRestClientInstance().postJSon("/rest/v2/editor/" + topologyId + "/execute", JsonUtil.toString(operation))); trySetTopologyDto(); } public static String getLastOperationId() { if (TOPOLOGY_DTO == null || TOPOLOGY_DTO.getLastOperationIndex() == -1) { // no previous operations return null; } else { return TOPOLOGY_DTO.getOperations().get(TOPOLOGY_DTO.getLastOperationIndex()).getId(); } } @Given("^I save the topology$") public void i_save_the_topology() throws Throwable { do_i_save_the_topology(); } public static void do_i_save_the_topology() throws Throwable { String topologyId = Context.getInstance().getTopologyId(); String lastOperationId = TOPOLOGY_DTO.getOperations().get(TOPOLOGY_DTO.getLastOperationIndex()).getId(); Context.getInstance() .registerRestResponse(Context.getRestClientInstance().postJSon("/rest/v2/editor/" + topologyId + "?lastOperationId=" + lastOperationId, "")); trySetTopologyDto(); } public static void trySetTopologyDto() { try { TOPOLOGY_DTO = JsonUtil.read(Context.getInstance().getRestResponse(), TopologyDTO.class, Context.getJsonMapper()).getData(); } catch (Exception e) { // This may fail as the latest rest call may fail based on test scenario but this is a shortcut for all successfull scenario. } } @When("^I upload a file located at \"([^\"]*)\" to the archive path \"([^\"]*)\"$") public void iUploadAFileLocatedAtToTheArchivePath(String localFile, String archivePath) throws Throwable { String topologyId = Context.getInstance().getTopologyId(); String url = "/rest/v2/editor/" + topologyId + "/upload"; InputStream artifactStream = Files.newInputStream(Paths.get(localFile)); Context.getInstance() .registerRestResponse(Context.getRestClientInstance().postMultipart(url, Paths.get(localFile).getFileName().toString(), artifactStream, ImmutableMap.<String, String> builder().put("path", archivePath).put("lastOperationId", String.valueOf(getLastOperationId())).build())); trySetTopologyDto(); } }