You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by gn...@apache.org on 2017/02/23 13:50:12 UTC

ambari git commit: Revert "AMBARI-20050. Issue while importing workflow with insufficient permissions.(Madhan Mohan Reddy via gauravn7)"

Repository: ambari
Updated Branches:
  refs/heads/branch-2.5 ab5749a99 -> 523247aaf


Revert "AMBARI-20050. Issue while importing workflow with insufficient permissions.(Madhan Mohan Reddy via gauravn7)"

This reverts commit ab5749a99e02643dd0808f6baf0c6c3c91e88fa9.


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/523247aa
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/523247aa
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/523247aa

Branch: refs/heads/branch-2.5
Commit: 523247aaf24b9b766927e97e35cb2f9e5e790fbf
Parents: ab5749a
Author: Gaurav Nagar <gr...@gmail.com>
Authored: Thu Feb 23 19:19:34 2017 +0530
Committer: Gaurav Nagar <gr...@gmail.com>
Committed: Thu Feb 23 19:19:34 2017 +0530

----------------------------------------------------------------------
 .../apache/oozie/ambari/view/OozieDelegate.java |  12 +-
 .../ambari/view/OozieProxyImpersonator.java     | 381 ++++++++++++-------
 .../oozie/ambari/view/assets/AssetResource.java |  93 ++---
 .../WorkflowsManagerResource.java               |  36 +-
 .../ui/app/components/bundle-config.js          |   8 +-
 .../resources/ui/app/components/coord-config.js |   6 +-
 .../ui/app/components/designer-errors.js        |  49 ---
 .../ui/app/components/flow-designer.js          |  69 +++-
 .../src/main/resources/ui/app/styles/app.less   |  13 +-
 .../app/templates/components/bundle-config.hbs  |   4 +-
 .../app/templates/components/coord-config.hbs   |   2 +-
 .../templates/components/designer-errors.hbs    |  17 -
 .../app/templates/components/flow-designer.hbs  |  18 +-
 13 files changed, 378 insertions(+), 330 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/523247aa/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/OozieDelegate.java
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/OozieDelegate.java b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/OozieDelegate.java
index 6f3c4d2..55c4312 100644
--- a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/OozieDelegate.java
+++ b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/OozieDelegate.java
@@ -32,8 +32,6 @@ import javax.ws.rs.core.Response;
 
 import org.apache.ambari.view.ViewContext;
 import org.apache.commons.io.IOUtils;
