You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ni...@apache.org on 2017/01/10 09:34:57 UTC

ambari git commit: AMBARI-19419 : Save workflows via save mechanism instead of submission button configured (Venkata Sairam via nitirajrathore)

Repository: ambari
Updated Branches:
  refs/heads/trunk 96aaf1dbb -> 21697822f


AMBARI-19419 : Save workflows via save mechanism instead of submission button configured (Venkata Sairam via nitirajrathore)


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

Branch: refs/heads/trunk
Commit: 21697822f96c69b03eb6534b55f4fedabb311fd7
Parents: 96aaf1d
Author: Nitiraj Rathore <ni...@gmail.com>
Authored: Tue Jan 10 15:01:54 2017 +0530
Committer: Nitiraj Rathore <ni...@gmail.com>
Committed: Tue Jan 10 15:05:19 2017 +0530

----------------------------------------------------------------------
 .../ambari/view/OozieProxyImpersonator.java     |   4 +-
 .../WorkflowsManagerResource.java               |   2 +-
 .../resources/ui/app/adapters/application.js    |  27 +++++
 .../app/components/design/proj-manager-tabs.js  |  21 ++++
 .../ui/app/components/designer-workspace.js     |  35 +++++-
 .../resources/ui/app/components/drafts-wf.js    |  69 +++++++++++
 .../ui/app/helpers/format-unicode-date.js       |  24 ++++
 .../main/resources/ui/app/models/wfproject.js   |  25 ++++
 .../src/main/resources/ui/app/router.js         |   1 +
 .../src/main/resources/ui/app/routes/design.js  |   8 ++
 .../ui/app/routes/design/proj-manager-tab.js    |  29 +++++
 .../src/main/resources/ui/app/styles/app.less   |  25 +++-
 .../components/design/proj-manager-tabs.hbs     |  18 +++
 .../templates/components/designer-workspace.hbs |  11 ++
 .../ui/app/templates/components/drafts-wf.hbs   | 121 +++++++++++++++++++
 .../main/resources/ui/app/templates/design.hbs  |   4 +-
 .../app/templates/design/proj-manager-tab.hbs   |  19 +++
 .../main/resources/ui/app/utils/constants.js    |   1 +
 .../components/design/proj-manager-tabs-test.js |  41 +++++++
 .../integration/components/drafts-wf-test.js    |  41 +++++++
 .../ui/tests/unit/adapters/application-test.js  |  29 +++++
 .../unit/helpers/format-unicode-date-test.js    |  27 +++++
 .../ui/tests/unit/models/wfproject-test.js      |  29 +++++
 .../unit/routes/design/proj-manager-tab-test.js |  28 +++++
 24 files changed, 631 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/21697822/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 df2e3d8..7596de0 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
