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

ambari git commit: AMBARI-19674. Asset Manager import and validation issues (Madhan Mohan Reddy via pallavkul)

Repository: ambari
Updated Branches:
  refs/heads/trunk a6fd5cb04 -> 74aff7c64


AMBARI-19674. Asset Manager import and validation issues (Madhan Mohan Reddy via pallavkul)


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

Branch: refs/heads/trunk
Commit: 74aff7c645c987b692188e0a48e627896e6cf70a
Parents: a6fd5cb
Author: pallavkul <pa...@gmail.com>
Authored: Mon Jan 23 18:23:57 2017 +0530
Committer: pallavkul <pa...@gmail.com>
Committed: Mon Jan 23 18:23:57 2017 +0530

----------------------------------------------------------------------
 .../org/apache/oozie/ambari/view/Constants.java | 16 +++--
 .../apache/oozie/ambari/view/HDFSFileUtils.java | 19 ++++++
 .../ambari/view/OozieProxyImpersonator.java     | 40 ++++++++++-
 .../oozie/ambari/view/WorkflowFilesService.java | 70 ++++++++++++--------
 .../oozie/ambari/view/assets/AssetRepo.java     | 10 +++
 .../oozie/ambari/view/assets/AssetResource.java |  7 ++
 .../oozie/ambari/view/assets/AssetService.java  |  4 ++
 .../workflowmanager/WorkflowManagerService.java | 46 ++++++-------
 .../view/workflowmanager/WorkflowsRepo.java     | 19 +++++-
 .../resources/ui/app/components/asset-config.js | 18 ++++-
 .../resources/ui/app/components/asset-list.js   | 20 +++++-
 .../ui/app/components/asset-manager.js          | 51 ++++++++++++--
 .../ui/app/components/designer-workspace.js     | 23 +------
 .../ui/app/components/flow-designer.js          | 59 ++++++++---------
 .../resources/ui/app/services/asset-manager.js  | 19 ++++++
 .../src/main/resources/ui/app/styles/app.less   |  4 ++
 .../app/templates/components/asset-config.hbs   |  8 +++
 .../ui/app/templates/components/asset-list.hbs  | 12 +++-
 .../app/templates/components/asset-manager.hbs  | 26 +++++++-
 .../templates/components/designer-workspace.hbs |  2 +-
 .../app/templates/components/flow-designer.hbs  |  4 +-
 21 files changed, 347 insertions(+), 130 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/74aff7c6/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/Constants.java
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/Constants.java b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/Constants.java
index 238b002..f7c1936 100644
--- a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/Constants.java
+++ b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/Constants.java
@@ -17,9 +17,15 @@
  */
 package org.apache.oozie.ambari.view;
 
-public class Constants {
-  public static final String STATUS_FAILED = "failed";
-  public static final String STATUS_OK = "ok";
-  public static final String STATUS_KEY = "status";
-  public static final String MESSAGE_KEY = "message";
+public interface Constants {
+  String STATUS_FAILED = "failed";
+  String STATUS_OK = "ok";
+  String STATUS_KEY = "status";
+  String MESSAGE_KEY = "message";
+  String WF_DRAFT_EXTENSION = ".wfdraft";
+  String WF_EXTENSION = ".xml";
+  String DEFAULT_WORKFLOW_FILENAME="workflow.xml";
+  String DEFAULT_DRAFT_FILENAME="workflow"+WF_DRAFT_EXTENSION;
+  String WF_ASSET_EXTENSION = ".wfasset";
+  String DEFAULT_WORKFLOW_ASSET_FILENAME="asset"+WF_ASSET_EXTENSION;
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/74aff7c6/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/HDFSFileUtils.java
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/HDFSFileUtils.java b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/HDFSFileUtils.java
index 53b43f9..d06eb07 100644
--- a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/HDFSFileUtils.java
+++ b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/HDFSFileUtils.java
@@ -19,6 +19,7 @@ package org.apache.oozie.ambari.view;
 
 import com.google.common.base.Optional;
 import org.apache.ambari.view.ViewContext;
+import org.apache.ambari.view.commons.hdfs.UserService;
 import org.apache.ambari.view.commons.hdfs.ViewPropertyHelper;
 import org.apache.ambari.view.utils.hdfs.HdfsApi;
 import org.apache.ambari.view.utils.hdfs.HdfsUtil;
@@ -30,6 +31,7 @@ import org.slf4j.LoggerFactory;
 
 import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.util.HashMap;
 import java.util.Map;
 
 public class HDFSFileUtils {
@@ -118,5 +120,22 @@ public class HDFSFileUtils {
 		}
 
 	}
+	public boolean hdfsCheck()  {
+		try {
+			getHdfsgetApi().getStatus();
+			return true;
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		}
+	}
 
+	public boolean homeDirCheck(){
+		UserService userservice = new UserService(viewContext, getViewConfigs(viewContext));
+		userservice.homeDir();
+		return true;
+	}
+	private Map<String,String> getViewConfigs(ViewContext context) {
+		Optional<Map<String, String>> props = ViewPropertyHelper.getViewConfigs(context, VIEW_CONF_KEYVALUES);
+		return props.isPresent()? props.get() : new HashMap<String, String>();
+	}
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/74aff7c6/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 7596de0..d029c39 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
@@ -122,6 +122,16 @@ public class OozieProxyImpersonator {
       viewContext.getInstanceName()));
 
   }
