package alien4cloud.it.topology; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.alien4cloud.tosca.editor.operations.inputs.AddInputOperation; import org.alien4cloud.tosca.editor.operations.inputs.RenameInputOperation; import org.alien4cloud.tosca.editor.operations.nodetemplate.inputs.SetNodeCapabilityPropertyAsInputOperation; import org.alien4cloud.tosca.editor.operations.nodetemplate.inputs.SetNodePropertyAsInputOperation; import org.alien4cloud.tosca.model.definitions.PropertyDefinition; import org.alien4cloud.tosca.model.templates.Capability; import org.alien4cloud.tosca.model.templates.NodeTemplate; import org.alien4cloud.tosca.model.types.CapabilityType; import org.alien4cloud.tosca.model.types.NodeType; import org.apache.commons.collections4.MapUtils; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import org.junit.Assert; import com.fasterxml.jackson.databind.JavaType; import alien4cloud.it.Context; import alien4cloud.rest.model.RestResponse; import alien4cloud.rest.utils.JsonUtil; import alien4cloud.topology.TopologyDTO; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; public class InputPropertiesStepDefinitions { @When("^I define the property \"([^\"]*)\" of the node \"([^\"]*)\" as input property$") public void I_define_the_property_of_the_node_as_input_property(String inputId, String nodeName) throws Throwable { // get the topologyTDO to have the real type of the propertyDefinition PropertyDefinition propertyDefinition = getPropertyDefinition(nodeName, inputId); AddInputOperation addInputOperation = new AddInputOperation(); addInputOperation.setPropertyDefinition(propertyDefinition); addInputOperation.setInputName(inputId); EditorStepDefinitions.do_i_execute_the_operation(addInputOperation); SetNodePropertyAsInputOperation setNodePropertyAsInputOperation = new SetNodePropertyAsInputOperation(); setNodePropertyAsInputOperation.setInputName(inputId); setNodePropertyAsInputOperation.setPropertyName(inputId); setNodePropertyAsInputOperation.setNodeName(nodeName); EditorStepDefinitions.do_i_execute_the_operation(setNodePropertyAsInputOperation); EditorStepDefinitions.do_i_save_the_topology(); } private PropertyDefinition getPropertyDefinition(String nodeName, String propertyName) throws Throwable { PropertyDefinition propDef = null; String url = String.format("/rest/v1/topologies/%s", Context.getInstance().getTopologyId()); String response = Context.getRestClientInstance().get(url); TopologyDTO topologyDTO = JsonUtil.read(response, TopologyDTO.class, Context.getJsonMapper()).getData(); NodeTemplate template = MapUtils.getObject(topologyDTO.getTopology().getNodeTemplates(), nodeName); if (template != null) { NodeType nodeType = MapUtils.getObject(topologyDTO.getNodeTypes(), template.getType()); if (nodeType != null) { propDef = MapUtils.getObject(nodeType.getProperties(), propertyName); } } if (propDef == null) { throw new NullPointerException( "The property definition is required for node " + nodeName + " and property " + propertyName + ", please check your cucumber scenario."); } return propDef; } @Given("^I define the capability \"(.*?)\" property \"(.*?)\" of the node \"(.*?)\" as input property$") public void i_define_the_capability_property_of_the_node_of_typeId_as_input_property(String capabilityName, String propertyName, String nodeName) throws Throwable { String url = String.format("/rest/v1/topologies/%s", Context.getInstance().getTopologyId()); String response = Context.getRestClientInstance().get(url); TopologyDTO topologyDTO = JsonUtil.read(response, TopologyDTO.class, Context.getJsonMapper()).getData(); NodeTemplate template = MapUtils.getObject(topologyDTO.getTopology().getNodeTemplates(), nodeName); Capability capability = template.getCapabilities().get(capabilityName); CapabilityType capabilityType = topologyDTO.getCapabilityTypes().get(capability.getType()); PropertyDefinition propertyDefinition = capabilityType.getProperties().get(propertyName); String fullUrl = String.format("/rest/v1/topologies/%s/inputs/%s", Context.getInstance().getTopologyId(), propertyName); String json = JsonUtil.toString(propertyDefinition); Context.getInstance().registerRestResponse(Context.getRestClientInstance().postJSon(fullUrl, json)); } @When("^I define the property \"([^\"]*)\" of the node \"([^\"]*)\" of typeId \"([^\"]*)\" as input property$") public void I_define_the_property_of_the_node_as_of_typeId_as_input_property(String inputId, String nodeName, String typeId) throws Throwable { // get the component to use the right property definition String componentResponse = Context.getRestClientInstance().get("/rest/v1/components/" + typeId); RestResponse<NodeType> componentResult = JsonUtil.read(componentResponse, NodeType.class, Context.getJsonMapper()); PropertyDefinition propertyDefinition = componentResult.getData().getProperties().get(inputId); String fullUrl = String.format("/rest/v1/topologies/%s/inputs/%s", Context.getInstance().getTopologyId(), inputId); String json = JsonUtil.toString(propertyDefinition); Context.getInstance().registerRestResponse(Context.getRestClientInstance().postJSon(fullUrl, json)); } @When("^I remove the input property \"([^\"]*)\"$") public void I_remove_the_input_property(String inputId) throws Throwable { String fullUrl = String.format("/rest/v1/topologies/%s/inputs/%s", Context.getInstance().getTopologyId(), inputId); Context.getInstance().registerRestResponse(Context.getRestClientInstance().delete(fullUrl)); } @When("^I unset the property \"([^\"]*)\" of the node \"([^\"]*)\" as input property$") public void I_unset_the_property_of_the_node_as_input_property(String propertyId, String nodeName) throws Throwable { String url = String.format("/rest/v1/topologies/%s/nodetemplates/%s/property/%s/input", Context.getInstance().getTopologyId(), nodeName, propertyId); Context.getInstance().registerRestResponse(Context.getRestClientInstance().delete(url)); } @When("^I rename the input \"([^\"]*)\" to \"([^\"]*)\"$") public void I_rename_the_input_to(String oldInputId, String newInputId) throws Throwable { RenameInputOperation renameInputOperation = new RenameInputOperation(); renameInputOperation.setInputName(oldInputId); renameInputOperation.setNewInputName(newInputId); EditorStepDefinitions.do_i_execute_the_operation(renameInputOperation); EditorStepDefinitions.do_i_save_the_topology(); } @Then("^The topology should have the property \"([^\"]*)\" defined as input property$") public void The_topology_should_have_the_property_of_the_node_defined_as_input_property(String inputId) throws Throwable { String response = Context.getRestClientInstance().get("/rest/v1/topologies/" + Context.getInstance().getTopologyId()); JavaType restResponseType = Context.getJsonMapper().getTypeFactory().constructParametricType(RestResponse.class, TopologyDTO.class); TopologyDTO topologyDTO = ((RestResponse<TopologyDTO>) Context.getJsonMapper().readValue(response, restResponseType)).getData(); Map<String, PropertyDefinition> inputProperties = topologyDTO.getTopology().getInputs(); Assert.assertNotNull(inputProperties); PropertyDefinition inputPropertieDefinition = inputProperties.get(inputId); Assert.assertNotNull(inputPropertieDefinition); } @Then("^The topology should not have the property \"([^\"]*)\" defined as input property$") public void The_topology_should_not_have_the_property_defined_as_input_property(String inputId) throws Throwable { TopologyDTO topologyDTO = JsonUtil.read(Context.getRestClientInstance().get("/rest/v1/topologies/" + Context.getInstance().getTopologyId()), TopologyDTO.class, Context.getJsonMapper()).getData(); Map<String, PropertyDefinition> inputProperties = topologyDTO.getTopology().getInputs(); Assert.assertFalse(inputProperties.containsKey(inputId)); } @Then("^I associate the property \"([^\"]*)\" of a node template \"([^\"]*)\" to the input \"([^\"]*)\"$") public void I_associate_the_property_of_a_node_template_to_the_input(String property, String nodeTemplateName, String inputId) throws Throwable { SetNodePropertyAsInputOperation setNodePropertyAsInputOperation = new SetNodePropertyAsInputOperation(); setNodePropertyAsInputOperation.setInputName(inputId); setNodePropertyAsInputOperation.setPropertyName(property); setNodePropertyAsInputOperation.setNodeName(nodeTemplateName); EditorStepDefinitions.do_i_execute_the_operation(setNodePropertyAsInputOperation); EditorStepDefinitions.do_i_save_the_topology(); } @Then("^I set the property \"([^\"]*)\" of a relationship \"([^\"]*)\" for the node template \"([^\"]*)\" to the input \"([^\"]*)\"$") public void I_set_the_property_of_a_relationship_for_the_node_template_to_the_input(String property, String relationshipTemplateId, String nodeTemplateName, String inputId) throws Throwable { String fullUrl = String.format("/rest/v1/topologies/%s/nodetemplates/%s/relationship/%s/property/%s/input", Context.getInstance().getTopologyId(), nodeTemplateName, relationshipTemplateId, property); List<NameValuePair> nvps = new ArrayList<NameValuePair>(); nvps.add(new BasicNameValuePair("inputId", inputId)); Context.getInstance().registerRestResponse(Context.getRestClientInstance().postUrlEncoded(fullUrl, nvps)); } @Then("^I unset the property \"([^\"]*)\" of a relationship \"([^\"]*)\" for the node template \"([^\"]*)\"$") public void I_unset_the_property_of_a_relationship_for_the_node_template_to_the_input(String property, String relationshipTemplateId, String nodeTemplateName) throws Throwable { String fullUrl = String.format("/rest/v1/topologies/%s/nodetemplates/%s/relationship/%s/property/%s/input", Context.getInstance().getTopologyId(), nodeTemplateName, relationshipTemplateId, property); Context.getInstance().registerRestResponse(Context.getRestClientInstance().delete(fullUrl)); } @When("^I ask for the input candidate for the node template \"([^\"]*)\" and property \"([^\"]*)\"$") public void I_ask_for_the_input_candidate_for_the_node_template_and_property(String nodeTemplateId, String property) throws Throwable { String url = String.format("/rest/v1/topologies/%s/nodetemplates/%s/property/%s/inputcandidats", Context.getInstance().getTopologyId(), nodeTemplateId, property); String restResult = Context.getRestClientInstance().get(url); List<String> candidates = JsonUtil.read(restResult, List.class).getData(); Context.getInstance().buildEvaluationContext(candidates); } @When("^I ask for the input candidate for the node template \"([^\"]*)\" and property \"([^\"]*)\" of relationship \"([^\"]*)\"$") public void I_ask_for_the_input_candidate_for_the_node_template_and_property_of_relationship(String nodeTemplateId, String property, String relationshipId) throws Throwable { String url = String.format("/rest/v1/topologies/%s/nodetemplates/%s/relationship/%s/property/%s/inputcandidats", Context.getInstance().getTopologyId(), nodeTemplateId, relationshipId, property); String restResult = Context.getRestClientInstance().get(url); List<String> candidates = JsonUtil.read(restResult, List.class).getData(); Context.getInstance().buildEvaluationContext(candidates); } @When("^I ask for the input candidate for the node template \"([^\"]*)\" and property \"([^\"]*)\" of capability \"([^\"]*)\"$") public void I_ask_for_the_input_candidate_for_the_node_template_and_property_of_capability(String nodeTemplateId, String property, String capabilityId) throws Throwable { String url = String.format("/rest/v1/topologies/%s/nodetemplates/%s/capability/%s/property/%s/inputcandidats", Context.getInstance().getTopologyId(), nodeTemplateId, capabilityId, property); String restResult = Context.getRestClientInstance().get(url); List<String> candidates = JsonUtil.read(restResult, List.class).getData(); Context.getInstance().buildEvaluationContext(candidates); } @When("^I set the property \"([^\"]*)\" of capability \"([^\"]*)\" the node \"([^\"]*)\" as input property name \"([^\"]*)\"$") public void I_define_the_property_of_capability_the_node_as_input_property(String propertyId, String capabilityId, String nodeTemplateId, String inputId) throws Throwable { SetNodeCapabilityPropertyAsInputOperation operation = new SetNodeCapabilityPropertyAsInputOperation(); operation.setNodeName(nodeTemplateId); operation.setPropertyName(propertyId); operation.setCapabilityName(capabilityId); operation.setInputName(inputId); EditorStepDefinitions.do_i_execute_the_operation(operation); EditorStepDefinitions.do_i_save_the_topology(); } @When("^I unset the property \"([^\"]*)\" of capability \"([^\"]*)\" the node \"([^\"]*)\" as input property$") public void I_unset_the_property_of_capability_the_node_as_input_property(String propertyId, String capabilityId, String nodeTemplateId) throws Throwable { String url = String.format("/rest/v1/topologies/%s/nodetemplates/%s/capability/%s/property/%s/input", Context.getInstance().getTopologyId(), nodeTemplateId, capabilityId, propertyId); Context.getInstance().registerRestResponse(Context.getRestClientInstance().delete(url)); } }