You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by jl...@apache.org on 2016/06/27 23:36:48 UTC

[22/34] ambari git commit: AMBARI-17355 & AMBARI-17354: POC: FE & BE changes for first class support for Yarn hosted services

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/styles/app_store.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/app_store.less b/ambari-web/app/styles/app_store.less
new file mode 100644
index 0000000..28ee619
--- /dev/null
+++ b/ambari-web/app/styles/app_store.less
@@ -0,0 +1,811 @@
+/**
+ * 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 'common.less';
+
+@lighten-for-apps: #eee;
+@darken-for-apps: #888;
+@darken-for-title: #666;
+@green-for-apps: #3fae2a;
+@size-for-apps: 220px;
+@border-radius-for-apps: 4px;
+
+#main.bg-grey {
+  background-image: url("/img/assemblies-background.png");
+  padding-bottom: 400px;
+  background-repeat-x: repeat;
+  background-repeat-y: no-repeat !important;
+  background-position: 0 100px;
+}
+
+#apps-store {
+
+  .detailed-info {
+
+    background-color: #fff;
+    color: #666;
+    .info-title {
+      text-transform: uppercase;
+      color: #aaa;
+    }
+
+    .containers-title {
+      a {
+        color: #aaa;
+        &:hover {
+          text-decoration: none;
+        }
+      }
+    }
+
+    .containers {
+      .container-title {
+        background: #4a4a4a;
+        padding: 5px 10px;
+        text-transform: uppercase;
+
+        a {
+          color: #fff;
+          &:hover {
+            text-decoration: none;
+          }
+        }
+      }
+    }
+  }
+
+  .sliderBar {
+    height: 1em;
+    border-radius: 0;
+    margin-top: 5px;
+    margin-bottom: 5px;
+    background: #eee;
+    a {
+      border-radius: 0;
+      width: 1.3em;
+      height: 1.3em;
+    }
+    .ui-slider-handle {
+      background: repeating-linear-gradient( 135deg, @lighten-for-apps, @lighten-for-apps 2px, #fff 2px, #fff 4px );
+    }
+  }
+  .ranges {
+    color: @darken-for-apps;
+  }
+
+  .valueInput input {
+    width: 90px;
+    border-radius: 0;
+    &.error {
+      border-color: #b94a48;
+    }
+  }
+
+  h4, h5 {
+    font-weight: 400;
+    margin-bottom: 0;
+  }
+  .top-search-bar {
+    margin-top: -15px;
+    .title {
+      padding-left: 20px;
+      width: 14%;
+    }
+    .title > h2 {
+      font-weight: 300;
+      font-size: 26px;
+    }
+    .subtitle {
+      margin-top: 11px;
+      margin-left: 0;
+    }
+    .subtitle > h5 {
+      font-size: 17px;
+    }
+    .search-box {
+      padding-top: 15px;
+      .icon-search {
+        position: relative;
+        left: 20px;
+        bottom: 2px;
+      }
+      input, input:focus {
+        background: transparent;
+        border-top-color: transparent;
+        border-right-color: transparent;
+        border-left-color: transparent;
+        border-bottom-color: #ccc;
+        border-radius: 0;
+        box-shadow: none;
+        margin-right: 20px;
+        padding-left: 30px;
+      }
+    }
+  }
+  .left-menu {
+
+    .service-groups-block .collapse.in {
+      overflow: visible;
+    }
+
+    .custom-accordion {
+      padding-bottom: 15px;
+      .collapse {
+        transition: height 0.00001s;
+      }
+    }
+
+    .service-group {
+      background-color: #f5f5f5;
+      border: 1px solid #d4d4d4;
+      margin-bottom: 10px;
+      margin-top: 5px;
+
+      .service-group-title {
+        padding: 5px 0 3px 15px;
+        span.pointer {
+          top: -3px;
+          position: relative;
+        }
+        a {
+          padding-left: 5px;
+          position: relative;
+          top: 2px;
+          text-decoration: none;
+          color: #555;
+          width: 105px;
+          overflow: hidden;
+          display: inline-block;
+          text-overflow: ellipsis;
+          white-space: nowrap;
+        }
+        img {
+          height: 10px;
+          position: relative;
+          bottom: 4px;
+        }
+      }
+
+      .service-group-title.active {
+        background: #4a4a4a;
+        max-height: 40px;
+        color: #ffffff;
+        a {
+          color: #ffffff;
+        }
+      }
+
+      .service-name-block {
+        width: auto;
+      }
+
+      ul.nav-list > li > a.services-menu-blocks {
+        cursor: default;
+        &:hover {
+          background: transparent;
+        }
+      }
+
+      .service-button {
+        margin-bottom: 10px;
+      }
+      .service-button .btn{
+        text-transform: uppercase;
+        border: 2px solid @darken-for-title;
+        background-color: transparent;
+        box-shadow: none;
+        text-shadow: none;
+        background-image: none;
+        border-radius: 2px;
+      }
+
+      .custom-accordion {
+        padding-bottom: 0;
+      }
+
+    }
+
+    .alerts-count {
+      float: right;
+    }
+    .restart-required-service {
+      display: none;
+    }
+
+
+    h5 a {
+      color: #555;
+      cursor: pointer;
+      text-transform: uppercase;
+      font-weight: normal;
+      font-size: 15px;
+      margin-left: 5px;
+      &:hover {
+        text-decoration: none;
+      }
+    }
+    h5.static-title {
+      color: #3fae2a;
+      margin-bottom: 15px;
+      text-transform: uppercase;
+      font-size: 15px;
+      font-weight: normal;
+    }
+    h5 span.pointer {
+      color: #3fae2a;
+    }
+    border: none;
+    background: none;
+    .nav-list > li > a {
+      color: #555;
+    }
+    .nav-list > li > a:hover {
+      color: #444;
+    }
+    .nav-list > li.active > a {
+      color: #fff;
+    }
+  }
+}
+
+.apps-section {
+  #top-banner {
+    padding: 15px 25px 0px 30px;
+  }
+  h5.section-title {
+    text-transform: uppercase;
+    margin-left: 35px;
+    margin-top: 15px;
+    font-size: 15px;
+    color: @darken-for-title;
+    .icon-question-sign {
+      margin: 8px;
+      color: #ccc;
+      cursor: pointer;
+    }
+  }
+  .no-apps-text {
+    color: #888;
+    font-size: 15px;
+    margin: 20px;
+  }
+}
+
+.store-apps-row {
+  margin-bottom: 35px;
+  margin-top: 10px;
+  display: block;
+  .store-app-span.span2 {
+    width: 17.4%;
+    margin-left: 1.5%;
+  }
+  .store-app-span.span1 {
+    width: 2%;
+  }
+  .slide-left, .slide-right {
+    padding-top: 100px;
+    color: #999;
+    cursor: pointer;
+    &.disabled {
+      opacity: 0.3;
+      cursor: default;
+    }
+    &.is-component {
+      padding-top: 75px;
+    }
+  }
+  .arrow {
+    position: relative;
+    top: 13px;
+    z-index: 110;
+    left: 50%;
+    margin-left: -11px;
+    display: block;
+    width: 0;
+    height: 0;
+    border-left: 10px solid transparent;
+    border-right: 10px solid transparent;
+    border-bottom: 15px solid #fff;
+    &.is-component {
+      top: 63px;
+    }
+  }
+
+  .action-buttons {
+    height: 30px;
+    margin-bottom: 10px;
+    text-align: center;
+    button.btn {
+      text-transform: uppercase;
+      border: 2px solid @green-for-apps;
+      background-color: transparent;
+      box-shadow: none;
+      text-shadow: none;
+      background-image: none;
+      border-radius: 0;
+    }
+    button.btn-success {
+      background-color: @green-for-apps;
+    }
+    button.show-details-button {
+      color: #fff;
+    }
+    button.collections-button {
+      color: @green-for-apps;
+    }
+  }
+}
+
+.bg-block {
+  background: #fff;
+  border: 1px solid @lighten-for-apps;
+  height: @size-for-apps;
+  border-radius: @border-radius-for-apps;
+  position: relative;
+  left: 7px;
+  top: 7px;
+  &.fit-margin {
+    left:0;
+    top: 2px;
+    right: 0;
+    height: 165px;
+  }
+}
+
+.store-app-block-view:hover .bg-block,
+.store-app-block-view.active .bg-block {
+  box-shadow: 0 0 10px #888;
+}
+
+.store-app-block {
+  background: #fff;
+  border: 1px solid @lighten-for-apps;
+  border-radius: @border-radius-for-apps;
+  height: @size-for-apps;
+  margin-top: -@size-for-apps;
+  position: relative;
+  z-index: 100;
+
+  &.fit-margin {
+    height: 165px;
+    top: 55px;
+    .logo {
+      margin-top: -10px;
+    }
+  }
+  .inner-block {
+    padding: 0 10px;
+    cursor: pointer;
+  }
+
+  h4.app-name {
+    width: 130px;
+    overflow: hidden;
+    margin-top: 8px;
+    display: inline-block;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+  p.categories {
+    color: @darken-for-apps;
+    line-height: 16px;
+    margin-bottom: 18px;
+    margin-top: -3px;
+  }
+
+  p.services {
+    color: #999;
+    border-top: 1px solid @lighten-for-apps;
+    text-align: center;
+    padding-top: 5px;
+    font-size: 11px;
+    .icon-ellipsis-horizontal {
+      color: #ccc;
+      padding: 5px;
+    }
+  }
+  .logo {
+    text-align: center;
+    height: 75px;
+    img {
+      height: 90px;
+      width: 90px;
+    }
+  }
+}
+
+.store-app-block-view.active {
+  .store-app-block {
+    background: #4CB8E7;
+    box-shadow: 0 0 4px #ccc;
+    .inner-block {
+      color: #fff !important;
+      .categories {
+        color: #fff;
+      }
+    }
+    p.logo img {
+      -webkit-filter: brightness(0) invert(1);
+      filter: brightness(0) invert(1);
+    }
+    .services {
+      color: #fff;
+      .icon-ellipsis-horizontal {
+        color: #fff;
+      }
+    }
+  }
+}
+
+.selected-store-app-details {
+  position: relative;
+  top: -25px;
+  box-shadow: 0 0 8px #ddd;
+  background-color: #fff;
+  border: 1px solid @lighten-for-apps;
+  border-radius: @border-radius-for-apps;
+  margin-left: 35px;
+  margin-right: 45px;
+  padding: 10px 30px;
+  &.is-component {
+    top: 25px;
+  }
+  .app-contents {
+    padding-right: 20px;
+    .title {
+      font-weight: normal;
+      margin: 5px 0;
+    }
+    .descriptions {
+      color: #686868;
+      font-size: 13px;
+    }
+    .action-buttons {
+      margin-top: 10px;
+      text-align: left;
+      button.btn {
+        text-transform: uppercase;
+        border: 2px solid @green-for-apps;
+        background-color: transparent;
+        box-shadow: none;
+        text-shadow: none;
+        background-image: none;
+        border-radius: 0;
+      }
+      button.btn-success {
+        background-color: @green-for-apps;
+      }
+      button.show-details-button {
+        color: #fff;
+      }
+      button.collections-button {
+        color: @green-for-apps;
+      }
+    }
+  }
+  .span2.app-image {
+    background: #f6f6f6;
+    margin: 15px 5px 15px 0;
+    height: 200px;
+    img {
+      padding-top: 30px;
+    }
+  }
+  .span3.services-images {
+    margin: 15px 0 0 4px;
+    width: 25.5%;
+    .span6.service-image {
+      margin: 0 7px 7px 0;
+      width: 46%;
+      padding: 8px;
+      background: #f6f6f6;
+    }
+  }
+  a.close {
+    position: absolute;
+    top: 7px;
+    right: 7px;
+    color: black;
+    text-decoration: none;
+    padding: 2px 5px 8px 5px;
+    height: 10px;
+    width: 10px;
+    text-align: center;
+    line-height: 15px;
+    border: 2px #000 solid;
+    border-radius: 100px;
+    font-weight: normal;
+    font-size: 1.2em;
+  }
+  a.close:hover {
+    opacity: 0.4;
+  }
+}
+
+.deploy-app-configs-modal {
+  .modal {
+    overflow: visible;
+    top: 20% !important;
+  }
+  .modal-footer {
+    .deploy-app-progress-bar div {
+      border-radius: 0;
+    }
+    .deploy-app-progress-bar{
+      .progress-info.progress-striped .bar, .progress-striped .bar-info {
+        background-color: #6490BF;
+      }
+    }
+    .manage-button {
+      margin-top: 13px;
+    }
+    .deploy-text {
+      color: #686868;
+    }
+    .percent {
+      color: #6490BF;
+    }
+  }
+  .modal-header {
+    a.close {
+      margin-top: 8px;
+      padding: 3px 6px 9px 6px;
+      height: 10px;
+      width: 10px;
+      text-align: center;
+      line-height: 15px;
+      border: 2px #000 solid;
+      border-radius: 100px;
+      font-weight: normal;
+      font-size: 1.2em;
+    }
+    a.close:hover {
+      opacity: 0.4;
+    }
+    .store-app-modal-header {
+      height: 40px;
+      margin-right: 30px;
+      h4 {
+        font-weight: normal;
+        margin: 0 100px;
+      }
+      p.categories {
+        margin-left: 100px;
+        line-height: 20px;
+        small {
+          color: @green-for-apps;
+        }
+      }
+      p.logo {
+        position: relative;
+        top: -90px;
+        left: -20px;
+        text-align: left;
+        height: 75px;
+        img {
+          height: 120px;
+        }
+      }
+    }
+  }
+  .modal-body {
+    background: #f6f6f6;
+    .deploy-app-body-content {
+      padding: 5px 80px;
+      .descriptions, .config-name {
+        color: #686868;
+      }
+      .sliderBar {
+        height: 1em;
+        border-radius: 0;
+        margin-top: 5px;
+        margin-bottom: 5px;
+        background: #eee;
+        a {
+          border-radius: 0;
+          width: 1.3em;
+          height: 1.3em;
+        }
+        .ui-slider-handle {
+          background: repeating-linear-gradient( 135deg, @lighten-for-apps, @lighten-for-apps 2px, #fff 2px, #fff 4px );
+        }
+      }
+      .ranges {
+        color: @darken-for-apps;
+      }
+
+      .valueInput input {
+        width: 90px;
+        border-radius: 0;
+        &.error {
+          border-color: #b94a48;
+        }
+      }
+    }
+  }
+  .modal-footer {
+    background: #fff;
+    button.btn {
+      background-color: transparent;
+      box-shadow: none;
+      text-shadow: none;
+      background-image: none;
+      border-radius: 0;
+    }
+    button.btn-success {
+      text-transform: uppercase;
+      border: 2px solid @green-for-apps;
+      background-color: @green-for-apps;
+    }
+  }
+}
+
+.configs-content {
+  padding: 15px 400px 15px 15px;
+}
+
+.descriptions, .config-name {
+    color: #686868;
+}
+#configs-save-button {
+  padding-top:40px;
+  button.btn {
+    background-color: transparent;
+    box-shadow: none;
+    text-shadow: none;
+    background-image: none;
+    border-radius: 0;
+  }
+  button.btn-success {
+    text-transform: uppercase;
+    border: 2px solid @green-for-apps;
+    background-color: @green-for-apps;
+  }
+}
+
+
+.assembly-header {
+  .desired-state {
+    padding: 15px 5px 0 0;
+    .desired-state-label {
+      padding: 4px 7px;
+      cursor: pointer;
+      border-radius: 0;
+      margin-bottom: 0;
+      text-transform: uppercase;
+      color: #fff;
+      text-shadow: none;
+      &.alert-success {
+        background: #3fae2a;
+        border-color: #3fae2a;
+      }
+      &.alert-danger {
+        background: #b94a48;
+        border-color: #b94a48;
+      }
+      i {
+        color: #fff;
+        padding-left: 5px;
+      }
+    }
+  }
+}
+
+#servicegroup-title {
+  padding-bottom:20px;
+  margin-top: 15px;
+  font-size: 20px;
+  color: @darken-for-title;
+}
+
+#main-servicegroup-section-panel {
+  min-height: 500px;
+  padding: 10px 20px;
+  background-color: rgba(255, 255, 255, 0.6);
+  #assembly-information {
+    width: 28%;
+    margin-left: 5.50%;
+    #assembly-business-impact-label, #assembly-quick-links-label {
+      font-size: 13.5px;
+      color: @darken-for-title;
+    }
+    #assembly-business-impact {
+      margin-bottom: 22px;
+      .business-impact {
+        background-color: #fff;
+        opacity: 0.85;
+        margin-top: 5px;
+        padding: 15px 0 0 10px;
+
+        #fraud-cost {
+          margin-left: 0px;
+        }
+        .description {
+          color: @darken-for-apps;
+          font-size: 13px;
+        }
+        .bi-value {
+          font-size: 35px;
+          font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
+          font-weight: 100;
+        }
+      }
+    }
+    #assembly-quick-links {
+      li {
+        list-style: none;
+      }
+      a.assembly-quick-link {
+        cursor: pointer;
+        color:rgba(0, 136, 204, 0.74);
+        font-size: 13.5px;
+      }
+    }
+  }
+  .service-group-menu-tabs.nav-tabs > li> a {
+    text-transform: uppercase;
+    color: #666;
+    border: 2px solid transparent;
+  }
+  .service-group-menu-tabs.nav-tabs > li> a:hover {
+   background-color: #e3e3e3;
+  }
+  .service-group-menu-tabs.nav-tabs > li.active > a,
+  .service-group-menu-tabs.nav-tabs > li.active > a:hover {
+    cursor: default;
+    background-color: transparent;
+    border-bottom-color: #3fae2a;
+  }
+}
+
+.manage-assembly-content {
+  padding: 5px 10px;
+  .descriptions {
+    color: #686868;
+    font-size: 13px;
+  }
+  #services-label {
+    text-transform: uppercase;
+    margin-top: 15px;
+    font-size: 13.5px;
+    color: @darken-for-title;
+  }
+
+  #services-images {
+    margin: 0;
+    .service-image {
+      cursor: pointer;
+      background: #fcfcfc;
+      border-radius: 2px;
+      padding: 8px;
+      opacity:0.75;
+      margin-left: 0;
+      margin-right:1.75%;
+      margin-bottom:1.75%;
+    }
+    .service-image.active {
+      cursor: auto;
+      box-shadow: 0 0 10px #ccc;
+      opacity:1;
+    }
+  }
+
+  #service-summary {
+    margin-top: 15px;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/styles/application.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/application.less b/ambari-web/app/styles/application.less
index 5c9e69e..91903d0 100644
--- a/ambari-web/app/styles/application.less
+++ b/ambari-web/app/styles/application.less
@@ -2394,8 +2394,29 @@ a:focus {
 
 /*****end styles for dashboard page*****/
 
