You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by nc...@apache.org on 2017/02/21 16:39:38 UTC

[07/25] ambari git commit: AMBARI-20077. Server Error when trying to save and not overwrite. (Madhan Mohan Reddy via gauravn7)

AMBARI-20077. Server Error when trying to save and not overwrite. (Madhan Mohan Reddy via gauravn7)


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

Branch: refs/heads/branch-feature-AMBARI-12556
Commit: 07342bc6e4a0e9ba2b2f850f5d8cbf38a948b50c
Parents: ac4f3d1
Author: Gaurav Nagar <gr...@gmail.com>
Authored: Mon Feb 20 15:40:41 2017 +0530
Committer: Gaurav Nagar <gr...@gmail.com>
Committed: Mon Feb 20 15:40:41 2017 +0530

----------------------------------------------------------------------
 .../ambari/view/OozieProxyImpersonator.java     | 192 ++++++++++---------
 .../apache/oozie/ambari/view/OozieUtils.java    |  18 ++
 .../org/apache/oozie/ambari/view/Utils.java     |  14 +-
 .../oozie/ambari/view/WorkflowFilesService.java |  22 ++-
 .../workflowmanager/WorkflowManagerService.java |   6 +-
 .../WorkflowsManagerResource.java               |   7 +-
 .../view/workflowmanager/WorkflowsRepo.java     |  40 +++-
 .../ui/app/components/bundle-config.js          |   4 +-
 .../resources/ui/app/components/coord-config.js |   4 +-
 .../ui/app/components/flow-designer.js          |  32 +---
 .../main/resources/ui/app/components/save-wf.js |  11 +-
 .../main/resources/ui/app/domain/workflow.js    |   1 +
 12 files changed, 213 insertions(+), 138 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/07342bc6/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 a119a7e..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
@@ -36,7 +36,6 @@ import javax.ws.rs.HttpMethod;
 import javax.ws.rs.POST;
 import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.Context;
