/**
* 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.searchUI;
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.Location;
import org.apache.falcon.entity.v0.feed.LocationType;
import org.apache.falcon.entity.v0.feed.Locations;
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.util.AssertUtil;
import org.apache.falcon.regression.core.util.BundleUtil;
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.testHelper.BaseUITestClass;
import org.apache.falcon.regression.ui.search.EntityPage;
import org.apache.falcon.regression.ui.search.EntityPage.InstanceAction;
import org.apache.falcon.regression.ui.search.LoginPage;
import org.apache.falcon.regression.ui.search.SearchPage;
import org.apache.falcon.resource.InstancesResult;
import org.apache.hadoop.fs.FileSystem;
import org.apache.log4j.Logger;
import org.apache.oozie.client.CoordinatorAction;
import org.apache.oozie.client.OozieClient;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* Tests for Search UI Entity Page.
*/
@Test(groups = "search-ui")
public class EntityPageTest extends BaseUITestClass {
private static final Logger LOGGER = Logger.getLogger(EntityPageTest.class);
private final ColoHelper cluster = servers.get(0);
private final FileSystem clusterFS = serverFS.get(0);
private final OozieClient clusterOC = serverOC.get(0);
private String baseTestHDFSDir = cleanAndGetTestDir();
private String aggregateWorkflowDir = baseTestHDFSDir + "/aggregator";
private String feedInputPath = baseTestHDFSDir + "/input" + MINUTE_DATE_PATTERN;
private String feedOutputPath = baseTestHDFSDir + "/output" + MINUTE_DATE_PATTERN;
private SearchPage searchPage = null;
@BeforeMethod(alwaysRun = true)
public void setup() throws IOException {
cleanAndGetTestDir();
HadoopUtil.uploadDir(serverFS.get(0), aggregateWorkflowDir, OSUtil.RESOURCES_OOZIE);
bundles[0] = BundleUtil.readELBundle();
bundles[0] = new Bundle(bundles[0], servers.get(0));
bundles[0].generateUniqueBundle(this);
bundles[0].setInputFeedDataPath(feedInputPath);
bundles[0].setProcessWorkflow(aggregateWorkflowDir);
bundles[0].setProcessValidity("2010-01-02T01:00Z", "2010-01-02T01:11Z");
bundles[0].setProcessInputStartEnd("now(0, 0)", "now(0, 0)");
bundles[0].setProcessPeriodicity(5, Frequency.TimeUnit.minutes);
bundles[0].setOutputFeedPeriodicity(5, Frequency.TimeUnit.minutes);
bundles[0].setOutputFeedLocationData(feedOutputPath);
bundles[0].setInputFeedPeriodicity(5, Frequency.TimeUnit.minutes);
openBrowser();
final LoginPage loginPage = LoginPage.open(getDriver());
searchPage = loginPage.doDefaultLogin();
}
/**
* Basic checks on the entity page for feed and process.
* Run feed and process.
* Click on each entity from Entities table. Navigate to respective entity page.
* Check that page is named the same as entity.
* Check that page has all required blocks and identifying elements (Dependencies,
* Properties, Instances blocks)
*/
@Test
public void entityPage() throws Exception {
final FeedMerlin inputFeed = FeedMerlin.fromString(bundles[0].getInputFeedFromBundle());
final FeedMerlin outputFeed = FeedMerlin.fromString(bundles[0].getOutputFeedFromBundle());
final ProcessMerlin processMerlin = bundles[0].getProcessObject();
bundles[0].submitAndScheduleProcess();
final List<SearchPage.SearchResult> results = searchPage.doSearch("*");
SearchPage.SearchResult.assertEqual(results,
Arrays.asList(inputFeed, outputFeed, processMerlin), "Unexpected search results.");
for (SearchPage.SearchResult result : results) {
EntityPage entityPage = searchPage.click(result);
Assert.assertEquals(entityPage.getEntityName(), result.getEntityName(),
"Unexpected entity name displayed on entity page.");
entityPage.checkPage();
//navigate to initial search page
searchPage = entityPage.getPageHeader().gotoHome();
searchPage.doSearch("*");
}
}
/**
* Test header of the EntityPage.
* Check that buttons (logout, entities, uploadXml, help, Falcon) are present, and names are
* correct.
* Check the user name on header.
* "Create an entity"/"upload an entity" headers.
* Check that each button navigates user to correct page.
* @throws Exception
*/
@Test
public void testHeader() throws Exception {
bundles[0].submitAndScheduleProcess();
final SearchPage.SearchResult firstResult = searchPage.doSearch("*").get(0);
final EntityPage entityPage = searchPage.click(firstResult);
entityPage.getPageHeader().checkHeader();
}
/**
* Test that details of the feed are displayed correctly.
* Run feed. Check that properties block shows correct name,
* tags, workflow etc.
* @throws IOException
*/
@Test
public void testFeedEntityProperties() throws Exception {
final FeedMerlin inputFeed = FeedMerlin.fromString(bundles[0].getInputFeedFromBundle());
addLocationsToFeedCluster(inputFeed);
bundles[0].submitClusters(prism);
AssertUtil.assertSucceeded(prism.getFeedHelper().submitAndSchedule(inputFeed.toString()));
final List<SearchPage.SearchResult> results = searchPage.doSearch("*");
SearchPage.SearchResult.assertEqual(results, Collections.singletonList((Entity) inputFeed),
"Unexpected search results.");
final SearchPage.SearchResult result = results.get(0);
EntityPage entityPage = searchPage.click(result);
final String entityName = result.getEntityName();
Assert.assertEquals(entityPage.getEntityName(), entityName,
"Unexpected entity name displayed on entity page.");
entityPage.checkPage();
entityPage.checkFeedProperties(inputFeed);
}
private void addLocationsToFeedCluster(FeedMerlin feed) {
final Locations feedClusterLocations = new Locations();
final Location firstFeedClusterLocation = new Location();
firstFeedClusterLocation.setPath(feedInputPath);
firstFeedClusterLocation.setType(LocationType.DATA);
feedClusterLocations.getLocations().add(firstFeedClusterLocation);
final Location secondFeedClusterLocation = new Location();
secondFeedClusterLocation.setPath(baseTestHDFSDir + "/stats");
secondFeedClusterLocation.setType(LocationType.STATS);
feedClusterLocations.getLocations().add(secondFeedClusterLocation);
feed.getClusters().getClusters().get(0).setLocations(feedClusterLocations);
}
/**
* Test that details of the process are displayed correctly.
* Run process. Check that properties block shows correct name,
* input, output etc.
* @throws IOException
*/
@Test
public void testProcessEntityProperties() throws Exception {
final ProcessMerlin process = bundles[0].getProcessObject();
bundles[0].submitAndScheduleAllFeeds();
AssertUtil.assertSucceeded(prism.getProcessHelper().submitAndSchedule(process.toString()));
final List<SearchPage.SearchResult> results = searchPage.doSearch("*");
final List<Entity> scheduledEntities = new ArrayList<>();
scheduledEntities.add(process);
scheduledEntities.addAll(FeedMerlin.fromString(bundles[0].getDataSets()));
SearchPage.SearchResult.assertEqual(results, scheduledEntities,
"Unexpected search results.");
final EntityPage entityPage = searchPage.openEntityPage(process.getName());
Assert.assertEquals(entityPage.getEntityName(), process.getName(),
"Unexpected entity name displayed on entity page.");
entityPage.checkPage();
entityPage.checkProcessProperties(process);
}
/**
* Run a process with 9 instances. Get into it's page.
* Check that block contains correct number of instances with appropriate names, time ranges,
* statuses and colors.
*/
@Test
public void testInstancesBlockInfo() throws Exception {
bundles[0].setProcessValidity("2010-01-02T01:00Z", "2010-01-02T01:41Z");
final ProcessMerlin process = bundles[0].getProcessObject();
bundles[0].submitAndScheduleAllFeeds();
AssertUtil.assertSucceeded(prism.getProcessHelper().submitAndSchedule(process.toString()));
InstanceUtil.waitTillInstanceReachState(clusterOC, process.getName(), 1,
CoordinatorAction.Status.WAITING, EntityType.PROCESS, 1);
OozieUtil.createMissingDependencies(
cluster, EntityType.PROCESS, process.getName(), 0);
InstanceUtil.waitTillInstanceReachState(clusterOC, process.getName(), 1,
CoordinatorAction.Status.SUCCEEDED, EntityType.PROCESS, 5);
InstanceUtil.waitTillInstanceReachState(clusterOC, process.getName(), 1,
CoordinatorAction.Status.RUNNING, EntityType.PROCESS, 5);
final List<SearchPage.SearchResult> results = searchPage.doSearch("*");
final List<Entity> scheduledEntities = new ArrayList<>();
scheduledEntities.add(process);
scheduledEntities.addAll(FeedMerlin.fromString(bundles[0].getDataSets()));
SearchPage.SearchResult.assertEqual(results, scheduledEntities,
"Unexpected search results.");
final EntityPage entityPage = searchPage.openEntityPage(process.getName());
Assert.assertEquals(entityPage.getEntityName(), process.getName(),
"Unexpected entity name displayed on entity page.");
entityPage.checkPage();
final EntityPage.InstanceSummary displayedSummary = entityPage.getInstanceSummary();
displayedSummary.check();
final InstancesResult apiSummary = prism.getProcessHelper().listInstances(
process.getName(), "start=2010-01-02T01:00Z", null);
displayedSummary.checkSummary(apiSummary.getInstances());
}
/**
* Run a process with 30 instances. Get into it's page.
* Check that instance block has pagination enabled. Check the number of instances on current
* page, go to the next one and check that number there too.
*/
@Test
public void testInstancesBlockManyInstances() throws Exception {
bundles[0].setProcessValidity("2010-01-02T01:00Z", "2010-01-02T03:26Z");
final ProcessMerlin process = bundles[0].getProcessObject();
bundles[0].submitAndScheduleAllFeeds();
AssertUtil.assertSucceeded(prism.getProcessHelper().submitAndSchedule(process.toString()));
InstanceUtil.waitTillInstanceReachState(clusterOC, process.getName(), 1,
CoordinatorAction.Status.WAITING, EntityType.PROCESS, 1);
final List<SearchPage.SearchResult> results = searchPage.doSearch("*");
final List<Entity> scheduledEntities = new ArrayList<>();
scheduledEntities.add(process);
scheduledEntities.addAll(FeedMerlin.fromString(bundles[0].getDataSets()));
SearchPage.SearchResult.assertEqual(results, scheduledEntities,
"Unexpected search results.");
final EntityPage entityPage = searchPage.openEntityPage(process.getName());
Assert.assertEquals(entityPage.getEntityName(), process.getName(),
"Unexpected entity name displayed on entity page.");
entityPage.checkPage();
final EntityPage.InstanceSummary displayedSummary = entityPage.getInstanceSummary();
final InstancesResult apiSummary = prism.getProcessHelper().listInstances(
process.getName(),
"start=2010-01-02T01:00Z&end=2099-01-01T01:00Z&numResults=1000", null);
displayedSummary.check();
displayedSummary.checkSummary(apiSummary.getInstances());
}
/**
* Run a process with 3 instances: 1 succeeded, 1 suspended and 1 waiting.
* Get into it's page.
* Set filtering by start time. Increase start time and check that number of instances
* decreases.
* Set end time filter - only succeeded instance should be shown.
* Set filtering by status:
* running (empty list)
* waiting - 1 instance
* succeeded - 1 instance
* suspended - 1 instance
* Check that block contains correct number of instances with appropriate names, time ranges,
* statuses and colors.
*/
@Test
public void testInstancesBlockFilter() throws Exception {
final String startTime = "2010-01-02T01:00Z";
final String endTime = "2010-01-02T01:11Z";
String prefix = bundles[0].getFeedDataPathPrefix();
bundles[0].setProcessValidity(startTime, endTime);
final ProcessMerlin process = bundles[0].getProcessObject();
bundles[0].submitAndScheduleAllFeeds();
AssertUtil.assertSucceeded(prism.getProcessHelper().submitAndSchedule(process.toString()));
InstanceUtil.waitTillInstanceReachState(clusterOC, process.getName(), 1,
CoordinatorAction.Status.WAITING, EntityType.PROCESS, 1);
OozieUtil.createMissingDependencies(cluster, EntityType.PROCESS, process.getName(), 0, 0);
InstanceUtil.waitTillInstanceReachState(clusterOC, process.getName(), 1,
CoordinatorAction.Status.SUCCEEDED, EntityType.PROCESS, 5);
OozieUtil.createMissingDependencies(cluster, EntityType.PROCESS, process.getName(), 0, 1);
InstanceUtil.waitTillInstanceReachState(clusterOC, process.getName(), 1,
CoordinatorAction.Status.RUNNING, EntityType.PROCESS, 5);
//suspend the second instance
prism.getProcessHelper().getProcessInstanceSuspend(process.getName(),
"?start=" + TimeUtil.addMinsToTime(startTime, 5)
+ "&end=" + TimeUtil.addMinsToTime(startTime, 6));
final List<SearchPage.SearchResult> results = searchPage.doSearch("*");
final List<Entity> scheduledEntities = new ArrayList<>();
scheduledEntities.add(process);
scheduledEntities.addAll(FeedMerlin.fromString(bundles[0].getDataSets()));
SearchPage.SearchResult.assertEqual(results, scheduledEntities,
"Unexpected search results.");
final EntityPage entityPage = searchPage.openEntityPage(process.getName());
Assert.assertEquals(entityPage.getEntityName(), process.getName(),
"Unexpected entity name displayed on entity page.");
entityPage.checkPage();
final EntityPage.InstanceSummary displayedSummary = entityPage.getInstanceSummary();
final InstancesResult apiSummary = prism.getProcessHelper().listInstances(
process.getName(), "start=" + startTime, null);
displayedSummary.check();
displayedSummary.checkSummary(apiSummary.getInstances());
displayedSummary.setInstanceSummaryStartTime("01022010" + "0101");
final List<EntityPage.OneInstanceSummary> newSummary =
entityPage.getInstanceSummary().getSummary();
Assert.assertNull(EntityPage.InstanceSummary.getOneSummary(newSummary, startTime),
"Not expecting first instance to be displayed");
displayedSummary.setInstanceSummaryStartTime("01022010" + "0106");
final List<EntityPage.OneInstanceSummary> newSummary2 =
entityPage.getInstanceSummary().getSummary();
Assert.assertNull(EntityPage.InstanceSummary.getOneSummary(newSummary2, startTime),
"Not expecting first instance to be displayed");
Assert.assertNull(EntityPage.InstanceSummary.getOneSummary(newSummary2,
TimeUtil.addMinsToTime(startTime, 5)),
"Not expecting second instance to be displayed");
displayedSummary.setInstanceSummaryStartTime("");
displayedSummary.setInstanceSummaryEndTime("01022010" + "0105");
final List<EntityPage.OneInstanceSummary> newSummary3 =
entityPage.getInstanceSummary().getSummary();
Assert.assertNotNull(
EntityPage.InstanceSummary.getOneSummary(newSummary3, startTime),
"Not expecting first instance to be displayed");
Assert.assertNull(EntityPage.InstanceSummary.getOneSummary(newSummary3,
TimeUtil.addMinsToTime(startTime, 5)),
"Not expecting second instance to be displayed");
Assert.assertNull(EntityPage.InstanceSummary.getOneSummary(newSummary3,
TimeUtil.addMinsToTime(startTime, 10)),
"Not expecting second instance to be displayed");
//checking status
displayedSummary.setInstanceSummaryStartTime("");
displayedSummary.setInstanceSummaryEndTime("");
displayedSummary.selectInstanceSummaryStatus("RUNNING");
AssertUtil.assertEmpty(entityPage.getInstanceSummary().getSummary(),
"Unexpected summary displayed.");
displayedSummary.selectInstanceSummaryStatus("WAITING");
Assert.assertEquals(entityPage.getInstanceSummary().getSummary().size(), 1,
"Unexpected summary displayed.");
displayedSummary.selectInstanceSummaryStatus("SUCCEEDED");
Assert.assertEquals(entityPage.getInstanceSummary().getSummary().size(), 1,
"Unexpected summary displayed.");
displayedSummary.selectInstanceSummaryStatus("SUSPENDED");
Assert.assertEquals(entityPage.getInstanceSummary().getSummary().size(), 1,
"Unexpected summary displayed.");
}
/**
* Test whether instance status changes are reflected by UI.
* Run a process with at 1 running instance.
* Suspend instance via API. Refresh page. Check that instance status changed on UI.
* Resume it via API. Refresh page. Check that instance is running on UI.
* @throws Exception
*/
@Test
public void testInstancesBlockStatusRunningSuspended() throws Exception {
final String startTime = "2010-01-02T01:00Z";
final String endTime = "2010-01-02T01:01Z";
String prefix = bundles[0].getFeedDataPathPrefix();
bundles[0].setProcessValidity(startTime, endTime);
final ProcessMerlin process = bundles[0].getProcessObject();
bundles[0].submitAndScheduleAllFeeds();
AssertUtil.assertSucceeded(prism.getProcessHelper().submitAndSchedule(process.toString()));
InstanceUtil.waitTillInstanceReachState(clusterOC, process.getName(), 1,
CoordinatorAction.Status.WAITING, EntityType.PROCESS, 1);
final List<String> dataDates = TimeUtil.getMinuteDatesOnEitherSide(startTime, endTime, 5);
HadoopUtil.flattenAndPutDataInFolder(clusterFS, OSUtil.NORMAL_INPUT, prefix, dataDates);
InstanceUtil.waitTillInstanceReachState(clusterOC, process.getName(), 1,
CoordinatorAction.Status.RUNNING, EntityType.PROCESS, 5);
//suspend the instance
prism.getProcessHelper().getProcessInstanceSuspend(process.getName(),
"?start=" + startTime + "&end=" + endTime);
final EntityPage entityPage = searchPage.openEntityPage(process.getName());
final EntityPage.InstanceSummary displayedSummary = entityPage.getInstanceSummary();
final InstancesResult apiSummary = prism.getProcessHelper().listInstances(
process.getName(), "start=" + startTime, null);
displayedSummary.check();
displayedSummary.checkSummary(apiSummary.getInstances());
//resume the instance
prism.getProcessHelper().getProcessInstanceResume(process.getName(),
"?start=" + startTime + "&end=" + endTime);
EntityPage newEntityPage = entityPage.refreshPage();
final EntityPage.InstanceSummary newDisplayedSummary = newEntityPage.getInstanceSummary();
final InstancesResult newApiSummary = prism.getProcessHelper().listInstances(
process.getName(), "start=" + startTime, null);
newDisplayedSummary.check();
newDisplayedSummary.checkSummary(newApiSummary.getInstances());
}
/**
* Check suspend/resume on multiple instances.
* Run a process with at least 2 running instances. Check instances status on UI.
* Select both instances and Pause them. Check paused status on UI & API.
* Select them again and Resume them. Check running status via both UI and API.
* @throws Exception
*/
@Test
public void testInstancesBlockActionsSuspendResume() throws Exception {
final String startTime = "2010-01-02T01:00Z";
final String endTime = "2010-01-02T01:06Z";
String prefix = bundles[0].getFeedDataPathPrefix();
bundles[0].setProcessValidity(startTime, endTime);
bundles[0].setProcessConcurrency(2);
final ProcessMerlin process = bundles[0].getProcessObject();
bundles[0].submitAndScheduleAllFeeds();
AssertUtil.assertSucceeded(prism.getProcessHelper().submitAndSchedule(process.toString()));
InstanceUtil.waitTillInstanceReachState(clusterOC, process.getName(), 1,
CoordinatorAction.Status.WAITING, EntityType.PROCESS, 1);
final List<String> dataDates = TimeUtil.getMinuteDatesOnEitherSide(startTime, endTime, 5);
HadoopUtil.flattenAndPutDataInFolder(clusterFS, OSUtil.NORMAL_INPUT, prefix, dataDates);
InstanceUtil.waitTillInstanceReachState(clusterOC, process.getName(), 2,
CoordinatorAction.Status.RUNNING, EntityType.PROCESS, 5);
final EntityPage entityPage = searchPage.openEntityPage(process.getName());
final EntityPage.InstanceSummary displayedSummary = entityPage.getInstanceSummary();
//suspend instances through ui
for (EntityPage.OneInstanceSummary oneInstanceSummary : displayedSummary.getSummary()) {
oneInstanceSummary.clickCheckBox();
}
entityPage.performActionOnSelectedInstances(InstanceAction.Suspend);
final List<EntityPage.OneInstanceSummary> suspendedSummary = displayedSummary.getSummary();
Assert.assertEquals(suspendedSummary.get(0).getStatus(), "SUSPENDED",
"Expecting first instance to be suspended");
Assert.assertEquals(suspendedSummary.get(1).getStatus(), "SUSPENDED",
"Expecting second instance to be suspended");
final InstancesResult apiSuspendedSummary = prism.getProcessHelper().listInstances(
process.getName(), "start=" + startTime, null);
displayedSummary.check();
displayedSummary.checkSummary(apiSuspendedSummary.getInstances());
//resume instances through ui
for (EntityPage.OneInstanceSummary oneInstanceSummary : suspendedSummary) {
oneInstanceSummary.clickCheckBox();
}
entityPage.performActionOnSelectedInstances(InstanceAction.Resume);
final List<EntityPage.OneInstanceSummary> resumedSummary = displayedSummary.getSummary();
Assert.assertEquals(resumedSummary.get(0).getStatus(), "RUNNING",
"Expecting first instance to be running");
Assert.assertEquals(resumedSummary.get(1).getStatus(), "RUNNING",
"Expecting second instance to be running");
final InstancesResult apiResumeSummary = prism.getProcessHelper().listInstances(
process.getName(), "start=" + startTime, null);
displayedSummary.check();
displayedSummary.checkSummary(apiResumeSummary.getInstances());
}
/**
* Check kill/rerun on multiple instances.
* Run a process with at least 2 running instances. Check instances status on UI.
* Select both instances and Pause them. Check paused status on UI & API.
* Select them again and Rerun them. Check running status via both UI and API.
* @throws Exception
*/
@Test
public void testInstancesBlockActionsKillRerun() throws Exception {
final String startTime = "2010-01-02T01:00Z";
final String endTime = "2010-01-02T01:06Z";
String prefix = bundles[0].getFeedDataPathPrefix();
bundles[0].setProcessValidity(startTime, endTime);
bundles[0].setProcessConcurrency(2);
final ProcessMerlin process = bundles[0].getProcessObject();
bundles[0].submitAndScheduleAllFeeds();
AssertUtil.assertSucceeded(prism.getProcessHelper().submitAndSchedule(process.toString()));
InstanceUtil.waitTillInstanceReachState(clusterOC, process.getName(), 1,
CoordinatorAction.Status.WAITING, EntityType.PROCESS, 1);
final List<String> dataDates = TimeUtil.getMinuteDatesOnEitherSide(startTime, endTime, 5);
HadoopUtil.flattenAndPutDataInFolder(clusterFS, OSUtil.NORMAL_INPUT, prefix, dataDates);
InstanceUtil.waitTillInstanceReachState(clusterOC, process.getName(), 2,
CoordinatorAction.Status.RUNNING, EntityType.PROCESS, 5);
final EntityPage entityPage = searchPage.openEntityPage(process.getName());
final EntityPage.InstanceSummary displayedSummary = entityPage.getInstanceSummary();
//kill instances through ui
final List<EntityPage.OneInstanceSummary> runningSummary = displayedSummary.getSummary();
for (EntityPage.OneInstanceSummary oneInstanceSummary : runningSummary) {
oneInstanceSummary.clickCheckBox();
}
entityPage.performActionOnSelectedInstances(InstanceAction.Kill);
final List<EntityPage.OneInstanceSummary> killedSummary = displayedSummary.getSummary();
Assert.assertEquals(killedSummary.get(0).getStatus(), "KILLED",
"Expecting first instance to be killed");
Assert.assertEquals(killedSummary.get(1).getStatus(), "KILLED",
"Expecting second instance to be killed");
final InstancesResult apiKilledSummary = prism.getProcessHelper().listInstances(
process.getName(), "start=" + startTime, null);
displayedSummary.check();
displayedSummary.checkSummary(apiKilledSummary.getInstances());
//rerun instances through ui
for (EntityPage.OneInstanceSummary oneInstanceSummary : killedSummary) {
oneInstanceSummary.clickCheckBox();
}
entityPage.performActionOnSelectedInstances(InstanceAction.Rerun);
final List<EntityPage.OneInstanceSummary> rerunSummary = displayedSummary.getSummary();
Assert.assertEquals(rerunSummary.get(0).getStatus(), "RUNNING",
"Expecting first instance to be running");
Assert.assertEquals(rerunSummary.get(1).getStatus(), "RUNNING",
"Expecting second instance to be running");
final InstancesResult apiRerunSummary = prism.getProcessHelper().listInstances(
process.getName(), "start=" + startTime, null);
displayedSummary.check();
displayedSummary.checkSummary(apiRerunSummary.getInstances());
}
/**
* Check download log button on single/multiple instances.
* Run a process and get into it's page.
* Select two instances, the log button should be disabled.
* Select one instance, the log button should work.
* Check that the browser navigates to the correct page.
* @throws Exception
*/
@Test
public void testSpecificInstanceLog() throws Exception {
final String startTime = "2010-01-02T01:00Z";
final String endTime = "2010-01-02T01:06Z";
String prefix = bundles[0].getFeedDataPathPrefix();
bundles[0].setProcessValidity(startTime, endTime);
bundles[0].setProcessConcurrency(2);
final ProcessMerlin process = bundles[0].getProcessObject();
bundles[0].submitAndScheduleAllFeeds();
AssertUtil.assertSucceeded(prism.getProcessHelper().submitAndSchedule(process.toString()));
InstanceUtil.waitTillInstanceReachState(clusterOC, process.getName(), 1,
CoordinatorAction.Status.WAITING, EntityType.PROCESS, 1);
final List<String> dataDates = TimeUtil.getMinuteDatesOnEitherSide(startTime, endTime, 5);
HadoopUtil.flattenAndPutDataInFolder(clusterFS, OSUtil.NORMAL_INPUT, prefix, dataDates);
InstanceUtil.waitTillInstanceReachState(clusterOC, process.getName(), 2,
CoordinatorAction.Status.RUNNING, EntityType.PROCESS, 5);
final EntityPage entityPage = searchPage.openEntityPage(process.getName());
final EntityPage.InstanceSummary displayedSummary = entityPage.getInstanceSummary();
//kill instances through ui
final List<EntityPage.OneInstanceSummary> runningSummary = displayedSummary.getSummary();
entityPage.performActionOnSelectedInstances(InstanceAction.Log);
Assert.assertFalse(getDriver().getCurrentUrl().contains("oozie"),
"No instance is selected, so, log button should be disabled. "
+ "Clicking instance log button should not take user to oozie page.");
for (EntityPage.OneInstanceSummary oneInstanceSummary : runningSummary) {
oneInstanceSummary.clickCheckBox();
}
entityPage.performActionOnSelectedInstances(InstanceAction.Log);
Assert.assertFalse(getDriver().getCurrentUrl().contains("oozie"),
"Two instances are selected, so, log button should be disabled. "
+ "Clicking instance log button should not take user to oozie page.");
runningSummary.get(1).clickCheckBox();
//only first checkbox is ticked
entityPage.performActionOnSelectedInstances(InstanceAction.Log);
final String nominalTimeOfSelectedInstance = runningSummary.get(0).getNominalTime();
final InstancesResult processInstanceLogs = prism.getProcessHelper()
.getProcessInstanceLogs(process.getName(),
"start=" + nominalTimeOfSelectedInstance
+ "&end=" + TimeUtil.addMinsToTime(nominalTimeOfSelectedInstance, 1));
Assert.assertEquals(getDriver().getCurrentUrl().replaceFirst("/\\?", "?").toLowerCase(),
processInstanceLogs.getInstances()[0].getLogFile().toLowerCase(),
"Only one instance is selected. "
+ "Clicking instance log button should take user to oozie page.");
}
@AfterMethod(alwaysRun = true)
public void tearDown() throws IOException {
removeTestClassEntities();
closeBrowser();
}
}