You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@falcon.apache.org by ro...@apache.org on 2014/10/28 10:32:35 UTC
git commit: FALCON-814 Tests for entities summary API. Contributed by
Paul Isaychuk
Repository: incubator-falcon
Updated Branches:
refs/heads/master bf959ea9f -> 35506d528
FALCON-814 Tests for entities summary API. Contributed by Paul Isaychuk
Project: http://git-wip-us.apache.org/repos/asf/incubator-falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-falcon/commit/35506d52
Tree: http://git-wip-us.apache.org/repos/asf/incubator-falcon/tree/35506d52
Diff: http://git-wip-us.apache.org/repos/asf/incubator-falcon/diff/35506d52
Branch: refs/heads/master
Commit: 35506d5280bcdfaf25b683e6d34d3bd8933f5495
Parents: bf959ea
Author: Ruslan Ostafiychuk <ro...@apache.org>
Authored: Tue Oct 28 11:31:53 2014 +0200
Committer: Ruslan Ostafiychuk <ro...@apache.org>
Committed: Tue Oct 28 11:31:53 2014 +0200
----------------------------------------------------------------------
falcon-regression/CHANGES.txt | 2 +
.../falcon/regression/core/bundle/Bundle.java | 9 +
.../core/interfaces/IEntityManagerHelper.java | 16 +
.../core/response/ServiceResponse.java | 16 +
.../falcon/regression/core/util/Util.java | 1 +
.../regression/lineage/EntitySummaryTest.java | 415 +++++++++++++++++++
6 files changed, 459 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-falcon/blob/35506d52/falcon-regression/CHANGES.txt
----------------------------------------------------------------------
diff --git a/falcon-regression/CHANGES.txt b/falcon-regression/CHANGES.txt
index b59c00f..f6e70e3 100644
--- a/falcon-regression/CHANGES.txt
+++ b/falcon-regression/CHANGES.txt
@@ -5,6 +5,8 @@ Trunk (Unreleased)
INCOMPATIBLE CHANGES
NEW FEATURES
+ FALCON-814 Tests for entities summary API (Paul Isaychuk via Ruslan Ostafiychuk)
+
FALCON-833 FeedReplicationTest.availabilityFlagTest fix (Paul Isaychuk
via Raghav Kumar Gautam)
http://git-wip-us.apache.org/repos/asf/incubator-falcon/blob/35506d52/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/bundle/Bundle.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/bundle/Bundle.java b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/bundle/Bundle.java
index 8e55493..5ee6dd2 100644
--- a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/bundle/Bundle.java
+++ b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/bundle/Bundle.java
@@ -1053,4 +1053,13 @@ public class Bundle {
processMerlin.setACL(owner, group, permission);
setProcessData(processMerlin.toString());
}
+
+ /**
+ * Set custom tags for a process. Key-value pairs are valid.
+ */
+ public void setProcessTags(String value) {
+ ProcessMerlin processMerlin = getProcessObject();
+ processMerlin.setTags(value);
+ setProcessData(processMerlin.toString());
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-falcon/blob/35506d52/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/interfaces/IEntityManagerHelper.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/interfaces/IEntityManagerHelper.java b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/interfaces/IEntityManagerHelper.java
index 52f1bc1..2f588ef 100644
--- a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/interfaces/IEntityManagerHelper.java
+++ b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/interfaces/IEntityManagerHelper.java
@@ -526,4 +526,20 @@ public abstract class IEntityManagerHelper {
url += "?filterBy=PIPELINES:" + pipeline;
return Util.sendRequest(url, "get", null, null);
}
+
+ /**
+ * Retrieves entities summary.
+ * @param clusterName compulsory parameter for request
+ * @param params list of optional parameters
+ * @return entity summary along with its instances.
+ */
+ public ServiceResponse getEntitySummary(String clusterName, String params)
+ throws AuthenticationException, IOException, URISyntaxException {
+ String url = createUrl(this.hostname + URLS.ENTITY_SUMMARY.getValue(),
+ getEntityType(), clusterName);
+ if (!StringUtils.isEmpty(params)){
+ url += "?" + params;
+ }
+ return Util.sendRequest(url, "get", null, null);
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-falcon/blob/35506d52/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/response/ServiceResponse.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/response/ServiceResponse.java b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/response/ServiceResponse.java
index 3c5bd9e..badab3d 100644
--- a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/response/ServiceResponse.java
+++ b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/response/ServiceResponse.java
@@ -20,6 +20,7 @@ package org.apache.falcon.regression.core.response;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.falcon.regression.core.util.Util;
+import org.apache.falcon.resource.EntitySummaryResult;
import org.apache.http.HttpResponse;
import org.apache.log4j.Logger;
@@ -102,4 +103,19 @@ public class ServiceResponse {
return null;
}
}
+
+ /**
+ * Retrieves EntitySummaryResult from a message if possible.
+ * @return EntitiesResult
+ */
+ public EntitySummaryResult getEntitySummaryResult() {
+ try {
+ JAXBContext jc = JAXBContext.newInstance(EntitySummaryResult.class);
+ Unmarshaller u = jc.createUnmarshaller();
+ return (EntitySummaryResult) u.unmarshal(new StringReader(message));
+ } catch (JAXBException e) {
+ LOGGER.info("getEntitySummaryResult() failed:\n" + ExceptionUtils.getStackTrace(e));
+ return null;
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-falcon/blob/35506d52/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/util/Util.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/util/Util.java b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/util/Util.java
index 1d07fc5..3a63e7c 100644
--- a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/util/Util.java
+++ b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/util/Util.java
@@ -603,6 +603,7 @@ public final class Util {
RESUME_URL("/api/entities/resume"),
UPDATE("/api/entities/update"),
STATUS_URL("/api/entities/status"),
+ ENTITY_SUMMARY("/api/entities/summary"),
SUBMIT_AND_SCHEDULE_URL("/api/entities/submitAndSchedule"),
INSTANCE_RUNNING("/api/instance/running"),
INSTANCE_STATUS("/api/instance/status"),
http://git-wip-us.apache.org/repos/asf/incubator-falcon/blob/35506d52/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/lineage/EntitySummaryTest.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/lineage/EntitySummaryTest.java b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/lineage/EntitySummaryTest.java
new file mode 100644
index 0000000..2bed06f
--- /dev/null
+++ b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/lineage/EntitySummaryTest.java
@@ -0,0 +1,415 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.falcon.regression.lineage;
+
+import org.apache.falcon.entity.v0.Entity;
+import org.apache.falcon.entity.v0.EntityType;
+import org.apache.falcon.entity.v0.Frequency;
+import org.apache.falcon.entity.v0.feed.ActionType;
+import org.apache.falcon.entity.v0.feed.ClusterType;
+import org.apache.falcon.regression.Entities.FeedMerlin;
+import org.apache.falcon.regression.Entities.ProcessMerlin;
+import org.apache.falcon.regression.core.bundle.Bundle;
+import org.apache.falcon.regression.core.helpers.ColoHelper;
+import org.apache.falcon.regression.core.interfaces.IEntityManagerHelper;
+import org.apache.falcon.regression.core.response.InstancesResult;
+import org.apache.falcon.regression.core.util.AssertUtil;
+import org.apache.falcon.regression.core.util.BundleUtil;
+import org.apache.falcon.regression.core.util.CleanupUtil;
+import org.apache.falcon.regression.core.util.HadoopUtil;
+import org.apache.falcon.regression.core.util.InstanceUtil;
+import org.apache.falcon.regression.core.util.OSUtil;
+import org.apache.falcon.regression.core.util.OozieUtil;
+import org.apache.falcon.regression.core.util.TimeUtil;
+import org.apache.falcon.regression.core.util.Util;
+import org.apache.falcon.regression.core.util.XmlUtil;
+import org.apache.falcon.regression.testHelper.BaseTestClass;
+import org.apache.falcon.resource.APIResult;
+import org.apache.falcon.resource.EntitySummaryResult;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.security.authentication.client.AuthenticationException;
+import org.apache.log4j.Logger;
+import org.apache.oozie.client.CoordinatorAction;
+import org.apache.oozie.client.OozieClient;
+import org.apache.oozie.client.OozieClientException;
+import org.testng.Assert;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+import org.testng.asserts.SoftAssert;
+
+import javax.xml.bind.JAXBException;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Test bulk API for dashboard needs.
+ */
+@Test(groups = "embedded")
+public class EntitySummaryTest extends BaseTestClass {
+ private static final Logger LOGGER = Logger.getLogger(EntitySummaryTest.class);
+ private ColoHelper cluster1 = servers.get(0);
+ private ColoHelper cluster2 = servers.get(1);
+ private OozieClient cluster1OC = serverOC.get(0);
+ private OozieClient cluster2OC = serverOC.get(1);
+ private FileSystem cluster1FS = serverFS.get(0);
+ private String testDir = "/EntitySummaryTest";
+ private String baseTestHDFSDir = baseHDFSDir + testDir;
+ private String aggregateWorkflowDir = baseTestHDFSDir + "/aggregator";
+ private String sourcePath = baseTestHDFSDir + "/source";
+ private String feedDataLocation = baseTestHDFSDir + "/source" + MINUTE_DATE_PATTERN;
+ private String targetPath = baseTestHDFSDir + "/target";
+ private String targetDataLocation = targetPath + MINUTE_DATE_PATTERN;
+ private String startTime, endTime;
+ private SoftAssert softAssert;
+
+ @BeforeMethod(alwaysRun = true)
+ public void prepareData() throws IOException {
+ uploadDirToClusters(aggregateWorkflowDir, OSUtil.RESOURCES_OOZIE);
+ Bundle bundle = BundleUtil.readELBundle();
+ for (int i = 0; i <= 1; i++) {
+ bundles[i] = new Bundle(bundle, servers.get(i));
+ bundles[i].generateUniqueBundle();
+ bundles[i].setProcessWorkflow(aggregateWorkflowDir);
+ bundles[i].setInputFeedDataPath(feedDataLocation);
+ }
+ startTime = TimeUtil.getTimeWrtSystemTime(-35);
+ endTime = TimeUtil.getTimeWrtSystemTime(5);
+ LOGGER.info("Time range is between : " + startTime + " and " + endTime);
+ softAssert = new SoftAssert();
+ }
+
+ @AfterMethod(alwaysRun = true)
+ public void tearDown() throws IOException {
+ cleanTestDirs();
+ CleanupUtil.cleanAllEntities(prism);
+ }
+
+ /**
+ * Get status of 7 processes and 7 instances of each process. The call should give correct
+ * information, instance info must be recent.
+ */
+ @Test
+ public void getProcessSummary() throws Exception {
+ //prepare process
+ bundles[0].setProcessValidity(startTime, endTime);
+ bundles[0].submitClusters(prism);
+ bundles[0].submitFeeds(prism);
+ String clusterName = Util.readEntityName(bundles[0].getClusters().get(0));
+ List<String> processes = scheduleEntityValidateWaitingInstances(cluster1,
+ bundles[0].getProcessData(), EntityType.PROCESS, clusterName);
+
+ //create data for processes to run and wait some time for instances to make progress
+ OozieUtil.createMissingDependencies(cluster1, EntityType.PROCESS, processes.get(0), 0);
+ InstanceUtil.waitTillInstanceReachState(cluster1OC, processes.get(0), 1,
+ CoordinatorAction.Status.RUNNING, EntityType.PROCESS);
+
+ //compare summary and instance result for each of 7 processes
+ validateProgressingInstances(processes, EntityType.PROCESS, clusterName);
+ softAssert.assertAll();
+ }
+
+ /**
+ * Get status of 7 feeds and 7 instances of each feed the call should give correct information,
+ * instance info must be recent.
+ */
+ @Test
+ public void getFeedSummary() throws Exception {
+ //prepare feed template.
+ bundles[0].setInputFeedPeriodicity(5, Frequency.TimeUnit.minutes);
+ bundles[0].setInputFeedDataPath(feedDataLocation);
+ String feed = bundles[0].getInputFeedFromBundle();
+ String cluster1Def = bundles[0].getClusters().get(0);
+ String cluster2Def = bundles[1].getClusters().get(0);
+ //erase all clusters from feed definition
+ feed = InstanceUtil.setFeedCluster(feed,
+ XmlUtil.createValidity("2012-10-01T12:00Z", "2010-01-01T00:00Z"),
+ XmlUtil.createRetention("days(1000000)", ActionType.DELETE), null,
+ ClusterType.SOURCE, null);
+ //set cluster1 as source
+ feed = InstanceUtil.setFeedCluster(feed,
+ XmlUtil.createValidity(startTime, endTime),
+ XmlUtil.createRetention("days(1000000)", ActionType.DELETE),
+ Util.readEntityName(cluster1Def), ClusterType.SOURCE, null);
+ //set cluster2 as target
+ feed = InstanceUtil.setFeedCluster(feed,
+ XmlUtil.createValidity(startTime, endTime),
+ XmlUtil.createRetention("days(1000000)", ActionType.DELETE),
+ Util.readEntityName(cluster2Def), ClusterType.TARGET, null, targetDataLocation);
+ String clusterName = Util.readEntityName(cluster2Def);
+
+ //submit clusters
+ AssertUtil.assertSucceeded(prism.getClusterHelper().submitEntity(cluster1Def));
+ AssertUtil.assertSucceeded(prism.getClusterHelper().submitEntity(cluster2Def));
+
+ //submit and schedule 7 feeds, check that 7 waiting instances are present for each feed
+ List<String> feeds = scheduleEntityValidateWaitingInstances(cluster2, feed,
+ EntityType.FEED, clusterName);
+
+ //create data for processes to run and wait some time for instances to make progress
+ List<String> folders = TimeUtil.getMinuteDatesOnEitherSide(TimeUtil.oozieDateToDate(
+ startTime), TimeUtil.oozieDateToDate(endTime), 1);
+ HadoopUtil.flattenAndPutDataInFolder(cluster1FS, OSUtil.NORMAL_INPUT, sourcePath, folders);
+ InstanceUtil.waitTillInstanceReachState(cluster2OC, feeds.get(0), 1,
+ CoordinatorAction.Status.RUNNING, EntityType.FEED);
+
+ //compare summary and instance result for each of 7 processes
+ validateProgressingInstances(feeds, EntityType.FEED, clusterName);
+ softAssert.assertAll();
+ }
+
+ /*
+ * Schedules 7 entities and checks that summary reflects info about the most recent 7
+ * instances of each of them.
+ */
+ private List<String> scheduleEntityValidateWaitingInstances(ColoHelper cluster, String entity,
+ EntityType entityType,
+ String clusterName)
+ throws AuthenticationException, IOException, URISyntaxException, JAXBException,
+ OozieClientException {
+ String entityName = Util.readEntityName(entity);
+ IEntityManagerHelper helper;
+ List<String> names = new ArrayList<String>();
+ for (int i = 1; i <= 7; i++) {
+ String uniqueName = entityName + i;
+ names.add(uniqueName);
+ Entity entityMerlin;
+ if (entityType == EntityType.FEED) {
+ helper = prism.getFeedHelper();
+ entityMerlin = new FeedMerlin(entity);
+ ((FeedMerlin) entityMerlin).setName(uniqueName);
+ } else {
+ helper = prism.getProcessHelper();
+ entityMerlin = new ProcessMerlin(entity);
+ ((ProcessMerlin) entityMerlin).setName(uniqueName);
+ }
+ entity = entityMerlin.toString();
+ AssertUtil.assertSucceeded(helper.submitAndSchedule(entity));
+ InstanceUtil.waitTillInstancesAreCreated(cluster, entity, 0);
+ InstanceUtil.waitTillInstanceReachState(cluster.getClusterHelper().getOozieClient(),
+ uniqueName, 7, CoordinatorAction.Status.WAITING, entityType);
+
+ //check that summary shows recent (i) number of feeds and their instances
+ EntitySummaryResult summary = helper.getEntitySummary(clusterName, null)
+ .getEntitySummaryResult();
+
+ EntitySummaryResult.EntitySummary[] entitiesSummary = summary.getEntitySummaries();
+ softAssert.assertEquals(entitiesSummary.length, i, "Summary must contain info "
+ + "about exact number of feeds.");
+ for (EntitySummaryResult.EntitySummary entitySummary : entitiesSummary) {
+ String status = entitySummary.getStatus();
+ softAssert.assertTrue(status.equals("RUNNING") || status.equals("SUBMITTED"),
+ "Unexpected entity status : " + status);
+ softAssert.assertTrue(names.contains(entitySummary.getName()),
+ "Unexpected entity name: " + entitySummary.getName());
+ softAssert.assertEquals(entitySummary.getInstances().length, 7,
+ "Unexpected number of instances.");
+ for (EntitySummaryResult.Instance instance : entitySummary.getInstances()) {
+ softAssert.assertEquals(instance.getStatus(),
+ EntitySummaryResult.WorkflowStatus.WAITING,
+ "Unexpected instance status.");
+ softAssert.assertEquals(instance.getCluster(), clusterName,
+ "Invalid cluster in summary.");
+ }
+ }
+ }
+ return names;
+ }
+
+ /*
+ * Retrieves the most resent info from instanceStatus and entitySummary API and compares them.
+ * Summary for each entity should contain 7 instances and that instances should be the same
+ * as in response of instancesResult request.
+ */
+ private void validateProgressingInstances(List<String> names, EntityType entityType,
+ String clusterName)
+ throws AuthenticationException, IOException, URISyntaxException {
+ InstancesResult r;
+ IEntityManagerHelper helper;
+ if (entityType == EntityType.FEED) {
+ helper = prism.getFeedHelper();
+ } else {
+ helper = prism.getProcessHelper();
+ }
+ for (String entityName : names) {
+ LOGGER.info("Working with " + entityType + " : " + entityName);
+ //get recent instances info by -getStatus API
+ r = helper.getProcessInstanceStatus(entityName, null);
+ InstancesResult.Instance[] instancesR = r.getInstances();
+ LOGGER.info("Instances from InstancesResult: " + Arrays.toString(instancesR));
+ //get recent instances info by -summary API
+ EntitySummaryResult.EntitySummary[] summaries =
+ helper.getEntitySummary(clusterName, null)
+ .getEntitySummaryResult().getEntitySummaries();
+ EntitySummaryResult.EntitySummary summaryItem = null;
+ //get instances for specific process
+ for (EntitySummaryResult.EntitySummary item : summaries) {
+ if (item.getName().equals(entityName)) {
+ summaryItem = item;
+ break;
+ }
+ }
+ Assert.assertNotNull(summaryItem, "Appropriate summary not found for : " + entityName);
+ EntitySummaryResult.Instance[] instancesS = summaryItem.getInstances();
+ LOGGER.info("Instances from SummaryResult: " + Arrays.toString(instancesS));
+ softAssert.assertEquals(instancesS.length, 7, "7 instances should be present in "
+ + "summary.");
+ for (EntitySummaryResult.Instance instance : instancesS) {
+ softAssert.assertTrue(containsInstances(instancesR, instance), "Instance "
+ + instance.toString() + " is absent in list : " + Arrays.toString(instancesR));
+ }
+ }
+ }
+
+ /*
+ * Checks if array of instances of InstancesResult contains particular instance
+ * from SummaryResult by common properties.
+ */
+ private boolean containsInstances(InstancesResult.Instance[] instancesR,
+ EntitySummaryResult.Instance instanceS) {
+ for (InstancesResult.Instance instanceR : instancesR) {
+ if (instanceR.getInstance().equals(instanceS.getInstance())
+ && instanceR.getStatus().toString().equals(instanceS.getStatus().toString())
+ && instanceR.getCluster().equals(instanceS.getCluster())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Test entitySummary optional params. Schedule few processes and get summary using
+ * different optional params. Check that responses match to expected.
+ *
+ * @throws URISyntaxException
+ * @throws IOException
+ * @throws AuthenticationException
+ * @throws JAXBException
+ */
+ @Test
+ public void getSummaryFilterBy()
+ throws URISyntaxException, IOException, AuthenticationException, JAXBException {
+ //prepare process template
+ bundles[0].setProcessValidity(startTime, endTime);
+ bundles[0].submitClusters(prism);
+ bundles[0].submitFeeds(prism);
+ String clusterName = Util.readEntityName(bundles[0].getClusters().get(0));
+ String originName = bundles[0].getProcessName();
+ List<String> pNames = new ArrayList<String>();
+ //schedule 3 processes with different pipelines. 1st and 3d processes have same tag value.
+ for (int i = 1; i <= 3; i++) {
+ String uniqueName = originName + "-" + i;
+ pNames.add(uniqueName);
+ String pipeline = "pipeline_" + i;
+ bundles[0].setProcessName(uniqueName);
+ bundles[0].setProcessPipeline(pipeline);
+ if (i == 2) {
+ bundles[0].setProcessTags("value=2");
+ } else {
+ bundles[0].setProcessTags("value=1");
+ }
+ String process = bundles[0].getProcessData();
+ AssertUtil.assertSucceeded(prism.getProcessHelper().submitAndSchedule(process));
+ }
+
+ //test filterBy name option. Use first process name. Expecting 1 summary be returned.
+ EntitySummaryResult.EntitySummary[] summaries = prism.getProcessHelper()
+ .getEntitySummary(clusterName, "filterBy=NAME:" + pNames.get(0))
+ .getEntitySummaryResult().getEntitySummaries();
+ softAssert.assertEquals(summaries.length, 1, "There should be single process filtered by name.");
+ softAssert.assertEquals(summaries[0].getName(), pNames.get(0), "Invalid process was returned.");
+
+ //suspend one process and test filterBy status option for both running and suspended processes.
+ bundles[0].setProcessName(pNames.get(0));
+ AssertUtil.assertSucceeded(prism.getProcessHelper().suspend(bundles[0].getProcessData()));
+ summaries = prism.getProcessHelper()
+ .getEntitySummary(clusterName, "filterBy=STATUS:SUSPENDED")
+ .getEntitySummaryResult().getEntitySummaries();
+ softAssert.assertEquals(summaries.length, 1, "There should be single SUSPENDED process filtered.");
+ softAssert.assertEquals(summaries[0].getName(), pNames.get(0),
+ "Summary shows invalid suspended process.");
+
+ //lets use the same request for RUNNING processes, adding orderBy option and
+ //sortOrder=asc option, check result
+ summaries = prism.getProcessHelper()
+ .getEntitySummary(clusterName, "filterBy=STATUS:RUNNING&orderBy=name&sortOrder=asc")
+ .getEntitySummaryResult().getEntitySummaries();
+ softAssert.assertEquals(summaries.length, 2, "Invalid RUNNING processes number.");
+ softAssert.assertEquals(summaries[0].getName(), pNames.get(1), "Another process expected.");
+ softAssert.assertEquals(summaries[1].getName(), pNames.get(2), "Another process expected.");
+
+ //lets use the same request adding orderBy option and sortOrder=desc option, check result
+ summaries = prism.getProcessHelper()
+ .getEntitySummary(clusterName, "filterBy=STATUS:RUNNING&orderBy=name&sortOrder=desc")
+ .getEntitySummaryResult().getEntitySummaries();
+ softAssert.assertEquals(summaries.length, 2, "Invalid RUNNING processes number.");
+ softAssert.assertEquals(summaries[0].getName(), pNames.get(2), "Another process expected.");
+ softAssert.assertEquals(summaries[1].getName(), pNames.get(1), "Another process expected.");
+
+ //lets use original request adding numResults option. Single summary should be returned
+ summaries = prism.getProcessHelper()
+ .getEntitySummary(clusterName, "filterBy=STATUS:RUNNING&numResults=1")
+ .getEntitySummaryResult().getEntitySummaries();
+ softAssert.assertEquals(summaries.length, 1, "Single process should be shown.");
+ softAssert.assertEquals(summaries[0].getStatus(), "RUNNING", "Wrong status was returned.");
+ softAssert.assertEquals(summaries[0].getInstances().length, 7, "Invalid instances number.");
+
+ //use the same request adding numInstances option, check instances number differs
+ summaries = prism.getProcessHelper()
+ .getEntitySummary(clusterName, "filterBy=STATUS:RUNNING&numResults=1&numInstances=2")
+ .getEntitySummaryResult().getEntitySummaries();
+ softAssert.assertEquals(summaries.length, 1, "Single process should be shown.");
+ softAssert.assertEquals(summaries[0].getStatus(), "RUNNING", "Wrong status was returned.");
+ softAssert.assertEquals(summaries[0].getInstances().length, 2, "Invalid instances number.");
+
+ //filterBy RUNNING status AND specific pipeline name of one of the running processes.
+ //Result should reflect 'AND' logic and return the only process with correct pipeline
+ //name which matches to a given one in request. Also we should use 'fields' option to get
+ //pipelines listed in entity summary.
+ summaries = prism.getProcessHelper().getEntitySummary(clusterName,
+ "filterBy=STATUS:RUNNING,PIPELINES:pipeline_2&fields=PIPELINES")
+ .getEntitySummaryResult().getEntitySummaries();
+ softAssert.assertEquals(summaries.length, 1, "Single process should be shown.");
+ softAssert.assertEquals(summaries[0].getName(), pNames.get(1), "Invalid process name returned");
+ softAssert.assertEquals(summaries[0].getPipelines()[0], "pipeline_2",
+ "Summary returned process with a wrong pipeline name.");
+
+ //test 'tags' option. 1st and 3d processes should be returned in ascending order.
+ summaries = prism.getProcessHelper()
+ .getEntitySummary(clusterName, "tags=value=1&orderBy=name&sortOrder=asc")
+ .getEntitySummaryResult().getEntitySummaries();
+ softAssert.assertEquals(summaries.length, 2, "Wrong number of processes.");
+ softAssert.assertEquals(summaries[0].getName(), pNames.get(0), "Wrong order.");
+ softAssert.assertEquals(summaries[0].getStatus(), "SUSPENDED", "Wrong status.");
+ softAssert.assertEquals(summaries[1].getName(), pNames.get(2), "Wrong order.");
+ softAssert.assertEquals(summaries[1].getStatus(), "RUNNING", "Wrong status.");
+
+ //attempt to use invalid option or values should not return any summaries.
+ EntitySummaryResult summary = prism.getProcessHelper()
+ .getEntitySummary(clusterName, "filterBy=STATUS:STUCK")
+ .getEntitySummaryResult();
+ softAssert.assertEquals(summary.getStatus(), APIResult.Status.SUCCEEDED);
+ softAssert.assertEquals(summary.getMessage(), "Entity Summary Result", "Invalid message.");
+ softAssert.assertEquals(summary.getEntitySummaries(), null, "Entity summary should be null.");
+ softAssert.assertAll();
+ }
+}