AMBARI-20529. Make home directory check as optional in wfmanager view (Madhan Mohan Reddy via pallavkul)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/52bc319d Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/52bc319d Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/52bc319d Branch: refs/heads/branch-2.5 Commit: 52bc319d368cb337078161e7b2fdc4961c253415 Parents: c8e937a Author: pallavkul <pallav....@gmail.com> Authored: Fri Mar 24 14:05:06 2017 +0530 Committer: Nitiraj Singh Rathore <nitiraj.rath...@gmail.com> Committed: Tue Apr 4 13:03:12 2017 +0530 ---------------------------------------------------------------------- .../apache/oozie/ambari/view/HDFSFileUtils.java | 41 +++++++++++- .../ambari/view/OozieProxyImpersonator.java | 16 +++-- .../main/resources/ui/app/controllers/index.js | 5 +- .../src/main/resources/ui/app/routes/index.js | 66 ++++++++++++++++---- 4 files changed, 107 insertions(+), 21 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/52bc319d/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/HDFSFileUtils.java ---------------------------------------------------------------------- diff --git a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/HDFSFileUtils.java b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/HDFSFileUtils.java index d06eb07..09c63e3 100644 --- a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/HDFSFileUtils.java +++ b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/HDFSFileUtils.java @@ -21,8 +21,11 @@ import com.google.common.base.Optional; import org.apache.ambari.view.ViewContext; import org.apache.ambari.view.commons.hdfs.UserService; import org.apache.ambari.view.commons.hdfs.ViewPropertyHelper; +import org.apache.ambari.view.utils.hdfs.ConfigurationBuilder; import org.apache.ambari.view.utils.hdfs.HdfsApi; +import org.apache.ambari.view.utils.hdfs.HdfsApiException; import org.apache.ambari.view.utils.hdfs.HdfsUtil; +import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileStatus; @@ -31,12 +34,18 @@ import org.slf4j.LoggerFactory; import java.io.FileNotFoundException; import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; import java.util.HashMap; import java.util.Map; +import java.util.Arrays; +import java.util.List; +import java.util.LinkedList; public class HDFSFileUtils { public static final String VIEW_CONF_KEYVALUES = "view.conf.keyvalues"; - + private static final String DEFAULT_FS = "fs.defaultFS"; + private static final String AMBARI_SKIP_HOME_DIRECTORY_CHECK_PROTOCOL_LIST = "views.skip.home-directory-check.file-system.list"; private final static Logger LOGGER = LoggerFactory .getLogger(HDFSFileUtils.class); private ViewContext viewContext; @@ -108,6 +117,36 @@ public class HDFSFileUtils { } } + public Boolean shouldCheckForHomeDir(){ + Optional<Map<String, String>> viewConfigs = ViewPropertyHelper.getViewConfigs(viewContext, VIEW_CONF_KEYVALUES); + ConfigurationBuilder configBuilder; + if(viewConfigs.isPresent()) { + configBuilder = new ConfigurationBuilder(this.viewContext, viewConfigs.get()); + }else{ + configBuilder = new ConfigurationBuilder(this.viewContext); + } + Configuration configurations = null; + try { + configurations = configBuilder.buildConfig(); + } catch (HdfsApiException e) { + throw new RuntimeException(e); + } + String defaultFS = configurations.get(DEFAULT_FS); + try { + URI fsUri = new URI(defaultFS); + String protocol = fsUri.getScheme(); + String ambariSkipCheckValues = viewContext.getAmbariProperty(AMBARI_SKIP_HOME_DIRECTORY_CHECK_PROTOCOL_LIST); + List<String> protocolSkipList = (ambariSkipCheckValues == null? new LinkedList<String>() : Arrays.asList(ambariSkipCheckValues.split(","))); + if(null != protocol && protocolSkipList.contains(protocol)){ + return Boolean.FALSE; + } + } catch (URISyntaxException e) { + LOGGER.error("Error occurred while parsing the defaultFS URI.", e); + return Boolean.TRUE; + } + return Boolean.TRUE; + } + public FileStatus getFileStatus(String filePath) { try { return getHdfsgetApi().getFileStatus(filePath); http://git-wip-us.apache.org/repos/asf/ambari/blob/52bc319d/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/OozieProxyImpersonator.java ---------------------------------------------------------------------- diff --git a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/OozieProxyImpersonator.java b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/OozieProxyImpersonator.java index d82f928..8d2b5a5 100644 --- a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/OozieProxyImpersonator.java +++ b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/OozieProxyImpersonator.java @@ -160,11 +160,17 @@ public class OozieProxyImpersonator { @GET @Path("/getWorkflowManagerConfigs") public Response getWorkflowConfigs() { - HashMap<String, String> workflowConfigs = new HashMap<String, String>(); - workflowConfigs.put("nameNode", viewContext.getProperties().get("webhdfs.url")); - workflowConfigs.put("resourceManager", viewContext.getProperties().get("yarn.resourcemanager.address")); - workflowConfigs.put("userName", viewContext.getUsername()); - return Response.ok(workflowConfigs).build(); + try { + HashMap<String, String> workflowConfigs = new HashMap<String, String>(); + workflowConfigs.put("nameNode", viewContext.getProperties().get("webhdfs.url")); + workflowConfigs.put("resourceManager", viewContext.getProperties().get("yarn.resourcemanager.address")); + workflowConfigs.put("userName", viewContext.getUsername()); + workflowConfigs.put("checkHomeDir",hdfsFileUtils.shouldCheckForHomeDir().toString()); + return Response.ok(workflowConfigs).build(); + } catch (Exception e) { + LOGGER.error(e.getMessage(), e); + throw new WfmWebException(e); + } } @POST http://git-wip-us.apache.org/repos/asf/ambari/blob/52bc319d/contrib/views/wfmanager/src/main/resources/ui/app/controllers/index.js ---------------------------------------------------------------------- diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/controllers/index.js b/contrib/views/wfmanager/src/main/resources/ui/app/controllers/index.js index f4d93ea..25fdb6d 100644 --- a/contrib/views/wfmanager/src/main/resources/ui/app/controllers/index.js +++ b/contrib/views/wfmanager/src/main/resources/ui/app/controllers/index.js @@ -23,14 +23,13 @@ export default Ember.Controller.extend({ issues : Ember.A([]), serviceChecks : Ember.A([ {'name':'oozie', 'checkCompleted':false, isAvailable : true, 'displayName' : 'Oozie Test', 'errorMessage' : 'Oozie service check failed'}, - {'name':'hdfs', 'checkCompleted':false, isAvailable : true, 'displayName' : 'HDFS Test', 'errorMessage' : 'HDFS service check failed'}, - {'name':'homeDir', 'checkCompleted':false, isAvailable : true, 'displayName' : 'User Home Directory Test', 'errorMessage' : 'User home directory not found'} + {'name':'hdfs', 'checkCompleted':false, isAvailable : true, 'displayName' : 'HDFS Test', 'errorMessage' : 'HDFS service check failed'} ]), width : Ember.computed('serviceChecks.@each.checkCompleted','serviceChecks.@each.isAvailable', function(){ let width = 10; this.get('serviceChecks').forEach((check)=>{ if(check.checkCompleted && check.isAvailable){ - width += 30; + width += (90/this.get('serviceChecks').length); } }); return Ember.String.htmlSafe(`${width}%`); http://git-wip-us.apache.org/repos/asf/ambari/blob/52bc319d/contrib/views/wfmanager/src/main/resources/ui/app/routes/index.js ---------------------------------------------------------------------- diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/routes/index.js b/contrib/views/wfmanager/src/main/resources/ui/app/routes/index.js index 316ec0e..6d94dfe 100644 --- a/contrib/views/wfmanager/src/main/resources/ui/app/routes/index.js +++ b/contrib/views/wfmanager/src/main/resources/ui/app/routes/index.js @@ -19,23 +19,45 @@ import Ember from 'ember'; export default Ember.Route.extend({ afterModel(){ + let workflowManagerConfigsPromise = this.getWorkflowManagerConfigs(); + workflowManagerConfigsPromise.then(function(data){ + this.invokeServiceChecksPromises(JSON.parse(data)); + }.bind(this)).catch(function(errors){ + this.controllerFor('index').set('errors', errors); + }.bind(this)); + }, + invokeServiceChecksPromises(workflowManagerConfigs) { let ooziePromise = this.checkOozie(); let hdfsPromise = this.checkHdfs(); - let homeDirPromise = this.checkUserHome(); - let serviceChecks = this.controllerFor('index').get('serviceChecks'); this.controllerFor('index').get('issues').clear(); + let serviceChecks = this.controllerFor('index').get('serviceChecks'); this.processServiceCheckPromise(ooziePromise, serviceChecks.findBy('name', 'oozie')); this.processServiceCheckPromise(hdfsPromise, serviceChecks.findBy('name', 'hdfs')); - this.processServiceCheckPromise(homeDirPromise, serviceChecks.findBy('name', 'homeDir')); - Ember.RSVP.Promise.all([ooziePromise, hdfsPromise, homeDirPromise]).then(()=>{ - this.controllerFor('index').set('serviceChecksComplete', true); - Ember.run.later(()=>{ - this.transitionTo('design'); - }, 2000); - }).catch((errors)=>{ - this.controllerFor('index').set('serviceChecksComplete', true); - this.controllerFor('index').set('errors', errors); - }); + + if (workflowManagerConfigs.checkHomeDir === 'true') { + serviceChecks.pushObject({'name':'homeDir', 'checkCompleted':false, isAvailable : true, 'displayName' : 'User Home Directory Test', 'errorMessage' : 'User home directory not found'}) + let homeDirPromise = this.checkUserHome(); + this.processServiceCheckPromise(homeDirPromise, serviceChecks.findBy('name', 'homeDir')); + Ember.RSVP.Promise.all([ooziePromise, hdfsPromise, homeDirPromise]).then(()=>{ + this.controllerFor('index').set('serviceChecksComplete', true); + Ember.run.later(()=>{ + this.transitionTo('design'); + }, 2000); + }).catch((errors)=>{ + this.controllerFor('index').set('serviceChecksComplete', true); + this.controllerFor('index').set('errors', errors); + }); + } else { + Ember.RSVP.Promise.all([ooziePromise, hdfsPromise]).then(()=>{ + this.controllerFor('index').set('serviceChecksComplete', true); + Ember.run.later(()=>{ + this.transitionTo('design'); + }, 2000); + }).catch((errors)=>{ + this.controllerFor('index').set('serviceChecksComplete', true); + this.controllerFor('index').set('errors', errors); + }); + } }, processServiceCheckPromise(promise, serviceCheck){ promise.then(()=>{ @@ -109,6 +131,26 @@ export default Ember.Route.extend({ }); }); }, + getWorkflowManagerConfigs(){ + return new Ember.RSVP.Promise((resolve, reject) => { + var url = Ember.ENV.API_URL + "/getWorkflowManagerConfigs"; + Ember.$.ajax({ + url: url, + method: "GET", + dataType: "text", + contentType: "text/plain;charset=utf-8", + beforeSend: function(request) { + request.setRequestHeader("X-Requested-By", "workflow-designer"); + }, + success : function(response){ + resolve(response); + }, + error : function(response){ + reject(response); + } + }); + }); + }, actions : { showDetails (check){ Ember.set(check, 'showingDetails', !check.showingDetails);