@@ -68,26 +67,30 @@ import com.google.inject.Singleton;
 public class OozieProxyImpersonator {
   private final static Logger LOGGER = LoggerFactory
     .getLogger(OozieProxyImpersonator.class);
+  private static final boolean PROJ_MANAGER_ENABLED = true;
+  public static final String RESPONSE_TYPE = "response-type";
+  public static final String OLDER_FORMAT_DRAFT_INGORED = "olderFormatDraftIngored";
 
-  private ViewContext viewContext;
+  private final ViewContext viewContext;
   private final Utils utils = new Utils();
 
 
   private final HDFSFileUtils hdfsFileUtils;
   private final WorkflowFilesService workflowFilesService;
   private WorkflowManagerService workflowManagerService;
-  private static final boolean PROJ_MANAGER_ENABLED = true;
+
   private final OozieDelegate oozieDelegate;
   private final OozieUtils oozieUtils = new OozieUtils();
   private final AssetResource assetResource;
-  private  final AmbariIOUtil ambariIOUtil;
-  private static enum ErrorCodes {
+
+  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", "Worfklow 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;
 
@@ -104,7 +107,18 @@ public class OozieProxyImpersonator {
       return description;
     }
   }
+  private static enum WorkflowFormat{
+    XML("xml"),
+    DRAFT("draft");
+    String value;
+    WorkflowFormat(String value) {
+      this.value=value;
+    }
 
+    public String getValue() {
+      return value;
+    }
+  }
   @Inject
   public OozieProxyImpersonator(ViewContext viewContext) {
     this.viewContext = viewContext;
@@ -115,7 +129,6 @@ public class OozieProxyImpersonator {
     if (PROJ_MANAGER_ENABLED) {
       workflowManagerService = new WorkflowManagerService(viewContext);
     }
-    ambariIOUtil=new AmbariIOUtil(viewContext);
 
     LOGGER.info(String.format(
       "OozieProxyImpersonator initialized for instance: %s",
@@ -158,6 +171,16 @@ public class OozieProxyImpersonator {
     return Response.ok(viewContext.getUsername()).build();
   }
 
+  @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();
+  }
+
   @POST
   @Path("/submitJob")
   @Consumes({MediaType.TEXT_PLAIN + "," + MediaType.TEXT_XML})
@@ -176,67 +199,64 @@ public class OozieProxyImpersonator {
   @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("description") String description,
-                               @QueryParam("projectId") String projectId, @QueryParam("jobType") String jobType,
+                               @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 RuntimeException("app path can't be empty.");
     }
-
-    JobType deducedJobType = oozieUtils.deduceJobType(postBody);
-    appPath = workflowFilesService.getWorkflowFileName(appPath.trim(),deducedJobType);
-
+    JobType jobType = StringUtils.isEmpty(jobTypeStr) ? JobType.WORKFLOW : JobType.valueOf(jobTypeStr);
+    String workflowFilePath = workflowFilesService.getWorkflowFileName(appPath.trim(), jobType);
     if (!overwrite) {
-      boolean fileExists = hdfsFileUtils.fileExists(appPath);
+      boolean fileExists = hdfsFileUtils.fileExists(workflowFilePath);
       if (fileExists) {
         return getFileExistsResponse();
       }
     }
 
-    postBody = utils.formatXml(postBody);
     try {
-      String filePath = workflowFilesService.createFile(appPath,
-        postBody, overwrite);
-      LOGGER.info(String.format(
-        "submit workflow job done. filePath=[%s]", filePath));
+      if (utils.isXml(postBody)) {
+        saveWorkflowXml(jobType, appPath, postBody, overwrite);
+      } else {
+        saveDraft(jobType, appPath, postBody, overwrite);
+      }
       if (PROJ_MANAGER_ENABLED) {
-        String workflowName = oozieUtils.deduceWorkflowNameFromXml(postBody);
-        workflowManagerService.saveWorkflow(projectId, appPath,
-          deducedJobType, description,
-          viewContext.getUsername(), workflowName);
+        workflowManagerService.saveWorkflow(null, workflowFilePath,
+          jobType, null,
+          viewContext.getUsername(), getWorkflowName(postBody));
       }
-
-      return Response.ok().build();
-    } catch (Exception ex) {
-      LOGGER.error(ex.getMessage(), ex);
+    } catch (IOException ex) {
       return getRespCodeForException(ex);
+    }
 
+    return Response.ok().build();
+  }
+  private String getWorkflowName(String postBody){
+    if (utils.isXml(postBody)) {
+      return oozieUtils.deduceWorkflowNameFromXml(postBody);
+    }else{
+      return oozieUtils.deduceWorkflowNameFromJson(postBody);
     }
   }
 
-  @POST
-  @Path("/saveWorkflowDraft")
-  @Consumes({MediaType.TEXT_PLAIN + "," + MediaType.TEXT_XML})
-  public Response saveDraft(String postBody, @Context HttpHeaders headers,
-                            @Context UriInfo ui, @QueryParam("app.path") String appPath,
-                            @QueryParam("projectId") String projectId, @QueryParam("description") String description,
-                            @DefaultValue("false") @QueryParam("overwrite") Boolean overwrite, @QueryParam("jobType") String jobTypeStr)
-    throws IOException {
-    LOGGER.info("save workflow  called");
-    if (StringUtils.isEmpty(appPath)) {
-      throw new RuntimeException("app path can't be empty.");
-    }
-    JobType jobType = StringUtils.isEmpty(jobTypeStr) ? JobType.WORKFLOW : JobType.valueOf(jobTypeStr);
-    appPath = workflowFilesService.getWorkflowDraftFileName(appPath.trim(),jobType);
+  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);
-    if (PROJ_MANAGER_ENABLED) {
-      String name = oozieUtils.deduceWorkflowNameFromJson(postBody);
-      workflowManagerService.saveWorkflow(projectId, appPath,
-        jobType, description,
-        viewContext.getUsername(), name);
+    String workflowDraftPath = workflowFilesService.getWorkflowDraftFileName(appPath.trim(), jobType);
+    if (hdfsFileUtils.fileExists(workflowDraftPath)) {
+      hdfsFileUtils.deleteFile(workflowDraftPath);
     }
-    return Response.ok().build();
+  }
+
+  private void saveDraft(JobType jobType, String appPath, String postBody, Boolean overwrite) throws IOException {
+    String workflowFilePath = workflowFilesService.getWorkflowFileName(appPath.trim(), jobType);
+    if (!hdfsFileUtils.fileExists(workflowFilePath)) {
+      String noOpWorkflow = oozieUtils.getNoOpWorkflowXml(postBody, jobType);
+      workflowFilesService.createFile(workflowFilePath, noOpWorkflow, overwrite);
+    }
+    String workflowDraftPath = workflowFilesService.getWorkflowDraftFileName(appPath.trim(), jobType);
+    workflowFilesService.createFile(workflowDraftPath, postBody, true);
   }
 
   @POST
@@ -415,30 +435,40 @@ public class OozieProxyImpersonator {
   }
 
   @GET
-  @Path("/readWorkflowDetail")
-  public Response getWorkflowDetail(
-    @QueryParam("workflowXmlPath") String workflowPath) {
-    WorkflowFileInfo workflowDetails = workflowFilesService
-      .getWorkflowDetails(workflowPath, null);
-    return Response.ok(workflowDetails).build();
-  }
-
-  @GET
   @Path("/readWorkflow")
   public Response readWorkflow(
-    @QueryParam("workflowPath") String workflowPath,@QueryParam("jobType") String jobTypeStr) {
-    WorkflowFileInfo workflowDetails = workflowFilesService
-      .getWorkflowDetails(workflowPath,JobType.valueOf(jobTypeStr));
-    String filePath;
-    String responseType;
+    @QueryParam("workflowPath") String workflowPath, @QueryParam("jobType") String 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();
+    }
 
-    if (workflowPath.endsWith(Constants.WF_DRAFT_EXTENSION) || workflowDetails.getIsDraftCurrent()){
-      filePath=workflowFilesService.getWorkflowDraftFileName(workflowPath,JobType.valueOf(jobTypeStr));
-      responseType="draft";
-    }else{
-      filePath=workflowFilesService.getWorkflowFileName(workflowPath,JobType.valueOf(jobTypeStr));
-      responseType="xml";
+    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)) {
+          filePath = workflowFilesService.getWorkflowFileName(workflowPath, JobType.valueOf(jobTypeStr));
+          return getWorkflowResponse(filePath, WorkflowFormat.XML.getValue(), true);
+        } else {
+          return Response.ok(stringResponse).header(RESPONSE_TYPE, WorkflowFormat.DRAFT.getValue()).build();
+        }
+      } catch (IOException e) {
+        return getRespCodeForException(e);
+      }
+    } 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) {
     try {
       final InputStream is = workflowFilesService
         .readWorkflowXml(filePath);
@@ -451,7 +481,11 @@ public class OozieProxyImpersonator {
           os.close();
         }
       };
-      return Response.ok(streamer).header("response-type",responseType).status(200).build();
+      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);
     }