+.service-group-name {
+  background-image: -moz-linear-gradient(top, @top-nav-bg-color-from, @top-nav-bg-color-to);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@top-nav-bg-color-from), to(@top-nav-bg-color-to));
+  background-image: -webkit-linear-gradient(top, @top-nav-bg-color-from, @top-nav-bg-color-to);
+  background-image: -o-linear-gradient(top, @top-nav-bg-color-from, @top-nav-bg-color-to);
+  background-image: linear-gradient(to bottom, @top-nav-bg-color-from, @top-nav-bg-color-to);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr= @top-nav-bg-color-from, endColorstr=@top-nav-bg-color-to); //for IE9-
+  -webkit-box-shadow: inset 0 0 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
+  -moz-box-shadow: inset 0 0 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
+  box-shadow: inset 0 0 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
+  max-height: 40px;
+  color: #ffffff;
+  text-shadow: 0 1px 0 #555555;
+  padding-left: 10px;
+  padding-right: 4px;
+  padding-top: 3px;
+  padding-bottom: 3px;
+  border-radius: 2px;
+}
+
 /*Services*/
 .services-menu {
+  border-radius: 2px;
   .nav-list {
     .tab-marker-position {
       list-style: none;

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/application.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/application.hbs b/ambari-web/app/templates/application.hbs
index 49cb18a..a00571a 100644
--- a/ambari-web/app/templates/application.hbs
+++ b/ambari-web/app/templates/application.hbs
@@ -16,7 +16,7 @@
 * limitations under the License.
 }}
 
-<div id="main">
+<div id="main" {{bindAttr class="isAppStorePageSelected:bg-grey"}}>
   <div id="top-nav">
     <div class="navbar navbar-static-top">
       <div class="navbar-inner">

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/common/collapsible.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/common/collapsible.hbs b/ambari-web/app/templates/common/collapsible.hbs
new file mode 100644
index 0000000..9d5cac4
--- /dev/null
+++ b/ambari-web/app/templates/common/collapsible.hbs
@@ -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.
+}}
+
+<div class="custom-accordion">
+  {{yield}}
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies.hbs b/ambari-web/app/templates/main/assemblies.hbs
new file mode 100644
index 0000000..4c668b2
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies.hbs
@@ -0,0 +1,107 @@
+{{!
+* 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.
+}}
+<div id="apps-store">
+  <div class="row-fluid top-search-bar">
+    <div class="span12">
+      <div class="span2 title">
+        <h2>{{t menu.item.appStore}}</h2>
+      </div>
+      <div class="span2 subtitle">
+        <h5>{{subtitle}}</h5>
+      </div>
+      {{#if showFilterString}}
+        <div class="pull-right search-box">
+          <i class="icon-search"></i>{{view Em.TextField valueBinding="filterString" placeholderBinding="searchString"}}
+        </div>
+      {{/if}}
+    </div>
+  </div>
+
+  <div class="row-fluid main-apps-content">
+    <div class="well span2 left-menu" style="padding: 8px 0px 8px 25px">
+      <h5 class="static-title">{{t appStore.menu.header.discover}}</h5>
+      {{#view App.CollapsibleView openOnInit=true}}
+        <h5>
+          <span {{action "toggleCollapse" target="view"}} {{bindAttr class="view.expanded:icon-caret-down:icon-caret-right :pointer"}}></span>
+          <a id="discover-assemblies-label" {{action "toggleCollapse" target="view"}}>{{t common.categories}}</a>
+        </h5>
+        <div id="discover-assemblies-content" class="collapse">
+          <ul class="nav nav-list">
+            {{#each storeCategory in storeCategories}}
+              <li {{bindAttr class="storeCategory.isActive:active"}}>
+                <a href="#" {{action "selectCategory" storeCategory target="controller"}}>{{storeCategory.name}}</a>
+              </li>
+            {{/each}}
+          </ul>
+        </div>
+      {{/view}}
+
+      <h5 class="static-title">{{t appStore.menu.header.manage}}</h5>
+      {{#view App.CollapsibleView class="service-groups-block" openOnInit=false}}
+        <h5>
+          <span {{action "toggleCollapse" target="view"}} {{bindAttr class="view.expanded:icon-caret-down:icon-caret-right :pointer"}}></span>
+          <a id="manage-deployed-assemblies-label" {{action "toggleCollapse" target="view"}}>{{t appStore.collections.assemblies}}</a>
+        </h5>
+        <div class="collapse" id="manage-deployed-assemblies-content">
+          {{#each serviceGroup in visibleServiceGroups}}
+            <div class="service-group">
+              {{#view App.CollapsibleView contentBinding="serviceGroup"}}
+                <div {{bindAttr class="serviceGroup.isActive:active :service-group-title"}}>
+                  <div {{action "toggleCollapse" target="view"}}>
+                    <span {{bindAttr class="view.expanded:icon-caret-down:icon-caret-right :pointer"}}></span>
+                    <a href="#" {{action "makeServiceGroupActive" serviceGroup target="controller"}}>
+                      {{serviceGroup.serviceGroupDisplayName}}
+                    </a>
+                    {{#unless serviceGroup.allServicesAreStarted}}
+                      <img src="/img/health-status-dead.png" alt="">
+                    {{/unless}}
+                  </div>
+                </div>
+                <div class="collapse manage-deployed-assembly">
+                  {{view App.MainServiceMenuView serviceGroupBinding="serviceGroup"}}
+                  {{view App.AllServicesActionView serviceGroupBinding="serviceGroup"}}
+                </div>
+              {{/view}}
+            </div>
+          {{/each}}
+        </div>
+      {{/view}}
+
+      {{#view App.CollapsibleView}}
+        <h5>
+          <span {{action "toggleCollapse" target="view"}} {{bindAttr class="view.expanded:icon-caret-down:icon-caret-right :pointer"}}></span>
+          <a id="manage-assemblies-collection-label" {{action "toggleCollapse" target="view"}}>{{t appStore.collections.header}}</a>
+        </h5>
+        <div class="collapse" id="manage-assemblies-collection-content">
+          <ul class="nav nav-list">
+            {{#each storeCollection in storeCollections}}
+              <li {{bindAttr class="storeCollection.isActive:active"}}>
+                <a
+                  href="#" {{action "selectCollection" storeCollection target="controller"}}>{{storeCollection.name}}</a>
+              </li>
+            {{/each}}
+          </ul>
+        </div>
+      {{/view}}
+
+    </div>
+    <div class="span10 apps-section">
+      {{outlet}}
+    </div>
+  </div>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/active_store_app.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/active_store_app.hbs b/ambari-web/app/templates/main/assemblies/active_store_app.hbs
new file mode 100644
index 0000000..44d2595
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/active_store_app.hbs
@@ -0,0 +1,42 @@
+{{!
+* 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.
+}}
+
+<div {{bindAttr class=":selected-store-app-details view.storeApp.isComponent:is-component"}}>
+  <div class="row-fluid">
+    <div class="span7 app-contents">
+      <h3 class="title">{{view.title}}</h3>
+      <p class="descriptions">{{nl2br view.storeApp.description}}</p>
+      <p class="action-buttons">
+        <button type="button" class="btn btn-success" {{action "startDeploy" target="controller"}}>{{t common.deploy}}</button>
+        <button type="button" class="btn collections-button" {{action "addToCollection" target="controller"}}><span class="icon-plus"></span> {{t appStore.collections.addToCollection}}</button>
+      </p>
+    </div>
+    <div class="span2 app-image">
+      <img {{bindAttr src="view.storeApp.logoUrl" alt="view.storeApp.name"}} />
+    </div>
+    <div class="span3 services-images">
+      {{! Services logos }}
+        {{#each service in view.shownServices}}
+          <div class="span6 service-image">
+            <img {{bindAttr src="service.url" alt="service.name" title="service.name"}}/>
+          </div>
+        {{/each}}
+    </div>
+    <a class="close" {{action "closeDetails" target="controller"}}>x</a>
+  </div>
+</div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/apps_row.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/apps_row.hbs b/ambari-web/app/templates/main/assemblies/apps_row.hbs
new file mode 100644
index 0000000..182973d
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/apps_row.hbs
@@ -0,0 +1,45 @@
+{{!
+* 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.
+}}
+
+<h5 class="section-title">{{view.rowTitle}}
+  <i {{bindAttr class="view.rowTitle :icon-question-sign"}}></i>
+</h5>
+<div class="row-fluid store-apps-row">
+  <div {{bindAttr class=":slide-left :store-app-span :span1 :icon-chevron-left :icon-2x
+    view.disabledLeft:disabled view.isComponents:is-component" }}
+    {{action moveLeft target="view"}}>
+  </div>
+  {{#each storeApp in view.visibleApps}}
+    <div class="store-app-span span2">
+      {{view App.StoreAppBlockView storeAppBinding="storeApp"}}
+      {{#if storeApp.isActive}}
+        <div {{bindAttr class=":arrow storeApp.isComponent:is-component"}}></div>{{/if}}
+    </div>
+  {{/each}}
+  <div {{bindAttr class=":slide-right :store-app-span :span1 :icon-chevron-right :icon-2x
+    view.disabledRight:disabled view.isComponents:is-component" }}
+    {{action moveRight target="view"}}>
+  </div>
+</div>
+{{#if view.hasActiveApp}}
+  <div class="row-fluid">
+    <div class="span12">
+      {{view App.ActiveStoreAppView storeAppBinding="view.activeApp"}}
+    </div>
+  </div>
+{{/if}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/categories/category.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/categories/category.hbs b/ambari-web/app/templates/main/assemblies/categories/category.hbs
new file mode 100644
index 0000000..49f909f
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/categories/category.hbs
@@ -0,0 +1,32 @@
+{{!
+* 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.
+}}
+<div id="top-banner">
+  <img src="/img/assemblies-banner.jpg" alt="Assemblies Banner"/>
+</div>
+{{#if storeAppsEmpty}}
+  <div class="no-apps-text">
+    {{t appStore.apps.noApps}}
+  </div>
+{{else}}
+  {{#if assemblies.length}}
+    {{view App.AppsRowView appsBinding="assemblies" rowTitleBinding="assembliesTitle"}}
+  {{/if}}
+  {{#if components.length}}
+    {{view App.AppsRowView appsBinding="components" rowTitleBinding="componentsTitle" isComponents=true}}
+  {{/if}}
+{{/if}}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/collections/collection.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/collections/collection.hbs b/ambari-web/app/templates/main/assemblies/collections/collection.hbs
new file mode 100644
index 0000000..14f5174
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/collections/collection.hbs
@@ -0,0 +1,30 @@
+{{!
+* 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 storeAppsEmpty}}
+  <div class="no-apps-text">
+    {{t appStore.apps.noApps}}
+  </div>
+{{else}}
+  {{#if assemblies.length}}
+    {{view App.AppsRowView appsBinding="assemblies" rowTitleBinding="assembliesTitle"}}
+  {{/if}}
+  {{#if components.length}}
+    {{view App.AppsRowView appsBinding="components" rowTitleBinding="componentsTitle"}}
+  {{/if}}
+{{/if}}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/deploy_store_app.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/deploy_store_app.hbs b/ambari-web/app/templates/main/assemblies/deploy_store_app.hbs
new file mode 100644
index 0000000..65f2254
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/deploy_store_app.hbs
@@ -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.
+}}
+
+<div class="deploy-app-body-content">
+    <p class="descriptions">{{t assemblies.app.deploy.popup.description}}</p>
+
+    {{#each config in view.parentView.storeApp.configurations}}
+      {{view App.DeployStoreAppView configBinding="config" isDeployingBinding="isDeploying"}}
+    {{/each}}
+</div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/deploy_store_app/config.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/deploy_store_app/config.hbs b/ambari-web/app/templates/main/assemblies/deploy_store_app/config.hbs
new file mode 100644
index 0000000..81a6c1a
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/deploy_store_app/config.hbs
@@ -0,0 +1,30 @@
+{{!
+* 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.
+}}
+
+<div class="config_form">
+  <p class="config-name">{{view.config.name}}</p>
+  <div class="row-fluid">
+    <div class="span8">
+      <div class="sliderBar"></div>
+      <div class="ranges"><span class="pull-left">{{view.config.minValue}}</span><span class="pull-right">{{view.config.maxValue}}</span></div>
+    </div>
+    <div {{bindAttr class=":span4 :valueInput :control-group view.config.errorMessage:error" }}>
+      {{view view.sliderInputView valueBinding="view.config.value"}}
+    </div>
+  </div>
+</div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/deploy_store_app/deploy_store_app_footer.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/deploy_store_app/deploy_store_app_footer.hbs b/ambari-web/app/templates/main/assemblies/deploy_store_app/deploy_store_app_footer.hbs
new file mode 100644
index 0000000..ed86570
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/deploy_store_app/deploy_store_app_footer.hbs
@@ -0,0 +1,44 @@
+{{!
+* 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.
+}}
+
+<div class="modal-footer">
+  {{#if view.parentView.isDeploying}}
+    <div class="row-fluid">
+      <div class="span8">
+        <div>
+          <span class="pull-left deploy-text">{{t common.deploying}}</span>
+          <span class="percent">{{view.parentView.progress}}%</span>
+        </div>
+        <div {{bindAttr class=":deploy-app-progress-bar :progress-bar"}}>
+          <div class="progress-striped active progress-info progress">
+            <div class="bar" {{bindAttr style="view.parentView.progressStyle"}}></div>
+          </div>
+        </div>
+      </div>
+      <div class="span4">
+        <button {{bindAttr class=":manage-button :btn view.parentView.primaryClass"}}
+          {{action onSecondary target="view.parentView"}}>{{t common.manage}}</button>
+      </div>
+    </div>
+  {{else}}
+    <button {{bindAttr disabled="view.parentView.disableSecondary" class=":btn view.parentView.secondaryClass"}}
+      {{action onSecondary target="view.parentView"}}>{{view.parentView.secondary}}</button>
+    <button {{bindAttr disabled="view.parentView.storeApp.someConfigurationInvalid" class=":btn view.parentView.primaryClass"}}
+      {{action onPrimary target="view.parentView"}}>{{view.parentView.primary}}</button>
+  {{/if}}
+</div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/deploy_store_app/deploy_store_app_header.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/deploy_store_app/deploy_store_app_header.hbs b/ambari-web/app/templates/main/assemblies/deploy_store_app/deploy_store_app_header.hbs
new file mode 100644
index 0000000..5326453
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/deploy_store_app/deploy_store_app_header.hbs
@@ -0,0 +1,26 @@
+{{!
+* 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.
+}}
+
+<div class="store-app-modal-header">
+  <h4>{{ view.parentView.storeApp.name }}</h4>
+  <p class="categories">
+    <small>{{ view.categories }}</small></p>
+  <p class="logo">
+    <img {{bindAttr src="view.parentView.storeApp.logoUrl"}} />
+  </p>
+</div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/service_groups/configs.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/service_groups/configs.hbs b/ambari-web/app/templates/main/assemblies/service_groups/configs.hbs
new file mode 100644
index 0000000..a12074e
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/service_groups/configs.hbs
@@ -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.
+}}
+
+
+<div class="configs-content">
+  {{#each config in content.configurations}}
+    {{view App.DeployStoreAppView configBinding="config" isDeploying=false}}
+  {{/each}}
+  <div id="configs-save-button">
+    <button class="btn btn-success pull-left" {{action "saveConfiguration" target="controller"}} {{bindAttr disabled="content.someConfigurationInvalid"}}>{{t common.save}}</button>
+  </div>
+</div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/service_groups/detailed_info.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/service_groups/detailed_info.hbs b/ambari-web/app/templates/main/assemblies/service_groups/detailed_info.hbs
new file mode 100644
index 0000000..697863a
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/service_groups/detailed_info.hbs
@@ -0,0 +1,114 @@
+{{!
+* 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.
+}}
+
+<div class="detailed-info">
+
+  <table class="table table-bordered">
+    <tr>
+      <td colspan="3">
+        <span class="info-title">{{t assembly.detailedInfo.infoTitle.assemblyName}}</span><br/>
+        {{content.serviceGroupNameLower}}
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <span class="info-title">{{t assembly.detailedInfo.infoTitle.uri}}</span><br/>
+        {{content.uri}}
+      </td>
+      <td>
+        <span class="info-title">{{t assembly.detailedInfo.infoTitle.lifetime}}</span><br/>
+        {{content.lifetime}}
+      </td>
+      <td>
+        <span class="info-title">{{t assembly.detailedInfo.infoTitle.expectedContainers}}</span><br/>
+        {{content.containers.length}}
+      </td>
+    </tr>
+    <tr>
+      <td colspan="3">
+        {{#view App.CollapsibleView}}
+          <p class="containers-title">
+            <a href="#" {{action "toggleCollapse" target="view"}}>
+              <span {{bindAttr class="view.expanded:icon-caret-down:icon-caret-right :pointer"}}></span>
+              <span class="info-title">{{t assembly.detailedInfo.infoTitle.containers}} ({{content.containers.length}})</span>
+            </a>
+          </p>
+          <div class="collapse">
+            <div class="containers">
+              {{#each container in containers}}
+
+                {{#view App.CollapsibleView}}
+                  <p class="container-title">
+                    <a href="#" {{action "toggleCollapse" target="view"}}>
+                      <span {{bindAttr class="view.expanded:icon-caret-down:icon-caret-right :pointer"}}></span>
+                      {{container.id}}
+                    </a>
+                  </p>
+                  <div class="collapse">
+                    <table class="table table-striped table-bordered table-condensed">
+                      <tbody>
+                      <tr>
+                        <td class="span2">{{t common.name}}</td>
+                        <td class="span10">{{container.component_name}}</td>
+                      </tr>
+                      <tr>
+                        <td>{{t common.uri}}</td>
+                        <td>{{container.uri}}</td>
+                      </tr>
+                      <tr>
+                        <td>{{t common.ip}}</td>
+                        <td>{{container.ip}}</td>
+                      </tr>
+                      <tr>
+                        <td>{{t common.hostName}}</td>
+                        <td>{{container.hostname}}</td>
+                      </tr>
+                      <tr>
+                        <td>{{t common.state}}</td>
+                        <td>{{container.state}}</td>
+                      </tr>
+                      <tr>
+                        <td>{{t assembly.detailedInfo.containers.launchTime}}</td>
+                        <td>{{container.launch_time}}</td>
+                      </tr>
+                      <tr>
+                        <td>{{t assembly.detailedInfo.containers.bareHost}}</td>
+                        <td>{{container.bare_host}}</td>
+                      </tr>
+                      <tr>
+                        <td>{{t common.cpu}}</td>
+                        <td>{{container.resource.cpus}}</td>
+                      </tr>
+                      <tr>
+                        <td>{{t common.memory}}</td>
+                        <td>{{container.resource.memory}}</td>
+                      </tr>
+                      </tbody>
+                    </table>
+                  </div>
+                {{/view}}
+
+              {{/each}}
+            </div>
+          </div>
+        {{/view}}
+      </td>
+    </tr>
+  </table>
+
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/service_groups/menu.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/service_groups/menu.hbs b/ambari-web/app/templates/main/assemblies/service_groups/menu.hbs
new file mode 100644
index 0000000..d237c42
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/service_groups/menu.hbs
@@ -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.
+}}
+
+<ul class="nav nav-tabs service-group-menu-tabs">
+  {{#each item in view.menu}}
+    <li {{bindAttr class="item.isActive:active"}}>
+      <a href="#" {{action "moveTo" item.route target="view" }}>{{item.title}}</a>
+    </li>
+  {{/each}}
+</ul>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/service_groups/service_group.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/service_groups/service_group.hbs b/ambari-web/app/templates/main/assemblies/service_groups/service_group.hbs
new file mode 100644
index 0000000..6b0fd57
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/service_groups/service_group.hbs
@@ -0,0 +1,38 @@
+{{!
+* 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.
+}}
+<div class="assembly-header">
+  <h5 id="servicegroup-title" class="pull-left">
+    {{content.serviceGroupDisplayName}}
+    {{#if content.alertsCount}}
+      <span class="label alerts-crit-count">{{content.shownAlertsCount}}</span>
+    {{/if}}
+  </h5>
+  <p class="desired-state pull-right">
+    {{#if content.isStarted}}
+      <span class="pull-right alert alert-success desired-state-label" {{action "stopServiceGroup" target="controller"}}>{{t common.running}} <a href="#"><i class="icon-pause"></i></a></span>
+    {{/if}}
+    {{#if content.isStopped}}
+      <span class="pull-right alert alert-danger desired-state-label" {{action "startServiceGroup" target="controller"}}>{{t common.stopped}} <a href="#"><i class="icon-play"></i></a></span>
+    {{/if}}
+  </p>
+  <div class="clearfix"></div>
+</div>
+<div id="main-servicegroup-section-panel">
+  {{view App.MainAssembliesServiceGroupMenuView}}
+  {{outlet}}
+</div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/service_groups/summary.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/service_groups/summary.hbs b/ambari-web/app/templates/main/assemblies/service_groups/summary.hbs
new file mode 100644
index 0000000..b5fb02f
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/service_groups/summary.hbs
@@ -0,0 +1,66 @@
+{{!
+* 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.
+}}
+
+<div class="manage-assembly-content span8">
+  <p class="descriptions">{{content.description}}</p>
+  <p id="services-label">{{t assembly.manage.summary.label.service}}</p>
+  <div id="services-images">
+    {{! Services logos }}
+    {{#each service in view.shownServices}}
+      <div {{bindAttr class="service.isActive:active :span2 :service-image"}}>
+        <img  {{action "makeServiceActive" service target="view"}} {{bindAttr src="service.url" alt="service.displayName" title="service.displayName"}}/>
+      </div>
+    {{/each}}
+  </div>
+  <div class="clearfix"></div>
+  <div class="box" id="service-summary">
+    <div class="box-header summary-box-header">
+      <h4>{{view.activeService.displayName}}&nbsp;{{t services.service.info.menu.summary}}</h4>
+    </div>
+    {{#if view.showSpinner}}
+      {{view App.SpinnerView}}
+    {{else}}
+      {{view view.serviceSummaryView}}
+    {{/if}}
+  </div>
+</div>
+<div id="assembly-information" class="span4">
+  {{#if content.isCfMonitorServiceGroup}}
+    <div id="assembly-business-impact">
+      <span id="assembly-business-impact-label">{{t assembly.manage.summary.business.impact}}</span>
+      <div class="business-impact">
+        <div class="span6" id="fraud-transactions">
+          <p class="bi-value text-error">{{content.businessImpact.fraudTransactions}}</p>
+          <p class="description">{{t assembly.manage.fraudTransactions}}</p>
+        </div>
+        <div class="span6" id="fraud-cost">
+          <p class="bi-value">{{content.businessImpact.fraudCost}}</p>
+          <p class="description">{{t assembly.manage.fraudCost}}</p>
+        </div>
+        <div class="clearfix"></div>
+      </div>
+    </div>
+  {{/if}}
+  <div id="assembly-quick-links">
+    <span id="assembly-quick-links-label">{{t assembly.manage.summary.quick.links}}</span>
+    <li> <a tabindex="-1" class="assembly-quick-link" href="#" {{action "showAssemblyFile" target="view"}}>{{t assembly.manage.assemblySpecFile}}</a></li>
+    {{#each assemblyLink in content.assemblyLinks}}
+       <li> <a tabindex="-1" class="assembly-quick-link" {{bindAttr href="assemblyLink.url"}} target="_blank">{{assemblyLink.label}}</a></li>
+    {{/each}}
+  </div>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/assemblies/store_app_block.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/assemblies/store_app_block.hbs b/ambari-web/app/templates/main/assemblies/store_app_block.hbs
new file mode 100644
index 0000000..d2f3893
--- /dev/null
+++ b/ambari-web/app/templates/main/assemblies/store_app_block.hbs
@@ -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.
+}}
+
+<div class="outer-block" {{action "showDetails" view.storeApp target="controller"}}>
+  <div {{bindAttr class=":bg-block view.showBgBlock::fit-margin"}}></div>
+  <div {{bindAttr class=":store-app-block view.showBgBlock::fit-margin"}}>
+    <div class="inner-block">
+      <h4 class="app-name">{{view.storeApp.name}}</h4>
+      <p class="categories">
+        <small>{{view.categoryNames}}</small>
+      </p>
+      <p class="logo">
+        <img {{bindAttr src="view.storeApp.logoUrl" alt="view.storeApp.name"}} />
+      </p>
+      <div class="action-buttons"></div>
+    </div>
+    {{#unless view.storeApp.isComponent}}
+      <p class="services">
+        {{view.shownServices}}
+        {{#if view.moreServices}}
+          <i class="icon-ellipsis-horizontal"></i>
+        {{/if}}
+      </p>
+    {{/unless}}
+  </div>
+</div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/dashboard.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/dashboard.hbs b/ambari-web/app/templates/main/dashboard.hbs
index f020162..c3df5c1 100644
--- a/ambari-web/app/templates/main/dashboard.hbs
+++ b/ambari-web/app/templates/main/dashboard.hbs
@@ -17,20 +17,28 @@
 }}
 
 <div class="row-fluid">
-  <div class="services-menu well span2 service-menu-width" style="padding: 8px 0">
-    {{view App.MainServiceMenuView}}
-    {{view App.AllServicesActionView}}
+  <div class="span2 service-menu-width" style="padding: 8px 0">
+    <div class="service-group-name">
+      {{App.currentStackName}}
+      {{#if coreServiceGroup.alertsCount}}
+        <span class="label alerts-count alerts-crit-count pull-right">{{coreServiceGroup.shownAlertsCount}}</span>
+      {{/if}}
+    </div>
+    <div class="services-menu well" style="padding: 8px 0">
+      {{view App.MainServiceMenuView serviceGroupBinding="coreServiceGroup"}}
+      {{view App.AllServicesActionView serviceGroupBinding="coreServiceGroup"}}
+    </div>
   </div>
-    <div class="summary-width span10" id="dashboard-widgets-container">
-      <ul class="nav nav-tabs background-text">
-        {{#each category in view.categories}}
-          {{#view view.NavItemView itemBinding="category.name" }}
-            <a href="#" {{action "goToDashboardView" category.url}} >{{category.label}}</a>
-          {{/view}}
-        {{/each}}
-      </ul>
+  <div class="summary-width span10" id="dashboard-widgets-container">
+    <ul class="nav nav-tabs background-text">
+      {{#each category in view.categories}}
+        {{#view view.NavItemView itemBinding="category.name" }}
+          <a href="#" {{action "goToDashboardView" category.url}} >{{category.label}}</a>
+        {{/view}}
+      {{/each}}
+    </ul>
 
       <!--show widgets, heatmaps or configs in the content-->
-      {{outlet}}
-    </div>
+    {{outlet}}
+  </div>
 </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/service.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/service.hbs b/ambari-web/app/templates/main/service.hbs
index 3a4f786..f56d48a 100644
--- a/ambari-web/app/templates/main/service.hbs
+++ b/ambari-web/app/templates/main/service.hbs
@@ -17,9 +17,21 @@
 }}
 
 <div class="row-fluid">
-  <div class="services-menu well span2 service-menu-width" style="padding: 8px 0">
-    {{view App.MainServiceMenuView}}
-    {{view App.AllServicesActionView}}
+  <div class="span2 service-menu-width" style="padding: 8px 0">
+    <div class="service-group-name">
+      {{#if serviceGroup.isCoreServiceGroup}}
+        {{App.currentStackName}}
+      {{else}}
+        {{serviceGroup.serviceGroupDisplayName}}
+      {{/if}}
+      {{#if serviceGroup.alertsCount}}
+        <span class="label alerts-count alerts-crit-count pull-right">{{serviceGroup.shownAlertsCount}}</span>
+      {{/if}}
+    </div>
+    <div class="services-menu well" style="padding: 8px 0">
+      {{view App.MainServiceMenuView serviceGroupBinding="serviceGroup"}}
+      {{view App.AllServicesActionView serviceGroupBinding="serviceGroup"}}
+    </div>
   </div>
   <div class="span10 summary-width">
     {{outlet}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/service/all_services_actions.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/service/all_services_actions.hbs b/ambari-web/app/templates/main/service/all_services_actions.hbs
index edcd29c..987adc4 100644
--- a/ambari-web/app/templates/main/service/all_services_actions.hbs
+++ b/ambari-web/app/templates/main/service/all_services_actions.hbs
@@ -24,39 +24,45 @@
             </a>
             <ul class="pull-left dropdown-menu">
                 {{#isAuthorized "SERVICE.ADD_DELETE_SERVICES"}}
-                    <li {{bindAttr class="view.serviceController.isAllServicesInstalled:disabled"}}>
+                  {{#if view.serviceGroup.isCoreServiceGroup}}
+                    <li {{bindAttr class="view.serviceGroup.isAllServicesInstalled:disabled"}}>
                         <a href="#"
-                            {{bindAttr class="view.serviceController.isAllServicesInstalled:disabled"}}
+                            {{bindAttr class="view.serviceGroup.isAllServicesInstalled:disabled"}}
                             {{action gotoAddService target="view.serviceController"}}>
                             <i class="icon-plus icon-white"></i> {{t services.service.add}}</a>
                     </li>
+                  {{/if}}
                 {{/isAuthorized}}
                 {{#isAuthorized "SERVICE.START_STOP"}}
+                  {{#if view.serviceGroup.isCoreServiceGroup}}
                     <li class="divider"></li>
-                    <li {{bindAttr class="view.serviceController.isStartAllDisabled:disabled" }}>
+                  {{/if}}
+                    <li {{bindAttr class="view.isStartAllDisabled:disabled" }}>
                         <a href="#" data-toggle="modal"
-                            {{bindAttr class="view.serviceController.isStartAllDisabled:disabled" }}
-                            {{action "startAllService" target="view.serviceController"}}>
-                            <i {{bindAttr class=":icon-play view.serviceController.isStartAllDisabled:disabled:enabled " }}></i>
+                            {{bindAttr class="view.isStartAllDisabled:disabled" }}
+                            {{action "startAllService" view.serviceGroup target="view.serviceController"}}>
+                            <i {{bindAttr class=":icon-play view.isStartAllDisabled:disabled:enabled " }}></i>
                             {{t services.service.startAll}}
                         </a>
                     </li>
-                    <li {{bindAttr class="view.serviceController.isStopAllDisabled:disabled" }}>
+                    <li {{bindAttr class="view.isStopAllDisabled:disabled" }}>
                         <a href="#" data-toggle="modal"
-                            {{bindAttr class="view.serviceController.isStopAllDisabled:disabled" }}
-                            {{action "stopAllService" target="view.serviceController"}}>
-                            <i {{bindAttr class=":icon-stop view.serviceController.isStopAllDisabled:disabled:enabled" }}></i>
+                            {{bindAttr class="view.isStopAllDisabled:disabled" }}
+                            {{action "stopAllService" view.serviceGroup target="view.serviceController"}}>
+                            <i {{bindAttr class=":icon-stop view.isStopAllDisabled:disabled:enabled" }}></i>
                             {{t services.service.stopAll}}
                         </a>
                     </li>
-                    <li {{bindAttr class="view.serviceController.isRestartAllRequiredDisabled:disabled" }}>
+                    {{#if view.serviceGroup.isCoreServiceGroup}}
+                      <li {{bindAttr class="view.isRestartAllRequiredDisabled:disabled" }}>
                         <a href="#" data-toggle="modal"
-                            {{bindAttr class="view.serviceController.isRestartAllRequiredDisabled:disabled" }}
-                            {{action "restartAllRequired" target="view.serviceController"}}>
-                            <i {{bindAttr class=":icon-repeat view.serviceController.isRestartAllRequiredDisabled:disabled:enabled" }}></i>
+                            {{bindAttr class="view.isRestartAllRequiredDisabled:disabled" }}
+                            {{action "restartAllRequired" view.serviceGroup target="view.serviceController"}}>
+                            <i {{bindAttr class=":icon-repeat view.isRestartAllRequiredDisabled:disabled:enabled" }}></i>
                             {{t services.service.restartAllRequired}}
                         </a>
-                    </li>
+                      </li>
+                    {{/if}}
                 {{/isAuthorized}}
             </ul>
         </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/templates/main/service/item.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/service/item.hbs b/ambari-web/app/templates/main/service/item.hbs
index c22424b..d7d70fe 100644
--- a/ambari-web/app/templates/main/service/item.hbs
+++ b/ambari-web/app/templates/main/service/item.hbs
@@ -58,7 +58,7 @@
 
 {{#isAuthorized "SERVICE.RUN_CUSTOM_COMMAND, SERVICE.RUN_SERVICE_CHECK, SERVICE.START_STOP, SERVICE.TOGGLE_MAINTENANCE, SERVICE.ENABLE_HA"}}
 <div class="service-button">
-  {{#if view.isMaintenanceActive}}
+  {{#if view.isServiceActionsVisible}}
     <div class="btn-group display-inline-block">
       <a class="btn dropdown-toggle" id="service-actions-dropdown-btn" data-toggle="dropdown" href="#">
         {{t services.service.actions.serviceActions}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/utils/ajax/ajax.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/ajax/ajax.js b/ambari-web/app/utils/ajax/ajax.js
index 195dab4..b873239 100644
--- a/ambari-web/app/utils/ajax/ajax.js
+++ b/ambari-web/app/utils/ajax/ajax.js
@@ -2935,6 +2935,26 @@ var urls = {
   'service.components.load': {
     real: '/clusters/{clusterName}/services?fields=components&minimal_response=true',
     mock: '/data/services/components.json'
+  },
+  'service_group.get.info': {
+    real: '/clusters/{clusterName}/servicegroups?fields=*',
+    mock: '',
+    type: 'GET'
+  },
+  'service_group.change_state': {
+    real: '/clusters/{clusterName}/servicegroups/{id}',
+    mock: '',
+    format: function (data) {
+      return {
+        type: 'PUT',
+        data: JSON.stringify({
+          RequestInfo: {context: "Starting " + data.id},
+          ServiceGroupInfo: {
+            desired_state: data.state
+          }
+        })
+      }
+    }
   }
 };
 /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/utils/handlebars_helpers.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/handlebars_helpers.js b/ambari-web/app/utils/handlebars_helpers.js
index eca816c..997396e 100644
--- a/ambari-web/app/utils/handlebars_helpers.js
+++ b/ambari-web/app/utils/handlebars_helpers.js
@@ -39,6 +39,7 @@ App.registerBoundHelper = function(name, view) {
  *           {{pluralize hostsCount singular="@view.hostName"}}
  */
 App.registerBoundHelper('pluralize', App.PluralizeView);
+
 /**
  * Return defined string instead of empty if value is null/undefined
  * by default is `n/a`.
@@ -100,4 +101,10 @@ App.registerBoundHelper('statusIcon', App.StatusIconView);
  * Return `span` with formatted service name
  * @param {string} content - serviceName
  */
-App.registerBoundHelper('formatRole', App.FormatRoleView);
\ No newline at end of file
+App.registerBoundHelper('formatRole', App.FormatRoleView);
+
+/**
+ * Return `span` with message where all "\n" are replaced with br-tag
+ * @param {string} content - message to show
+ */
+App.registerBoundHelper('nl2br', App.Nl2BrView);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/utils/misc.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/misc.js b/ambari-web/app/utils/misc.js
index ae0e49b..1dab04b 100644
--- a/ambari-web/app/utils/misc.js
+++ b/ambari-web/app/utils/misc.js
@@ -54,11 +54,13 @@ module.exports = {
     return ((((((+d[0])*256)+(+d[1]))*256)+(+d[2]))*256)+(+d[3]);
   },
 
-  sortByOrder: function (sortOrder, array) {
+  sortByOrder: function (sortOrder, array, sortByParam) {
+    sortByParam = sortByParam || 'stackServiceName';
     var sorted = [];
     for (var i = 0; i < sortOrder.length; i++)
       for (var j = 0; j < array.length; j++) {
-        if (sortOrder[i] == Em.get(array[j], 'id')) {
+        var value = Em.get(array[j], sortByParam) || Em.get(array[j], 'stack_service_name') || Em.get(array[j], 'id');
+        if (sortOrder[i] == value) {
           sorted.push(array[j]);
         }
       }

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/views.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views.js b/ambari-web/app/views.js
index 7127420..16a9f97 100644
--- a/ambari-web/app/views.js
+++ b/ambari-web/app/views.js
@@ -100,9 +100,11 @@ require('views/common/assign_master_components_view');
 require('views/common/helpers/format_word_break_view');
 require('views/common/helpers/format_null_view');
 require('views/common/helpers/format_role_view');
+require('views/common/helpers/nl2br_view');
 require('views/common/helpers/pluralize_view');
 require('views/common/helpers/status_icon_view');
 require('views/common/chosen_plugin');
+require('views/common/collapsible_view');
 require('views/common/export_metrics_menu_view');
 require('views/login');
 require('views/main');
@@ -307,6 +309,23 @@ require('views/main/service/info/metrics/flume/cpu_user');
 require('views/main/service/info/metrics/flume/flume_metric_graph');
 require('views/main/service/info/metrics/flume/flume_metric_graphs');
 
+require('views/main/assemblies/apps_row_view');
+require('views/main/assemblies_view');
+require('views/main/assemblies/categories_view');
+require('views/main/assemblies/collections_view');
+require('views/main/assemblies/service_groups_view');
+require('views/main/assemblies/categories/category_view');
+require('views/main/assemblies/collections/collection_view');
+require('views/main/assemblies/service_groups/service_group_view');
+require('views/main/assemblies/service_groups/configs_view');
+require('views/main/assemblies/service_groups/summary_view');
+require('views/main/assemblies/service_groups/menu_view');
+require('views/main/assemblies/service_groups/detailed_info_view');
+require('views/main/assemblies/store_app_block_view');
+require('views/main/assemblies/active_store_app_view');
+require('views/main/assemblies/deploy_store_app/deploy_store_app_view');
+
+
 require('views/main/service/add_view');
 require('views/main/service/reassign_view');
 require('views/main/service/reassign/step1_view');

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/views/common/collapsible_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/collapsible_view.js b/ambari-web/app/views/common/collapsible_view.js
new file mode 100644
index 0000000..22230d7
--- /dev/null
+++ b/ambari-web/app/views/common/collapsible_view.js
@@ -0,0 +1,84 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+
+/**
+ * Usage:
+ * <pre>
+ *   {{#view App.CollapsibleView}}
+ *     <a {{action "toggleCollapse" target="view"}}>My Title</a>
+ *     <div class="collapse">
+ *      {{! some content }}
+ *     </div>
+ *   {{/view}}
+ * </pre>
+ * <b>IMPORTANT!</b>
+ *  1. Collapsible content has to be wrapped with <code>.collapse</code>
+ *  2. Link/button with action "toggleCollapse" targeted to the view has to be in the block-template
+ *
+ * @type {Em.View}
+ */
+App.CollapsibleView = Em.View.extend({
+
+  layoutName: require('templates/common/collapsible'),
+
+  /**
+   * Determines if content-panel should be opened initially
+   *
+   * @type {boolean}
+   * @default false
+   */
+  openOnInit: false,
+
+  /**
+   * Flag shows if content-panel is expanded or not
+   *
+   * @type {boolean}
+   * @default false
+   */
+  expanded: false,
+
+  content: null,
+
+  didInsertElement: function () {
+    if (this.get('openOnInit') || this.get('content.expanded')) {
+      this.$('.collapse:first').collapse('show');
+      this.set('expanded', true);
+      var content = this.get('content');
+      if (content) {
+        Em.set(content, 'expanded', true);
+      }
+    }
+  },
+
+  willDestroyElement: function () {
+    this.$('.collapse:first').off();
+  },
+
+  toggleCollapse: function () {
+    this.set('expanded', !this.$('.collapse:first').hasClass('in'));
+    var content = this.get('content');
+    if (content) {
+      Em.set(content, 'expanded', this.get('expanded'));
+    }
+    this.$('.collapse:first').collapse('toggle');
+    return false;
+  }
+
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/views/common/helpers/nl2br_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/helpers/nl2br_view.js b/ambari-web/app/views/common/helpers/nl2br_view.js
new file mode 100644
index 0000000..613eb78
--- /dev/null
+++ b/ambari-web/app/views/common/helpers/nl2br_view.js
@@ -0,0 +1,31 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+
+App.Nl2BrView = Em.View.extend({
+
+  tagName: 'span',
+  template: Em.Handlebars.compile('{{#each str in view.result}}{{str}}<br />{{/each}}'),
+
+  result: function () {
+    var content = this.get('content') || '';
+    return content.split('\n');
+  }.property('content')
+
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/views/main/assemblies/active_store_app_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/assemblies/active_store_app_view.js b/ambari-web/app/views/main/assemblies/active_store_app_view.js
new file mode 100644
index 0000000..9f9d8de
--- /dev/null
+++ b/ambari-web/app/views/main/assemblies/active_store_app_view.js
@@ -0,0 +1,56 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+
+App.ActiveStoreAppView = Em.View.extend({
+
+  templateName: require('templates/main/assemblies/active_store_app'),
+
+  /**
+   * @type {string}
+   */
+  title: Em.computed.firstNotBlank('storeApp.title', 'storeApp.name'),
+
+  /**
+   * Bound from template
+   *
+   * @type {App.StoreApp}
+   */
+  storeApp: null,
+
+  /**
+   * Show services icons on the details popup
+   *
+   * @type {string}
+   */
+  shownServices: function () {
+    var serviceNames = this.get('storeApp.services') ? this.get('storeApp.services').split('|').slice(0, 4) : [];
+    var services = [];
+    serviceNames.forEach(function(name) {
+      var name = name.toString().trim();
+      if (name != "LOG SEARCH") {
+        services.push({
+          name: name,
+          url: "/img/" + name.toLowerCase() + "-color.png"
+        });
+      }
+    });
+    return services;
+  }.property('storeApp.services')
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/views/main/assemblies/apps_row_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/assemblies/apps_row_view.js b/ambari-web/app/views/main/assemblies/apps_row_view.js
new file mode 100644
index 0000000..9cc48ab
--- /dev/null
+++ b/ambari-web/app/views/main/assemblies/apps_row_view.js
@@ -0,0 +1,89 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+
+App.AppsRowView = Em.View.extend({
+
+  templateName: require('/templates/main/assemblies/apps_row'),
+
+  didInsertElement: function () {
+    App.tooltip($(".assemblies.icon-question-sign"), {
+      placement: "top",
+      title: Em.I18n.t('appStore.apps.title.assemblies.tooltip')
+    });
+    App.tooltip($(".components.icon-question-sign"), {
+      placement: "top",
+      title: Em.I18n.t('appStore.apps.title.components.tooltip')
+    });
+  },
+
+  /**
+   * Should be bound from the template
+   *
+   * @type {string}
+   */
+  rowTitle: '',
+
+  /**
+   * @type {number}
+   */
+  startIndex: 0,
+
+  /**
+   * @type {number}
+   */
+  endIndex: function() {
+    return this.get('startIndex') + 5;
+  }.property('startIndex'),
+
+  /**
+   * @type {App.StoreApp[]}
+   */
+  visibleApps: function () {
+    return this.get('apps').slice(this.get('startIndex'), this.get('endIndex'));
+  }.property('apps.[]', 'startIndex', 'endIndex'),
+
+  /**
+   * @type {boolean}
+   */
+  hasActiveApp: Em.computed.bool('activeApp'),
+
+  /**
+   * @type {App.StoreApp}
+   */
+  activeApp: Em.computed.findBy('visibleApps', 'isActive', true),
+
+  /**
+   * @type {boolean}
+   */
+  disabledLeft: Em.computed.equal('startIndex', 0),
+
+  /**
+   * @type {boolean}
+   */
+  disabledRight: Em.computed.gteProperties('endIndex', 'apps.length'),
+
+  moveLeft: function() {
+    if (!this.get('disabledLeft')) this.decrementProperty('startIndex');
+  },
+
+  moveRight: function() {
+    if (!this.get('disabledRight')) this.incrementProperty('startIndex');
+  }
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/views/main/assemblies/categories/category_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/assemblies/categories/category_view.js b/ambari-web/app/views/main/assemblies/categories/category_view.js
new file mode 100644
index 0000000..b0f7658
--- /dev/null
+++ b/ambari-web/app/views/main/assemblies/categories/category_view.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.
+ */
+
+var App = require('app');
+
+App.MainAssembliesCategoryView = Em.View.extend({
+
+  templateName: require('templates/main/assemblies/categories/category')
+
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/views/main/assemblies/categories_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/assemblies/categories_view.js b/ambari-web/app/views/main/assemblies/categories_view.js
new file mode 100644
index 0000000..8fc980a
--- /dev/null
+++ b/ambari-web/app/views/main/assemblies/categories_view.js
@@ -0,0 +1,23 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+
+App.MainAssembliesCategoriesView = Em.View.extend({
+
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/views/main/assemblies/collections/collection_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/assemblies/collections/collection_view.js b/ambari-web/app/views/main/assemblies/collections/collection_view.js
new file mode 100644
index 0000000..e6e9170
--- /dev/null
+++ b/ambari-web/app/views/main/assemblies/collections/collection_view.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.
+ */
+
+var App = require('app');
+
+App.MainAssembliesCollectionView = Em.View.extend({
+
+  templateName: require('templates/main/assemblies/collections/collection')
+
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-web/app/views/main/assemblies/collections_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/assemblies/collections_view.js b/ambari-web/app/views/main/assemblies/collections_view.js
new file mode 100644
index 0000000..fe8524e
--- /dev/null
+++ b/ambari-web/app/views/main/assemblies/collections_view.js
@@ -0,0 +1,23 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+
+App.MainAssembliesCollectionsView = Em.View.extend({
+
+});
\ No newline at end of file