package alien4cloud.it.components; import static org.junit.Assert.*; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import org.alien4cloud.tosca.model.types.NodeType; import org.elasticsearch.client.Client; import org.elasticsearch.mapping.MappingBuilder; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Lists; import alien4cloud.common.AlienConstants; import alien4cloud.dao.ElasticSearchDAO; import alien4cloud.dao.ElasticSearchMapper; import alien4cloud.exception.IndexingServiceException; import alien4cloud.it.Context; import alien4cloud.model.common.Tag; import alien4cloud.rest.component.UpdateTagRequest; import alien4cloud.rest.utils.JsonUtil; import cucumber.api.DataTable; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; public class UpdateDeleteTagDefinitionsSteps { private final ObjectMapper jsonMapper = ElasticSearchMapper.getInstance(); private final Client esClient = Context.getEsClientInstance(); @Given("^I have a component with id \"([^\"]*)\"$") public void I_have_a_component_with_id(String componentId) throws Throwable { Context.getInstance().registerRestResponse(Context.getRestClientInstance().get("/rest/v1/components/" + componentId)); NodeType idnt = JsonUtil.read(Context.getInstance().takeRestResponse(), NodeType.class).getData(); assertNotNull(idnt); Context.getInstance().registerComponentId(idnt.getId()); } @Given("^I have a fake component with a bad id \"([^\"]*)\"$") public void I_have_a_fake_component_with_a_bad_id(String badComponentId) throws Throwable { Context.getInstance().registerComponentId(badComponentId); } @Given("^I have a component with and id \"([^\"]*)\" and an archive version \"([^\"]*)\" with tags:$") public void I_have_a_component_with_and_id_and_an_archive_version_with_tags(String componentId, String archiveVersion, DataTable tags) throws Throwable { List<Tag> nodeTypeTags = Lists.newArrayList(); for (List<String> rows : tags.raw()) { nodeTypeTags.add(new Tag(rows.get(0), rows.get(1))); } createOneIndexNodeType(componentId, archiveVersion, nodeTypeTags, true); } @When("^I update a tag with key \"([^\"]*)\" and value \"([^\"]*)\"$") public void I_update_a_tag_with_key_and_value(String tagKey, String tagValue) throws Throwable { UpdateTagRequest updateTagRequest = new UpdateTagRequest(); updateTagRequest.setTagKey(tagKey); updateTagRequest.setTagValue(tagValue); Context.getInstance().registerRestResponse(Context.getRestClientInstance() .postJSon("/rest/v1/components/" + Context.getInstance().getComponentId(0) + "/tags", jsonMapper.writeValueAsString(updateTagRequest))); } @Given("^I have a tag \"([^\"]*)\"$") public void I_have_a_tag(String tag) throws Throwable { Context.getInstance().registerRestResponse(Context.getRestClientInstance().get("/rest/v1/components/" + Context.getInstance().getComponentId(0))); NodeType idnt = JsonUtil.read(Context.getInstance().takeRestResponse(), NodeType.class).getData(); assertTrue(idnt.getTags().contains(new Tag(tag, null))); } @Then("^I should have tag \"([^\"]*)\" with value \"([^\"]*)\"$") public void I_should_have_tag_with_value(String tagKey, String tagValue) throws Throwable { Context.getInstance().registerRestResponse(Context.getRestClientInstance().get("/rest/v1/components/" + Context.getInstance().getComponentId(0))); NodeType idnt = JsonUtil.read(Context.getInstance().takeRestResponse(), NodeType.class).getData(); assertNotNull(idnt); int index = idnt.getTags().indexOf(new Tag(tagKey, null)); assertEquals(idnt.getTags().get(index).getValue(), tagValue); } @When("^I delete a tag with key \"([^\"]*)\"$") public void I_delete_a_tag_with_key(String tagId) throws Throwable { Context.getInstance().registerRestResponse( Context.getRestClientInstance().delete("/rest/v1/components/" + Context.getInstance().getComponentId(0) + "/tags/" + tagId)); } /** * Load components IndexedNodeType from a file to use it in tests * * @param componentId * @param refresh * @throws IOException * @throws IndexingServiceException */ @SuppressWarnings("unchecked") private void createOneIndexNodeType(String componentId, String archiveVersion, List<Tag> tags, boolean refresh) throws IOException, IndexingServiceException { String samplePathString = "src/test/resources/data/components/indexed_nodetypes.json"; Path path = Paths.get(samplePathString); List<Object> tempList = jsonMapper.readValue(path.toFile(), ArrayList.class); List<NodeType> idntList = new ArrayList<>(); for (Object ob : tempList) { idntList.add(jsonMapper.readValue(jsonMapper.writeValueAsString(ob), NodeType.class)); } String typeName = MappingBuilder.indexTypeFromClass(NodeType.class); NodeType indexedNodeType = null; // Save on nodeType with if (componentId != null && archiveVersion != null && !componentId.trim().isEmpty()) { // Get the first nodetype to update its id and insert it indexedNodeType = idntList.get(0); indexedNodeType.setElementId(componentId); indexedNodeType.setArchiveVersion(archiveVersion); indexedNodeType.setWorkspace(AlienConstants.GLOBAL_WORKSPACE_ID); if (tags != null) { indexedNodeType.setTags(tags); } String serializeDatum = jsonMapper.writeValueAsString(indexedNodeType); esClient.prepareIndex(ElasticSearchDAO.TOSCA_ELEMENT_INDEX, typeName).setSource(serializeDatum).setRefresh(refresh).execute().actionGet(); } } }