@@ -497,28 +531,6 @@ public class OozieProxyImpersonator {
   }
 
   @GET
-  @Path("/getDag")
-  @Produces("image/png")
-  public Response getDag(@Context HttpHeaders headers,
-                         @Context UriInfo ui, @QueryParam("jobid") String jobid) {
-    Map<String, String> newHeaders = utils.getHeaders(headers);
-    final InputStream is = oozieDelegate.readFromOozie(headers,
-      oozieDelegate.getDagUrl(jobid), HttpMethod.GET, null,
-      newHeaders);
-    StreamingOutput streamer = new StreamingOutput() {
-      @Override
-      public void write(OutputStream os) throws IOException,
-        WebApplicationException {
-        IOUtils.copy(is, os);
-        is.close();
-        os.close();
-      }
-
-    };
-    return Response.ok(streamer).status(200).build();
-  }
-
-  @GET
   @Path("/{path: .*}")
   public Response handleGet(@Context HttpHeaders headers, @Context UriInfo ui) {
     try {

http://git-wip-us.apache.org/repos/asf/ambari/blob/07342bc6/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/OozieUtils.java
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/OozieUtils.java b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/OozieUtils.java
index 9791c47..83affd3 100644
--- a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/OozieUtils.java
+++ b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/OozieUtils.java
@@ -106,6 +106,10 @@ public class OozieUtils {
     String name = jsonElement.getAsJsonObject().get("name").getAsString();
     return name;
   }
+  public String deduceWorkflowSchemaVersionFromJson(String json) {
+    JsonElement jsonElement = new JsonParser().parse(json);
+    return jsonElement.getAsJsonObject().get("xmlns").getAsString();
+  }
 
   public String deduceWorkflowNameFromXml(String xml) {
     try {
@@ -172,4 +176,18 @@ public class OozieUtils {
       throw new RuntimeException(e);
     }
   }
+
+  public String getNoOpWorkflowXml(String json,JobType jobType) {
+    String schema=deduceWorkflowSchemaVersionFromJson(json);
+    String name=deduceWorkflowNameFromJson(json);
+    switch (jobType){
+      case WORKFLOW:
+        return String.format("<workflow-app xmlns=\"%s\" name=\"%s\"><start to=\"end\"/><end name=\"end\"/></workflow-app>",schema,name);
+      case COORDINATOR:
+        return String.format("<coordinator-app xmlns=\"%s\" name=\"%s\"></coordinator-app>",schema,name);
+      case BUNDLE:
+        return String.format("<bundle-app xmlns=\"%s\" name=\"%s\"></bundle-app>",schema,name);
+    }
+    return null;
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/07342bc6/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/Utils.java
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/Utils.java b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/Utils.java
index 61d878e..0b9adda 100644
--- a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/Utils.java
+++ b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/Utils.java
@@ -52,8 +52,9 @@ public class Utils {
 	private static final String XML_INDENT_AMT_PROP_NAME = "{http://xml.apache.org/xslt}indent-amount";
 	private final static Logger LOGGER = LoggerFactory
 			.getLogger(Utils.class);
+	private final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 	public String formatXml(String xml) {
-		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+
 		try {
 			DocumentBuilder db = dbf.newDocumentBuilder();
 			StreamResult result = new StreamResult(new StringWriter());
@@ -151,4 +152,15 @@ public class Utils {
 	}
 
 
+  public boolean isXml(String postBody) {
+		try {
+			DocumentBuilder db = dbf.newDocumentBuilder();
+			InputSource is = new InputSource();
+			is.setCharacterStream(new StringReader(postBody));
+			Document doc = db.parse(is);
+			return true;
+		} catch (Exception e) {
+			return false;
+		}
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/07342bc6/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/WorkflowFilesService.java
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/WorkflowFilesService.java b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/WorkflowFilesService.java
index 24c263b..cdf4e99 100644
--- a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/WorkflowFilesService.java
+++ b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/WorkflowFilesService.java
@@ -20,6 +20,8 @@ package org.apache.oozie.ambari.view;
 import java.io.IOException;
 import java.io.InputStream;
 
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParser;
 import org.apache.hadoop.fs.FileStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -28,6 +30,7 @@ public class WorkflowFilesService {
   private final static Logger LOGGER = LoggerFactory
           .getLogger(WorkflowFilesService.class);
   private HDFSFileUtils hdfsFileUtils;
+  private String currentDraftVersion="v1";
 
   public WorkflowFilesService(HDFSFileUtils hdfsFileUtils) {
     super();
@@ -118,8 +121,13 @@ public class WorkflowFilesService {
     if (appPath.endsWith(Constants.WF_ASSET_EXTENSION)) {
       assetFile = appPath;
     } else {
-      assetFile = appPath + (appPath.endsWith("/") ? "" : "/")
-              + Constants.DEFAULT_WORKFLOW_ASSET_FILENAME;
+      String[] paths=appPath.split("/");
+      if (paths[paths.length-1].contains(".")){
+        return appPath;
+      }else{
+        assetFile = appPath + (appPath.endsWith("/") ? "" : "/")
+          + Constants.DEFAULT_WORKFLOW_ASSET_FILENAME;
+      }
     }
     return assetFile;
   }
@@ -144,6 +152,7 @@ public class WorkflowFilesService {
               .getFileStatus(appPath);
       workflowInfo.setWorkflowModificationTime(workflowFileStatus
               .getModificationTime());
+
     }
     if (draftExists) {
       FileStatus draftFileStatus = hdfsFileUtils
@@ -167,4 +176,13 @@ public class WorkflowFilesService {
     }
   }
 
+  public boolean isDraftFormatCurrent(String json) {
+    JsonElement jsonElement = new JsonParser().parse(json);
+    JsonElement draftVersion = jsonElement.getAsJsonObject().get("draftVersion");
+    if (draftVersion != null && currentDraftVersion.equals(draftVersion.getAsString().trim())) {
+      return true;
+    } else {
+      return false;
+    }
+  }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/07342bc6/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/workflowmanager/WorkflowManagerService.java
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/workflowmanager/WorkflowManagerService.java b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/workflowmanager/WorkflowManagerService.java
index fc08b80..dcb82ac 100644
--- a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/workflowmanager/WorkflowManagerService.java
+++ b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/workflowmanager/WorkflowManagerService.java
@@ -53,7 +53,7 @@ public class WorkflowManagerService {
 
     } else {
       String workflowFileName = workflowFilesService.getWorkflowFileName(path, jobType);
-      Workflow workflowByPath = workflowsRepository.getWorkflowByPath(workflowFileName);
+      Workflow workflowByPath = workflowsRepository.getWorkflowByPath(workflowFileName,userName);
       if (workflowByPath != null) {
         setWorkflowAttributes(jobType, userName, name, workflowByPath);
         workflowsRepository.update(workflowByPath);
@@ -74,8 +74,8 @@ public class WorkflowManagerService {
     wf.setType(jobType.name());
   }
 
-  public Collection<Workflow> getAllWorkflows() {
-    return workflowsRepository.findAll();
+  public Collection<Workflow> getAllWorkflows(String username) {
+    return workflowsRepository.getWorkflows(username);
   }
 
   public void deleteWorkflow(String projectId, Boolean deleteDefinition) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/07342bc6/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 7513107..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
@@ -30,17 +30,18 @@ import javax.ws.rs.QueryParam;
 import org.apache.ambari.view.ViewContext;
 
 public class WorkflowsManagerResource {
-	private WorkflowManagerService workflowManagerService;
-	
+	private final WorkflowManagerService workflowManagerService;
+	private final ViewContext viewContext;
 	public WorkflowsManagerResource(ViewContext viewContext) {
 		super();
+		this.viewContext=viewContext;
 		this.workflowManagerService=new WorkflowManagerService(viewContext);
 	}
 
 	@GET
 	public Map<String,Object> getWorkflows(){
 	    HashMap<String,Object> result=new HashMap<>();
-	    result.put("wfprojects", workflowManagerService.getAllWorkflows());
+	    result.put("wfprojects", workflowManagerService.getAllWorkflows(viewContext.getUsername()));
 	    return result;
 	}
 	

http://git-wip-us.apache.org/repos/asf/ambari/blob/07342bc6/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/workflowmanager/WorkflowsRepo.java
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/workflowmanager/WorkflowsRepo.java b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/workflowmanager/WorkflowsRepo.java
index 1fc0c5f..b0fb905 100644
--- a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/workflowmanager/WorkflowsRepo.java
+++ b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/workflowmanager/WorkflowsRepo.java
@@ -24,7 +24,9 @@ import org.apache.oozie.ambari.view.workflowmanager.model.Workflow;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 
 public class WorkflowsRepo extends BaseRepo<Workflow> {
   private final static Logger LOGGER = LoggerFactory
@@ -33,21 +35,47 @@ public class WorkflowsRepo extends BaseRepo<Workflow> {
     super(Workflow.class, dataStore);
 
   }
+  public Collection<Workflow> getWorkflows(String userName){
+    try {
+      Collection<Workflow> workflows = this.dataStore.findAll(Workflow.class,
+        "owner='" + userName + "'");
+      return  workflows;
+    } catch (PersistenceException e) {
+      throw new RuntimeException(e);
+    }
+  }
 
-  public Workflow getWorkflowByPath(String path) {
+  public Workflow getWorkflowByPath(String path, String userName) {
     try {
       Collection<Workflow> workflows = this.dataStore.findAll(Workflow.class,
-              "workflowDefinitionPath='" + path + "'");
+        "workflowDefinitionPath='" + path + "'");
       if (workflows == null || workflows.isEmpty()) {
         return null;
-      } else if (workflows.size() > 1) {
-        LOGGER.error("Duplicate workflows found having same path");
-        throw new RuntimeException("Duplicate workflows");
       } else {
-        return workflows.iterator().next();
+        List<Workflow> myWorkflows = filterWorkflows(workflows, userName, true);
+        if (myWorkflows.isEmpty()) {
+          return null;
+        } else if (myWorkflows.size() == 1) {
+          return myWorkflows.get(0);
+        } else {
+          LOGGER.error("Duplicate workflows found having same path");
+          throw new RuntimeException("Duplicate workflows. Remove one in Recent Workflows Manager");
+        }
       }
     } catch (PersistenceException e) {
       throw new RuntimeException(e);
     }
   }
+
+  private List<Workflow> filterWorkflows(Collection<Workflow> workflows,String userName,boolean matches ) {
+    List<Workflow> filteredWorkflows = new ArrayList<>();
+    for (Workflow wf : workflows) {
+      if (matches && userName.equals(wf.getOwner())) {
+        filteredWorkflows.add(wf);
+      } else if (!matches && !userName.equals(wf.getOwner())) {
+        filteredWorkflows.add(wf);
+      }
+    }
+    return filteredWorkflows;
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/07342bc6/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 db7a180..9201d5c 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
@@ -123,7 +123,9 @@ export default Ember.Component.extend(Ember.Evented, Validations, {
       coordinators : null,
       schemaVersions : {
         bundleVersion : this.get('schemaVersions').getDefaultVersion('bundle')
-      }
+      },
+      xmlns : "uri:oozie:bundle:" +this.get('schemaVersions').getDefaultVersion('bundle'),
+      draftVersion: 'v1'
     });
   },
   importSampleBundle (){

http://git-wip-us.apache.org/repos/asf/ambari/blob/07342bc6/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 369481f..c7da381 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
@@ -223,7 +223,9 @@ export default Ember.Component.extend(Validations, Ember.Evented, {
       slainfo : SlaInfo.create({}),
       schemaVersions : {
         coordinatorVersion : this.get('schemaVersions').getDefaultVersion('coordinator')
-      }
+      },
+      xmlns : "uri:oozie:coordinator:" +this.get('schemaVersions').getDefaultVersion('coordinator'),
+      draftVersion: 'v1'
     });
   },
   importSampleCoordinator (){

http://git-wip-us.apache.org/repos/asf/ambari/blob/07342bc6/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 29c9dd2..c1bd4be 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
@@ -145,31 +145,7 @@ export default Ember.Component.extend(FindNodeMixin, Validations, {
   },
 
   importWorkflowFromProjManager(path){
-      var self = this;
-      this.set("showingFileBrowser",false);
-      if(path){
-        self.set("isWorkflowImporting", true);
-        this.isDraftExists(path).promise.then(function(data){
-          var draftData = JSON.parse(data);
-          if(draftData.draftExists && draftData.isDraftCurrent) {
-              self.set("workflowFilePath", path);
-              self.getDraftWorkflowData(path).promise.then(function(data){
-                var workflowImporter = WorkflowJsonImporter.create({});
-                var workflow = workflowImporter.importWorkflow(data);
-                self.resetDesigner();
-                self.set("workflow", workflow);
-                self.initAndRenderWorkflow();
-                self.set("isWorkflowImporting", false);
-                self.doValidation();
-              }.bind(this)).catch(function(data){
-              });
-          } else {
-            self.importWorkflow(path);
-          }
-        }.bind(this)).catch(function(e){
-          console.error(e);
-        });
-      }
+    this.importWorkflow(path);
   },
 
   observeXmlAppPath : Ember.observer('xmlAppPath', function(){
@@ -376,6 +352,7 @@ export default Ember.Component.extend(FindNodeMixin, Validations, {
     var workflow=workflowImporter.importWorkflow(data);
     this.resetDesigner();
     this.set("workflow", workflow);
+    this.initAndRenderWorkflow();
     this.rerender();
     this.doValidation();
   },
@@ -453,7 +430,9 @@ export default Ember.Component.extend(FindNodeMixin, Validations, {
     var actionNodeType = Object.keys(actionNodeXml)[0];
     var currentTransition = this.get("currentTransition.transition");
     this.createSnapshot();
-    var actionNode = this.get("workflow").addNode(this.findTransition(this.get("workflow").startNode, currentTransition.sourceNodeId, currentTransition.targetNode.id),actionNodeType);
+    var transition = this.get("currentTransition").source.transitions.findBy('targetNode.id',currentTransition.targetNode.id);
+    transition.source=this.get("currentTransition").source;
+    var actionNode = this.get("workflow").addNode(transition,actionNodeType);
     this.rerender();
     this.doValidation();
     this.scrollToNewPosition();
@@ -714,6 +693,7 @@ export default Ember.Component.extend(FindNodeMixin, Validations, {
     }, 1000);
   },
   openSaveWorkflow() {
+    this.get('workflowContext').clearErrors();
     if(Ember.isBlank(this.$('[name=wf_title]').val())) {
       this.set('errors',[{"message":"Workflow name is mandatory"}]);
       return;

http://git-wip-us.apache.org/repos/asf/ambari/blob/07342bc6/contrib/views/wfmanager/src/main/resources/ui/app/components/save-wf.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/save-wf.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/save-wf.js
index 75cdaf9..17ee0fd 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/components/save-wf.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/save-wf.js
@@ -17,6 +17,7 @@
 
 import Ember from 'ember';
 import { validator, buildValidations } from 'ember-cp-validations';
+import CommonUtils from "../utils/common-utils";
 
 const Validations = buildValidations({
   'filePath': validator('presence', {
@@ -83,11 +84,11 @@ export default Ember.Component.extend(Validations, {
     }
   },
   saveJob(){
-    var url = Ember.ENV.API_URL + "/saveWorkflowDraft?app.path=" + this.get("filePath") + "&overwrite=" + this.get("overwritePath") + "&jobType="+this.get('displayName').toUpperCase();
-    this.saveWfJob(url, this.get("jobJson"));
-    if(!this.get('isDraft')){
-       url = Ember.ENV.API_URL + "/saveWorkflow?app.path=" + this.get("filePath") + "&overwrite=" + this.get("overwritePath");
-       this.saveWfJob(url, this.get("jobXml"));
+    var url = Ember.ENV.API_URL + "/saveWorkflow?app.path=" + this.get("filePath") + "&overwrite=" + this.get("overwritePath") + "&jobType="+this.get('displayName').toUpperCase();
+    if(this.get('isDraft')){
+       this.saveWfJob(url, this.get("jobJson"));
+    } else {
+      this.saveWfJob(url, this.get("jobXml"));
     }
   },
   saveWfJob(url, workflowData) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/07342bc6/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow.js b/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow.js
index 26e72d5..a563c20 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow.js
@@ -38,6 +38,7 @@ var Workflow= Ember.Object.extend(FindNodeMixin,{
     var schemaVersions=SchemaVersions.create({});
     this.schemaVersions = {};
     this.schemaVersions.workflowVersion = schemaVersions.getDefaultVersion('workflow');
+    this.set("xmlns","uri:oozie:workflow:"+this.schemaVersions.workflowVersion);
     var actionsMap = new Map();
     Constants.actions.forEach((action)=>{
       if(action.supportsSchema){