YARN-11442. Refactor FederationInterceptorREST Code. (#5420)
This commit is contained in:
parent
389b3ea6e3
commit
eb1d3ebe2f
@ -26,6 +26,7 @@
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.Random;
|
||||
import java.util.Collection;
|
||||
|
||||
import javax.cache.Cache;
|
||||
import javax.cache.CacheManager;
|
||||
@ -93,6 +94,7 @@
|
||||
import org.apache.hadoop.yarn.server.federation.store.records.SubClusterDeregisterRequest;
|
||||
import org.apache.hadoop.yarn.server.federation.store.records.SubClusterDeregisterResponse;
|
||||
import org.apache.hadoop.yarn.security.client.RMDelegationTokenIdentifier;
|
||||
import org.apache.hadoop.yarn.webapp.NotFoundException;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
@ -1211,4 +1213,23 @@ public boolean deregisterSubCluster(SubClusterId subClusterId,
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get active subclusters.
|
||||
*
|
||||
* @return We will return a list of active subclusters as a Collection.
|
||||
*/
|
||||
public Collection<SubClusterInfo> getActiveSubClusters()
|
||||
throws NotFoundException {
|
||||
try {
|
||||
Map<SubClusterId, SubClusterInfo> subClusterMap = getSubClusters(true);
|
||||
if (MapUtils.isEmpty(subClusterMap)) {
|
||||
throw new NotFoundException("Not Found SubClusters.");
|
||||
}
|
||||
return subClusterMap.values();
|
||||
} catch (Exception e) {
|
||||
LOG.error("getActiveSubClusters failed.", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -111,8 +111,8 @@ private RouterWebServiceUtil() {
|
||||
* @param formParam the form parameters as input for a specific REST call
|
||||
* @param additionalParam the query parameters as input for a specific REST
|
||||
* call in case the call has no servlet request
|
||||
* @param conf configuration.
|
||||
* @param client same client used to reduce number of clients created
|
||||
* @param conf configuration
|
||||
* @return the retrieved entity from the REST call
|
||||
*/
|
||||
protected static <T> T genericForward(final String webApp,
|
||||
@ -510,6 +510,11 @@ public static void mergeMetrics(ClusterMetricsInfo metrics,
|
||||
|
||||
/**
|
||||
* Extract from HttpServletRequest the MediaType in output.
|
||||
*
|
||||
* @param request the servlet request.
|
||||
* @param returnType the return type of the REST call.
|
||||
* @param <T> Generic Type T.
|
||||
* @return MediaType.
|
||||
*/
|
||||
protected static <T> String getMediaTypeFromHttpServletRequest(
|
||||
HttpServletRequest request, final Class<T> returnType) {
|
||||
|
@ -145,8 +145,6 @@
|
||||
import org.apache.hadoop.yarn.webapp.util.WebAppUtils;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import static org.apache.hadoop.yarn.conf.YarnConfiguration.RM_DELEGATION_KEY_UPDATE_INTERVAL_DEFAULT;
|
||||
import static org.apache.hadoop.yarn.conf.YarnConfiguration.RM_DELEGATION_KEY_UPDATE_INTERVAL_KEY;
|
||||
@ -170,11 +168,11 @@
|
||||
* reused to validate different request interceptor chains.
|
||||
*/
|
||||
public class TestFederationInterceptorREST extends BaseRouterWebServicesTest {
|
||||
private static final Logger LOG =
|
||||
LoggerFactory.getLogger(TestFederationInterceptorREST.class);
|
||||
|
||||
private final static int NUM_SUBCLUSTER = 4;
|
||||
private static final int BAD_REQUEST = 400;
|
||||
private static final int ACCEPTED = 202;
|
||||
private static final String TEST_USER = "test-user";
|
||||
private static final int OK = 200;
|
||||
private static String user = "test-user";
|
||||
private TestableFederationInterceptorREST interceptor;
|
||||
@ -195,7 +193,7 @@ public void setUp() throws YarnException, IOException {
|
||||
stateStoreUtil = new FederationStateStoreTestUtil(stateStore);
|
||||
|
||||
interceptor.setConf(this.getConf());
|
||||
interceptor.init(user);
|
||||
interceptor.init(TEST_USER);
|
||||
|
||||
subClusters = new ArrayList<>();
|
||||
|
||||
@ -282,8 +280,7 @@ protected YarnConfiguration createConfiguration() {
|
||||
* ApplicationId has to belong to one of the SubCluster in the cluster.
|
||||
*/
|
||||
@Test
|
||||
public void testGetNewApplication()
|
||||
throws YarnException, IOException, InterruptedException {
|
||||
public void testGetNewApplication() throws IOException, InterruptedException {
|
||||
|
||||
Response response = interceptor.createNewApplication(null);
|
||||
|
||||
@ -359,8 +356,7 @@ public void testSubmitApplicationMultipleSubmission()
|
||||
* request.
|
||||
*/
|
||||
@Test
|
||||
public void testSubmitApplicationEmptyRequest()
|
||||
throws YarnException, IOException, InterruptedException {
|
||||
public void testSubmitApplicationEmptyRequest() throws IOException, InterruptedException {
|
||||
|
||||
// ApplicationSubmissionContextInfo null
|
||||
Response response = interceptor.submitApplication(null, null);
|
||||
@ -384,8 +380,7 @@ public void testSubmitApplicationEmptyRequest()
|
||||
* application in wrong format.
|
||||
*/
|
||||
@Test
|
||||
public void testSubmitApplicationWrongFormat()
|
||||
throws YarnException, IOException, InterruptedException {
|
||||
public void testSubmitApplicationWrongFormat() throws IOException, InterruptedException {
|
||||
|
||||
ApplicationSubmissionContextInfo context =
|
||||
new ApplicationSubmissionContextInfo();
|
||||
@ -506,8 +501,7 @@ public void testGetApplicationReport()
|
||||
* application does not exist in StateStore.
|
||||
*/
|
||||
@Test
|
||||
public void testGetApplicationNotExists()
|
||||
throws YarnException, IOException, InterruptedException {
|
||||
public void testGetApplicationNotExists() {
|
||||
|
||||
ApplicationId appId =
|
||||
ApplicationId.newInstance(System.currentTimeMillis(), 1);
|
||||
@ -522,8 +516,7 @@ public void testGetApplicationNotExists()
|
||||
* application in wrong format.
|
||||
*/
|
||||
@Test
|
||||
public void testGetApplicationWrongFormat()
|
||||
throws YarnException, IOException, InterruptedException {
|
||||
public void testGetApplicationWrongFormat() {
|
||||
|
||||
AppInfo response = interceptor.getApp(null, "Application_wrong_id", null);
|
||||
|
||||
@ -535,8 +528,7 @@ public void testGetApplicationWrongFormat()
|
||||
* subcluster provided one application.
|
||||
*/
|
||||
@Test
|
||||
public void testGetApplicationsReport()
|
||||
throws YarnException, IOException, InterruptedException {
|
||||
public void testGetApplicationsReport() {
|
||||
|
||||
AppsInfo responseGet = interceptor.getApps(null, null, null, null, null,
|
||||
null, null, null, null, null, null, null, null, null, null);
|
||||
@ -645,8 +637,7 @@ public void testGetApplicationState()
|
||||
* application does not exist in StateStore.
|
||||
*/
|
||||
@Test
|
||||
public void testGetApplicationStateNotExists()
|
||||
throws YarnException, IOException, InterruptedException {
|
||||
public void testGetApplicationStateNotExists() throws IOException {
|
||||
|
||||
ApplicationId appId =
|
||||
ApplicationId.newInstance(Time.now(), 1);
|
||||
@ -662,7 +653,7 @@ public void testGetApplicationStateNotExists()
|
||||
*/
|
||||
@Test
|
||||
public void testGetApplicationStateWrongFormat()
|
||||
throws YarnException, IOException, InterruptedException {
|
||||
throws IOException {
|
||||
|
||||
AppState response = interceptor.getAppState(null, "Application_wrong_id");
|
||||
|
||||
@ -865,8 +856,7 @@ public void testGetContainer() throws Exception {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetAppAttempts()
|
||||
throws IOException, InterruptedException, YarnException {
|
||||
public void testGetAppAttempts() throws IOException, InterruptedException {
|
||||
// Submit application to multiSubCluster
|
||||
ApplicationId appId = ApplicationId.newInstance(Time.now(), 1);
|
||||
ApplicationSubmissionContextInfo context = new ApplicationSubmissionContextInfo();
|
||||
@ -897,8 +887,7 @@ public void testGetAppAttempts()
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetAppAttempt()
|
||||
throws IOException, InterruptedException, YarnException {
|
||||
public void testGetAppAttempt() throws IOException, InterruptedException {
|
||||
|
||||
// Generate ApplicationId information
|
||||
ApplicationId appId = ApplicationId.newInstance(Time.now(), 1);
|
||||
@ -922,7 +911,7 @@ public void testGetAppAttempt()
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetAppTimeout() throws IOException, InterruptedException, YarnException {
|
||||
public void testGetAppTimeout() throws IOException, InterruptedException {
|
||||
|
||||
// Generate ApplicationId information
|
||||
ApplicationId appId = ApplicationId.newInstance(Time.now(), 1);
|
||||
@ -942,7 +931,7 @@ public void testGetAppTimeout() throws IOException, InterruptedException, YarnEx
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetAppTimeouts() throws IOException, InterruptedException, YarnException {
|
||||
public void testGetAppTimeouts() throws IOException, InterruptedException {
|
||||
|
||||
// Generate ApplicationId information
|
||||
ApplicationId appId = ApplicationId.newInstance(Time.now(), 1);
|
||||
@ -1022,8 +1011,7 @@ public void testUpdateApplicationPriority() throws IOException, InterruptedExcep
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetAppPriority() throws IOException, InterruptedException,
|
||||
YarnException {
|
||||
public void testGetAppPriority() throws IOException, InterruptedException {
|
||||
|
||||
// Submit application to multiSubCluster
|
||||
ApplicationId appId = ApplicationId.newInstance(Time.now(), 1);
|
||||
@ -1072,7 +1060,7 @@ public void testUpdateAppQueue() throws IOException, InterruptedException,
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetAppQueue() throws IOException, InterruptedException, YarnException {
|
||||
public void testGetAppQueue() throws IOException, InterruptedException {
|
||||
String queueName = "queueName";
|
||||
|
||||
// Submit application to multiSubCluster
|
||||
@ -1090,7 +1078,7 @@ public void testGetAppQueue() throws IOException, InterruptedException, YarnExce
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetAppsInfoCache() throws IOException, InterruptedException, YarnException {
|
||||
public void testGetAppsInfoCache() {
|
||||
|
||||
AppsInfo responseGet = interceptor.getApps(
|
||||
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null);
|
||||
@ -1102,7 +1090,7 @@ public void testGetAppsInfoCache() throws IOException, InterruptedException, Yar
|
||||
LRUCacheHashMap<RouterAppInfoCacheKey, AppsInfo> appsInfoCache =
|
||||
interceptor.getAppInfosCaches();
|
||||
Assert.assertNotNull(appsInfoCache);
|
||||
Assert.assertTrue(!appsInfoCache.isEmpty());
|
||||
Assert.assertFalse(appsInfoCache.isEmpty());
|
||||
Assert.assertEquals(1, appsInfoCache.size());
|
||||
Assert.assertTrue(appsInfoCache.containsKey(cacheKey));
|
||||
|
||||
@ -1113,7 +1101,6 @@ public void testGetAppsInfoCache() throws IOException, InterruptedException, Yar
|
||||
|
||||
@Test
|
||||
public void testGetAppStatistics() throws IOException, InterruptedException, YarnException {
|
||||
AppState appStateRUNNING = new AppState(YarnApplicationState.RUNNING.name());
|
||||
|
||||
// Submit application to multiSubCluster
|
||||
ApplicationId appId = ApplicationId.newInstance(Time.now(), 1);
|
||||
@ -1200,6 +1187,7 @@ public void testListReservation() throws Exception {
|
||||
Assert.assertNotNull(entity);
|
||||
Assert.assertNotNull(entity instanceof ReservationListInfo);
|
||||
|
||||
Assert.assertTrue(entity instanceof ReservationListInfo);
|
||||
ReservationListInfo listInfo = (ReservationListInfo) entity;
|
||||
Assert.assertNotNull(listInfo);
|
||||
|
||||
@ -1267,6 +1255,7 @@ public void testSubmitReservation() throws Exception {
|
||||
Assert.assertNotNull(entity);
|
||||
Assert.assertNotNull(entity instanceof ReservationListInfo);
|
||||
|
||||
Assert.assertTrue(entity instanceof ReservationListInfo);
|
||||
ReservationListInfo listInfo = (ReservationListInfo) entity;
|
||||
Assert.assertNotNull(listInfo);
|
||||
|
||||
@ -1310,6 +1299,7 @@ public void testUpdateReservation() throws Exception {
|
||||
Assert.assertNotNull(entity);
|
||||
Assert.assertNotNull(entity instanceof ReservationListInfo);
|
||||
|
||||
Assert.assertTrue(entity instanceof ReservationListInfo);
|
||||
ReservationListInfo listInfo = (ReservationListInfo) entity;
|
||||
Assert.assertNotNull(listInfo);
|
||||
|
||||
@ -1373,8 +1363,7 @@ private Response submitReservation(ReservationId reservationId)
|
||||
throws IOException, InterruptedException {
|
||||
ReservationSubmissionRequestInfo resSubmissionRequestInfo =
|
||||
getReservationSubmissionRequestInfo(reservationId);
|
||||
Response response = interceptor.submitReservation(resSubmissionRequestInfo, null);
|
||||
return response;
|
||||
return interceptor.submitReservation(resSubmissionRequestInfo, null);
|
||||
}
|
||||
|
||||
public static ReservationSubmissionRequestInfo getReservationSubmissionRequestInfo(
|
||||
@ -1402,15 +1391,13 @@ public static ReservationSubmissionRequest getReservationSubmissionRequest(
|
||||
long arrival = Time.now();
|
||||
|
||||
// deadline by when the resource(s) must be allocated.
|
||||
// The reason for choosing 1.05 is because this gives an integer
|
||||
// The reason for choosing 1.05 is that this gives an integer
|
||||
// DURATION * 0.05 = 3000(ms)
|
||||
// deadline = arrival + 3000ms
|
||||
long deadline = (long) (arrival + 1.05 * DURATION);
|
||||
|
||||
ReservationSubmissionRequest submissionRequest = createSimpleReservationRequest(
|
||||
return createSimpleReservationRequest(
|
||||
reservationId, numContainers, arrival, deadline, DURATION, memory, vcore);
|
||||
|
||||
return submissionRequest;
|
||||
}
|
||||
|
||||
public static ReservationSubmissionRequest createSimpleReservationRequest(
|
||||
@ -1423,9 +1410,7 @@ public static ReservationSubmissionRequest createSimpleReservationRequest(
|
||||
Collections.singletonList(r), ReservationRequestInterpreter.R_ALL);
|
||||
ReservationDefinition rDef = ReservationDefinition.newInstance(
|
||||
arrival, deadline, reqs, "testClientRMService#reservation", "0", Priority.UNDEFINED);
|
||||
ReservationSubmissionRequest request = ReservationSubmissionRequest.newInstance(
|
||||
rDef, QUEUE_DEDICATED_FULL, reservationId);
|
||||
return request;
|
||||
return ReservationSubmissionRequest.newInstance(rDef, QUEUE_DEDICATED_FULL, reservationId);
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -1497,7 +1482,7 @@ private void checkUserAccessToQueueSuccess(String queue, String userName,
|
||||
interceptor.checkUserAccessToQueue(queue, userName, queueACL.name(), mockHsr);
|
||||
Assert.assertNotNull(aclInfo);
|
||||
Assert.assertTrue(aclInfo instanceof FederationRMQueueAclInfo);
|
||||
FederationRMQueueAclInfo fedAclInfo = FederationRMQueueAclInfo.class.cast(aclInfo);
|
||||
FederationRMQueueAclInfo fedAclInfo = (FederationRMQueueAclInfo) aclInfo;
|
||||
List<RMQueueAclInfo> aclInfos = fedAclInfo.getList();
|
||||
Assert.assertNotNull(aclInfos);
|
||||
Assert.assertEquals(4, aclInfos.size());
|
||||
@ -1513,7 +1498,7 @@ private void checkUserAccessToQueueFailed(String queue, String userName,
|
||||
interceptor.checkUserAccessToQueue(queue, userName, queueACL.name(), mockHsr);
|
||||
Assert.assertNotNull(aclInfo);
|
||||
Assert.assertTrue(aclInfo instanceof FederationRMQueueAclInfo);
|
||||
FederationRMQueueAclInfo fedAclInfo = FederationRMQueueAclInfo.class.cast(aclInfo);
|
||||
FederationRMQueueAclInfo fedAclInfo = (FederationRMQueueAclInfo) aclInfo;
|
||||
List<RMQueueAclInfo> aclInfos = fedAclInfo.getList();
|
||||
Assert.assertNotNull(aclInfos);
|
||||
Assert.assertEquals(4, aclInfos.size());
|
||||
@ -1589,13 +1574,12 @@ public void testGetSchedulerInfo() {
|
||||
Assert.assertTrue(typeInfo instanceof FederationSchedulerTypeInfo);
|
||||
|
||||
FederationSchedulerTypeInfo federationSchedulerTypeInfo =
|
||||
FederationSchedulerTypeInfo.class.cast(typeInfo);
|
||||
(FederationSchedulerTypeInfo) typeInfo;
|
||||
Assert.assertNotNull(federationSchedulerTypeInfo);
|
||||
List<SchedulerTypeInfo> schedulerTypeInfos = federationSchedulerTypeInfo.getList();
|
||||
Assert.assertNotNull(schedulerTypeInfos);
|
||||
Assert.assertEquals(4, schedulerTypeInfos.size());
|
||||
List<String> subClusterIds =
|
||||
subClusters.stream().map(subClusterId -> subClusterId.getId()).
|
||||
List<String> subClusterIds = subClusters.stream().map(SubClusterId::getId).
|
||||
collect(Collectors.toList());
|
||||
|
||||
for (SchedulerTypeInfo schedulerTypeInfo : schedulerTypeInfos) {
|
||||
@ -1609,8 +1593,7 @@ public void testGetSchedulerInfo() {
|
||||
SchedulerInfo schedulerInfo = schedulerTypeInfo.getSchedulerInfo();
|
||||
Assert.assertNotNull(schedulerInfo);
|
||||
Assert.assertTrue(schedulerInfo instanceof CapacitySchedulerInfo);
|
||||
CapacitySchedulerInfo capacitySchedulerInfo =
|
||||
CapacitySchedulerInfo.class.cast(schedulerInfo);
|
||||
CapacitySchedulerInfo capacitySchedulerInfo = (CapacitySchedulerInfo) schedulerInfo;
|
||||
Assert.assertNotNull(capacitySchedulerInfo);
|
||||
|
||||
// 3. The parent queue name should be root
|
||||
@ -1702,7 +1685,7 @@ public void testPostDelegationToken() throws Exception {
|
||||
Assert.assertNotNull(entity);
|
||||
Assert.assertTrue(entity instanceof DelegationToken);
|
||||
|
||||
DelegationToken dtoken = DelegationToken.class.cast(entity);
|
||||
DelegationToken dtoken = (DelegationToken) entity;
|
||||
Assert.assertEquals(TEST_RENEWER, dtoken.getRenewer());
|
||||
Assert.assertEquals(TEST_RENEWER, dtoken.getOwner());
|
||||
Assert.assertEquals("RM_DELEGATION_TOKEN", dtoken.getKind());
|
||||
@ -1751,7 +1734,7 @@ public void testPostDelegationTokenExpiration() throws Exception {
|
||||
Object entity = response.getEntity();
|
||||
Assert.assertNotNull(entity);
|
||||
Assert.assertTrue(entity instanceof DelegationToken);
|
||||
DelegationToken dtoken = DelegationToken.class.cast(entity);
|
||||
DelegationToken dtoken = (DelegationToken) entity;
|
||||
|
||||
final String yarnTokenHeader = "Hadoop-YARN-RM-Delegation-Token";
|
||||
when(request.getHeader(yarnTokenHeader)).thenReturn(dtoken.getToken());
|
||||
@ -1764,7 +1747,7 @@ public void testPostDelegationTokenExpiration() throws Exception {
|
||||
Assert.assertTrue(renewEntity instanceof DelegationToken);
|
||||
|
||||
// renewDelegation, we only return renewDate, other values are NULL.
|
||||
DelegationToken renewDToken = DelegationToken.class.cast(renewEntity);
|
||||
DelegationToken renewDToken = (DelegationToken) renewEntity;
|
||||
Assert.assertNull(renewDToken.getRenewer());
|
||||
Assert.assertNull(renewDToken.getOwner());
|
||||
Assert.assertNull(renewDToken.getKind());
|
||||
@ -1789,7 +1772,7 @@ public void testCancelDelegationToken() throws Exception {
|
||||
Object entity = response.getEntity();
|
||||
Assert.assertNotNull(entity);
|
||||
Assert.assertTrue(entity instanceof DelegationToken);
|
||||
DelegationToken dtoken = DelegationToken.class.cast(entity);
|
||||
DelegationToken dtoken = (DelegationToken) entity;
|
||||
|
||||
final String yarnTokenHeader = "Hadoop-YARN-RM-Delegation-Token";
|
||||
when(request.getHeader(yarnTokenHeader)).thenReturn(dtoken.getToken());
|
||||
@ -1903,7 +1886,7 @@ public void testDumpSchedulerLogs() throws Exception {
|
||||
// We cannot guarantee the calling order of the sub-clusters,
|
||||
// We guarantee that the returned result contains the information of each subCluster.
|
||||
Assert.assertNotNull(dumpSchedulerLogsMsg);
|
||||
subClusters.stream().forEach(subClusterId -> {
|
||||
subClusters.forEach(subClusterId -> {
|
||||
String subClusterMsg =
|
||||
"subClusterId" + subClusterId + " : Capacity scheduler logs are being created.; ";
|
||||
Assert.assertTrue(dumpSchedulerLogsMsg.contains(subClusterMsg));
|
||||
@ -1978,7 +1961,7 @@ public void testGetBulkActivitiesNormal() throws InterruptedException {
|
||||
Assert.assertTrue(bulkActivitiesInfo instanceof FederationBulkActivitiesInfo);
|
||||
|
||||
FederationBulkActivitiesInfo federationBulkActivitiesInfo =
|
||||
FederationBulkActivitiesInfo.class.cast(bulkActivitiesInfo);
|
||||
(FederationBulkActivitiesInfo) bulkActivitiesInfo;
|
||||
Assert.assertNotNull(federationBulkActivitiesInfo);
|
||||
|
||||
List<BulkActivitiesInfo> activitiesInfos = federationBulkActivitiesInfo.getList();
|
||||
@ -2033,9 +2016,7 @@ public void testAddToClusterNodeLabels1() throws Exception {
|
||||
// we confirm the result by contains
|
||||
String expectedMsg =
|
||||
"SubCluster-0:SUCCESS,SubCluster-1:SUCCESS,SubCluster-2:SUCCESS,SubCluster-3:SUCCESS";
|
||||
Arrays.stream(entities).forEach(item -> {
|
||||
Assert.assertTrue(expectedMsg.contains(item));
|
||||
});
|
||||
Arrays.stream(entities).forEach(item -> Assert.assertTrue(expectedMsg.contains(item)));
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -2098,9 +2079,7 @@ public void testRemoveFromClusterNodeLabels1() throws Exception {
|
||||
// we confirm the result by contains
|
||||
String expectedMsg =
|
||||
"SubCluster-0:SUCCESS,SubCluster-1:SUCCESS,SubCluster-2:SUCCESS,SubCluster-3:SUCCESS";
|
||||
Arrays.stream(entities).forEach(item -> {
|
||||
Assert.assertTrue(expectedMsg.contains(item));
|
||||
});
|
||||
Arrays.stream(entities).forEach(item -> Assert.assertTrue(expectedMsg.contains(item)));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
Loading…
Reference in New Issue
Block a user