+  @Path("hdfsCheck")
+  public Response hdfsCheck(){
+    hdfsFileUtils.hdfsCheck();
+    return Response.ok().build();
+  }
+  @Path("homeDirCheck")
+  public Response homeDirCheck(){
+    hdfsFileUtils.homeDirCheck();
+    return Response.ok().build();
+  }
 
   @Path("/fileServices")
   public FileServices fileServices() {
@@ -210,7 +220,7 @@ public class OozieProxyImpersonator {
     if (StringUtils.isEmpty(appPath)) {
       throw new RuntimeException("app path can't be empty.");
     }
-    appPath = workflowFilesService.getWorkflowDrafFileName(appPath.trim());
+    appPath = workflowFilesService.getWorkflowDraftFileName(appPath.trim());
     workflowFilesService.createFile(appPath, postBody, overwrite);
     if (PROJ_MANAGER_ENABLED) {
       JobType jobType = StringUtils.isEmpty(jobTypeStr) ? JobType.WORKFLOW : JobType.valueOf(jobTypeStr);
@@ -263,6 +273,30 @@ public class OozieProxyImpersonator {
       return getRespCodeForException(ex);
     }
   }
+  @GET
+  @Path("/readAsset")
+  public Response readAsset(
+          @QueryParam("assetPath") String assetPath) {
+    if (StringUtils.isEmpty(assetPath)) {
+      throw new RuntimeException("assetPath can't be empty.");
+    }
+    try {
+      final InputStream is = workflowFilesService
+              .readAssset(assetPath);
+      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();
+    } catch (IOException e) {
+      return getRespCodeForException(e);
+    }
+  }
 
 
   @GET
@@ -375,7 +409,7 @@ public class OozieProxyImpersonator {
 
   @GET
   @Path("/readWorkflowDetail")
-  public Response isDraftAvailable(
+  public Response getWorkflowDetail(
     @QueryParam("workflowXmlPath") String workflowPath) {
     WorkflowFileInfo workflowDetails = workflowFilesService
       .getWorkflowDetails(workflowPath);
@@ -384,7 +418,7 @@ public class OozieProxyImpersonator {
 
   @GET
   @Path("/readWorkflowXml")
-  public Response readWorkflowXxml(
+  public Response readWorkflowXml(
     @QueryParam("workflowXmlPath") String workflowPath) {
     if (StringUtils.isEmpty(workflowPath)) {
       throw new RuntimeException("workflowXmlPath can't be empty.");

http://git-wip-us.apache.org/repos/asf/ambari/blob/74aff7c6/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 d8bf9ff..289e68b 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
@@ -26,7 +26,7 @@ import org.slf4j.LoggerFactory;
 
 public class WorkflowFilesService {
   private final static Logger LOGGER = LoggerFactory
-    .getLogger(WorkflowFilesService.class);
+          .getLogger(WorkflowFilesService.class);
   private HDFSFileUtils hdfsFileUtils;
 
   public WorkflowFilesService(HDFSFileUtils hdfsFileUtils) {
@@ -35,86 +35,104 @@ public class WorkflowFilesService {
   }
 
   public String createFile(String appPath, String content,
-                                   boolean overwrite) throws IOException {
+                           boolean overwrite) throws IOException {
     return hdfsFileUtils.writeToFile(appPath, content,
-      overwrite);
+            overwrite);
   }
 
   public String createAssetFile(String appPath, String content,
                                 boolean overwrite) throws IOException {
     return hdfsFileUtils.writeToFile(appPath, content,
-      overwrite);
+            overwrite);
   }
 
   public InputStream readDraft(String appPath) throws IOException {
-    return hdfsFileUtils.read(getWorkflowDrafFileName(appPath));
+    return hdfsFileUtils.read(getWorkflowDraftFileName(appPath));
   }
 
   public InputStream readWorkflowXml(String appPath) throws IOException {
     return hdfsFileUtils.read(getWorkflowFileName(appPath));
   }
 
-  public String getWorkflowDrafFileName(String appPath) {
-    if (appPath.endsWith(".draft.json")){
+  public InputStream readAssset(String assetPath) throws IOException {
+    return hdfsFileUtils.read(getAssetFileName(assetPath));
+  }
+
+  public String getWorkflowDraftFileName(String appPath) {
+    if (appPath.endsWith(Constants.WF_DRAFT_EXTENSION)) {
       return appPath;
-    }else{
-      return getWorkflowFileName(appPath).concat(".draft.json");
+    } else if (appPath.endsWith(Constants.WF_EXTENSION)) {
+      String folderPath = appPath.substring(0, appPath.lastIndexOf(Constants.WF_EXTENSION));
+      return folderPath + Constants.WF_DRAFT_EXTENSION;
+    } else if (appPath.endsWith("/")) {
+      return appPath + Constants.DEFAULT_DRAFT_FILENAME;
+    } else {
+      return appPath + "/" + Constants.DEFAULT_DRAFT_FILENAME;
     }
   }
 
   public String getWorkflowFileName(String appPath) {
-    String workflowFile = null;
-    if (appPath.endsWith(".xml")) {
-      workflowFile = appPath;
+    if (appPath.endsWith(Constants.WF_EXTENSION)) {
+      return appPath;
+    } else if (appPath.endsWith(Constants.WF_DRAFT_EXTENSION)) {
+      String folderPath = appPath.substring(0, appPath.lastIndexOf(Constants.WF_DRAFT_EXTENSION));
+      return folderPath + Constants.WF_EXTENSION;
+    } else if (appPath.endsWith("/")) {
+      return appPath + Constants.DEFAULT_WORKFLOW_FILENAME;
     } else {
-      workflowFile = appPath + (appPath.endsWith("/") ? "" : "/")
-        + "workflow.xml";
+      return appPath + "/" + Constants.DEFAULT_WORKFLOW_FILENAME;
     }
-    return workflowFile;
   }
 
   public String getAssetFileName(String appPath) {
     String assetFile = null;
-    if (appPath.endsWith(".xml")) {
+    if (appPath.endsWith(Constants.WF_ASSET_EXTENSION)) {
       assetFile = appPath;
     } else {
       assetFile = appPath + (appPath.endsWith("/") ? "" : "/")
-        + "asset.xml";
+              + Constants.DEFAULT_WORKFLOW_ASSET_FILENAME;
     }
     return assetFile;
   }
 
   public void discardDraft(String workflowPath) throws IOException {
-    hdfsFileUtils.deleteFile(getWorkflowDrafFileName(workflowPath));
-
+    hdfsFileUtils.deleteFile(getWorkflowDraftFileName(workflowPath));
   }
 
   public WorkflowFileInfo getWorkflowDetails(String appPath) {
     WorkflowFileInfo workflowInfo = new WorkflowFileInfo();
     workflowInfo.setWorkflowPath(getWorkflowFileName(appPath));
     boolean draftExists = hdfsFileUtils
-      .fileExists(getWorkflowDrafFileName(appPath));
+            .fileExists(getWorkflowDraftFileName(appPath));
     workflowInfo.setDraftExists(draftExists);
     boolean workflowExists = hdfsFileUtils.fileExists(getWorkflowFileName(appPath));
     FileStatus workflowFileStatus = null;
     if (workflowExists) {
       workflowFileStatus = hdfsFileUtils
-        .getFileStatus(getWorkflowFileName(appPath));
+              .getFileStatus(getWorkflowFileName(appPath));
       workflowInfo.setWorkflowModificationTime(workflowFileStatus
-        .getModificationTime());
+              .getModificationTime());
     }
     if (draftExists) {
       FileStatus draftFileStatus = hdfsFileUtils
-        .getFileStatus(getWorkflowDrafFileName(appPath));
+              .getFileStatus(getWorkflowDraftFileName(appPath));
       workflowInfo.setDraftModificationTime(draftFileStatus
-        .getModificationTime());
+              .getModificationTime());
       if (!workflowExists) {
         workflowInfo.setIsDraftCurrent(true);
       } else {
         workflowInfo.setIsDraftCurrent(draftFileStatus.getModificationTime()
-          - workflowFileStatus.getModificationTime() > 0);
+                - workflowFileStatus.getModificationTime() > 0);
       }
     }
     return workflowInfo;
   }
-}
+  public void deleteWorkflowFile(String fullWorkflowFilePath){
+    try {
+      hdfsFileUtils.deleteFile(fullWorkflowFilePath);
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/74aff7c6/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/assets/AssetRepo.java
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/assets/AssetRepo.java b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/assets/AssetRepo.java
index df936a4..6e9b7ee 100644
--- a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/assets/AssetRepo.java
+++ b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/assets/AssetRepo.java
@@ -36,4 +36,14 @@ public class AssetRepo extends BaseRepo<ActionAsset> {
       throw new RuntimeException(e);
     }
   }
+
+  public boolean assetNameAvailable(String name) {
+    try {
+      Collection<ActionAsset> assets=dataStore.findAll(ActionAsset.class, " name='" + name + "'");
+      boolean assetExists= assets!=null && !assets.isEmpty();
+      return !assetExists;
+    } catch (PersistenceException e) {
+      throw new RuntimeException(e);
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/74aff7c6/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 0622971..af86810 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
@@ -145,6 +145,13 @@ public class AssetResource {
   }
 
   @GET
+  @Path("/assetNameAvailable")
+  public Response assetNameAvailable(@QueryParam("name") String name){
+    boolean available=assetService.isAssetNameAvailable(name);
+    return Response.ok(available).build();
+  }
+
+  @GET
   @Path("/{id}")
   public Response getAssetDetail(@PathParam("id") String id) {
     try {

http://git-wip-us.apache.org/repos/asf/ambari/blob/74aff7c6/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/assets/AssetService.java
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/assets/AssetService.java b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/assets/AssetService.java
index 9fe2f9c..4bac2cd 100644
--- a/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/assets/AssetService.java
+++ b/contrib/views/wfmanager/src/main/java/org/apache/oozie/ambari/view/assets/AssetService.java
@@ -112,4 +112,8 @@ public class AssetService {
   public Collection<ActionAsset> getMyAssets() {
     return assetRepo.getMyAsets(viewContext.getUsername());
   }
+
+  public boolean isAssetNameAvailable(String name) {
+    return assetRepo.assetNameAvailable(name);
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/74aff7c6/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 afdee9e..7ce6081 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
@@ -17,26 +17,26 @@
  */
 package org.apache.oozie.ambari.view.workflowmanager;
 
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Date;
-
 import org.apache.ambari.view.ViewContext;
 import org.apache.oozie.ambari.view.HDFSFileUtils;
 import org.apache.oozie.ambari.view.JobType;
+import org.apache.oozie.ambari.view.WorkflowFilesService;
 import org.apache.oozie.ambari.view.workflowmanager.model.Workflow;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.Collection;
+
 public class WorkflowManagerService {
   private final static Logger LOGGER = LoggerFactory
-    .getLogger(WorkflowManagerService.class);
+          .getLogger(WorkflowManagerService.class);
   private final WorkflowsRepo workflowsRepository;
-  private final HDFSFileUtils hdfsFileUtils;
+  private final WorkflowFilesService workflowFilesService;
 
   public WorkflowManagerService(ViewContext viewContext) {
     workflowsRepository = new WorkflowsRepo(viewContext.getDataStore());
-    hdfsFileUtils = new HDFSFileUtils(viewContext);
+
+    workflowFilesService = new WorkflowFilesService(new HDFSFileUtils(viewContext));
   }
 
   public void saveWorkflow(String projectId, String path, JobType jobType,
@@ -46,16 +46,24 @@ public class WorkflowManagerService {
       Workflow workflowById = workflowsRepository.findById(projectId);
       if (workflowById == null) {
         throw new RuntimeException("could not find project with id :"
-          + projectId);
+                + projectId);
       }
       setWorkflowAttributes(jobType, userName, name, workflowById);
       workflowsRepository.update(workflowById);
+
     } else {
-      Workflow wf = new Workflow();
-      wf.setId(workflowsRepository.generateId());
-      setWorkflowAttributes(jobType, userName, name, wf);
-      wf.setWorkflowDefinitionPath(path);
-      workflowsRepository.create(wf);
+      String workflowFileName = workflowFilesService.getWorkflowFileName(path);
+      Workflow workflowByPath = workflowsRepository.getWorkflowByPath(workflowFileName);
+      if (workflowByPath!=null){
+        setWorkflowAttributes(jobType, userName, name, workflowByPath);
+        workflowsRepository.update(workflowByPath);
+      }else{
+        Workflow wf = new Workflow();
+        wf.setId(workflowsRepository.generateId());
+        setWorkflowAttributes(jobType, userName, name, wf);
+        wf.setWorkflowDefinitionPath(workflowFileName);
+        workflowsRepository.create(wf);
+      }
     }
   }
 
@@ -70,19 +78,11 @@ public class WorkflowManagerService {
     return workflowsRepository.findAll();
   }
 
-  public Workflow getWorkflowByPath(String path) {
-    return workflowsRepository.getWorkflowByPath(path);
-  }
-
   public void deleteWorkflow(String projectId, Boolean deleteDefinition) {
     Workflow workflow = workflowsRepository.findById(projectId);
     if (deleteDefinition) {
-      try {
-        hdfsFileUtils.deleteFile(workflow.getWorkflowDefinitionPath());
-      } catch (IOException e) {
-        throw new RuntimeException(e);
-      }
+      workflowFilesService.deleteWorkflowFile(workflow.getWorkflowDefinitionPath());
     }
     workflowsRepository.delete(workflow);
   }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/74aff7c6/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 7787bda..1fc0c5f 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
@@ -21,9 +21,14 @@ import org.apache.ambari.view.DataStore;
 import org.apache.ambari.view.PersistenceException;
 import org.apache.oozie.ambari.view.repo.BaseRepo;
 import org.apache.oozie.ambari.view.workflowmanager.model.Workflow;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
-public class WorkflowsRepo extends BaseRepo<Workflow> {
+import java.util.Collection;
 
+public class WorkflowsRepo extends BaseRepo<Workflow> {
+  private final static Logger LOGGER = LoggerFactory
+          .getLogger(WorkflowsRepo.class);
   public WorkflowsRepo(DataStore dataStore) {
     super(Workflow.class, dataStore);
 
@@ -31,8 +36,16 @@ public class WorkflowsRepo extends BaseRepo<Workflow> {
 
   public Workflow getWorkflowByPath(String path) {
     try {
-      return this.dataStore.find(Workflow.class,
-        "workflowDefinitionPath='" + path + "'");
+      Collection<Workflow> workflows = this.dataStore.findAll(Workflow.class,
+              "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();
+      }
     } catch (PersistenceException e) {
       throw new RuntimeException(e);
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/74aff7c6/contrib/views/wfmanager/src/main/resources/ui/app/components/asset-config.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/asset-config.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/asset-config.js
index dcfba34..62d3be3 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/components/asset-config.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/asset-config.js
@@ -24,6 +24,7 @@ const Validations = buildValidations({
 });
 
 export default Ember.Component.extend(Validations, {
+  assetManager : Ember.inject.service('asset-manager'),
   initialize: function(){
     this.$('#asset_config_dialog').modal('show');
     this.$('#asset_config_dialog').modal().on('hidden.bs.modal', function() {
@@ -39,8 +40,21 @@ export default Ember.Component.extend(Validations, {
         this.set('showErrorMessage', true);
         return;
       }
-      this.$('#asset_config_dialog').modal('hide');
-      this.sendAction('saveAssetConfig');
+      this.set("inProgress", true);
+      var assetNameAvailableDefered=this.get("assetManager").assetNameAvailable(this.get("assetModel.name"));
+      assetNameAvailableDefered.promise.then(function(data){
+        this.set("inProgress", false);
+        if (data === "false") {
+          this.set("assetErrorMsg", "Asset name already exists");
+          return;
+        } else {
+          this.$('#asset_config_dialog').modal('hide');
+          this.sendAction('saveAssetConfig');
+        }
+      }.bind(this)).catch(function(data){
+        model.set("inProgress", false);
+        return "There is some problem while checking asset name availability. Please try again.";
+      });
     }
   }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/74aff7c6/contrib/views/wfmanager/src/main/resources/ui/app/components/asset-list.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/asset-list.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/asset-list.js
index 9ad0494..ae695fe 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/components/asset-list.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/asset-list.js
@@ -17,9 +17,11 @@
 import Ember from 'ember';
 
 export default Ember.Component.extend({
+  assetManager : Ember.inject.service('asset-manager'),
   currentAssetId: null,
   assetNotSelected: true,
   assetSearchCriteria: "",
+  filteredAssetList:  Ember.A([]),
   fuseSearchOptions: {
     shouldSort: true,
     threshold: 0.1,
@@ -46,7 +48,23 @@ export default Ember.Component.extend({
     this.$('#asset_list_dialog').modal().on('hidden.bs.modal', function() {
       this.sendAction('showAssetList', false);
     }.bind(this));
-    this.initializeFuseSearch();
+
+    self.set("inProgress", true);
+    self.set("assetErrorMsg", "");
+    var fetchAssetsDefered=self.get("assetManager").fetchAssets();
+    fetchAssetsDefered.promise.then(function(response){
+      var assetData = JSON.parse(response).data;
+      if (self.get("assetListType") && self.get("assetListType") !== "") {
+        assetData = assetData.filterBy('type', self.get("assetListType"));
+      }
+      self.set('assetList', assetData);
+      self.initializeFuseSearch();
+      self.set("inProgress", false);
+    }.bind(this)).catch(function(data){
+      self.set("assetErrorMsg", "There is some problem while fetching assets. Please try again.");
+      self.set("inProgress", false);
+    });
+
   }.on('didInsertElement'),
   initializeFuseSearch() {
      this.set('fuse', new Fuse(this.get("assetList"), this.get('fuseSearchOptions')));

http://git-wip-us.apache.org/repos/asf/ambari/blob/74aff7c6/contrib/views/wfmanager/src/main/resources/ui/app/components/asset-manager.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/asset-manager.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/asset-manager.js
index 4674533..5228324 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/components/asset-manager.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/asset-manager.js
@@ -17,7 +17,10 @@
 import Ember from 'ember';
 
 export default Ember.Component.extend({
+  assetManager : Ember.inject.service('asset-manager'),
   assetSearchCriteria: "",
+  currentAsset: null,
+  filteredAssetList:  Ember.A([]),
   fuseSearchOptions: {
     shouldSort: true,
     threshold: 0.1,
@@ -45,7 +48,17 @@ export default Ember.Component.extend({
       this.sendAction('showAssetManager', false);
     }.bind(this));
 
-    this.initializeFuseSearch();
+    self.set("inProgress", true);
+    self.set("errorMsg", "");
+    var fetchAssetsDefered=self.get("assetManager").fetchMyAssets();
+    fetchAssetsDefered.promise.then(function(response){
+      self.set('assetList', JSON.parse(response).data);
+      self.initializeFuseSearch();
+      self.set("inProgress", false);
+    }.bind(this)).catch(function(data){
+      self.set("errorMsg", "There is some problem while fetching assets. Please try again.");
+      self.set("inProgress", false);
+    });
   }.on('didInsertElement'),
   initializeFuseSearch() {
      this.set('fuse', new Fuse(this.get("assetList"), this.get('fuseSearchOptions')));
@@ -62,9 +75,39 @@ export default Ember.Component.extend({
     close() {
       this.$('#asset_manager_dialog').modal('hide');
     },
-    deleteAsset(asset) {
-      this.$('#asset_manager_dialog').modal('hide');
-      this.sendAction('deleteAsset', asset);
+    deleteAsset() {
+      var self=this;
+      self.set("inProgress", true);
+      self.set("errorMsg", "");
+      self.set("successMsg", "");
+      var deleteAssetDefered=self.get("assetManager").deleteAsset(self.get("currentAsset").id);
+      deleteAssetDefered.promise.then(function(response){
+        var fetchAssetsDefered=self.get("assetManager").fetchMyAssets();
+        fetchAssetsDefered.promise.then(function(response){
+          self.get("assetList").clear();
+          self.get("assetList").pushObjects(JSON.parse(response).data);
+          if (self.get("assetSearchCriteria") !== "") {
+            self.set('filteredAssetList', self.get('fuse').search(self.get("assetSearchCriteria")));
+          } else {
+            self.set('filteredAssetList', self.get("assetList"));
+          }
+          self.set("successMsg", "Asset got deleted successfully");
+          self.set("inProgress", false);
+        }.bind(this)).catch(function(data){
+          self.set("errorMsg", "There is some problem while fetching assets. Please try again.");
+          self.set("inProgress", false);
+        });
+      }.bind(this)).catch(function(data){
+        self.set("errorMsg", "There is some problem while deleting asset. Please try again.");
+        self.set("inProgress", false);
+      });
+    },
+    showDeleteAssetWarning(asset) {
+      this.set("currentAsset", asset);
+      this.set('showingDeleteAssetWarning', true);
+      Ember.run.later(()=>{
+        this.$('#ConfirmDialog').modal('show');
+      });
     }
   }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/74aff7c6/contrib/views/wfmanager/src/main/resources/ui/app/components/designer-workspace.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/designer-workspace.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/designer-workspace.js
index a04c66d..422253d 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/components/designer-workspace.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/designer-workspace.js
@@ -19,7 +19,6 @@ import CommonUtils from "../utils/common-utils";
 import Constants from '../utils/constants';
 export default Ember.Component.extend({
   workspaceManager : Ember.inject.service('workspace-manager'),
-  assetManager : Ember.inject.service('asset-manager'),
   xmlAppPath : null,
   appPath : null,
   type : 'wf',
@@ -236,27 +235,7 @@ export default Ember.Component.extend({
       }
     },
     showAssetManager(value) {
-      var self=this;
-      if (value) {
-        var fetchAssetsDefered=self.get("assetManager").fetchMyAssets();
-        fetchAssetsDefered.promise.then(function(response){
-          self.set('assetList', JSON.parse(response).data);
-          self.set('showingAssetManager', value);
-        }.bind(this)).catch(function(data){
-          self.set("errorMsg", "There is some problem while fetching assets. Please try again.");
-        });
-      } else {
-        self.set('showingAssetManager', value);
-      }
-    },
-    deleteAsset(asset) {
-      var self=this;
-      var deleteAssetDefered=self.get("assetManager").deleteAsset(asset.id);
-      deleteAssetDefered.promise.then(function(response){
-        console.log("Asset deleted..");
-      }.bind(this)).catch(function(data){
-        self.set("errorMsg", "There is some problem while deleting asset. Please try again.");
-      });
+      this.set('showingAssetManager', value);
     }
   }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/74aff7c6/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 1822a20..c682ea9 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
@@ -349,6 +349,24 @@ export default Ember.Component.extend(FindNodeMixin, Validations, {
     });
     return deferred;
   },
+  getAssetFromHdfs(filePath){
+    var url = Ember.ENV.API_URL + "/readAsset?assetPath="+filePath;
+    var deferred = Ember.RSVP.defer();
+    Ember.$.ajax({
+      url: url,
+      method: 'GET',
+      dataType: "text",
+      beforeSend: function (xhr) {
+        xhr.setRequestHeader("X-XSRF-HEADER", Math.round(Math.random()*100000));
+        xhr.setRequestHeader("X-Requested-By", "Ambari");
+      }
+    }).done(function(data){
+      deferred.resolve(data);
+    }).fail(function(data){
+      deferred.reject(data);
+    });
+    return deferred;
+  },
   importActionSettingsFromString(actionSettings) {
     var x2js = new X2JS();
     var actionSettingsObj = x2js.xml_str2json(actionSettings);
@@ -945,13 +963,13 @@ export default Ember.Component.extend(FindNodeMixin, Validations, {
       this.set("showingActionSettingsFileBrowser", false);
       if(this.get('actionSettingsFilePath')){
         self.set("errorMsg", "");
-        var actionSettingsXmlDefered=this.getWorkflowFromHdfs(this.get('actionSettingsFilePath'));
+        var actionSettingsXmlDefered=this.getAssetFromHdfs(this.get('actionSettingsFilePath'));
         actionSettingsXmlDefered.promise.then(function(data){
           this.importActionSettingsFromString(data);
         }.bind(this)).catch(function(data){
           console.error(data);
           var stackTraceMsg = self.getStackTrace(data.responseText);
-          self.set("errorMsg", "There is some problem while importing.Please try again.");
+          self.set("errorMsg", "There is some problem while importing asset.Please try again.");
           self.showingErrorMsgInDesigner(data);
         });
       }
@@ -964,13 +982,13 @@ export default Ember.Component.extend(FindNodeMixin, Validations, {
       this.set("showingImportActionNodeFileBrowser", false);
       if(this.get('actionNodeFilePath')){
         self.set("errorMsg", "");
-        var actionSettingsXmlDefered=this.getWorkflowFromHdfs(this.get('actionNodeFilePath'));
+        var actionSettingsXmlDefered=this.getAssetFromHdfs(this.get('actionNodeFilePath'));
         actionSettingsXmlDefered.promise.then(function(data){
           this.importActionNodeFromString(data);
         }.bind(this)).catch(function(data){
           console.error(data);
           var stackTraceMsg = self.getStackTrace(data.responseText);
-          self.set("errorMsg", "There is some problem while importing.Please try again.");
+          self.set("errorMsg", "There is some problem while importing asset. Please try again.");
           self.showingErrorMsgInDesigner(data);
         });
       }
@@ -1109,22 +1127,8 @@ export default Ember.Component.extend(FindNodeMixin, Validations, {
     },
     showAssetList(value) {
       var self=this;
-      if (value) {
-        self.set("errorMsg", "");
-        var fetchAssetsDefered=self.get("assetManager").fetchAssets();
-        fetchAssetsDefered.promise.then(function(response){
-          var assetData = JSON.parse(response).data;
-          assetData = assetData.filterBy('type', self.flowRenderer.currentCyNode.data().node.actionType);
-          self.set('assetList', assetData);
-          self.set('assetListType', self.flowRenderer.currentCyNode.data().node.actionType);
-          self.set('showingAssetList', value);
-        }.bind(this)).catch(function(data){
-          self.set("errorMsg", "There is some problem while fetching assets. Please try again.");
-          self.showingErrorMsgInDesigner(data);
-        });
-      } else {
-        self.set('showingAssetList', value);
-      }
+      self.set('showingAssetList', value);
+      self.set('assetListType', self.flowRenderer.currentCyNode.data().node.actionType);
     },
     importAsset(asset) {
       var self=this;
@@ -1143,19 +1147,8 @@ export default Ember.Component.extend(FindNodeMixin, Validations, {
     },
     showAssetNodeList(value) {
       var self=this;
-      if (value) {
-        self.set("errorMsg", "");
-        var fetchAssetsDefered=self.get("assetManager").fetchAssets();
-        fetchAssetsDefered.promise.then(function(response){
-          self.set('assetList', JSON.parse(response).data);
-          self.set('showingAssetNodeList', value);
-        }.bind(this)).catch(function(data){
-          self.set("errorMsg", "There is some problem while fetching assets. Please try again.");
-          self.showingErrorMsgInDesigner(data);
-        });
-      } else {
-        self.set('showingAssetNodeList', value);
-      }
+      self.set('showingAssetNodeList', value);
+      self.set('assetListType', "");
     },
     importAssetNode(asset) {
       var self=this;

http://git-wip-us.apache.org/repos/asf/ambari/blob/74aff7c6/contrib/views/wfmanager/src/main/resources/ui/app/services/asset-manager.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/services/asset-manager.js b/contrib/views/wfmanager/src/main/resources/ui/app/services/asset-manager.js
index 3e87644..45f99e7 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/services/asset-manager.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/services/asset-manager.js
@@ -138,5 +138,24 @@ export default Ember.Service.extend({
       deferred.reject(data);
     });
     return deferred;
+  },
+  assetNameAvailable(assetName) {
+    var url = Ember.ENV.API_URL + "/assets/assetNameAvailable?name=" + assetName;
+    var deferred = Ember.RSVP.defer();
+    Ember.$.ajax({
+      url: url,
+      method: "GET",
+      dataType: "text",
+      contentType: "text/plain;charset=utf-8",
+      beforeSend: function (xhr) {
+        xhr.setRequestHeader("X-XSRF-HEADER", Math.round(Math.random()*100000));
+        xhr.setRequestHeader("X-Requested-By", "workflow-designer");
+      }
+    }).done(function(data){
+      deferred.resolve(data);
+    }).fail(function(data){
+      deferred.reject(data);
+    });
+    return deferred;
   }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/74aff7c6/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 d91eb3b..755a6ad 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
@@ -1636,3 +1636,7 @@ input:invalid {
   width: 100%;
   min-height: 175px;
 }
+#asset-delete-confirm-dialog .modal-dialog{
+  width: 650px;
+  top: 60px;
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/74aff7c6/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/asset-config.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/asset-config.hbs b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/asset-config.hbs
index 3ae4bff..7bc48d7 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/asset-config.hbs
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/asset-config.hbs
@@ -25,6 +25,11 @@
         <h4 class="modal-title">Publish Asset</h4>
       </div>
       <div class="modal-body">
+          {{#if (and assetErrorMsg (not (eq assetErrorMsg "")))}}
+            <div id="alert"class="alert alert-danger alert-dismissible" role="alert">
+                {{assetErrorMsg}}
+            </div>
+          {{/if}}
           <form class="form-horizontal">
             <div class="panel panel-default">
               <div class="panel-body">
@@ -52,3 +57,6 @@
     </div>
   </div>
 </div>
+{{#if inProgress}}
+  {{spin-spinner lines=13 length=20 width=10 top=200}}
+{{/if}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/74aff7c6/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/asset-list.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/asset-list.hbs b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/asset-list.hbs
index bc5201d..7fd1236 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/asset-list.hbs
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/asset-list.hbs
@@ -26,6 +26,11 @@
       </div>
       <div class="modal-body">
         {{input type="text" class="form-control marginBottom10" name="assetSearchCriteria" value=assetSearchCriteria placeholder="Asset Search"}}
+        {{#if (and assetErrorMsg (not (eq assetErrorMsg "")))}}
+          <div id="alert"class="alert alert-danger alert-dismissible" role="alert">
+              {{assetErrorMsg}}
+          </div>
+        {{/if}}
         <div class="panel panel-default mb0 asset-list-panel-header">
           <table class="table asset-list-header-table listing table-striped table-hover table-bordered" cellspacing="0" width="100%">
             <thead>
@@ -38,8 +43,8 @@
             </thead>
           </table>
         </div>
-        <div class="panel panel-default asset-list-panel-body {{if (eq filteredAssetList.length 0) 'no-asset-records'}}">
-          {{#if (eq filteredAssetList.length 0)}}
+        <div class="panel panel-default asset-list-panel-body {{if (and (eq filteredAssetList.length 0) (eq assetErrorMsg "")) 'no-asset-records'}}">
+          {{#if (and (eq filteredAssetList.length 0) (eq assetErrorMsg ""))}}
             No {{#if (not-eq assetListType "")}} {{assetListType}}{{/if}} assets
           {{/if}}
           <table id="asset-list" class="table asset-list listing table-striped table-hover table-bordered" cellspacing="0" width="100%">
@@ -64,3 +69,6 @@
     </div>
   </div>
 </div>
+{{#if inProgress}}
+  {{spin-spinner lines=13 length=20 width=10 top=200}}
+{{/if}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/74aff7c6/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/asset-manager.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/asset-manager.hbs b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/asset-manager.hbs
index 7a21af1..6ca85c6 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/asset-manager.hbs
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/asset-manager.hbs
@@ -26,6 +26,16 @@
       </div>
       <div class="modal-body">
         {{input type="text" class="form-control marginBottom10" name="assetSearchCriteria" value=assetSearchCriteria placeholder="Asset Search"}}
+        {{#if (and errorMsg (not (eq errorMsg "")))}}
+          <div id="alert"class="alert alert-danger alert-dismissible" role="alert">
+              {{errorMsg}}
+          </div>
+        {{/if}}
+        {{#if (and successMsg (not (eq successMsg "")))}}
+            <div id="alert"class="alert alert-success alert-dismissible" role="alert">
+                {{successMsg}}
+            </div>
+        {{/if}}
         <div class="panel panel-default mb0 asset-list-panel-header">
           <table class="table asset-list-header-table listing table-striped table-hover table-bordered" cellspacing="0" width="100%">
             <thead>
@@ -38,8 +48,8 @@
             </thead>
           </table>
         </div>
-        <div class="panel panel-default asset-list-panel-body {{if (eq filteredAssetList.length 0) 'no-asset-records'}}">
-          {{#if (eq filteredAssetList.length 0)}}
+        <div class="panel panel-default asset-list-panel-body {{if (and (eq filteredAssetList.length 0) (eq errorMsg "")) 'no-asset-records'}}">
+          {{#if (and (eq filteredAssetList.length 0) (eq errorMsg ""))}}
             <span>No assets</span>
           {{/if}}
           <table id="asset-list" class="table asset-list listing table-striped table-hover table-bordered" cellspacing="0" width="100%">
@@ -49,7 +59,7 @@
                   <td class="col-xs-3">{{asset.name}}</td>
                   <td class="col-xs-3">{{asset.type}}</td>
                   <td class="col-xs-3">{{asset.description}}</td>
-                  <td class="col-xs-3"><span {{action 'deleteAsset' asset}}><i class="fa fa-trash-o"></i></span></td>
+                  <td class="col-xs-3"><span {{action 'showDeleteAssetWarning' asset}}><i class="fa fa-trash-o"></i></span></td>
                 </tr>
               {{/each}}
             </tbody>
@@ -63,3 +73,13 @@
     </div>
   </div>
 </div>
+{{#if showingDeleteAssetWarning}}
+  <div id="asset-delete-confirm-dialog">
+    {{#confirmation-dialog title="Confirm asset delete"
+      confirmationMessage="Do you want to delete this asset ?"
+      okBtnText="Continue" cancelBtnText="Cancel" onOk="deleteAsset"}}{{/confirmation-dialog}}
+  </div>
+{{/if}}
+{{#if inProgress}}
+  {{spin-spinner lines=13 length=20 width=10 top=200}}
+{{/if}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/74aff7c6/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/designer-workspace.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/designer-workspace.hbs b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/designer-workspace.hbs
index 7a6005a..46a3f63 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/designer-workspace.hbs
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/designer-workspace.hbs
@@ -126,7 +126,7 @@
     </div>
   </div>
   {{#if showingAssetManager}}
-    {{#asset-manager showAssetManager="showAssetManager" deleteAsset="deleteAsset" assetList=assetList}}{{/asset-manager}}
+    {{#asset-manager showAssetManager="showAssetManager"}}{{/asset-manager}}
   {{/if}}
   {{#if showingWarning}}
   {{#confirmation-dialog title="Confirm workflow reset"

http://git-wip-us.apache.org/repos/asf/ambari/blob/74aff7c6/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 38d8eaf..1758946 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
@@ -201,7 +201,7 @@
               </div>
             {{/if}}
           {{/each}}
-          <div class="overlay-node-label">asd</div>
+          <div class="overlay-node-label"></div>
           <div class="overlay-transition-content">
             <div class="decision-condition-label">
               <div class="decision-condition-header">Condition</div>
@@ -306,7 +306,7 @@
   {{#asset-list showAssetList="showAssetList" importAsset="importAsset" assetList=assetList assetListType=assetListType}}{{/asset-list}}
 {{/if}}
 {{#if showingAssetNodeList}}
-  {{#asset-list showAssetList="showAssetNodeList" importAsset="importAssetNode" deleteAsset="deleteAsset" assetList=assetList}}{{/asset-list}}
+  {{#asset-list showAssetList="showAssetNodeList" importAsset="importAssetNode" assetList=assetList}}{{/asset-list}}
 {{/if}}
 {{#if showingPreview}}
   {{#preview-dialog title="Workflow XML Preview" previewXml=previewXml closePreview="closePreview"}}{{/preview-dialog}}