@@ -76,7 +76,7 @@ public class OozieProxyImpersonator {
   private final HDFSFileUtils hdfsFileUtils;
   private final WorkflowFilesService workflowFilesService;
   private WorkflowManagerService workflowManagerService;
-  private static final boolean PROJ_MANAGER_ENABLED = false;
+  private static final boolean PROJ_MANAGER_ENABLED = true;
   private final OozieDelegate oozieDelegate;
   private final OozieUtils oozieUtils = new OozieUtils();
   private final AssetResource assetResource;
@@ -511,4 +511,4 @@ public class OozieProxyImpersonator {
     }
     return getErrorDetails(errorCode, errorMessage, ex);
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/21697822/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 64e2060a..7513107 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
@@ -46,7 +46,7 @@ public class WorkflowsManagerResource {
 	
 	
 	@DELETE
-	@Path("/projectId")
+	@Path("/{projectId}")
 	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/21697822/contrib/views/wfmanager/src/main/resources/ui/app/adapters/application.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/adapters/application.js b/contrib/views/wfmanager/src/main/resources/ui/app/adapters/application.js
new file mode 100644
index 0000000..453f2e9
--- /dev/null
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/adapters/application.js
@@ -0,0 +1,27 @@
+/*
+*    Licensed to the Apache Software Foundation (ASF) under one or more
+*    contributor license agreements.  See the NOTICE file distributed with
+*    this work for additional information regarding copyright ownership.
+*    The ASF licenses this file to You under the Apache License, Version 2.0
+*    (the "License"); you may not use this file except in compliance with
+*    the License.  You may obtain a copy of the License at
+*
+*        http://www.apache.org/licenses/LICENSE-2.0
+*
+*    Unless required by applicable law or agreed to in writing, software
+*    distributed under the License is distributed on an "AS IS" BASIS,
+*    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+*    See the License for the specific language governing permissions and
+*    limitations under the License.
+*/
+
+import Ember from 'ember';
+import DS from 'ember-data';
+
+export default DS.RESTAdapter.extend({
+  namespace: Ember.ENV.API_URL,
+  headers:{
+    "X-XSRF-HEADER":Math.round(Math.random()*100000),
+    "X-Requested-By":"Ambari"
+  }
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/21697822/contrib/views/wfmanager/src/main/resources/ui/app/components/design/proj-manager-tabs.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/design/proj-manager-tabs.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/design/proj-manager-tabs.js
new file mode 100644
index 0000000..0803faa
--- /dev/null
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/design/proj-manager-tabs.js
@@ -0,0 +1,21 @@
+/**
+*    Licensed to the Apache Software Foundation (ASF) under one or more
+*    contributor license agreements.  See the NOTICE file distributed with
+*    this work for additional information regarding copyright ownership.
+*    The ASF licenses this file to You under the Apache License, Version 2.0
+*    (the "License"); you may not use this file except in compliance with
+*    the License.  You may obtain a copy of the License at
+*
+*        http://www.apache.org/licenses/LICENSE-2.0
+*
+*    Unless required by applicable law or agreed to in writing, software
+*    distributed under the License is distributed on an "AS IS" BASIS,
+*    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+*    See the License for the specific language governing permissions and
+*    limitations under the License.
+*/
+
+import Ember from 'ember';
+
+export default Ember.Component.extend({
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/21697822/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 c4f1b09..f70658e 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
@@ -16,13 +16,15 @@
 */
 import Ember from 'ember';
 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',
-  tabId: 0,
+  tabId : 0,
+  //isProjectManagerEnabled : Constants.isProjectManagerEnabled,
   hasMultitabSupport : true,
   tabCounter : new Map(),
   tabs : Ember.A([]),
@@ -33,6 +35,11 @@ export default Ember.Component.extend({
     this.get('workspaceManager').saveTabs(this.get('tabs'));
   }),
   initialize : function(){
+    if (Constants.isProjectManagerEnabled) {
+      this.set("isProjectManagerEnabled", "true");
+    } else {
+      this.set("isProjectManagerEnabled", "false");
+    }
     this.get('tabCounter').set('wf', 0);
     this.get('tabCounter').set('coord', 0);
     this.get('tabCounter').set('bundle', 0);
@@ -56,7 +63,10 @@ export default Ember.Component.extend({
       var tab = this.get('tabs').findBy('id', id);
       if(tab.type === 'dashboard'){
         this.sendAction('showDashboard');
-      }else{
+      } else if (tab.type === 'Projects') {
+        this.createOrShowProjManager();
+      }
+      else{
         this.sendAction('hideDashboard');
       }
     }.bind(this));
@@ -107,6 +117,24 @@ export default Ember.Component.extend({
     this.get('tabCounter').set(type, ++count);
     return count;
   },
+  createOrShowProjManager(){
+    var projectsTab = this.get('tabs').findBy('type', 'Projects');
+    if(projectsTab && projectsTab.type === 'Projects'){
+      this.$('.nav-tabs a[href="#' + projectsTab.id + '"]').tab('show');
+    }else{
+      var tab = {
+        type : 'Projects',
+        id : this.generateTabId(),
+        name : 'Projects'
+      };
+      this.$('.nav-tabs li').removeClass('active');
+      this.$('.tab-content .tab-pane').removeClass('active');
+      this.get('tabs').pushObject(tab);
+      this.$('.nav-tabs a[href="#' + tab.id + '"]').tab('show');
+    }
+    this.sendAction('showProjManager');
+    return;
+  },
   createOrshowDashboard(){
     var dashboardTab = this.get('tabs').findBy('type', 'dashboard');
     if(dashboardTab && dashboardTab.type === 'dashboard'){
@@ -148,6 +176,9 @@ export default Ember.Component.extend({
     showDashboard(){
       this.createOrshowDashboard();
     },
+    showProjectManager(){
+      this.createOrShowProjManager();
+    },
     closeTab(index){
       if(index < this.get('tabs').length - 1){
         var previousTab = this.get('tabs').objectAt(index + 1);

http://git-wip-us.apache.org/repos/asf/ambari/blob/21697822/contrib/views/wfmanager/src/main/resources/ui/app/components/drafts-wf.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/drafts-wf.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/drafts-wf.js
new file mode 100644
index 0000000..885655a
--- /dev/null
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/drafts-wf.js
@@ -0,0 +1,69 @@
+/*
+*    Licensed to the Apache Software Foundation (ASF) under one or more
+*    contributor license agreements.  See the NOTICE file distributed with
+*    this work for additional information regarding copyright ownership.
+*    The ASF licenses this file to You under the Apache License, Version 2.0
+*    (the "License"); you may not use this file except in compliance with
+*    the License.  You may obtain a copy of the License at
+*
+*        http://www.apache.org/licenses/LICENSE-2.0
+*
+*    Unless required by applicable law or agreed to in writing, software
+*    distributed under the License is distributed on an "AS IS" BASIS,
+*    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+*    See the License for the specific language governing permissions and
+*    limitations under the License.
+*/
+
+import Ember from 'ember';
+const { computed } = Ember;
+
+export default Ember.Component.extend({
+  "isDeleteDraftConformation": false,
+  "currentDraft": undefined,
+  "deleteInProgress": false,
+  "deleteMsg": undefined,
+  elementsInserted: function () {
+      this.$('.actions').hide();
+  }.on("didInsertElement"),
+  rendered : function(){
+    var self = this;
+    this.$("#configureJob").on('hidden.bs.modal', function () {
+      self.set("deleteMsg", null);
+      self.set("deleteInProgress", false);
+    }.bind(this));
+  }.on('didInsertElement'),
+  store: Ember.inject.service(),
+  actions: {
+    importActionToEditor ( path ) {
+      this.sendAction('editWorkflow', path);
+    },
+    deleteDraftConformation (job ){
+	    this.set("isDeleteDraftConformation", true);
+	    this.$("#configureJob").modal("show");
+	    this.set("currentDraft", job);
+    },
+    deleteDraft () {
+	    this.set("deleteInProgress", true);
+	    var job = this.get("currentDraft"), self= this;
+  		this.get("store").findRecord('wfproject', job.id).then(function(post) {
+  		  post.destroyRecord();
+  		}).then(function () {
+  	      self.set("deleteInProgress", false);
+  	      self.set("deleteMsg", "Draft successfully deleted.");
+            console.log("Deleted successfully");
+  	    }).catch(function (response) {
+  	      self.set("deleteInProgress", false);
+  	      self.set("deleteMsg", "There is some problem while deletion.Please try again.");
+  	    });
+    },
+    showActions (job) {
+      this.$('.'+job.get("updatedAt")+'Actions').show();
+      this.$('.Actions'+job.get("updatedAt")).hide();
+    },
+    hideActions (job) {
+      this.$('.'+job.get("updatedAt")+'Actions').hide();
+      this.$('.Actions'+job.get("updatedAt")).show();
+    }
+  }
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/21697822/contrib/views/wfmanager/src/main/resources/ui/app/helpers/format-unicode-date.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/helpers/format-unicode-date.js b/contrib/views/wfmanager/src/main/resources/ui/app/helpers/format-unicode-date.js
new file mode 100644
index 0000000..e6dd653
--- /dev/null
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/helpers/format-unicode-date.js
@@ -0,0 +1,24 @@
+/*
+*    Licensed to the Apache Software Foundation (ASF) under one or more
+*    contributor license agreements.  See the NOTICE file distributed with
+*    this work for additional information regarding copyright ownership.
+*    The ASF licenses this file to You under the Apache License, Version 2.0
+*    (the "License"); you may not use this file except in compliance with
+*    the License.  You may obtain a copy of the License at
+*
+*        http://www.apache.org/licenses/LICENSE-2.0
+*
+*    Unless required by applicable law or agreed to in writing, software
+*    distributed under the License is distributed on an "AS IS" BASIS,
+*    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+*    See the License for the specific language governing permissions and
+*    limitations under the License.
+*/
+
+import Ember from 'ember';
+
+export function formatUnicodeDate(params) {
+  return new Date(parseInt(params[0])).toUTCString();
+}
+
+export default Ember.Helper.helper(formatUnicodeDate);

http://git-wip-us.apache.org/repos/asf/ambari/blob/21697822/contrib/views/wfmanager/src/main/resources/ui/app/models/wfproject.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/models/wfproject.js b/contrib/views/wfmanager/src/main/resources/ui/app/models/wfproject.js
new file mode 100644
index 0000000..e90a613
--- /dev/null
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/models/wfproject.js
@@ -0,0 +1,25 @@
+/*
+*    Licensed to the Apache Software Foundation (ASF) under one or more
+*    contributor license agreements.  See the NOTICE file distributed with
+*    this work for additional information regarding copyright ownership.
+*    The ASF licenses this file to You under the Apache License, Version 2.0
+*    (the "License"); you may not use this file except in compliance with
+*    the License.  You may obtain a copy of the License at
+*
+*        http://www.apache.org/licenses/LICENSE-2.0
+*
+*    Unless required by applicable law or agreed to in writing, software
+*    distributed under the License is distributed on an "AS IS" BASIS,
+*    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+*    See the License for the specific language governing permissions and
+*    limitations under the License.
+*/
+
+import DS from 'ember-data';
+
+export default DS.Model.extend({
+	workflowDefinitionPath: DS.attr("string"),
+	type: DS.attr("string"),
+	updatedAt: DS.attr("string"),
+	owner:DS.attr("string")
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/21697822/contrib/views/wfmanager/src/main/resources/ui/app/router.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/router.js b/contrib/views/wfmanager/src/main/resources/ui/app/router.js
index f494f6f..26ff353 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/router.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/router.js
@@ -27,6 +27,7 @@ Router.map(function () {
   this.route('design', function() {
     this.route('dashboardtab');
     this.route('jobtab');
+    this.route('projManagerTab');
   });
   this.route('designtest');
   this.route('job');

http://git-wip-us.apache.org/repos/asf/ambari/blob/21697822/contrib/views/wfmanager/src/main/resources/ui/app/routes/design.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/routes/design.js b/contrib/views/wfmanager/src/main/resources/ui/app/routes/design.js
index d557625..3affe7c 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/routes/design.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/routes/design.js
@@ -73,9 +73,17 @@ export default Ember.Route.extend(Ember.Evented, {
       this.controller.set('dashboardShown', true);
       this.transitionTo('design.dashboardtab');
     },
+    showProjManager(){
+      //this.controller.set('ProjManagerShown', true);
+      this.transitionTo('design.projManagerTab');
+    },
     hideDashboard(){
       this.controller.set('dashboardShown', false);
       this.transitionTo('design');
+    },
+    hideProjManager(){
+      //this.controller.set('ProjManagerShown', false);
+      this.transitionTo('design');
     }
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/21697822/contrib/views/wfmanager/src/main/resources/ui/app/routes/design/proj-manager-tab.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/routes/design/proj-manager-tab.js b/contrib/views/wfmanager/src/main/resources/ui/app/routes/design/proj-manager-tab.js
new file mode 100644
index 0000000..b37ed83
--- /dev/null
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/routes/design/proj-manager-tab.js
@@ -0,0 +1,29 @@
+/*
+*    Licensed to the Apache Software Foundation (ASF) under one or more
+*    contributor license agreements.  See the NOTICE file distributed with
+*    this work for additional information regarding copyright ownership.
+*    The ASF licenses this file to You under the Apache License, Version 2.0
+*    (the "License"); you may not use this file except in compliance with
+*    the License.  You may obtain a copy of the License at
+*
+*        http://www.apache.org/licenses/LICENSE-2.0
+*
+*    Unless required by applicable law or agreed to in writing, software
+*    distributed under the License is distributed on an "AS IS" BASIS,
+*    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+*    See the License for the specific language governing permissions and
+*    limitations under the License.
+*/
+
+import Ember from 'ember';
+
+export default Ember.Route.extend({
+  model:function(params) {
+    return this.store.findAll('wfproject');
+  },
+  actions: {
+    routeToDesigner(options){
+      this.transitionTo("design", options);
+    }
+  }
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/21697822/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 a5b0b4a..92955d7 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
@@ -1585,4 +1585,27 @@ input:invalid {
 }
 #search-table td:first-child {
   width:5%;
-}
\ No newline at end of file
+}
+#draftsTable {
+  padding-top: 0.5%;
+  padding-left: 0.5%;
+  padding-right: 0.5%;
+  max-height:500px;
+  overflow:scroll;
+}
+#emptyDrafts {
+  padding-left:40%;
+  padding-top:5%;
+}
+.width300 {
+  white-space: nowrap;
+  width: 70%;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+#draftsTable td:second-child {
+  width:35%;
+}
+#draftsNum {
+  padding-left:40%;
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/21697822/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/design/proj-manager-tabs.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/design/proj-manager-tabs.hbs b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/design/proj-manager-tabs.hbs
new file mode 100644
index 0000000..a4bf4b3
--- /dev/null
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/design/proj-manager-tabs.hbs
@@ -0,0 +1,18 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+{{yield}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/21697822/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 88e2c70..9bc46c2 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
@@ -68,6 +68,11 @@
               <button {{action "showAssetManager" true}} class="btn btn-default" title="Manage Assets">
                   Manage Assets
               </button>
+              {{#if (eq isProjectManagerEnabled "true")}}
+              <button {{action "showProjectManager" true}} class="btn btn-default" title="Project Manager">
+                  <i class="fa fa-folder marginright5" aria-hidden="true"></i>Projects
+              </button>
+              {{/if}}
               {{help-icon}}
             </div>
           </div>
@@ -84,6 +89,8 @@
           <i class="fa fa-history marginright5"></i>
           {{else if (eq tab.type 'bundle')}}
           <i class="fa fa-cubes marginright5"></i>
+          {{else if (eq tab.type 'Projects')}}
+          <i class="fa fa-folder marginright5"></i>
           {{else}}
           <i class="fa fa-th marginright5"></i>
           {{/if}}
@@ -107,6 +114,10 @@
           changeFilePath="changeFilePath" tabInfo=tab}}
         {{else if (eq tab.type 'dashboard')}}
           {{outlet}}
+        {{else if (eq tab.type 'Projects')}}
+          {{#if (eq isProjectManagerEnabled "true")}}
+          {{outlet}}
+          {{/if}}
         {{else}}
           {{spin-spinner lines=7 length=3 width=3 radius=3 top=-10 left=150}}
         {{/if}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/21697822/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/drafts-wf.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/drafts-wf.hbs b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/drafts-wf.hbs
new file mode 100644
index 0000000..54ea25f
--- /dev/null
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/drafts-wf.hbs
@@ -0,0 +1,121 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+{{#if model}}
+<div id="draftsTable">
+<table id="search-table" class="table search-table listing table-striped table-hover table-bordered" cellspacing="0" width="100%">
+  <thead>
+    <tr>
+      <!--th>Draft Name</th-->
+      <th>Type</th>
+      <th>Draft Path</th>
+      <th>Created Time</th>
+      <th>Action</th>
+    </tr>
+  </thead>
+  <tbody>
+    {{#if model}}
+    {{#each model as |job idx|}}
+    <tr>
+    <!--td title={{job.workflowDefinitionPath}}> <div class="width300">{{job.workflowDefinitionPath}}</div></td-->
+    <td class="{{job.type}} cyScrollMsg">
+    {{#if (eq job.type "WORKFLOW")}}
+      <i class="fa fa-sitemap marginright5"></i>
+    {{/if}}
+    </td>
+		<td title={{job.workflowDefinitionPath}}>
+     <div class="width300">
+       {{job.workflowDefinitionPath}}
+     </div>
+    </td>
+		<td> {{format-unicode-date job.updatedAt}}</td>
+		<td class=" no-sort" {{action 'hideActions' job on="mouseLeave"}} style="width:200px;">
+		  <div id="actions-div" class="pull-left Actions{{job.updatedAt}}">
+		    <button {{action 'showActions' job on='mouseEnter'}} type="button" class="btn btn-default isOn">
+		      <i class="fa fa-cog" aria-hidden="true"></i>
+		    </button>
+		  </div>
+		  <div class="pull-left {{job.updatedAt}}Actions actions" id="actions">
+		    <div class="wf-buttons btn-group btn-group-sm" role="group" aria-label="buttons">
+		      <button {{action "importActionToEditor" job.workflowDefinitionPath}} type="button" class="btn btn-default">
+		        Edit
+		      </button>
+		      <button {{action 'deleteDraftConformation' job}} type="button" class="btn btn-default">
+		        Delete
+		      </button>
+		    </div>
+		  </div>
+		</td>
+	</tr>
+    {{/each}}
+    {{/if}}
+  </tbody>
+</table>
+</div>
+<div id="draftsNum">Displaying {{model.length}} projects</div>
+{{else}}
+  <div id="emptyDrafts">
+    There are no projects currently
+  </div>
+{{/if}}
+{{#if true}}
+<div class="modal fade" id="configureJob" role="dialog">
+  <div class="modal-dialog">
+    <div class="modal-content">
+      <div class="modal-header">
+        <button type="button" class="close" data-dismiss="modal">&times;</button>
+          <h4 class="modal-title">Delete Draft Confirmation</h4>
+      </div>
+      <div class="modal-body">
+         {{#if deleteMsg}}
+        <div class="row form-group">
+          <div class="col-xs-4">
+          </div>
+          <div class="col-xs-8">
+            <div class="input-group">
+              {{deleteMsg}}
+            </div>
+          </div>
+        </div>
+          {{/if}}
+          {{#unless deleteMsg}}
+        <div class="row form-group">
+          <div class="col-xs-4">
+          </div>
+          <div class="col-xs-8">
+            <div class="input-group">
+              <label class="control-label" for="{{type}}-path">Do you want to delete the draft?</label>
+            </div>
+          </div>
+        </div>
+        {{/unless}}
+      </div>
+      <div class="modal-footer">
+        {{#if deleteInProgress}}
+          {{spin-spinner lines=10 length=10 width=5 radius=10 }}
+          <span class="pull-left">Deleting the draft</span>
+        {{/if}}
+        <button type="button" class="btn btn-default" data-dismiss="modal" {{action "closeDraftWindow"}}>Close</button>
+        {{#unless deleteMsg}}
+          <button type="button" class="btn btn-primary" {{action "deleteDraft" }}>Delete</button>
+        {{/unless}}
+      </div>
+    </div>
+  </div>
+</div>
+{{/if}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/21697822/contrib/views/wfmanager/src/main/resources/ui/app/templates/design.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/templates/design.hbs b/contrib/views/wfmanager/src/main/resources/ui/app/templates/design.hbs
index e39ba8d..012d9e7 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/templates/design.hbs
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/templates/design.hbs
@@ -15,5 +15,5 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 }}
-{{designer-workspace xmlAppPath=xmlAppPath showDashboard="showDashboard"
-  hideDashboard="hideDashboard" adminConfig=model.adminConfig}}
+{{designer-workspace xmlAppPath=xmlAppPath showDashboard="showDashboard" showProjManager="showProjManager"
+  hideDashboard="hideDashboard" hideProjManager="hideProjManager" adminConfig=model.adminConfig}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/21697822/contrib/views/wfmanager/src/main/resources/ui/app/templates/design/proj-manager-tab.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/templates/design/proj-manager-tab.hbs b/contrib/views/wfmanager/src/main/resources/ui/app/templates/design/proj-manager-tab.hbs
new file mode 100644
index 0000000..b897a4c
--- /dev/null
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/templates/design/proj-manager-tab.hbs
@@ -0,0 +1,19 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+{{drafts-wf model=model routeToDesigner="routeToDesigner" editWorkflow="editWorkflow"}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/21697822/contrib/views/wfmanager/src/main/resources/ui/app/utils/constants.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/utils/constants.js b/contrib/views/wfmanager/src/main/resources/ui/app/utils/constants.js
index a508905..fc20359 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/utils/constants.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/utils/constants.js
@@ -32,6 +32,7 @@ export default Ember.Object.create({
   rmDefaultValue: "${resourceManager}",
   defaultNameNodeValue : "${nameNode}",
   useCytoscape : true,
+  isProjectManagerEnabled : false,
   autoRestoreWorkflowEnabled : true,
   actions:{
     hiveAction:{name : "hive",supportsSchema : true, currentVersion:''},

http://git-wip-us.apache.org/repos/asf/ambari/blob/21697822/contrib/views/wfmanager/src/main/resources/ui/tests/integration/components/design/proj-manager-tabs-test.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/tests/integration/components/design/proj-manager-tabs-test.js b/contrib/views/wfmanager/src/main/resources/ui/tests/integration/components/design/proj-manager-tabs-test.js
new file mode 100644
index 0000000..87b3c0a
--- /dev/null
+++ b/contrib/views/wfmanager/src/main/resources/ui/tests/integration/components/design/proj-manager-tabs-test.js
@@ -0,0 +1,41 @@
+/*
+ *    Licensed to the Apache Software Foundation (ASF) under one or more
+ *    contributor license agreements.  See the NOTICE file distributed with
+ *    this work for additional information regarding copyright ownership.
+ *    The ASF licenses this file to You under the Apache License, Version 2.0
+ *    (the "License"); you may not use this file except in compliance with
+ *    the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+
+moduleForComponent('design/proj-manager-tabs', 'Integration | Component | design/proj manager tabs', {
+  integration: true
+});
+
+test('it renders', function(assert) {
+  // Set any properties with this.set('myProperty', 'value');
+  // Handle any actions with this.on('myAction', function(val) { ... });"
+
+  this.render(hbs`{{design/proj-manager-tabs}}`);
+
+  assert.equal(this.$().text().trim(), '');
+
+  // Template block usage:"
+  this.render(hbs`
+    {{#design/proj-manager-tabs}}
+      template block text
+    {{/design/proj-manager-tabs}}
+  `);
+
+  assert.equal(this.$().text().trim(), 'template block text');
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/21697822/contrib/views/wfmanager/src/main/resources/ui/tests/integration/components/drafts-wf-test.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/tests/integration/components/drafts-wf-test.js b/contrib/views/wfmanager/src/main/resources/ui/tests/integration/components/drafts-wf-test.js
new file mode 100644
index 0000000..a0bad76
--- /dev/null
+++ b/contrib/views/wfmanager/src/main/resources/ui/tests/integration/components/drafts-wf-test.js
@@ -0,0 +1,41 @@
+/*
+ *    Licensed to the Apache Software Foundation (ASF) under one or more
+ *    contributor license agreements.  See the NOTICE file distributed with
+ *    this work for additional information regarding copyright ownership.
+ *    The ASF licenses this file to You under the Apache License, Version 2.0
+ *    (the "License"); you may not use this file except in compliance with
+ *    the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+
+moduleForComponent('drafts-wf', 'Integration | Component | drafts wf', {
+  integration: true
+});
+
+test('it renders', function(assert) {
+  // Set any properties with this.set('myProperty', 'value');
+  // Handle any actions with this.on('myAction', function(val) { ... });"
+
+  this.render(hbs`{{drafts-wf}}`);
+
+  assert.equal(this.$().text().trim(), '');
+
+  // Template block usage:"
+  this.render(hbs`
+    {{#drafts-wf}}
+      template block text
+    {{/drafts-wf}}
+  `);
+
+  assert.equal(this.$().text().trim(), 'template block text');
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/21697822/contrib/views/wfmanager/src/main/resources/ui/tests/unit/adapters/application-test.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/tests/unit/adapters/application-test.js b/contrib/views/wfmanager/src/main/resources/ui/tests/unit/adapters/application-test.js
new file mode 100644
index 0000000..d04fc3d
--- /dev/null
+++ b/contrib/views/wfmanager/src/main/resources/ui/tests/unit/adapters/application-test.js
@@ -0,0 +1,29 @@
+/*
+ *    Licensed to the Apache Software Foundation (ASF) under one or more
+ *    contributor license agreements.  See the NOTICE file distributed with
+ *    this work for additional information regarding copyright ownership.
+ *    The ASF licenses this file to You under the Apache License, Version 2.0
+ *    (the "License"); you may not use this file except in compliance with
+ *    the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+import { moduleFor, test } from 'ember-qunit';
+
+moduleFor('adapter:application', 'Unit | Adapter | application', {
+  // Specify the other units that are required for this test.
+  // needs: ['serializer:foo']
+});
+
+// Replace this with your real tests.
+test('it exists', function(assert) {
+  let adapter = this.subject();
+  assert.ok(adapter);
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/21697822/contrib/views/wfmanager/src/main/resources/ui/tests/unit/helpers/format-unicode-date-test.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/tests/unit/helpers/format-unicode-date-test.js b/contrib/views/wfmanager/src/main/resources/ui/tests/unit/helpers/format-unicode-date-test.js
new file mode 100644
index 0000000..807e8b6
--- /dev/null
+++ b/contrib/views/wfmanager/src/main/resources/ui/tests/unit/helpers/format-unicode-date-test.js
@@ -0,0 +1,27 @@
+/*
+ *    Licensed to the Apache Software Foundation (ASF) under one or more
+ *    contributor license agreements.  See the NOTICE file distributed with
+ *    this work for additional information regarding copyright ownership.
+ *    The ASF licenses this file to You under the Apache License, Version 2.0
+ *    (the "License"); you may not use this file except in compliance with
+ *    the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+import { formatUnicodeDate } from 'oozie-designer/helpers/format-unicode-date';
+import { module, test } from 'qunit';
+
+module('Unit | Helper | format unicode date');
+
+// Replace this with your real tests.
+test('it works', function(assert) {
+  let result = formatUnicodeDate([42]);
+  assert.ok(result);
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/21697822/contrib/views/wfmanager/src/main/resources/ui/tests/unit/models/wfproject-test.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/tests/unit/models/wfproject-test.js b/contrib/views/wfmanager/src/main/resources/ui/tests/unit/models/wfproject-test.js
new file mode 100644
index 0000000..8469555
--- /dev/null
+++ b/contrib/views/wfmanager/src/main/resources/ui/tests/unit/models/wfproject-test.js
@@ -0,0 +1,29 @@
+/*
+ *    Licensed to the Apache Software Foundation (ASF) under one or more
+ *    contributor license agreements.  See the NOTICE file distributed with
+ *    this work for additional information regarding copyright ownership.
+ *    The ASF licenses this file to You under the Apache License, Version 2.0
+ *    (the "License"); you may not use this file except in compliance with
+ *    the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+import { moduleForModel, test } from 'ember-qunit';
+
+moduleForModel('wfproject', 'Unit | Model | wfproject', {
+  // Specify the other units that are required for this test.
+  needs: []
+});
+
+test('it exists', function(assert) {
+  let model = this.subject();
+  // let store = this.store();
+  assert.ok(!!model);
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/21697822/contrib/views/wfmanager/src/main/resources/ui/tests/unit/routes/design/proj-manager-tab-test.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/tests/unit/routes/design/proj-manager-tab-test.js b/contrib/views/wfmanager/src/main/resources/ui/tests/unit/routes/design/proj-manager-tab-test.js
new file mode 100644
index 0000000..4ded785
--- /dev/null
+++ b/contrib/views/wfmanager/src/main/resources/ui/tests/unit/routes/design/proj-manager-tab-test.js
@@ -0,0 +1,28 @@
+/*
+*    Licensed to the Apache Software Foundation (ASF) under one or more
+*    contributor license agreements.  See the NOTICE file distributed with
+*    this work for additional information regarding copyright ownership.
+*    The ASF licenses this file to You under the Apache License, Version 2.0
+*    (the "License"); you may not use this file except in compliance with
+*    the License.  You may obtain a copy of the License at
+*
+*        http://www.apache.org/licenses/LICENSE-2.0
+*
+*    Unless required by applicable law or agreed to in writing, software
+*    distributed under the License is distributed on an "AS IS" BASIS,
+*    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+*    See the License for the specific language governing permissions and
+*    limitations under the License.
+*/
+
+import { moduleFor, test } from 'ember-qunit';
+
+moduleFor('route:design/proj-manager-tab', 'Unit | Route | design/proj manager tab', {
+  // Specify the other units that are required for this test.
+  // needs: ['controller:foo']
+});
+
+test('it exists', function(assert) {
+  let route = this.subject();
+  assert.ok(route);
+});