From 8fbea531d7f7b665f6f55af54c8ebf330118ff37 Mon Sep 17 00:00:00 2001 From: Jian He Date: Mon, 9 Nov 2015 10:43:45 -0800 Subject: [PATCH] YARN-3840. Resource Manager web ui issue when sorting application by id (with application having id > 9999) Contributed by Mohammad Shahid Khan --- .../mapreduce/v2/app/webapp/TaskPage.java | 2 +- .../mapreduce/v2/app/webapp/TasksPage.java | 2 +- hadoop-yarn-project/CHANGES.txt | 3 ++ .../hadoop/yarn/webapp/view/JQueryUI.java | 21 ++++---- .../dt-plugin-1.10.7/sorting/natural.js.gz | Bin 0 -> 1448 bytes .../webapp/AppAttemptPage.java | 2 +- .../webapp/AppPage.java | 2 +- .../webapp/TestAHSWebApp.java | 50 +++++++++++++++++- .../yarn/server/webapp/WebPageUtils.java | 6 +-- .../webapp/AllApplicationsPage.java | 9 +++- .../nodemanager/webapp/AllContainersPage.java | 8 ++- .../resourcemanager/webapp/TestRMWebApp.java | 5 ++ 12 files changed, 88 insertions(+), 22 deletions(-) create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/dt-plugin-1.10.7/sorting/natural.js.gz diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/webapp/TaskPage.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/webapp/TaskPage.java index 19b0d7cfdf..f8637e7043 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/webapp/TaskPage.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/webapp/TaskPage.java @@ -221,7 +221,7 @@ private String attemptsTableInit() { .append("\n{'aTargets': [ 5 ]") .append(", 'bSearchable': false }") - .append("\n, {'sType':'string', 'aTargets': [ 0 ]") + .append("\n, {'sType':'natural', 'aTargets': [ 0 ]") .append(", 'mRender': parseHadoopID }") .append("\n, {'sType':'numeric', 'aTargets': [ 6, 7") diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/webapp/TasksPage.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/webapp/TasksPage.java index 96485279db..e2f12dc4d1 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/webapp/TasksPage.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/webapp/TasksPage.java @@ -43,7 +43,7 @@ private String tasksTableInit() { .append(", bProcessing: true") .append("\n, aoColumnDefs: [\n") - .append("{'sType':'string', 'aTargets': [0]") + .append("{'sType':'natural', 'aTargets': [0]") .append(", 'mRender': parseHadoopID }") .append("\n, {'sType':'numeric', bSearchable:false, 'aTargets': [1]") diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index 1784d6eb48..edb1026fbb 100644 --- a/hadoop-yarn-project/CHANGES.txt +++ b/hadoop-yarn-project/CHANGES.txt @@ -1042,6 +1042,9 @@ Release 2.8.0 - UNRELEASED YARN-4326. Fix TestDistributedShell timeout as AHS in MiniYarnCluster no longer binds to default port 8188. (Meng Ding via wangda) + YARN-3840. Resource Manager web ui issue when sorting application by id (with + application having id > 9999) (Mohammad Shahid Khan via jianhe) + Release 2.7.3 - UNRELEASED INCOMPATIBLE CHANGES diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/webapp/view/JQueryUI.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/webapp/view/JQueryUI.java index 9abfdac7e0..81786f4c53 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/webapp/view/JQueryUI.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/webapp/view/JQueryUI.java @@ -65,14 +65,14 @@ public class JQueryUI extends HtmlBlock { @Override protected void render(Block html) { - html. - link(root_url("static/jquery/themes-1.9.1/base/jquery-ui.css")). - link(root_url("static/dt-1.9.4/css/jui-dt.css")). - script(root_url("static/jquery/jquery-1.8.2.min.js")). - script(root_url("static/jquery/jquery-ui-1.9.1.custom.min.js")). - script(root_url("static/dt-1.9.4/js/jquery.dataTables.min.js")). - script(root_url("static/yarn.dt.plugins.js")). - style("#jsnotice { padding: 0.2em; text-align: center; }", + html.link(root_url("static/jquery/themes-1.9.1/base/jquery-ui.css")) + .link(root_url("static/dt-1.9.4/css/jui-dt.css")) + .script(root_url("static/jquery/jquery-1.8.2.min.js")) + .script(root_url("static/jquery/jquery-ui-1.9.1.custom.min.js")) + .script(root_url("static/dt-1.9.4/js/jquery.dataTables.min.js")) + .script(root_url("static/yarn.dt.plugins.js")) + .script(root_url("static/dt-plugin-1.10.7/sorting/natural.js")) + .style("#jsnotice { padding: 0.2em; text-align: center; }", ".ui-progressbar { height: 1em; min-width: 5em }"); // required List list = Lists.newArrayList(); @@ -82,9 +82,8 @@ protected void render(Block html) { initProgressBars(list); if (!list.isEmpty()) { - html. - script().$type("text/javascript"). - _("$(function() {")._(list.toArray())._("});")._(); + html.script().$type("text/javascript")._("$(function() {") + ._(list.toArray())._("});")._(); } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/dt-plugin-1.10.7/sorting/natural.js.gz b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/dt-plugin-1.10.7/sorting/natural.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..8d781d6c6539c2503738f690f7ec7f1699b4d5a4 GIT binary patch literal 1448 zcmV;Z1y}kXiwFn|t&>#%18!k-b#h^BE^2cCwN`C!+cpsXoC5t1*Dk1~SZ@gmY;~Gu zMYC*u3%aG)7uzXli?W$Wq(@PzyCW|?IC%UB4&aO# z24f~cWrj-_alol6X1N$M!&4~461PBB#fa+?m`ow(#?aWyM9x97f|nMGX?M6#68MrK z2>0!YQfVXP1k98dAS6mjW-85cD43L7gDByTN*FwEky4RmVqE10W?GGMUPQEPx6To& z!qYsj5hmq`f#xlgzJV!2`*O`$TB9H6OsXU&b!LkAXdQ!54GN9WjlGqbD)b{HyC73} zt`=nFEUzXZ9;-@T+O58`_7Zh_K4g^~8-YF|+B;ELtWPX2xE^{_V`jZLUMv=onj=Zv zL`X<{lq5gI$%{BSjIY_8m18YtCUmeN(G#+KqO>s6B3$4%tfUyLl!s+Co8h((MiCiv zk@7WpEv;xPh4C{(s>%&j@FT?rE_S8eR#_DV(>0J!kWvzmTBP(J0{+D*&g(CcgK0Q~ zKJxJYbFk%^ORr`Iu;jFkY_wAd(hun2e<`O&v*|y&YDgD zhUp16D4D=&OLo|fSKuGhIDY)-@guKI3CxaLT8JAvTk0*zYv(Z4G`w3=fcf`3vP21$ zMBn4=H=c7=V(nEj#oGAz_A_8La#=R+zP6P2U_&{0BP)*x<7p*tY))WlK&DlJsWIp9 zUhy2O(E_|t(r7WN3?_dMK8hO-KWjlS#e{w-T7Cd;av=?T!j;kl@V>@cf1R?T3}8|T z1k;7GaF-mJb1}az+kjF$qlr?JoKp;K29$Fd8;u6WTLl$emyXAEU2W}x#{w8xR`=#i z170yF5PMhQX+H^H47=VSYDNcsKh1`xyqTTu-(4k38nQ4OcK7cZX+NHb0Fm~}7N-xx zgFE`{F#`xc6<2m(Z}tb-dzpS+r!}bsy~Pa;qajeiY&ST z;0N#^4$|A_D?hfXr;X|z%j3pi)owMCag5n4vA8I$a=IHz45^$n^@_v7^GR-rhgf9P zrQP-XNb_0F#@s^!0_b#nxVyt2i&>-W=o@88KV@2M)D4&7Pi~c6Ai{Ee%$^z~`-g+1 zvjK~7B@Q~9Pc?zS0Be`#BiH>){QgN zI%9Zmy_LpWMg=qDsfV$_nm9}>3*Pb~%DJ52h56*<1PG?e*kqm^pCADdPK6#q}z3_S(;E$mMdmT zkcxD%#ytD*brQVv8}-ClLOzoeS|%jkt={%^XlskCQ|HTz@du3R6Evw$8i!4l_%4FV zMbHNCoRqHxH!lV8HR_OXZbo~`H5-~-_sd000n3t{J)b}whO1y$Y*8m`! zZZiaL^9J~B3W@T9U3d)*zAc7!g{=4QCDyLE52sid71wpdm)N7H9=K^HH?7W3OA{%2F$0VHwC$^~$#~k^ zw5%S`d)gMfQ?uRPvS37w&E6`o)x5^RyX4;kVRz85fKD_G6aIQW4gLbuHcC%`3;+Ph C7{I*% literal 0 HcmV?d00001 diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AppAttemptPage.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AppAttemptPage.java index c7fe318955..a08297db9a 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AppAttemptPage.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AppAttemptPage.java @@ -53,7 +53,7 @@ protected Class content() { protected String getContainersTableColumnDefs() { StringBuilder sb = new StringBuilder(); - return sb.append("[\n").append("{'sType':'string', 'aTargets': [0]") + return sb.append("[\n").append("{'sType':'natural', 'aTargets': [0]") .append(", 'mRender': parseHadoopID }]").toString(); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AppPage.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AppPage.java index 50dcd9665e..c0e1394ae6 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AppPage.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AppPage.java @@ -55,7 +55,7 @@ protected Class content() { protected String getAttemptsTableColumnDefs() { StringBuilder sb = new StringBuilder(); - return sb.append("[\n").append("{'sType':'string', 'aTargets': [0]") + return sb.append("[\n").append("{'sType':'natural', 'aTargets': [0]") .append(", 'mRender': parseHadoopID }") .append("\n, {'sType':'numeric', 'aTargets': [1]") diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/TestAHSWebApp.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/TestAHSWebApp.java index 1e0886f36c..49fcc58b2a 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/TestAHSWebApp.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/TestAHSWebApp.java @@ -21,7 +21,7 @@ import static org.apache.hadoop.yarn.webapp.Params.TITLE; import static org.mockito.Mockito.mock; -import org.junit.Assert; +import java.util.Map; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.yarn.api.ApplicationBaseProtocol; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; @@ -38,6 +38,7 @@ import org.apache.hadoop.yarn.util.StringHelper; import org.apache.hadoop.yarn.webapp.YarnWebParams; import org.apache.hadoop.yarn.webapp.test.WebAppTests; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -87,6 +88,21 @@ public void testView() throws Exception { WebAppTests.flushOutput(injector); } + @Test + public void testAPPViewNaturalSortType() throws Exception { + Injector injector = + WebAppTests.createMockInjector(ApplicationBaseProtocol.class, + mockApplicationHistoryClientService(5, 1, 1)); + AHSView ahsViewInstance = injector.getInstance(AHSView.class); + + ahsViewInstance.render(); + WebAppTests.flushOutput(injector); + Map moreParams = + ahsViewInstance.context().requestContext().moreParams(); + String appTableColumnsMeta = moreParams.get("ui.dataTables.apps.init"); + Assert.assertTrue(appTableColumnsMeta.indexOf("natural") != -1); + } + @Test public void testAboutPage() throws Exception { Injector injector = @@ -117,6 +133,22 @@ public void testAppPage() throws Exception { WebAppTests.flushOutput(injector); } + @Test + public void testAppPageNaturalSortType() throws Exception { + Injector injector = + WebAppTests.createMockInjector(ApplicationBaseProtocol.class, + mockApplicationHistoryClientService(1, 5, 1)); + AppPage appPageInstance = injector.getInstance(AppPage.class); + + appPageInstance.render(); + WebAppTests.flushOutput(injector); + Map moreParams = + appPageInstance.context().requestContext().moreParams(); + String attemptsTableColumnsMeta = + moreParams.get("ui.dataTables.attempts.init"); + Assert.assertTrue(attemptsTableColumnsMeta.indexOf("natural") != -1); + } + @Test public void testAppAttemptPage() throws Exception { Injector injector = @@ -135,6 +167,21 @@ public void testAppAttemptPage() throws Exception { WebAppTests.flushOutput(injector); } + @Test + public void testAppAttemptPageNaturalSortType() throws Exception { + Injector injector = + WebAppTests.createMockInjector(ApplicationBaseProtocol.class, + mockApplicationHistoryClientService(1, 1, 5)); + AppAttemptPage appAttemptPageInstance = + injector.getInstance(AppAttemptPage.class); + appAttemptPageInstance.render(); + WebAppTests.flushOutput(injector); + Map moreParams = + appAttemptPageInstance.context().requestContext().moreParams(); + String tableColumnsMeta = moreParams.get("ui.dataTables.containers.init"); + Assert.assertTrue(tableColumnsMeta.indexOf("natural") != -1); + } + @Test public void testContainerPage() throws Exception { Injector injector = @@ -195,5 +242,4 @@ protected ApplicationHistoryStore createApplicationHistoryStore( return store; } }; - } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/WebPageUtils.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/WebPageUtils.java index d51c632c4d..a07baa2366 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/WebPageUtils.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/WebPageUtils.java @@ -49,7 +49,7 @@ private static String getAppsTableColumnDefs( boolean isFairSchedulerPage, boolean isResourceManager) { StringBuilder sb = new StringBuilder(); sb.append("[\n") - .append("{'sType':'string', 'aTargets': [0]") + .append("{'sType':'natural', 'aTargets': [0]") .append(", 'mRender': parseHadoopID }") .append("\n, {'sType':'numeric', 'aTargets': [6, 7]") .append(", 'mRender': renderHadoopDate }") @@ -75,7 +75,7 @@ public static String attemptsTableInit() { private static String getAttemptsTableColumnDefs() { StringBuilder sb = new StringBuilder(); - return sb.append("[\n").append("{'sType':'string', 'aTargets': [0]") + return sb.append("[\n").append("{'sType':'natural', 'aTargets': [0]") .append(", 'mRender': parseHadoopID }") .append("\n, {'sType':'numeric', 'aTargets': [1]") .append(", 'mRender': renderHadoopDate }]").toString(); @@ -91,7 +91,7 @@ public static String containersTableInit() { private static String getContainersTableColumnDefs() { StringBuilder sb = new StringBuilder(); - return sb.append("[\n").append("{'sType':'string', 'aTargets': [0]") + return sb.append("[\n").append("{'sType':'natural', 'aTargets': [0]") .append(", 'mRender': parseHadoopID }]").toString(); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/AllApplicationsPage.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/AllApplicationsPage.java index 9a227430a9..d32b271e46 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/AllApplicationsPage.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/AllApplicationsPage.java @@ -54,7 +54,14 @@ private String appsTableInit() { // Sort by id upon page load append(", aaSorting: [[0, 'asc']]"). // applicationid, applicationstate - append(", aoColumns:[null, null]} ").toString(); + append(", aoColumns:[").append(getApplicationsIdColumnDefs()) + .append(", null]} ").toString(); + } + + private String getApplicationsIdColumnDefs() { + StringBuilder sb = new StringBuilder(); + return sb.append("{'sType':'natural', 'aTargets': [0]") + .append(", 'mRender': parseHadoopID }").toString(); } @Override diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/AllContainersPage.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/AllContainersPage.java index 1bbb945d87..24b85753b1 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/AllContainersPage.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/AllContainersPage.java @@ -52,9 +52,15 @@ public class AllContainersPage extends NMView { private String containersTableInit() { return tableInit(). // containerid, containerid, log-url - append(", aoColumns:[null, null, {bSearchable:false}]} ").toString(); + append(", aoColumns:[").append(getContainersIdColumnDefs()) + .append(", null, {bSearchable:false}]} ").toString(); } + private String getContainersIdColumnDefs() { + StringBuilder sb = new StringBuilder(); + return sb.append("{'sType':'natural', 'aTargets': [0]") + .append(", 'mRender': parseHadoopID }").toString(); + } @Override protected Class content() { return AllContainersBlock.class; diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebApp.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebApp.java index 0290421706..edf3b3ff6e 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebApp.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebApp.java @@ -28,6 +28,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.concurrent.ConcurrentMap; import org.apache.hadoop.conf.Configuration; @@ -119,6 +120,10 @@ public void configure(Binder binder) { YarnApplicationState.RUNNING.toString())); rmViewInstance.render(); WebAppTests.flushOutput(injector); + Map moreParams = + rmViewInstance.context().requestContext().moreParams(); + String appsTableColumnsMeta = moreParams.get("ui.dataTables.apps.init"); + Assert.assertTrue(appsTableColumnsMeta.indexOf("natural") != -1); } @Test public void testNodesPage() {