This is an automated email from the ASF dual-hosted git repository. nitiraj pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/ambari.git
The following commit(s) were added to refs/heads/trunk by this push: new 1f6ebfe AMBARI-23817 : Visualizing the Encrypted zones and Erasure coded zones in HDFS (nitirajrathore) (#1243) 1f6ebfe is described below commit 1f6ebfedf2ba167c00c44ba2d8fdf1c6e08717b5 Author: nitirajrathore <nitiraj.rath...@gmail.com> AuthorDate: Mon May 14 12:00:43 2018 +0530 AMBARI-23817 : Visualizing the Encrypted zones and Erasure coded zones in HDFS (nitirajrathore) (#1243) --- contrib/views/ambari-views-package/pom.xml | 2 +- contrib/views/commons/pom.xml | 6 ++ contrib/views/files/pom.xml | 1 - .../main/resources/ui/app/config/files-columns.js | 20 +++++- .../main/resources/ui/app/helpers/shorten-text.js | 4 ++ .../files/src/main/resources/ui/app/models/file.js | 3 + .../ui/app/templates/components/file-row.hbs | 10 +++ contrib/views/hive-next/pom.xml | 2 - .../resources/uploads/parsers/ParseUtils.java | 4 +- contrib/views/hive20/pom.xml | 2 - .../resources/uploads/parsers/ParseUtils.java | 4 +- contrib/views/hueambarimigration/pom.xml | 4 +- contrib/views/jobs/pom.xml | 1 - contrib/views/pig/pom.xml | 21 ++++-- .../org/apache/ambari/view/pig/test/JobTest.java | 26 ++++---- .../ambari/view/pig/test/ScriptTestUnmanaged.java | 3 +- contrib/views/pom.xml | 66 ++++++++++++++++++- contrib/views/storm/pom.xml | 6 +- contrib/views/tez/pom.xml | 5 +- contrib/views/utils/pom.xml | 11 +++- .../org/apache/ambari/view/utils/hdfs/HdfsApi.java | 14 +++- .../ambari/view/utils/hdfs/DummyFileStatus.java | 76 ++++++++++++++++++++++ .../view/utils/hdfs/DummyNonHdfsFileStatus.java} | 22 ++----- .../apache/ambari/view/utils/hdfs/HdfsApiTest.java | 63 ++++++++++++++++++ 24 files changed, 317 insertions(+), 59 deletions(-) diff --git a/contrib/views/ambari-views-package/pom.xml b/contrib/views/ambari-views-package/pom.xml index 16c9985..1ed662e 100644 --- a/contrib/views/ambari-views-package/pom.xml +++ b/contrib/views/ambari-views-package/pom.xml @@ -21,7 +21,7 @@ <groupId>org.apache.ambari.contrib.views</groupId> <artifactId>ambari-views-package</artifactId> - <version>2.5.0.0.0</version> + <version>2.0.0.0-SNAPSHOT</version> <name>Ambari Views Package</name> <parent> <groupId>org.apache.ambari.contrib.views</groupId> diff --git a/contrib/views/commons/pom.xml b/contrib/views/commons/pom.xml index 5018d46..e380122 100644 --- a/contrib/views/commons/pom.xml +++ b/contrib/views/commons/pom.xml @@ -58,6 +58,12 @@ <dependency> <groupId>org.apache.hadoop</groupId> + <artifactId>hadoop-hdfs-client</artifactId> + <version>${hadoop.version}</version> + </dependency> + + <dependency> + <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>${hadoop.version}</version> <exclusions> diff --git a/contrib/views/files/pom.xml b/contrib/views/files/pom.xml index f7adbb5..acd7632 100644 --- a/contrib/views/files/pom.xml +++ b/contrib/views/files/pom.xml @@ -17,7 +17,6 @@ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> - <groupId>org.apache.ambari.contrib.views</groupId> <artifactId>files</artifactId> <version>1.0.0.0-SNAPSHOT</version> <name>Files</name> diff --git a/contrib/views/files/src/main/resources/ui/app/config/files-columns.js b/contrib/views/files/src/main/resources/ui/app/config/files-columns.js index 4dce394..d1caff7 100644 --- a/contrib/views/files/src/main/resources/ui/app/config/files-columns.js +++ b/contrib/views/files/src/main/resources/ui/app/config/files-columns.js @@ -26,7 +26,7 @@ var columnsConfig = [ isVisible: true, sortable: true, sortOrder: 0, - columnClass: 'col-md-4 col-xs-4' + columnClass: 'col-md-3 col-xs-3' }, { title: 'Size', @@ -50,7 +50,7 @@ var columnsConfig = [ isVisible: true, sortable: true, sortOrder: 0, - columnClass: 'col-md-2 col-xs-2' + columnClass: 'col-md-1 col-xs-1' }, { title: 'Group', @@ -66,7 +66,23 @@ var columnsConfig = [ isVisible: true, sortable: false, sortOrder: 0, + columnClass: 'col-md-1 col-xs-1' + }, + { + title: 'Erasure Coding', + key: 'erasureCodingPolicyName', + isVisible: true, + sortable: false, + sortOrder: 0, columnClass: 'col-md-2 col-xs-2' + }, + { + title: 'Encrypted', + key: 'isEncrypted', + isVisible: true, + sortable: false, + sortOrder: 0, + columnClass: 'col-md-1 col-xs-1' } ]; diff --git a/contrib/views/files/src/main/resources/ui/app/helpers/shorten-text.js b/contrib/views/files/src/main/resources/ui/app/helpers/shorten-text.js index c50b5ca..f95ae85 100644 --- a/contrib/views/files/src/main/resources/ui/app/helpers/shorten-text.js +++ b/contrib/views/files/src/main/resources/ui/app/helpers/shorten-text.js @@ -20,6 +20,10 @@ import Ember from 'ember'; export function shortenText(params) { let text = params[0]; + if(!text){ + return text; + } + let length = params[1]; if (text.length < length) { return text; diff --git a/contrib/views/files/src/main/resources/ui/app/models/file.js b/contrib/views/files/src/main/resources/ui/app/models/file.js index a2ed1f3..eb26c0f 100644 --- a/contrib/views/files/src/main/resources/ui/app/models/file.js +++ b/contrib/views/files/src/main/resources/ui/app/models/file.js @@ -33,6 +33,9 @@ export default DS.Model.extend({ modificationTime : DS.attr('iso-date'), blockSize : DS.attr('number'), replication : DS.attr('number'), + isEncrypted : DS.attr('boolean'), + isErasureCoded : DS.attr('boolean'), + erasureCodingPolicyName : DS.attr('string'), size : Ember.computed.alias('len'), path: function() { diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/file-row.hbs b/contrib/views/files/src/main/resources/ui/app/templates/components/file-row.hbs index 5198504..9b0ba12 100644 --- a/contrib/views/files/src/main/resources/ui/app/templates/components/file-row.hbs +++ b/contrib/views/files/src/main/resources/ui/app/templates/components/file-row.hbs @@ -43,4 +43,14 @@ <div class={{get-value-from-columns columnHeaders 'permission' 'columnClass'}}> {{show-permission-string file}} </div> + <div class={{get-value-from-columns columnHeaders 'erasureCodingPolicyName' 'columnClass'}}> + {{file.erasureCodingPolicyName}} + </div> + <div class={{get-value-from-columns columnHeaders 'isEncrypted' 'columnClass'}}> + {{#if file.isEncrypted}} + Yes + {{else}} + No + {{/if}} + </div> </div> diff --git a/contrib/views/hive-next/pom.xml b/contrib/views/hive-next/pom.xml index 9a6c65d..60ddce3 100644 --- a/contrib/views/hive-next/pom.xml +++ b/contrib/views/hive-next/pom.xml @@ -17,7 +17,6 @@ <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> - <groupId>org.apache.ambari.contrib.views</groupId> <artifactId>hive-jdbc</artifactId> <version>2.0.0.0-SNAPSHOT</version> <name>Hive Jdbc</name> @@ -87,7 +86,6 @@ <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> - <version>3.0.1</version> </dependency> <dependency> <groupId>org.slf4j</groupId> diff --git a/contrib/views/hive-next/src/main/java/org/apache/ambari/view/hive2/resources/uploads/parsers/ParseUtils.java b/contrib/views/hive-next/src/main/java/org/apache/ambari/view/hive2/resources/uploads/parsers/ParseUtils.java index cafe148..34a1b8b 100644 --- a/contrib/views/hive-next/src/main/java/org/apache/ambari/view/hive2/resources/uploads/parsers/ParseUtils.java +++ b/contrib/views/hive-next/src/main/java/org/apache/ambari/view/hive2/resources/uploads/parsers/ParseUtils.java @@ -18,7 +18,7 @@ package org.apache.ambari.view.hive2.resources.uploads.parsers; -import org.apache.directory.api.util.Strings; +import com.google.common.base.Strings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -121,7 +121,7 @@ public class ParseUtils { return true; String str = object.toString(); - if (Strings.isNotEmpty(str)) { + if (!Strings.isNullOrEmpty(str)) { str = str.trim(); if (str.matches(HIVE_DATE_FORMAT_REGEX)) { try { diff --git a/contrib/views/hive20/pom.xml b/contrib/views/hive20/pom.xml index 0da3c88..c851a40 100644 --- a/contrib/views/hive20/pom.xml +++ b/contrib/views/hive20/pom.xml @@ -17,7 +17,6 @@ <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> - <groupId>org.apache.ambari.contrib.views</groupId> <artifactId>hive20</artifactId> <version>2.0.0.0-SNAPSHOT</version> <name>Hive 2.0</name> @@ -88,7 +87,6 @@ <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> - <version>3.0.1</version> </dependency> <dependency> <groupId>org.slf4j</groupId> diff --git a/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/parsers/ParseUtils.java b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/parsers/ParseUtils.java index 27d03f2..1a22b6b 100644 --- a/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/parsers/ParseUtils.java +++ b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/parsers/ParseUtils.java @@ -18,7 +18,7 @@ package org.apache.ambari.view.hive20.resources.uploads.parsers; -import org.apache.directory.api.util.Strings; +import com.google.common.base.Strings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -121,7 +121,7 @@ public class ParseUtils { return true; String str = object.toString(); - if (Strings.isNotEmpty(str)) { + if (!Strings.isNullOrEmpty(str)) { str = str.trim(); if (str.matches(HIVE_DATE_FORMAT_REGEX)) { try { diff --git a/contrib/views/hueambarimigration/pom.xml b/contrib/views/hueambarimigration/pom.xml index ec24679..72100e0 100644 --- a/contrib/views/hueambarimigration/pom.xml +++ b/contrib/views/hueambarimigration/pom.xml @@ -19,7 +19,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>org.apache.ambari.contrib.views</groupId> <artifactId>hueambarimigration</artifactId> -<version>1.0.0.0-SNAPSHOT</version> +<version>2.0.0.0-SNAPSHOT</version> <name>hueambarimigration</name> <parent> @@ -51,7 +51,7 @@ <dependency> <groupId>org.apache.ambari</groupId> <artifactId>ambari-views</artifactId> - <version>[1.7.0.0,)</version> + <version>2.0.0.0-SNAPSHOT</version> </dependency> <dependency> <groupId>javax.servlet</groupId> diff --git a/contrib/views/jobs/pom.xml b/contrib/views/jobs/pom.xml index ea8a527..37f0cf7 100644 --- a/contrib/views/jobs/pom.xml +++ b/contrib/views/jobs/pom.xml @@ -199,7 +199,6 @@ <dependency> <groupId>org.apache.ambari</groupId> <artifactId>ambari-views</artifactId> - <version>${ambari.version}</version> </dependency> <dependency> diff --git a/contrib/views/pig/pom.xml b/contrib/views/pig/pom.xml index 1430f69..1f5e2bf 100644 --- a/contrib/views/pig/pom.xml +++ b/contrib/views/pig/pom.xml @@ -17,9 +17,8 @@ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> - <groupId>org.apache.ambari.contrib.views</groupId> <artifactId>pig</artifactId> - <version>1.0.0.0-SNAPSHOT</version> + <version>2.0.0.0-SNAPSHOT</version> <name>Pig</name> <parent> @@ -61,6 +60,12 @@ <groupId>commons-configuration</groupId> <artifactId>commons-configuration</artifactId> <version>1.6</version> + <exclusions> + <exclusion> + <groupId>commons-beanutils</groupId> + <artifactId>commons-beanutils-core</artifactId> + </exclusion> + </exclusions> </dependency> <dependency> <groupId>org.apache.ambari</groupId> @@ -75,7 +80,6 @@ <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> - <version>3.0.1</version> </dependency> <dependency> <groupId>org.slf4j</groupId> @@ -154,7 +158,16 @@ </properties> <build> <plugins> - <plugin> + <plugin> + <!--disabled parallel execution of tests for pig--> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <configuration> + <forkCount>0</forkCount> + </configuration> + + </plugin> + <plugin> <!-- Cleanup ui files --> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-clean-plugin</artifactId> diff --git a/contrib/views/pig/src/test/java/org/apache/ambari/view/pig/test/JobTest.java b/contrib/views/pig/src/test/java/org/apache/ambari/view/pig/test/JobTest.java index b46fc7e..dc1ae72 100644 --- a/contrib/views/pig/src/test/java/org/apache/ambari/view/pig/test/JobTest.java +++ b/contrib/views/pig/src/test/java/org/apache/ambari/view/pig/test/JobTest.java @@ -108,7 +108,7 @@ public class JobTest extends BasePigTest { ByteArrayOutputStream do_stream = new ByteArrayOutputStream(); - FSDataOutputStream stream = new FSDataOutputStream(do_stream); + FSDataOutputStream stream = new FSDataOutputStream(do_stream, null); expect(hdfsApi.create(anyString(), eq(true))).andReturn(stream); replay(hdfsApi); UserLocalObjects.setHdfsApi(hdfsApi, context); @@ -143,7 +143,7 @@ public class JobTest extends BasePigTest { ByteArrayOutputStream do_stream = new ByteArrayOutputStream(); - FSDataOutputStream stream = new FSDataOutputStream(do_stream); + FSDataOutputStream stream = new FSDataOutputStream(do_stream, null); expect(hdfsApi.create(anyString(), eq(true))).andReturn(stream).anyTimes(); replay(hdfsApi); UserLocalObjects.setHdfsApi(hdfsApi, context); @@ -184,7 +184,7 @@ public class JobTest extends BasePigTest { ByteArrayOutputStream do_stream = new ByteArrayOutputStream(); - FSDataOutputStream stream = new FSDataOutputStream(do_stream); + FSDataOutputStream stream = new FSDataOutputStream(do_stream, null); expect(hdfsApi.create(anyString(), eq(true))).andReturn(stream); replay(hdfsApi); UserLocalObjects.setHdfsApi(hdfsApi, context); @@ -210,7 +210,7 @@ public class JobTest extends BasePigTest { ByteArrayOutputStream do_stream = new ByteArrayOutputStream(); - FSDataOutputStream stream = new FSDataOutputStream(do_stream); + FSDataOutputStream stream = new FSDataOutputStream(do_stream, null); expect(hdfsApi.create(anyString(), eq(true))).andReturn(stream); replay(hdfsApi); UserLocalObjects.setHdfsApi(hdfsApi, context); @@ -245,7 +245,7 @@ public class JobTest extends BasePigTest { ByteArrayOutputStream do_stream = new ByteArrayOutputStream(); - FSDataOutputStream stream = new FSDataOutputStream(do_stream); + FSDataOutputStream stream = new FSDataOutputStream(do_stream, null); expect(hdfsApi.create(anyString(), eq(true))).andReturn(stream); replay(hdfsApi); UserLocalObjects.setHdfsApi(hdfsApi, context); @@ -267,8 +267,8 @@ public class JobTest extends BasePigTest { ByteArrayOutputStream baScriptStream = new ByteArrayOutputStream(); ByteArrayOutputStream baTempletonArgsStream = new ByteArrayOutputStream(); - FSDataOutputStream scriptStream = new FSDataOutputStream(baScriptStream); - FSDataOutputStream templetonArgsStream = new FSDataOutputStream(baTempletonArgsStream); + FSDataOutputStream scriptStream = new FSDataOutputStream(baScriptStream, null); + FSDataOutputStream templetonArgsStream = new FSDataOutputStream(baTempletonArgsStream, null); expect(hdfsApi.create(endsWith("script.pig"), eq(true))).andReturn(scriptStream); expect(hdfsApi.create(endsWith("params"), eq(true))).andReturn(templetonArgsStream); replay(hdfsApi); @@ -294,7 +294,7 @@ public class JobTest extends BasePigTest { ByteArrayOutputStream do_stream = new ByteArrayOutputStream(); - FSDataOutputStream stream = new FSDataOutputStream(do_stream); + FSDataOutputStream stream = new FSDataOutputStream(do_stream, null); expect(hdfsApi.create(anyString(), eq(true))).andReturn(stream); replay(hdfsApi); UserLocalObjects.setHdfsApi(hdfsApi, context); @@ -317,7 +317,7 @@ public class JobTest extends BasePigTest { ByteArrayOutputStream do_stream = new ByteArrayOutputStream(); - FSDataOutputStream stream = new FSDataOutputStream(do_stream); + FSDataOutputStream stream = new FSDataOutputStream(do_stream, null); expect(hdfsApi.create(anyString(), eq(true))).andReturn(stream); replay(hdfsApi); UserLocalObjects.setHdfsApi(hdfsApi, context); @@ -339,7 +339,7 @@ public class JobTest extends BasePigTest { ByteArrayOutputStream do_stream = new ByteArrayOutputStream(); - FSDataOutputStream stream = new FSDataOutputStream(do_stream); + FSDataOutputStream stream = new FSDataOutputStream(do_stream, null); expect(hdfsApi.create(anyString(), eq(true))).andReturn(stream); replay(hdfsApi); UserLocalObjects.setHdfsApi(hdfsApi, context); @@ -362,7 +362,7 @@ public class JobTest extends BasePigTest { ByteArrayOutputStream do_stream = new ByteArrayOutputStream(); - FSDataOutputStream stream = new FSDataOutputStream(do_stream); + FSDataOutputStream stream = new FSDataOutputStream(do_stream, null); expect(hdfsApi.create(anyString(), eq(true))).andReturn(stream); replay(hdfsApi); UserLocalObjects.setHdfsApi(hdfsApi, context); @@ -397,7 +397,7 @@ public class JobTest extends BasePigTest { ByteArrayOutputStream do_stream = new ByteArrayOutputStream(); - FSDataOutputStream stream = new FSDataOutputStream(do_stream); + FSDataOutputStream stream = new FSDataOutputStream(do_stream, null); expect(hdfsApi.create(anyString(), eq(true))).andReturn(stream); replay(hdfsApi); UserLocalObjects.setHdfsApi(hdfsApi, context); @@ -432,7 +432,7 @@ public class JobTest extends BasePigTest { ByteArrayOutputStream do_stream = new ByteArrayOutputStream(); - FSDataOutputStream stream = new FSDataOutputStream(do_stream); + FSDataOutputStream stream = new FSDataOutputStream(do_stream, null); expect(hdfsApi.create(anyString(), eq(true))).andReturn(stream); replay(hdfsApi); UserLocalObjects.setHdfsApi(hdfsApi, context); diff --git a/contrib/views/pig/src/test/java/org/apache/ambari/view/pig/test/ScriptTestUnmanaged.java b/contrib/views/pig/src/test/java/org/apache/ambari/view/pig/test/ScriptTestUnmanaged.java index 23f9fba..9cfd60c 100644 --- a/contrib/views/pig/src/test/java/org/apache/ambari/view/pig/test/ScriptTestUnmanaged.java +++ b/contrib/views/pig/src/test/java/org/apache/ambari/view/pig/test/ScriptTestUnmanaged.java @@ -22,6 +22,7 @@ import org.apache.ambari.view.ViewContext; import org.apache.ambari.view.ViewResourceHandler; import org.apache.ambari.view.pig.BasePigTest; import org.apache.ambari.view.pig.resources.scripts.ScriptService; +import org.apache.ambari.view.pig.utils.ServiceFormattedException; import org.apache.ambari.view.utils.UserLocal; import org.apache.ambari.view.utils.hdfs.HdfsApi; import org.apache.ambari.view.utils.hdfs.HdfsApiException; @@ -76,7 +77,7 @@ public class ScriptTestUnmanaged extends BasePigTest { replay(handler, context); scriptService = getService(ScriptService.class, handler, context); - thrown.expect(HdfsApiException.class); + thrown.expect(ServiceFormattedException.class); doCreateScript("Test", null); } } diff --git a/contrib/views/pom.xml b/contrib/views/pom.xml index ef8ed27..3d4efbc 100644 --- a/contrib/views/pom.xml +++ b/contrib/views/pom.xml @@ -31,7 +31,8 @@ <properties> <ambari.version>2.0.0.0-SNAPSHOT</ambari.version> <ambari.dir>${project.parent.parent.basedir}</ambari.dir> - <hadoop.version>2.7.3</hadoop.version> + <jetty.version>9.3.19.v20170502</jetty.version> + <hadoop.version>3.0.0.3.0.0.0-1301</hadoop.version> <views.jars.dir>views-jars</views.jars.dir> <views.jars.dir.rel>../target/${views.jars.dir}</views.jars.dir.rel> </properties> @@ -165,6 +166,69 @@ </profiles> <dependencyManagement> <dependencies> + <!--We had to include the jetty's and other's version specific to the one used in hadoop and override the ambari managed version because the tests were failing. --> + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>javax.servlet-api</artifactId> + <version>3.1.0</version> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-server</artifactId> + <version>${jetty.version}</version> + <scope>test</scope> + <optional>true</optional> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-security</artifactId> + <version>${jetty.version}</version> + <scope>test</scope> + <optional>true</optional> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-servlet</artifactId> + <version>${jetty.version}</version> + <scope>test</scope> + <optional>true</optional> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-servlets</artifactId> + <version>${jetty.version}</version> + <scope>test</scope> + <optional>true</optional> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-webapp</artifactId> + <version>${jetty.version}</version> + <scope>test</scope> + <optional>true</optional> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-util-ajax</artifactId> + <version>${jetty.version}</version> + <scope>test</scope> + <optional>true</optional> + </dependency> + <dependency> + <groupId>org.eclipse.jetty.websocket</groupId> + <artifactId>websocket-servlet</artifactId> + <version>${jetty.version}</version> + <scope>test</scope> + <optional>true</optional> + </dependency> + <dependency> + <groupId>org.eclipse.jetty.websocket</groupId> + <artifactId>websocket-server</artifactId> + <version>${jetty.version}</version> + <scope>test</scope> + <optional>true</optional> + </dependency> + <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> diff --git a/contrib/views/storm/pom.xml b/contrib/views/storm/pom.xml index 4a1ff68..6f1ae10 100644 --- a/contrib/views/storm/pom.xml +++ b/contrib/views/storm/pom.xml @@ -26,8 +26,7 @@ <ui.directory>${basedir}/src/main/resources/ui</ui.directory> </properties> <modelVersion>4.0.0</modelVersion> - <groupId>org.apache.ambari.contrib.views</groupId> - <artifactId>storm-view</artifactId> + <artifactId>storm-view</artifactId> <name>Storm_Monitoring</name> <version>0.1.0.0</version> <description>Storm Monitoring View</description> @@ -180,13 +179,12 @@ <dependency> <groupId>org.apache.ambari</groupId> <artifactId>ambari-views</artifactId> - <version>${ambari.version}</version> + <version>2.0.0.0-SNAPSHOT</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> - <version>3.0.1</version> <scope>provided</scope> </dependency> diff --git a/contrib/views/tez/pom.xml b/contrib/views/tez/pom.xml index fa1a773..0c058a0 100644 --- a/contrib/views/tez/pom.xml +++ b/contrib/views/tez/pom.xml @@ -27,8 +27,7 @@ <tez.version>0.7.0</tez.version> </properties> <modelVersion>4.0.0</modelVersion> - <groupId>org.apache.ambari.contrib.views</groupId> - <artifactId>tez-view</artifactId> + <artifactId>tez-view</artifactId> <name>Tez</name> <version>${tez.view.version}</version> <description>Tez View</description> @@ -222,7 +221,7 @@ <dependency> <groupId>org.apache.ambari</groupId> <artifactId>ambari-views</artifactId> - <version>${ambari.version}</version> + <version>2.0.0.0-SNAPSHOT</version> </dependency> <dependency> diff --git a/contrib/views/utils/pom.xml b/contrib/views/utils/pom.xml index 82b87c8..63eac8c 100644 --- a/contrib/views/utils/pom.xml +++ b/contrib/views/utils/pom.xml @@ -17,7 +17,6 @@ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> - <groupId>org.apache.ambari.contrib.views</groupId> <artifactId>ambari-views-utils</artifactId> <version>2.0.0.0-SNAPSHOT</version> <name>Ambari View Utils</name> @@ -76,6 +75,11 @@ </dependency> <dependency> <groupId>org.apache.hadoop</groupId> + <artifactId>hadoop-hdfs-client</artifactId> + <version>${hadoop.version}</version> + </dependency> + <dependency> + <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-yarn-common</artifactId> <version>${hadoop.version}</version> </dependency> @@ -117,7 +121,6 @@ <version>${hadoop.version}</version> <scope>test</scope> </dependency> - <dependency> <groupId>org.glassfish.jersey.test-framework</groupId> <artifactId>jersey-test-framework-core</artifactId> @@ -171,6 +174,10 @@ <artifactId>commons-validator</artifactId> <version>1.4.0</version> </dependency> + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-core</artifactId> + </dependency> </dependencies> <properties> diff --git a/contrib/views/utils/src/main/java/org/apache/ambari/view/utils/hdfs/HdfsApi.java b/contrib/views/utils/src/main/java/org/apache/ambari/view/utils/hdfs/HdfsApi.java index 812cd54..1f8b584 100644 --- a/contrib/views/utils/src/main/java/org/apache/ambari/view/utils/hdfs/HdfsApi.java +++ b/contrib/views/utils/src/main/java/org/apache/ambari/view/utils/hdfs/HdfsApi.java @@ -31,6 +31,7 @@ import org.apache.hadoop.fs.Trash; import org.apache.hadoop.fs.TrashPolicy; import org.apache.hadoop.fs.permission.FsAction; import org.apache.hadoop.fs.permission.FsPermission; +import org.apache.hadoop.hdfs.protocol.HdfsFileStatus; import org.apache.hadoop.security.UserGroupInformation; import org.json.simple.JSONArray; import org.slf4j.Logger; @@ -52,6 +53,9 @@ public class HdfsApi { private final static Logger LOG = LoggerFactory.getLogger(HdfsApi.class); + public static String KeyIsErasureCoded = "isErasureCoded"; + public static String KeyIsEncrypted = "isEncrypted"; + public static String KeyErasureCodingPolicyName = "erasureCodingPolicyName"; private final Configuration conf; private Map<String, String> authParams; @@ -554,7 +558,6 @@ public class HdfsApi { Map<String, Object> json = new LinkedHashMap<String, Object>(); json.put("path", Path.getPathWithoutSchemeAndAuthority(status.getPath()) .toString()); - json.put("replication", status.getReplication()); json.put("isDirectory", status.isDirectory()); json.put("len", status.getLen()); json.put("owner", status.getOwner()); @@ -567,6 +570,15 @@ public class HdfsApi { json.put("readAccess", checkAccessPermissions(status, FsAction.READ, ugi)); json.put("writeAccess", checkAccessPermissions(status, FsAction.WRITE, ugi)); json.put("executeAccess", checkAccessPermissions(status, FsAction.EXECUTE, ugi)); + json.put(KeyIsErasureCoded, status.isErasureCoded()); + json.put(KeyIsEncrypted, status.isEncrypted()); + + if( status instanceof HdfsFileStatus){ + HdfsFileStatus hdfsFileStatus = (HdfsFileStatus) status; + if(null != hdfsFileStatus.getErasureCodingPolicy()) { + json.put(KeyErasureCodingPolicyName, hdfsFileStatus.getErasureCodingPolicy().getName()); + } + } return json; } diff --git a/contrib/views/utils/src/test/java/org/apache/ambari/view/utils/hdfs/DummyFileStatus.java b/contrib/views/utils/src/test/java/org/apache/ambari/view/utils/hdfs/DummyFileStatus.java new file mode 100644 index 0000000..eb419d6 --- /dev/null +++ b/contrib/views/utils/src/test/java/org/apache/ambari/view/utils/hdfs/DummyFileStatus.java @@ -0,0 +1,76 @@ +/** + * 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 + * <p/> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p/> + * 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.ambari.view.utils.hdfs; + +import org.apache.hadoop.fs.FileEncryptionInfo; +import org.apache.hadoop.fs.FileStatus; +import org.apache.hadoop.fs.permission.FsPermission; +import org.apache.hadoop.hdfs.protocol.ErasureCodingPolicy; +import org.apache.hadoop.hdfs.protocol.HdfsFileStatus; + +public abstract class DummyFileStatus extends FileStatus implements HdfsFileStatus { + @Override + public long getFileId() { + return 0; + } + + @Override + public FileEncryptionInfo getFileEncryptionInfo() { + return null; + } + + @Override + public byte[] getLocalNameInBytes() { + return new byte[0]; + } + + @Override + public byte[] getSymlinkInBytes() { + return new byte[0]; + } + + @Override + public int getChildrenNum() { + return 0; + } + + @Override + public ErasureCodingPolicy getErasureCodingPolicy() { + return null; + } + + @Override + public byte getStoragePolicy() { + return 0; + } + + @Override + public void setPermission(FsPermission fsPermission) { + + } + + @Override + public void setOwner(String s) { + + } + + @Override + public void setGroup(String s) { + + } +} diff --git a/contrib/views/files/src/main/resources/ui/app/helpers/shorten-text.js b/contrib/views/utils/src/test/java/org/apache/ambari/view/utils/hdfs/DummyNonHdfsFileStatus.java similarity index 69% copy from contrib/views/files/src/main/resources/ui/app/helpers/shorten-text.js copy to contrib/views/utils/src/test/java/org/apache/ambari/view/utils/hdfs/DummyNonHdfsFileStatus.java index c50b5ca..1989c47 100644 --- a/contrib/views/files/src/main/resources/ui/app/helpers/shorten-text.js +++ b/contrib/views/utils/src/test/java/org/apache/ambari/view/utils/hdfs/DummyNonHdfsFileStatus.java @@ -6,9 +6,9 @@ * 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 - * + * <p/> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p/> * 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. @@ -16,17 +16,9 @@ * limitations under the License. */ -import Ember from 'ember'; +package org.apache.ambari.view.utils.hdfs; -export function shortenText(params) { - let text = params[0]; - let length = params[1]; - if (text.length < length) { - return text; - } else { - return text.substring(0, length - 3) + '...'; - } +import org.apache.hadoop.fs.FileStatus; -} - -export default Ember.Helper.helper(shortenText); +public abstract class DummyNonHdfsFileStatus extends FileStatus { +} \ No newline at end of file diff --git a/contrib/views/utils/src/test/java/org/apache/ambari/view/utils/hdfs/HdfsApiTest.java b/contrib/views/utils/src/test/java/org/apache/ambari/view/utils/hdfs/HdfsApiTest.java index e7a6752..928d596 100644 --- a/contrib/views/utils/src/test/java/org/apache/ambari/view/utils/hdfs/HdfsApiTest.java +++ b/contrib/views/utils/src/test/java/org/apache/ambari/view/utils/hdfs/HdfsApiTest.java @@ -23,7 +23,10 @@ import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FileUtil; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.fs.permission.FsPermission; import org.apache.hadoop.hdfs.MiniDFSCluster; +import org.apache.hadoop.hdfs.protocol.ErasureCodingPolicy; +import org.apache.hadoop.io.erasurecode.ECSchema; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -32,6 +35,11 @@ import org.junit.Test; import java.io.File; import java.io.IOException; import java.util.Arrays; +import java.util.Map; + +import static org.apache.ambari.view.utils.hdfs.HdfsApi.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class HdfsApiTest { private FileSystem fs; @@ -62,6 +70,61 @@ public class HdfsApiTest { } @Test + public void testWith_EC_And_Encryption(){ +// Have to mock DummyFileStatus, because we cannot rely on internal class of hdfs + DummyFileStatus fileStatus = mock(DummyFileStatus.class); + FsPermission fsPermission = new FsPermission((short)0777); + String ecPolicyName = "Some-EC-Policy"; + ECSchema ecSchema = new ECSchema("someSchema", 1, 1); + ErasureCodingPolicy erasureCodingPolicy = new ErasureCodingPolicy(ecPolicyName, ecSchema, 1024, (byte)0); + when(fileStatus.getPermission()).thenReturn(fsPermission); + when(fileStatus.getPath()).thenReturn(new Path("/test/path")); + when(fileStatus.getErasureCodingPolicy()).thenReturn(erasureCodingPolicy); + when(fileStatus.isErasureCoded()).thenReturn(true); + when(fileStatus.isEncrypted()).thenReturn(true); + Map<String, Object> json = hdfsApi.fileStatusToJSON(fileStatus); + + Assert.assertEquals(Boolean.TRUE, json.get(KeyIsErasureCoded)); + Assert.assertEquals(Boolean.TRUE, json.get(KeyIsEncrypted)); + Assert.assertEquals(json.get(KeyErasureCodingPolicyName), ecPolicyName); + } + + @Test + public void testWithout_EC_And_Encryption(){ +// Have to mock DummyFileStatus, because we cannot rely on internal class of hdfs + FsPermission fsPermission = new FsPermission((short)0777); + + DummyFileStatus fileStatus = mock(DummyFileStatus.class); + when(fileStatus.getPermission()).thenReturn(fsPermission); + + when(fileStatus.getPath()).thenReturn(new Path("/test/path")); + when(fileStatus.getErasureCodingPolicy()).thenReturn(null); + when(fileStatus.isErasureCoded()).thenReturn(false); + when(fileStatus.isEncrypted()).thenReturn(false); + Map<String, Object> json = hdfsApi.fileStatusToJSON(fileStatus); + + Assert.assertEquals(Boolean.FALSE, json.get(KeyIsErasureCoded)); + Assert.assertEquals(Boolean.FALSE, json.get(KeyIsEncrypted)); + Assert.assertNull(json.get(KeyErasureCodingPolicyName)); + } + + @Test + public void testNonHdfsFileStatus(){ +// Have to mock DummyNonHdfsFileStatus, because we cannot rely on internal class of hdfs + DummyNonHdfsFileStatus fileStatus = mock(DummyNonHdfsFileStatus.class); + FsPermission fsPermission = new FsPermission((short)0777); + when(fileStatus.getPermission()).thenReturn(fsPermission); + when(fileStatus.getPath()).thenReturn(new Path("/test/path")); + + when(fileStatus.isErasureCoded()).thenReturn(false); + when(fileStatus.isEncrypted()).thenReturn(false); + Map<String, Object> json = hdfsApi.fileStatusToJSON(fileStatus); + + Assert.assertEquals(Boolean.FALSE, json.get(KeyIsErasureCoded)); + Assert.assertEquals( Boolean.FALSE,json.get(KeyIsEncrypted)); + Assert.assertNull(json.get(KeyErasureCodingPolicyName)); + } + @Test public void filterAndTruncateDirStatus() throws Exception { { // null fileStatuses -- To stop receiving notification emails like this one, please contact niti...@apache.org.