-import org.apache.oozie.ambari.view.exception.ErrorCode;
-import org.apache.oozie.ambari.view.exception.WfmException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -92,16 +90,10 @@ public class OozieDelegate {
 
     LOGGER.info("Resp from oozie status entity=="
       + serviceResponse.getEntity());
-    String oozieResp=null;
     if (serviceResponse.getEntity() instanceof String) {
-      oozieResp= (String) serviceResponse.getEntity();
+      return (String) serviceResponse.getEntity();
     } else {
-      oozieResp= serviceResponse.getEntity().toString();
-    }
-    if (oozieResp != null && oozieResp.trim().startsWith("{")) {
-      return  oozieResp;
-    }else{
-      throw new WfmException(oozieResp,ErrorCode.OOZIE_SUBMIT_ERROR);
+      return "success";
     }
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/523247aa/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 c4e5bbd..6603a9c 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
@@ -49,10 +49,9 @@ import javax.ws.rs.core.UriInfo;
 import org.apache.ambari.view.ViewContext;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.hadoop.security.AccessControlException;
 import org.apache.oozie.ambari.view.assets.AssetResource;
-import org.apache.oozie.ambari.view.exception.ErrorCode;
-import org.apache.oozie.ambari.view.exception.WfmException;
-import org.apache.oozie.ambari.view.exception.WfmWebException;
 import org.apache.oozie.ambari.view.workflowmanager.WorkflowManagerService;
 import org.apache.oozie.ambari.view.workflowmanager.WorkflowsManagerResource;
 import org.slf4j.Logger;
@@ -84,7 +83,30 @@ public class OozieProxyImpersonator {
   private final OozieUtils oozieUtils = new OozieUtils();
   private final AssetResource assetResource;
 
+  private enum ErrorCodes {
+    OOZIE_SUBMIT_ERROR("error.oozie.submit", "Oozie Submit error"), OOZIE_IO_ERROR(
+      "error.oozie.io", "Oozie I/O error"), FILE_ACCESS_ACL_ERROR(
+      "error.file.access.control",
+      "Access Error to file due to access control"), FILE_ACCESS_UNKNOWN_ERROR(
+      "error.file.access", "Error accessing file"), WORKFLOW_PATH_EXISTS(
+      "error.workflow.path.exists", "Workflow Path exists"), WORKFLOW_XML_DOES_NOT_EXIST(
+      "error.workflow.xml.not.exists", "Workflow Xml does not exist");
+    private String errorCode;
+    private String description;
+
+    ErrorCodes(String errorCode, String description) {
+      this.errorCode = errorCode;
+      this.description = description;
+    }
+
+    public String getErrorCode() {
+      return errorCode;
+    }
 
+    public String getDescription() {
+      return description;
+    }
+  }
   private static enum WorkflowFormat{
     XML("xml"),
     DRAFT("draft");
@@ -117,23 +139,15 @@ public class OozieProxyImpersonator {
   @GET
   @Path("hdfsCheck")
   public Response hdfsCheck(){
-    try {
-      hdfsFileUtils.hdfsCheck();
-      return Response.ok().build();
-    }catch (Exception e){
-      throw new WfmWebException(e);
-    }
+    hdfsFileUtils.hdfsCheck();
+    return Response.ok().build();
   }
 
   @GET
   @Path("homeDirCheck")
   public Response homeDirCheck(){
-    try{
-      hdfsFileUtils.homeDirCheck();
-      return Response.ok().build();
-    }catch (Exception e){
-      throw new WfmWebException(e);
-    }
+    hdfsFileUtils.homeDirCheck();
+    return Response.ok().build();
   }
 
   @Path("/fileServices")
@@ -175,89 +189,57 @@ public class OozieProxyImpersonator {
                             @QueryParam("projectId") String projectId,
                             @DefaultValue("false") @QueryParam("overwrite") Boolean overwrite,
                             @QueryParam("description") String description,
-                            @QueryParam("jobType") String jobTypeString) {
+                            @QueryParam("jobType") String jobType) {
     LOGGER.info("submit workflow job called");
-    JobType jobType = JobType.valueOf(jobTypeString);
-    if (StringUtils.isEmpty(appPath)) {
-      throw new WfmWebException(ErrorCode.INVALID_EMPTY_INPUT);
-    }
-    appPath = workflowFilesService.getWorkflowFileName(appPath.trim(), jobType);
-    try {
-      if (!overwrite) {
-        boolean fileExists = hdfsFileUtils.fileExists(appPath);
-        if (fileExists) {
-          throw new WfmWebException(ErrorCode.WORKFLOW_PATH_EXISTS);
-        }
-      }
-      postBody = utils.formatXml(postBody);
-
-      String filePath = workflowFilesService.createFile(appPath, postBody, overwrite);
-      LOGGER.info(String.format("submit workflow job done. filePath=[%s]", filePath));
-
-      if (PROJ_MANAGER_ENABLED) {
-        String name = oozieUtils.deduceWorkflowNameFromXml(postBody);
-        workflowManagerService.saveWorkflow(projectId, appPath, jobType,
-          null, viewContext.getUsername(), name);
-      }
-      String response = oozieDelegate.submitWorkflowJobToOozie(headers,
-        appPath, ui.getQueryParameters(), jobType);
-      return Response.status(Status.OK).entity(response).build();
-    } catch (WfmWebException ex) {
-      throw ex;
-    } catch(WfmException ex){
-      throw new WfmWebException(ex,ex.getErrorCode());
-    } catch(Exception ex) {
-      throw new WfmWebException(ex);
-    }
+    return submitJobInternal(postBody, headers, ui, appPath, overwrite,
+      JobType.valueOf(jobType), projectId, description);
   }
 
   @POST
   @Path("/saveWorkflow")
   @Consumes({MediaType.TEXT_PLAIN + "," + MediaType.TEXT_XML})
   public Response saveWorkflow(String postBody, @Context HttpHeaders headers,
-                               @Context UriInfo ui, @QueryParam("app.path") String appPath,
-                               @QueryParam("jobType") String jobTypeStr,
+                               @Context UriInfo ui, @QueryParam("app.path") String appPath, @QueryParam("jobType") String jobTypeStr,
                                @DefaultValue("false") @QueryParam("overwrite") Boolean overwrite) {
     LOGGER.info("save workflow  called");
     if (StringUtils.isEmpty(appPath)) {
-      throw new WfmWebException(ErrorCode.INVALID_EMPTY_INPUT);
+      throw new RuntimeException("app path can't be empty.");
     }
     JobType jobType = StringUtils.isEmpty(jobTypeStr) ? JobType.WORKFLOW : JobType.valueOf(jobTypeStr);
     String workflowFilePath = workflowFilesService.getWorkflowFileName(appPath.trim(), jobType);
-    try {
-      if (!overwrite) {
-        boolean fileExists = hdfsFileUtils.fileExists(workflowFilePath);
-        if (fileExists) {
-          throw new WfmWebException(ErrorCode.WORKFLOW_PATH_EXISTS);
-        }
+    if (!overwrite) {
+      boolean fileExists = hdfsFileUtils.fileExists(workflowFilePath);
+      if (fileExists) {
+        return getFileExistsResponse();
       }
+    }
+
+    try {
       if (utils.isXml(postBody)) {
         saveWorkflowXml(jobType, appPath, postBody, overwrite);
       } else {
         saveDraft(jobType, appPath, postBody, overwrite);
       }
       if (PROJ_MANAGER_ENABLED) {
-        workflowManagerService.saveWorkflow(null, workflowFilePath, jobType, null,
+        workflowManagerService.saveWorkflow(null, workflowFilePath,
+          jobType, null,
           viewContext.getUsername(), getWorkflowName(postBody));
       }
-    } catch (WfmWebException ex) {
-      throw ex;
-    } catch (Exception ex) {
-       throw new WfmWebException(ex);
+    } catch (IOException ex) {
+      return getRespCodeForException(ex);
     }
+
     return Response.ok().build();
   }
-
-  private String getWorkflowName(String postBody) {
+  private String getWorkflowName(String postBody){
     if (utils.isXml(postBody)) {
       return oozieUtils.deduceWorkflowNameFromXml(postBody);
-    } else {
+    }else{
       return oozieUtils.deduceWorkflowNameFromJson(postBody);
     }
   }
 
-  private void saveWorkflowXml(JobType jobType, String appPath, String postBody,
-                               Boolean overwrite) throws IOException {
+  private void saveWorkflowXml(JobType jobType, String appPath, String postBody, Boolean overwrite) throws IOException {
     appPath = workflowFilesService.getWorkflowFileName(appPath.trim(), jobType);
     postBody = utils.formatXml(postBody);
     workflowFilesService.createFile(appPath, postBody, overwrite);
@@ -285,47 +267,49 @@ public class OozieProxyImpersonator {
                                @DefaultValue("false") @QueryParam("overwrite") Boolean overwrite) {
     LOGGER.info("publish asset called");
     if (StringUtils.isEmpty(uploadPath)) {
-      throw new WfmWebException(ErrorCode.INVALID_EMPTY_INPUT);
+      throw new RuntimeException("upload path can't be empty.");
     }
     uploadPath = uploadPath.trim();
-    try {
-      Map<String, String> validateAsset = assetResource.validateAsset(headers, postBody,
-        ui.getQueryParameters());
-      if (!STATUS_OK.equals(validateAsset.get(STATUS_KEY))) {
-        WfmWebException wfmEx=new WfmWebException(ErrorCode.INVALID_ASSET_INPUT);
-        wfmEx.setAdditionalDetail(validateAsset.get(MESSAGE_KEY));
-        throw wfmEx;
-      }
-      return saveAsset(postBody, uploadPath, overwrite);
-    } catch (WfmWebException ex) {
-      throw ex;
-    } catch (Exception ex) {
-      throw new WfmWebException(ex);
+    Map<String, String> validateAsset = assetResource.validateAsset(headers, postBody,
+      ui.getQueryParameters());
+    if (!STATUS_OK.equals(validateAsset.get(STATUS_KEY))) {
+      return Response.status(Status.BAD_REQUEST).entity(
+        validateAsset.get(MESSAGE_KEY)).build();
     }
+    return saveAsset(postBody, uploadPath, overwrite);
   }
 
-  private Response saveAsset(String postBody, String uploadPath, Boolean overwrite) throws IOException {
+  private Response saveAsset(String postBody, String uploadPath,
+                             Boolean overwrite) {
     uploadPath = workflowFilesService.getAssetFileName(uploadPath);
     if (!overwrite) {
       boolean fileExists = hdfsFileUtils.fileExists(uploadPath);
       if (fileExists) {
-        throw new WfmWebException(ErrorCode.WORKFLOW_PATH_EXISTS);
+        return getFileExistsResponse();
       }
     }
     postBody = utils.formatXml(postBody);
-    String filePath = workflowFilesService.createAssetFile(uploadPath, postBody, overwrite);
-    LOGGER.info(String.format("publish asset job done. filePath=[%s]", filePath));
-    return Response.ok().build();
+    try {
+      String filePath = workflowFilesService.createAssetFile(uploadPath,
+        postBody, overwrite);
+      LOGGER.info(String.format("publish asset job done. filePath=[%s]",
+        filePath));
+      return Response.ok().build();
+    } catch (Exception ex) {
+      LOGGER.error(ex.getMessage(), ex);
+      return getRespCodeForException(ex);
+    }
   }
-
   @GET
   @Path("/readAsset")
-  public Response readAsset(@QueryParam("assetPath") String assetPath) {
+  public Response readAsset(
+          @QueryParam("assetPath") String assetPath) {
     if (StringUtils.isEmpty(assetPath)) {
-      throw new WfmWebException(ErrorCode.INVALID_EMPTY_INPUT);
+      throw new RuntimeException("assetPath can't be empty.");
     }
     try {
-      final InputStream is = workflowFilesService.readAssset(assetPath);
+      final InputStream is = workflowFilesService
+              .readAssset(assetPath);
       StreamingOutput streamer = new StreamingOutput() {
         @Override
         public void write(OutputStream os) throws IOException,
@@ -336,16 +320,17 @@ public class OozieProxyImpersonator {
         }
       };
       return Response.ok(streamer).status(200).build();
-    } catch (IOException ex) {
-      throw new WfmWebException(ex);
+    } catch (IOException e) {
+      return getRespCodeForException(e);
     }
   }
 
+
   @GET
   @Path("/readWorkflowDraft")
   public Response readDraft(@QueryParam("workflowXmlPath") String workflowPath) {
     if (StringUtils.isEmpty(workflowPath)) {
-      throw new WfmWebException(ErrorCode.INVALID_EMPTY_INPUT);
+      throw new RuntimeException("workflowXmlPath can't be empty.");
     }
     try {
       final InputStream is = workflowFilesService.readDraft(workflowPath);
@@ -359,37 +344,113 @@ public class OozieProxyImpersonator {
         }
       };
       return Response.ok(streamer).status(200).build();
-    } catch (IOException ex) {
-      throw new WfmWebException(ex);
+    } catch (IOException e) {
+      return getRespCodeForException(e);
     }
   }
 
   @POST
   @Path("/discardWorkflowDraft")
   public Response discardDraft(
-    @QueryParam("workflowXmlPath") String workflowPath) {
+    @QueryParam("workflowXmlPath") String workflowPath)
+    throws IOException {
+    workflowFilesService.discardDraft(workflowPath);
+    return Response.ok().build();
+  }
+
+  private Response submitJobInternal(String postBody, HttpHeaders headers,
+                                     UriInfo ui, String appPath, Boolean overwrite, JobType jobType,
+                                     String projectId, String description) {
+    if (StringUtils.isEmpty(appPath)) {
+      throw new RuntimeException("app path can't be empty.");
+    }
+    appPath = workflowFilesService.getWorkflowFileName(appPath.trim(), jobType);
+    if (!overwrite) {
+      boolean fileExists = hdfsFileUtils.fileExists(appPath);
+      if (fileExists) {
+        return getFileExistsResponse();
+      }
+    }
+    postBody = utils.formatXml(postBody);
     try {
-      workflowFilesService.discardDraft(workflowPath);
-      return Response.ok().build();
-    } catch (IOException ex) {
-      throw new WfmWebException(ex);
+      String filePath = workflowFilesService.createFile(appPath, postBody,
+        overwrite);
+      LOGGER.info(String.format(
+        "submit workflow job done. filePath=[%s]", filePath));
+    } catch (Exception ex) {
+      LOGGER.error(ex.getMessage(), ex);
+      return getRespCodeForException(ex);
+
+    }
+    if (PROJ_MANAGER_ENABLED) {
+      String name = oozieUtils.deduceWorkflowNameFromXml(postBody);
+      workflowManagerService.saveWorkflow(projectId, appPath, jobType,
+        "todo description", viewContext.getUsername(), name);
+    }
+
+    String response = oozieDelegate.submitWorkflowJobToOozie(headers,
+      appPath, ui.getQueryParameters(), jobType);
+    if (response != null && response.trim().startsWith("{")) {
+      // dealing with oozie giving error but with 200 response.
+      return Response.status(Response.Status.OK).entity(response).build();
+    } else {
+      HashMap<String, String> resp = new HashMap<String, String>();
+      resp.put("status", ErrorCodes.OOZIE_SUBMIT_ERROR.getErrorCode());
+      resp.put("message", response);
+      return Response.status(Response.Status.BAD_REQUEST).entity(resp)
+        .build();
     }
+
+  }
+
+  private Response getRespCodeForException(Exception ex) {
+    if (ex instanceof AccessControlException) {
+      HashMap<String, String> errorDetails = getErrorDetails(
+        ErrorCodes.FILE_ACCESS_ACL_ERROR.getErrorCode(),
+        ErrorCodes.FILE_ACCESS_ACL_ERROR.getDescription(), ex);
+      return Response.status(Response.Status.BAD_REQUEST)
+        .entity(errorDetails).build();
+    } else if (ex instanceof IOException) {
+      HashMap<String, String> errorDetails = getErrorDetails(
+        ErrorCodes.FILE_ACCESS_UNKNOWN_ERROR.getErrorCode(),
+        ErrorCodes.FILE_ACCESS_UNKNOWN_ERROR.getDescription(), ex);
+      return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
+        .entity(errorDetails).build();
+    } else {
+      HashMap<String, String> errorDetails = getErrorDetails(
+        ErrorCodes.FILE_ACCESS_UNKNOWN_ERROR.getErrorCode(),
+        ErrorCodes.FILE_ACCESS_UNKNOWN_ERROR.getDescription(), ex);
+      return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
+        .entity(errorDetails).build();
+    }
+
+  }
+
+  private Response getFileExistsResponse() {
+    HashMap<String, String> resp = new HashMap<String, String>();
+    resp.put("status", ErrorCodes.WORKFLOW_PATH_EXISTS.getErrorCode());
+    resp.put("message", ErrorCodes.WORKFLOW_PATH_EXISTS.getDescription());
+    return Response.status(Response.Status.BAD_REQUEST).entity(resp)
+      .build();
   }
 
   @GET
   @Path("/readWorkflow")
   public Response readWorkflow(
     @QueryParam("workflowPath") String workflowPath, @QueryParam("jobType") String jobTypeStr) {
-    try {
-      String workflowFileName = workflowFilesService.getWorkflowFileName(workflowPath, JobType.valueOf(jobTypeStr));
-      if (!hdfsFileUtils.fileExists(workflowFileName)) {
-        throw new WfmWebException(ErrorCode.WORKFLOW_XML_DOES_NOT_EXIST);
-      }
-      WorkflowFileInfo workflowDetails = workflowFilesService
-        .getWorkflowDetails(workflowPath, JobType.valueOf(jobTypeStr));
-      if (workflowPath.endsWith(Constants.WF_DRAFT_EXTENSION) || workflowDetails.getIsDraftCurrent()) {
-        String filePath = workflowFilesService.getWorkflowDraftFileName(workflowPath, JobType.valueOf(jobTypeStr));
+    String workflowFileName=workflowFilesService.getWorkflowFileName(workflowPath, JobType.valueOf(jobTypeStr));
+    if (!hdfsFileUtils.fileExists(workflowFileName)){
+      HashMap<String,String> response=new HashMap<>();
+      response.put("status", ErrorCodes.WORKFLOW_XML_DOES_NOT_EXIST.getErrorCode());
+      response.put("message", ErrorCodes.WORKFLOW_XML_DOES_NOT_EXIST.getDescription());
+      return Response.status(Status.BAD_REQUEST).entity(response).build();
+    }
 
+    WorkflowFileInfo workflowDetails = workflowFilesService
+      .getWorkflowDetails(workflowPath, JobType.valueOf(jobTypeStr));
+    if (workflowPath.endsWith(Constants.WF_DRAFT_EXTENSION) || workflowDetails.getIsDraftCurrent()) {
+      String filePath = workflowFilesService.getWorkflowDraftFileName(workflowPath, JobType.valueOf(jobTypeStr));
+      try {
         InputStream inputStream = workflowFilesService.readWorkflowXml(filePath);
         String stringResponse = IOUtils.toString(inputStream);
         if (!workflowFilesService.isDraftFormatCurrent(stringResponse)) {
@@ -398,35 +459,36 @@ public class OozieProxyImpersonator {
         } else {
           return Response.ok(stringResponse).header(RESPONSE_TYPE, WorkflowFormat.DRAFT.getValue()).build();
         }
-      } else {
-        String filePath = workflowFilesService.getWorkflowFileName(workflowPath, JobType.valueOf(jobTypeStr));
-        return getWorkflowResponse(filePath, WorkflowFormat.XML.getValue(), false);
+      } catch (IOException e) {
+        return getRespCodeForException(e);
       }
-    } catch (WfmWebException ex) {
-      throw ex;
-    } catch (Exception ex) {
-      throw new WfmWebException(ex);
+    } else {
+      String filePath = workflowFilesService.getWorkflowFileName(workflowPath, JobType.valueOf(jobTypeStr));
+      return getWorkflowResponse(filePath, WorkflowFormat.XML.getValue(), false);
     }
   }
 
-  private Response getWorkflowResponse(String filePath, String responseType,
-                                       boolean olderFormatDraftIngored) throws IOException {
-    final InputStream is = workflowFilesService.readWorkflowXml(filePath);
-    StreamingOutput streamer = new StreamingOutput() {
-      @Override
-      public void write(OutputStream os) throws IOException,
-        WebApplicationException {
-        IOUtils.copy(is, os);
-        is.close();
-        os.close();
+  private Response getWorkflowResponse(String filePath, String responseType, boolean olderFormatDraftIngored) {
+    try {
+      final InputStream is = workflowFilesService
+        .readWorkflowXml(filePath);
+      StreamingOutput streamer = new StreamingOutput() {
+        @Override
+        public void write(OutputStream os) throws IOException,
+          WebApplicationException {
+          IOUtils.copy(is, os);
+          is.close();
+          os.close();
+        }
+      };
+      Response.ResponseBuilder responseBuilder = Response.ok(streamer).header(RESPONSE_TYPE, responseType);
+      if(olderFormatDraftIngored){
+        responseBuilder.header(OLDER_FORMAT_DRAFT_INGORED,Boolean.TRUE.toString());
       }
-    };
-    Response.ResponseBuilder responseBuilder = Response.ok(streamer).header(RESPONSE_TYPE, responseType);
-    if (olderFormatDraftIngored) {
-      responseBuilder.header(OLDER_FORMAT_DRAFT_INGORED, Boolean.TRUE.toString());
+      return  responseBuilder.build();
+    } catch (IOException e) {
+      return getRespCodeForException(e);
     }
-    return responseBuilder.build();
-
   }
 
   @GET
@@ -434,13 +496,12 @@ public class OozieProxyImpersonator {
   public Response readWorkflowXml(
     @QueryParam("workflowXmlPath") String workflowPath,@QueryParam("jobType") String jobTypeStr) {
     if (StringUtils.isEmpty(workflowPath)) {
-      throw new WfmWebException(ErrorCode.INVALID_EMPTY_INPUT);
+      throw new RuntimeException("workflowXmlPath can't be empty.");
     }
+
     try {
-      if (!hdfsFileUtils.fileExists(workflowPath)) {
-        throw new WfmWebException(ErrorCode.WORKFLOW_XML_DOES_NOT_EXIST);
-      }
-      final InputStream is = workflowFilesService.readWorkflowXml(workflowPath);
+      final InputStream is = workflowFilesService
+        .readWorkflowXml(workflowPath);
       StreamingOutput streamer = new StreamingOutput() {
         @Override
         public void write(OutputStream os) throws IOException,
@@ -451,13 +512,24 @@ public class OozieProxyImpersonator {
         }
       };
       return Response.ok(streamer).status(200).build();
-    } catch (WfmWebException ex) {
-      throw ex;
-    } catch (Exception ex) {
-      throw new WfmWebException(ex);
+    } catch (IOException e) {
+      return getRespCodeForException(e);
     }
   }
 
+  private HashMap<String, String> getErrorDetails(String status,
+                                                  String message, Exception ex) {
+    HashMap<String, String> resp = new HashMap<String, String>();
+    resp.put("status", status);
+    if (message != null) {
+      resp.put("message", message);
+    }
+    if (ex != null) {
+      resp.put("stackTrace", ExceptionUtils.getFullStackTrace(ex));
+    }
+    return resp;
+  }
+
   @GET
   @Path("/{path: .*}")
   public Response handleGet(@Context HttpHeaders headers, @Context UriInfo ui) {
@@ -466,7 +538,8 @@ public class OozieProxyImpersonator {
         .getPath(), ui.getQueryParameters(), HttpMethod.GET, null);
     } catch (Exception ex) {
       LOGGER.error("Error in GET proxy", ex);
-      throw new WfmWebException(ex);
+      return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
+        .entity(getErrorDetailsForException("Oozie", ex)).build();
     }
   }
 
@@ -475,11 +548,13 @@ public class OozieProxyImpersonator {
   public Response handlePost(String xml, @Context HttpHeaders headers,
                              @Context UriInfo ui) {
     try {
+
       return oozieDelegate.consumeService(headers, ui.getAbsolutePath()
         .getPath(), ui.getQueryParameters(), HttpMethod.POST, xml);
     } catch (Exception ex) {
       LOGGER.error("Error in POST proxy", ex);
-      throw new WfmWebException(ex);
+      return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
+        .entity(getErrorDetailsForException("Oozie", ex)).build();
     }
   }
 
@@ -492,7 +567,8 @@ public class OozieProxyImpersonator {
         .getPath(), ui.getQueryParameters(), HttpMethod.POST, null);
     } catch (Exception ex) {
       LOGGER.error("Error in DELETE proxy", ex);
-      throw new WfmWebException(ex);
+      return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
+        .entity(getErrorDetailsForException("Oozie", ex)).build();
     }
   }
 
@@ -505,7 +581,22 @@ public class OozieProxyImpersonator {
         .getPath(), ui.getQueryParameters(), HttpMethod.PUT, body);
     } catch (Exception ex) {
       LOGGER.error("Error in PUT proxy", ex);
-      throw new WfmWebException(ex);
+      return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
+        .entity(getErrorDetailsForException("Oozie", ex)).build();
+    }
+  }
+
+  private Map<String, String> getErrorDetailsForException(String component,
+                                                          Exception ex) {
+    String errorCode = component + "exception";
+    String errorMessage = component + " Exception";
+    if (ex instanceof RuntimeException) {
+      Throwable cause = ex.getCause();
+      if (cause instanceof IOException) {
+        errorCode = component + "io.exception";
+        errorMessage = component + "IO Exception";
+      }
     }
+    return getErrorDetails(errorCode, errorMessage, ex);
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/523247aa/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/assets/AssetResource.java
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/assets/AssetResource.java b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/assets/AssetResource.java
index 3355c85..ef3b508 100644
--- a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/assets/AssetResource.java
+++ b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/assets/AssetResource.java
@@ -25,15 +25,13 @@ import org.apache.oozie.ambari.view.*;
 import org.apache.oozie.ambari.view.assets.model.ActionAsset;
 import org.apache.oozie.ambari.view.assets.model.ActionAssetDefinition;
 import org.apache.oozie.ambari.view.assets.model.AssetDefintion;
-import org.apache.oozie.ambari.view.exception.ErrorCode;
-import org.apache.oozie.ambari.view.exception.WfmException;
-import org.apache.oozie.ambari.view.exception.WfmWebException;
 import org.apache.oozie.ambari.view.model.APIResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.ws.rs.*;
 import javax.ws.rs.core.*;
+import javax.ws.rs.core.Response.Status;
 import java.io.IOException;
 import java.util.*;
 
@@ -67,7 +65,7 @@ public class AssetResource {
       result.setData(assets);
       return Response.ok(result).build();
     } catch (Exception e) {
-      throw new WfmWebException(e);
+      throw new ServiceFormattedException(e);
     }
   }
 
@@ -82,7 +80,7 @@ public class AssetResource {
       result.setData(assets);
       return Response.ok(result).build();
     } catch (Exception e) {
-      throw new WfmWebException(e);
+      throw new ServiceFormattedException(e);
     }
   }
   @POST
@@ -90,20 +88,19 @@ public class AssetResource {
                             @QueryParam("id") String id, @Context UriInfo ui, String body) {
     try {
       Gson gson = new Gson();
-      AssetDefintion assetDefinition = gson.fromJson(body, AssetDefintion.class);
+      AssetDefintion assetDefinition = gson.fromJson(body,
+        AssetDefintion.class);
       Map<String, String> validateAsset = validateAsset(headers,
         assetDefinition.getDefinition(), ui.getQueryParameters());
       if (!STATUS_OK.equals(validateAsset.get(STATUS_KEY))) {
-        throw new WfmWebException(ErrorCode.ASSET_INVALID_FROM_OOZIE);
+        return Response.status(Status.BAD_REQUEST).build();
       }
       assetService.saveAsset(id, viewContext.getUsername(), assetDefinition);
       APIResult result = new APIResult();
       result.setStatus(APIResult.Status.SUCCESS);
       return Response.ok(result).build();
-    } catch (WfmWebException ex) {
-      throw ex;
-    } catch (Exception ex) {
-      throw new WfmWebException(ex);
+    } catch (Exception e) {
+      throw new ServiceFormattedException(e);
     }
   }
 
@@ -116,50 +113,43 @@ public class AssetResource {
   public Map<String, String> validateAsset(HttpHeaders headers,
                                            String postBody, MultivaluedMap<String, String> queryParams) {
     String workflowXml = oozieUtils.generateWorkflowXml(postBody);
-    Map<String, String> result = new HashMap<>();
-    String tempWfPath = "/tmp" + "/tmpooziewfs/tempwf_" + Math.round(Math.random() * 100000) + ".xml";
     try {
+      Map<String, String> result = new HashMap<>();
+      String tempWfPath = "/tmp" + "/tmpooziewfs/tempwf_" + Math.round(Math.random()*100000) + ".xml";
       hdfsFileUtils.writeToFile(tempWfPath, workflowXml, true);
-    } catch (IOException e) {
-      throw new WfmWebException(e, ErrorCode.FILE_ACCESS_UNKNOWN_ERROR);
-    }
-    queryParams.put("oozieparam.action", getAsList("dryrun"));
-    queryParams.put("oozieconfig.rerunOnFailure", getAsList("false"));
-    queryParams.put("oozieconfig.useSystemLibPath", getAsList("true"));
-    queryParams.put("resourceManager", getAsList("useDefault"));
-    String dryRunResp = oozieDelegate.submitWorkflowJobToOozie(headers,
-      tempWfPath, queryParams, JobType.WORKFLOW);
-    LOGGER.info(String.format("resp from validating asset=[%s]", dryRunResp));
-    try {
+      queryParams.put("oozieparam.action", getAsList("dryrun"));
+      queryParams.put("oozieconfig.rerunOnFailure", getAsList("false"));
+      queryParams.put("oozieconfig.useSystemLibPath", getAsList("true"));
+      queryParams.put("resourceManager", getAsList("useDefault"));
+      String dryRunResp = oozieDelegate.submitWorkflowJobToOozie(headers,
+        tempWfPath, queryParams, JobType.WORKFLOW);
+      LOGGER.info(String.format("resp from validating asset=[%s]",
+        dryRunResp));
       hdfsFileUtils.deleteFile(tempWfPath);
-    } catch (IOException e) {
-      throw new WfmWebException(e, ErrorCode.FILE_ACCESS_UNKNOWN_ERROR);
-    }
-    if (dryRunResp != null && dryRunResp.trim().startsWith("{")) {
-      JsonElement jsonElement = new JsonParser().parse(dryRunResp);
-      JsonElement idElem = jsonElement.getAsJsonObject().get("id");
-      if (idElem != null) {
-        result.put(STATUS_KEY, STATUS_OK);
+      if (dryRunResp != null && dryRunResp.trim().startsWith("{")) {
+        JsonElement jsonElement = new JsonParser().parse(dryRunResp);
+        JsonElement idElem = jsonElement.getAsJsonObject().get("id");
+        if (idElem != null) {
+          result.put(STATUS_KEY, STATUS_OK);
+        } else {
+          result.put(STATUS_KEY, STATUS_FAILED);
+          result.put(MESSAGE_KEY, dryRunResp);
+        }
       } else {
         result.put(STATUS_KEY, STATUS_FAILED);
         result.put(MESSAGE_KEY, dryRunResp);
       }
-    } else {
-      result.put(STATUS_KEY, STATUS_FAILED);
-      result.put(MESSAGE_KEY, dryRunResp);
+      return result;
+    } catch (IOException e) {
+      throw new RuntimeException(e);
     }
-    return result;
   }
 
   @GET
   @Path("/assetNameAvailable")
   public Response assetNameAvailable(@QueryParam("name") String name){
-    try {
-      boolean available = assetService.isAssetNameAvailable(name);
-      return Response.ok(available).build();
-    }catch (Exception e){
-      throw new WfmWebException(e);
-    }
+    boolean available=assetService.isAssetNameAvailable(name);
+    return Response.ok(available).build();
   }
 
   @GET
@@ -172,7 +162,7 @@ public class AssetResource {
       result.setData(assetDefinition);
       return Response.ok(result).build();
     } catch (Exception e) {
-      throw new WfmWebException(e);
+      throw new ServiceFormattedException(e);
     }
   }
 
@@ -180,13 +170,14 @@ public class AssetResource {
   @Path("/definition/id}")
   public Response getAssetDefinition(@PathParam("defnitionId") String id) {
     try {
-      ActionAssetDefinition assetDefinition = assetService.getAssetDefinition(id);
+      ActionAssetDefinition assetDefinition = assetService
+        .getAssetDefinition(id);
       APIResult result = new APIResult();
       result.setStatus(APIResult.Status.SUCCESS);
       result.setData(assetDefinition);
       return Response.ok(result).build();
     } catch (Exception e) {
-      throw new WfmWebException(e);
+      throw new ServiceFormattedException(e);
     }
   }
 
@@ -196,19 +187,19 @@ public class AssetResource {
     try {
       ActionAsset asset = assetService.getAsset(id);
       if (asset == null) {
-        throw new WfmWebException(ErrorCode.ASSET_NOT_EXIST);
+        throw new RuntimeException("Asset doesnt exist");
       }
       if (!viewContext.getUsername().equals(asset.getOwner())){
-        throw new WfmWebException(ErrorCode.PERMISSION_ERROR);
+        throw new RuntimeException(
+          "Dont have permission to delete this asset");
       }
       assetService.deleteAsset(id);
       APIResult result = new APIResult();
       result.setStatus(APIResult.Status.SUCCESS);
       return Response.ok(result).build();
-    } catch (WfmWebException ex) {
-      throw ex;
-    } catch (Exception ex) {
-      throw new WfmWebException(ex);
+    } catch (Exception e) {
+      throw new ServiceFormattedException(e);
     }
   }
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/523247aa/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/workflowmanager/WorkflowsManagerResource.java
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/workflowmanager/WorkflowsManagerResource.java b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/workflowmanager/WorkflowsManagerResource.java
index e1a5808..a0aa234 100644
--- a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/workflowmanager/WorkflowsManagerResource.java
+++ b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/workflowmanager/WorkflowsManagerResource.java
@@ -26,10 +26,8 @@ import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Response;
 
 import org.apache.ambari.view.ViewContext;
-import org.apache.oozie.ambari.view.exception.WfmWebException;
 
 public class WorkflowsManagerResource {
 	private final WorkflowManagerService workflowManagerService;
@@ -40,27 +38,19 @@ public class WorkflowsManagerResource {
 		this.workflowManagerService=new WorkflowManagerService(viewContext);
 	}
 
-  @GET
-  public Response getWorkflows() {
-    try {
-      HashMap<String, Object> result = new HashMap<>();
-      result.put("wfprojects", workflowManagerService.getAllWorkflows(viewContext.getUsername()));
-      return Response.ok(result).build();
-    } catch (Exception ex) {
-      throw new WfmWebException(ex);
-    }
-  }
-
-
-  @DELETE
+	@GET
+	public Map<String,Object> getWorkflows(){
+	    HashMap<String,Object> result=new HashMap<>();
+	    result.put("wfprojects", workflowManagerService.getAllWorkflows(viewContext.getUsername()));
+	    return result;
+	}
+	
+	
+	@DELETE
 	@Path("/{projectId}")
-	public Response deleteWorkflow(@PathParam("projectId") String id,
-                                 @DefaultValue("false") @QueryParam("deleteDefinition") Boolean deleteDefinition){
-	  try{
-      workflowManagerService.deleteWorkflow(id,deleteDefinition);
-      return Response.ok().build();
-    }catch (Exception ex) {
-      throw new WfmWebException(ex);
-    }
+	public void deleteWorkflow( @PathParam("projectId") String id,
+            @DefaultValue("false") @QueryParam("deleteDefinition") Boolean deleteDefinition){
+	    workflowManagerService.deleteWorkflow(id,deleteDefinition);
 	}
+	
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/523247aa/contrib/views/wfmanager/src/main/resources/ui/app/components/bundle-config.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/bundle-config.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/bundle-config.js
index e94d51a..3ccbc07 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/components/bundle-config.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/bundle-config.js
@@ -156,12 +156,10 @@ export default Ember.Component.extend(Ember.Evented, Validations, {
       }
       this.set('bundleFilePath', filePath);
       this.set("isImporting", false);
-    }.bind(this)).catch(function(data){
-      console.error(data);
-      this.set("errorMsg", "There is some problem while importing.");
+    }.bind(this)).catch(function(e){
       this.set("isImporting", false);
       this.set("isImportingSuccess", false);
-      this.set("data", data);
+      throw new Error(e);
     }.bind(this));
   },
   getBundleFromJSON(draftBundle){
@@ -365,7 +363,7 @@ export default Ember.Component.extend(Ember.Evented, Validations, {
       }.bind(this)).catch(function(e){
         this.$('#loading').hide();
         this.get("errors").pushObject({'message' : 'Could not process coordinator from ' + e.path});
-        throw new Error(e);
+        throw new Error(e.trace);
       }.bind(this));
     },
     preview(){

http://git-wip-us.apache.org/repos/asf/ambari/blob/523247aa/contrib/views/wfmanager/src/main/resources/ui/app/components/coord-config.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/coord-config.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/coord-config.js
index 4a57e37..bbd619d 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/components/coord-config.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/coord-config.js
@@ -274,12 +274,10 @@ export default Ember.Component.extend(Validations, Ember.Evented, {
       }
       this.set('coordinatorFilePath', filePath);
       this.set("isImporting", false);
-    }.bind(this)).catch(function(data){
-      console.error(data);
-      this.set("errorMsg", "There is some problem while importing.");
+    }.bind(this)).catch(function(e){
       this.set("isImporting", false);
       this.set("isImportingSuccess", false);
-      this.set("data", data);
+      throw new Error(e);
     }.bind(this));
   },
   getCoordinatorFromJSON(draftCoordinator){

http://git-wip-us.apache.org/repos/asf/ambari/blob/523247aa/contrib/views/wfmanager/src/main/resources/ui/app/components/designer-errors.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/designer-errors.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/designer-errors.js
index fdb4f5e..7a7c38d 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/components/designer-errors.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/designer-errors.js
@@ -18,53 +18,4 @@
 import Ember from 'ember';
 
 export default Ember.Component.extend({
-  showingStackTrace: false,
-  hasErrorMsg : Ember.computed('errorMsg', function() {
-    return !Ember.isBlank(this.get("errorMsg"));
-  }),
-  errorMsgDetails : Ember.computed('data.responseText', function() {
-    var jsonResponse = this.getparsedResponse();
-    if (jsonResponse.message) {
-      if (jsonResponse.message.indexOf('Permission denied') >= 0) {
-        return "Permission Denied";
-      }
-      return jsonResponse.message;
-    }
-    return "";
-  }),
-  stackTrace : Ember.computed('data.responseText', function() {
-      var jsonResponse = this.getparsedResponse();
-      var stackTraceMsg = jsonResponse.stackTrace;
-      if(!stackTraceMsg){
-        return "";
-      }
-      if (stackTraceMsg instanceof Array) {
-        return stackTraceMsg.join("").replace(/\tat /g, '&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;');
-      } else {
-        return stackTraceMsg.replace(/\tat /g, '<br/>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;');
-      }
-  }),
-  isStackTraceAvailable : Ember.computed('stackTrace', function(){
-    return this.get('stackTrace') && this.get('stackTrace').length ? true : false;
-  }),
-  getparsedResponse() {
-    var response = this.get('data.responseText');
-    if (response) {
-      try {
-        return JSON.parse(response);
-      } catch(err){
-        return "";
-      }
-    }
-    return "";
-  },
-
-  actions: {
-    showStackTrace(){
-      this.set("showingStackTrace", !this.get("showingStackTrace"));
-    },
-    closeStackTrace(){
-      this.set("showingStackTrace", false);
-    }
-  }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/523247aa/contrib/views/wfmanager/src/main/resources/ui/app/components/flow-designer.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/flow-designer.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/flow-designer.js
index de72c6d..f97add8 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/components/flow-designer.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/flow-designer.js
@@ -94,13 +94,13 @@ export default Ember.Component.extend(FindNodeMixin, Validations, {
   isWorkflowImporting: false,
   isAssetPublishing: false,
   errorMsg: "",
-  data : {
-    "responseText": ""
-  },
   shouldPersist : false,
   useCytoscape: Constants.useCytoscape,
   cyOverflow: {},
   clipboard : Ember.computed.alias('clipboardService.clipboard'),
+  isStackTraceVisible: false,
+  isStackTraceAvailable: false,
+  stackTrace:"",
   showingStreamImport:false,
   fileInfo:Ember.Object.create(),
   isDraft: false,
@@ -310,6 +310,24 @@ export default Ember.Component.extend(FindNodeMixin, Validations, {
   doValidation(){
     this.validate();
   },
+  getStackTrace(data){
+    if(data){
+     try{
+      var stackTraceMsg = JSON.parse(data).stackTrace;
+      if(!stackTraceMsg){
+        return "";
+      }
+     if(stackTraceMsg instanceof Array){
+       return stackTraceMsg.join("").replace(/\tat /g, '&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;');
+     } else {
+       return stackTraceMsg.replace(/\tat /g, '<br/>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;');
+     }
+     } catch(err){
+       return "";
+     }
+    }
+    return "";
+  },
   importWorkflow(filePath){
     var self = this;
     this.set("isWorkflowImporting", true);
@@ -325,8 +343,8 @@ export default Ember.Component.extend(FindNodeMixin, Validations, {
       this.set("workflowFilePath", filePath);
     }.bind(this)).catch(function(data){
       console.error(data);
-      self.set("errorMsg", "There is some problem while importing.");
-      self.set("data", data);
+      self.set("errorMsg", "There is some problem while importing.Please try again.");
+      self.showingErrorMsgInDesigner(data);
       self.set("isWorkflowImporting", false);
     });
   },
@@ -473,8 +491,8 @@ export default Ember.Component.extend(FindNodeMixin, Validations, {
     exportActionNodeXmlDefered.promise.then(function(data){
       self.set("isAssetPublishing", false);
     }.bind(this)).catch(function(data){
-      self.set("errorMsg", "There is some problem while publishing asset.");
-      self.set("data", data);
+      self.set("errorMsg", "There is some problem while publishing asset. Please try again.");
+      self.showingErrorMsgInDesigner(data);
       self.set("isAssetPublishing", false);
     });
 
@@ -721,6 +739,15 @@ export default Ember.Component.extend(FindNodeMixin, Validations, {
       this.set("showingWorkflowConfigProps",true);
     }
   },
+  showingErrorMsgInDesigner(data){
+      var self = this, stackTraceMsg = self.getStackTrace(data.responseText);
+      if(stackTraceMsg.length){
+        self.set("stackTrace", stackTraceMsg);
+        self.set("isStackTraceAvailable", true);
+      } else {
+        self.set("isStackTraceAvailable", false);
+      }
+  },
   isDraftExists(path){
     var deferred = Ember.RSVP.defer(), url, self = this;
     if(!path){
@@ -806,6 +833,12 @@ export default Ember.Component.extend(FindNodeMixin, Validations, {
       });
       reader.readAsText(file);
     },
+    showStackTrace(){
+      this.set("isStackTraceVisible", true);
+    },
+    hideStackTrace(){
+      this.set("isStackTraceVisible", false);
+    },
     showWorkflowSla (value) {
       this.set('showWorkflowSla', value);
     },
@@ -996,8 +1029,9 @@ export default Ember.Component.extend(FindNodeMixin, Validations, {
         actionSettingsXmlDefered.promise.then(function(data){
           this.importActionSettingsFromString(data);
         }.bind(this)).catch(function(data){
-          self.set("errorMsg", "There is some problem while importing asset.");
-          self.set("data", data);
+          console.error(data);
+          self.set("errorMsg", "There is some problem while importing asset.Please try again.");
+          self.showingErrorMsgInDesigner(data);
         });
       }
     },
@@ -1013,8 +1047,9 @@ export default Ember.Component.extend(FindNodeMixin, Validations, {
         actionSettingsXmlDefered.promise.then(function(data){
           this.importActionNodeFromString(data);
         }.bind(this)).catch(function(data){
-          self.set("errorMsg", "There is some problem while importing asset.");
-          self.set("data", data);
+          console.error(data);
+          self.set("errorMsg", "There is some problem while importing asset. Please try again.");
+          self.showingErrorMsgInDesigner(data);
         });
       }
     },
@@ -1149,9 +1184,9 @@ export default Ember.Component.extend(FindNodeMixin, Validations, {
       saveAssetConfigDefered.promise.then(function(data){
         self.set("isAssetPublishing", false);
       }.bind(this)).catch(function(data){
-        self.set("errorMsg", "There is some problem while saving asset.");
-        self.set("data", data);
         self.set("isAssetPublishing", false);
+        self.set("errorMsg", "There is some problem while saving asset. Please try again.");
+        self.showingErrorMsgInDesigner(data);
       });
     },
     showAssetList(value) {
@@ -1169,9 +1204,9 @@ export default Ember.Component.extend(FindNodeMixin, Validations, {
         self.importActionSettingsFromString(importedAsset.definition);
         self.set("isAssetImporting", false);
       }.bind(this)).catch(function(data){
-        self.set("errorMsg", "There is some problem while importing asset.");
-        self.set("data", data);
         self.set("isAssetImporting", false);
+        self.set("errorMsg", "There is some problem while importing asset. Please try again.");
+        self.showingErrorMsgInDesigner(data);
       });
     },
     showAssetNodeList(value) {
@@ -1189,9 +1224,9 @@ export default Ember.Component.extend(FindNodeMixin, Validations, {
         self.importActionNodeFromString(importedAsset.definition);
         self.set("isAssetImporting", false);
       }.bind(this)).catch(function(data){
-        self.set("errorMsg", "There is some problem while importing asset.");
-        self.set("data", data);
         self.set("isAssetImporting", false);
+        self.set("errorMsg", "There is some problem while importing asset. Please try again.");
+        self.showingErrorMsgInDesigner(data);
       });
     }
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/523247aa/contrib/views/wfmanager/src/main/resources/ui/app/styles/app.less
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/styles/app.less b/contrib/views/wfmanager/src/main/resources/ui/app/styles/app.less
index a424049..e98d182 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/styles/app.less
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/styles/app.less
@@ -605,10 +605,9 @@ input:invalid {
 #configureJob .modal-dialog,
 #asset-delete-confirm-dialog .modal-dialog,
 #projectsList .modal-dialog,
-#previewModal .modal-dialog,
-#stack_trace_dialog .modal-dialog {
+#previewModal .modal-dialog {
     width: @modalDialogWidth;
-    height: 100vh;
+height: 100vh;
 }
 
 #collapseOne{
@@ -1548,11 +1547,15 @@ input:invalid {
   padding-left: 0px;
   padding-right: 0px;
 }
-
+#stackTrace{
+  white-space: pre-wrap;
+  max-width: 100%;
+  max-height: 400px;
+  overflow: scroll;
+}
 .jobIdClass {
   width: 50px;
 }
-
 .width50 {
     white-space: nowrap;
     width: 150px;

http://git-wip-us.apache.org/repos/asf/ambari/blob/523247aa/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/bundle-config.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/bundle-config.hbs b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/bundle-config.hbs
index 2d374a5..ca58431 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/bundle-config.hbs
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/bundle-config.hbs
@@ -72,7 +72,7 @@
     <div id='loading'>
       {{spin-spinner lines=13 length=20 width=10}}
     </div>
-    {{designer-errors errors=errors validationErrors=validationErrors errorMsg=errorMsg data=data}}
+    {{designer-errors errors=errors}}
     <form class="form-horizontal">
       <div class="col-sm-12 paddingtop10">
         <div class="col-sm-8 centralize-panel">
@@ -100,7 +100,7 @@
                   <li class="list-group-item">No Coordinators Configured.</li>
                   {{/each}}
                 </ul>
-                {{#field-error model=this field='bundle.coordinators' showErrorMessage=showErrorMessage}}{{/field-error}}
+                {{#field-error model=this field='bundle.coordinators' showErrorMessage=true}}{{/field-error}}
 
               {{#if coordinatorCreateMode}}
               {{#bundle-coord-config coordinator=currentCoordinator openTab="openTab" openFileBrowser="openFileBrowser" add="addCoordinator" cancel="cancelCoordinatorOperation" createMode=coordinatorCreateMode}}{{/bundle-coord-config}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/523247aa/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/coord-config.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/coord-config.hbs b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/coord-config.hbs
index 7db5ce2..7b607ca 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/coord-config.hbs
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/coord-config.hbs
@@ -93,7 +93,7 @@
   {{spin-spinner lines=13 length=20 width=10}}
 </div>
 <div class="container-fluid">
-  {{designer-errors errors=errors validationErrors=validationErrors errorMsg=errorMsg data=data}}
+  {{designer-errors errors=errors}}
   <form class="form-horizontal">
     <div class="col-sm-12 paddingtop10">
       <div class="col-sm-8 centralize-panel">

http://git-wip-us.apache.org/repos/asf/ambari/blob/523247aa/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/designer-errors.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/designer-errors.hbs b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/designer-errors.hbs
index 00cb8a6..8438255 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/designer-errors.hbs
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/designer-errors.hbs
@@ -34,21 +34,4 @@
       {{/if}}
     </div>
   {{/if}}
-
-  {{#if hasErrorMsg}}
-    <div id="loader">
-        <div id="alert"class="alert alert-danger alert-dismissible workflow-error" role="alert">
-            {{errorMsg}}
-            <div id="errorMsgDetails">
-              {{errorMsgDetails}}
-              {{#if isStackTraceAvailable}}
-                <a href="#" class="action-link" {{action "showStackTrace"}}>Details</a>
-              {{/if}}
-            </div>
-        </div>
-    </div>
-  {{/if}}
 </div>
-{{#if showingStackTrace}}
-  {{#stack-trace-dialog title="Stack Trace" stackTrace=stackTrace closeStackTrace="closeStackTrace"}}{{/stack-trace-dialog}}
-{{/if}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/523247aa/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/flow-designer.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/flow-designer.hbs b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/flow-designer.hbs
index 4ff9d87..1a73421 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/flow-designer.hbs
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/flow-designer.hbs
@@ -138,7 +138,7 @@
   {{/if}}
   <div  id="content" class="panel panel-default designer-main-panel col-xs-20">
     <div class="designer-panel designer-canvas">
-      {{designer-errors errors=errors validationErrors=validationErrors errorMsg=errorMsg data=data}}
+      {{designer-errors errors=errors validationErrors=validationErrors}}
       {{#if undoAvailable}}
         <div id="alert"class="alert alert-warning workflow-error" role="alert">
           {{#if (eq undoType 'nodeDeleted')}}
@@ -157,6 +157,22 @@
           </div>
       </div>
       {{/if}}
+      {{#if (not (eq errorMsg ""))}}
+        <div id="loader">
+            <div id="alert"class="alert alert-danger alert-dismissible workflow-error" role="alert">
+                {{errorMsg}}
+                {{#if isStackTraceAvailable}}
+                  {{#if isStackTraceVisible}}
+                    <a href="#" class="action-link" {{action "hideStackTrace"}}>Hide Log</a>
+                    <div id="stackTrace">{{{stackTrace}}}</div>
+                  {{/if}}
+                  {{#unless isStackTraceVisible}}
+                    <a href="#" class="action-link" {{action "showStackTrace"}}>Show Log</a>
+                  {{/unless}}
+                {{/if}}
+            </div>
+        </div>
+      {{/if}}
       {{#if isAssetPublishing}}
         <div id="loader">
             <div id="alert"class="alert alert-info alert-dismissible workflow-error" role="alert">