Repository: ambari
Updated Branches:
  refs/heads/branch-feature-AMBARI-14714-ui fe57de61f -> 88dd72661


AMBARI-22239. [Modular Deployment][MVP] Download Products. (Ishan via Jaimin)


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

Branch: refs/heads/branch-feature-AMBARI-14714-ui
Commit: 88dd7266118920b879b68241cdda0168585c091f
Parents: fe57de6
Author: Jaimin Jetly <[email protected]>
Authored: Mon Oct 16 17:21:39 2017 -0700
Committer: Jaimin Jetly <[email protected]>
Committed: Mon Oct 16 17:21:39 2017 -0700

----------------------------------------------------------------------
 ambari-web/app/controllers.js                   |   1 +
 ambari-web/app/controllers/installer.js         |  59 ++++++++--
 ambari-web/app/controllers/wizard.js            |   4 +
 .../wizard/downloadProducts_controller.js       | 110 +++++++++++++++++++
 ambari-web/app/messages.js                      |   5 +
 .../app/mixins/wizard/wizard_menu_view.js       |   2 +
 ambari-web/app/router.js                        |   4 +-
 ambari-web/app/routes/installer.js              |  40 ++++++-
 ambari-web/app/styles/wizard.less               |  32 ++++++
 ambari-web/app/templates/installer.hbs          |  17 +--
 .../app/templates/wizard/downloadProducts.hbs   |  97 ++++++++++++++++
 ambari-web/app/utils/ajax/ajax.js               |  22 ++++
 ambari-web/app/views.js                         |   1 +
 .../app/views/wizard/downloadProducts_view.js   |  35 ++++++
 14 files changed, 405 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/88dd7266/ambari-web/app/controllers.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers.js b/ambari-web/app/controllers.js
index 8e7e267..82b0f66 100644
--- a/ambari-web/app/controllers.js
+++ b/ambari-web/app/controllers.js
@@ -150,6 +150,7 @@ require('controllers/wizard/step1_controller');
 require('controllers/wizard/step2_controller');
 require('controllers/wizard/step3_controller');
 require('controllers/wizard/configureDownload_controller');
+require('controllers/wizard/downloadProducts_controller');
 require('controllers/wizard/step4_controller');
 require('controllers/wizard/step5_controller');
 require('controllers/wizard/step6_controller');

http://git-wip-us.apache.org/repos/asf/ambari/blob/88dd7266/ambari-web/app/controllers/installer.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/installer.js 
b/ambari-web/app/controllers/installer.js
index 7afaf87..d4f656b 100644
--- a/ambari-web/app/controllers/installer.js
+++ b/ambari-web/app/controllers/installer.js
@@ -42,6 +42,7 @@ App.InstallerController = 
App.WizardController.extend(App.Persist, {
     "step2",
     "step3",
     "configureDownload",
+    "downloadProducts",
     "step1",
     "step4",
     "step5",
@@ -948,7 +949,15 @@ App.InstallerController = 
App.WizardController.extend(App.Persist, {
         }
       }
     ],
-    'step1': [
+    'step2': [
+      {
+        type: 'sync',
+        callback: function () {
+          this.load('installOptions');
+        }
+      }
+    ],
+    'configureDownload': [
       {
         type: 'async',
         callback: function () {
@@ -980,23 +989,47 @@ App.InstallerController = 
App.WizardController.extend(App.Persist, {
         }
       }
     ],
-    'step2': [
+    'downloadProducts': [
       {
-        type: 'sync',
+        type: 'async',
         callback: function () {
-          this.load('installOptions');
+          var dfd = $.Deferred();
+
+          this.loadStacks().done(function(stacksLoaded) {
+            
App.router.get('clusterController').loadAmbariProperties().always(function() {
+              dfd.resolve(stacksLoaded);
+            });
+          });
+
+          return dfd.promise();
+        }
+      },
+      {
+        type: 'async',
+        callback: function (stacksLoaded) {
+          var dfd = $.Deferred();
+
+          if (!stacksLoaded) {
+            $.when.apply(this, this.loadStacksVersions()).done(function () {
+              dfd.resolve(true);
+            });
+          } else {
+            dfd.resolve(stacksLoaded);
+          }
+
+          return dfd.promise();
         }
       }
     ],
-    'configureDownload': [
+    'step1': [
       {
         type: 'async',
         callback: function () {
           var dfd = $.Deferred();
 
-          this.loadStacks().always(function() {
+          this.loadStacks().done(function(stacksLoaded) {
             
App.router.get('clusterController').loadAmbariProperties().always(function() {
-              dfd.resolve();
+              dfd.resolve(stacksLoaded);
             });
           });
 
@@ -1010,9 +1043,7 @@ App.InstallerController = 
App.WizardController.extend(App.Persist, {
 
           if (!stacksLoaded) {
             $.when.apply(this, this.loadStacksVersions()).done(function () {
-              Em.run.later('sync', function() {
-                dfd.resolve(stacksLoaded);
-              }, 1000);
+              dfd.resolve(true);
             });
           } else {
             dfd.resolve(stacksLoaded);
@@ -1145,6 +1176,10 @@ App.InstallerController = 
App.WizardController.extend(App.Persist, {
     this.gotoStep('configureDownload');
   },
 
+  gotoDownloadProducts: function () {
+    this.gotoStep('downloadProducts');
+  },
+
   isStep0: function () {
     return this.get('currentStep') == this.getStepIndex('step0');
   }.property('currentStep'),
@@ -1193,6 +1228,10 @@ App.InstallerController = 
App.WizardController.extend(App.Persist, {
     return this.get('currentStep') == this.getStepIndex('configureDownload');
   }.property('currentStep'),
 
+  isDownloadProducts: function () {
+    return this.get('currentStep') == this.getStepIndex('downloadProducts');
+  }.property('currentStep'),
+
   clearConfigActionComponents: function() {
     var masterComponentHosts = this.get('content.masterComponentHosts');
     var componentsAddedFromConfigAction = 
this.get('content.componentsFromConfigs');

http://git-wip-us.apache.org/repos/asf/ambari/blob/88dd7266/ambari-web/app/controllers/wizard.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard.js 
b/ambari-web/app/controllers/wizard.js
index 711ad7b..9db923e 100644
--- a/ambari-web/app/controllers/wizard.js
+++ b/ambari-web/app/controllers/wizard.js
@@ -383,6 +383,10 @@ App.WizardController = 
Em.Controller.extend(App.LocalStorage, App.ThemesMappingM
     this.gotoStep("configureDownload");
   },
 
+  gotoDownloadProducts: function () {
+    this.gotoStep("downloadProducts");
+  },
+
   /**
    * Initialize host status info for step9
    */

http://git-wip-us.apache.org/repos/asf/ambari/blob/88dd7266/ambari-web/app/controllers/wizard/downloadProducts_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard/downloadProducts_controller.js 
b/ambari-web/app/controllers/wizard/downloadProducts_controller.js
new file mode 100644
index 0000000..7e95acf
--- /dev/null
+++ b/ambari-web/app/controllers/wizard/downloadProducts_controller.js
@@ -0,0 +1,110 @@
+/**
+ * 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');
+var arrayUtils = require('utils/array_utils');
+
+App.WizardDownloadProductsController = Em.Controller.extend({
+
+  name: 'wizardDownloadProductsController',
+
+  selectedMpacks:
+    [
+      {
+        "mpackName" : "HDP",
+        "displayName": "Hortonworks Data Platform Core",
+        "mpackVersion" : "3.0.0",
+        "registryId"  : "1"
+      },
+      {
+        "mpackName" : "EDW",
+        "displayName": "Data Warehousing",
+        "mpackVersion": "1.0.0",
+        "registryId": "1"
+      },
+      {
+        "mpackName" : "HDS",
+        "displayName": "Data Science and Machine Learning",
+        "mpackVersion" : "3.0.0.0",
+        "registryId" : "1"
+      }
+    ],
+
+  mpacks: [],
+
+  addMpacks: function () {
+    var self = this;
+    this.get('selectedMpacks').forEach( function (mpack) {
+      self.get('mpacks').pushObject(Em.Object.create({
+        name: mpack.mpackName,
+        displayName: mpack.displayName,
+        version: mpack.mpackVersion,
+        registryId:mpack.registryId,
+        inProgress: true,
+        failed: false,
+        success: false
+      }));
+    });
+  },
+
+  registerMpacks: function () {
+    var mpacks = this.get('mpacks');
+    var self = this;
+    mpacks.forEach(function (mpack) {
+      self.downloadMpack(mpack);
+    });
+  },
+
+  downloadMpack: function (mpack) {
+    console.log("downloading mpacks");
+    App.ajax.send({
+      name:'mpack.download',
+      sender: this,
+      data: {
+        name: mpack.name,
+        version: mpack.version,
+        registry: mpack.registryId
+      },
+      success: 'downloadMpackSuccess',
+      error: 'downloadMpackError',
+    });
+  },
+
+  downloadMpackSuccess: function (data, opt, params) {
+    console.dir("Mpack " + params.name + " download completed with success 
code " + data.status);
+    this.get('mpacks').findProperty('name', params.name).set('inProgress', 
false);
+    this.get('mpacks').findProperty('name', params.name).set('success', true);
+  },
+
+  downloadMpackError: function (request, ajaxOptions, error, opt, params) {
+    if(request.status == 409) {
+      this.downloadMpackSuccess(request, opt, params);
+    } else {
+      console.dir("Mpack " + params.name + " download failed with error code " 
+ request.status);
+      this.get('mpacks').findProperty('name', params.name).set('inProgress', 
false);
+      this.get('mpacks').findProperty('name', params.name).set('failed', true);
+    }
+  },
+
+  retryDownload: function (event) {
+    var mpack = event.context;
+    mpack.set('inProgress', true);
+    mpack.set('failed', false);
+    this.downloadMpack(mpack);
+  }
+
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/88dd7266/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index 46218b8..f74c560 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -358,6 +358,7 @@ Em.I18n.translations = {
   'common.rolling.downgrade': 'Rolling Downgrade',
   'common.express.downgrade': 'Express Downgrade',
   'common.views': 'Views',
+  'common.mpack': 'Management Pack',
 
   'models.alert_instance.tiggered.verbose': "Occurred on {0} <br> Checked on 
{1}",
   'models.alert_definition.triggered.verbose': "Occurred on {0}",
@@ -615,6 +616,10 @@ Em.I18n.translations = {
   'installer.configureDownload.publicRepo.hoverDesc': 'Management Packs will 
be downloaded using the internet',
   'installer.configureDownload.localRepo.hoverDesc': 'Management Packs will be 
downloaded from the specified local repository',
 
+  'installer.downloadProducts.header': 'Download Products',
+  'installer.downloadProducts.body.title': 'Downloading and validating 
Management Packs',
+  'installer.downloadProducts.body.description': 'Ambari is downloading the 
Management Packs and validating its contents',
+
   'installer.step1.header':'Select Version',
   'installer.step1.body':'Select the software version and method of delivery 
for your cluster.',
   'installer.step1.repo.body':'Using a Public Repository requires Internet 
connectivity. Using a Local Repository requires you have configured the 
software in a repository available in your network.',

http://git-wip-us.apache.org/repos/asf/ambari/blob/88dd7266/ambari-web/app/mixins/wizard/wizard_menu_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/wizard/wizard_menu_view.js 
b/ambari-web/app/mixins/wizard/wizard_menu_view.js
index 644b265..c2959e9 100644
--- a/ambari-web/app/mixins/wizard/wizard_menu_view.js
+++ b/ambari-web/app/mixins/wizard/wizard_menu_view.js
@@ -47,6 +47,7 @@ App.WizardMenuMixin = Em.Mixin.create({
   isStep2Disabled: isStepDisabled("step2"),
   isStep3Disabled: isStepDisabled("step3"),
   isConfigureDownloadDisabled: isStepDisabled("configureDownload"),
+  isDownloadProductsDisabled: isStepDisabled("downloadProducts"),
   isStep4Disabled: isStepDisabled("step4"),
   isStep5Disabled: isStepDisabled("step5"),
   isStep6Disabled: isStepDisabled("step6"),
@@ -60,6 +61,7 @@ App.WizardMenuMixin = Em.Mixin.create({
   isStep2Completed: isStepCompleted("step2"),
   isStep3Completed: isStepCompleted("step3"),
   isConfigureDownloadCompleted: isStepCompleted("configureDownload"),
+  isDownloadProductsCompleted: isStepCompleted("downloadProducts"),
   isStep4Completed: isStepCompleted("step4"),
   isStep5Completed: isStepCompleted("step5"),
   isStep6Completed: isStepCompleted("step6"),

http://git-wip-us.apache.org/repos/asf/ambari/blob/88dd7266/ambari-web/app/router.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/router.js b/ambari-web/app/router.js
index 9c466c7..c2d2a75 100644
--- a/ambari-web/app/router.js
+++ b/ambari-web/app/router.js
@@ -43,7 +43,9 @@ App.WizardRoute = Em.Route.extend({
 
   gotoStep10: Em.Router.transitionTo('step10'),
 
-  gotoStepConfigureDownload: Em.Router.transitionTo('configureDownload'),
+  gotoConfigureDownload: Em.Router.transitionTo('configureDownload'),
+
+  gotoDownloadProducts: Em.Router.transitionTo('configureDownload'),
 
   isRoutable: function() {
     return typeof this.get('route') === 'string' && App.router.get('loggedIn');

http://git-wip-us.apache.org/repos/asf/ambari/blob/88dd7266/ambari-web/app/routes/installer.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/routes/installer.js 
b/ambari-web/app/routes/installer.js
index deb76e1..5c3d806 100644
--- a/ambari-web/app/routes/installer.js
+++ b/ambari-web/app/routes/installer.js
@@ -160,7 +160,7 @@ module.exports = Em.Route.extend(App.RouterRedirections, {
         console.timeEnd('step1 connectOutlets');
       });
     },
-    back: Em.Router.transitionTo('step3'),
+    back: Em.Router.transitionTo('downloadProducts'),
     next: function (router) {
       console.time('step1 next');
       if(router.get('btnClickInProgress')) {
@@ -311,15 +311,45 @@ module.exports = Em.Route.extend(App.RouterRedirections, {
       if(router.get('btnClickInProgress')) {
         return;
       }
-      var configureDownloadController = 
router.get('configureDownloadController');
-      var installerController = router.get('installerController');
       App.set('router.nextBtnClickInProgress', true);
-      installerController.setDBProperty('service', undefined);
-      router.transitionTo('step1');
+      router.transitionTo('downloadProducts');
       console.timeEnd('configureDownload next');
     }
   }),
 
+  downloadProducts: App.StepRoute.extend({
+    route: '/downloadProducts',
+    connectOutlets: function (router) {
+      console.time('downloadProducts connectOutlets');
+      var self = this;
+      var controller = router.get('installerController');
+      var configureDownloadController = 
router.get('wizardDownloadProductsController');
+      var newStepIndex = controller.getStepIndex('downloadProducts');
+      router.setNavigationFlow(newStepIndex);
+      controller.setCurrentStep('downloadProducts');
+      controller.loadAllPriorSteps().done(function () {
+        configureDownloadController.set('wizardController', controller);
+        controller.connectOutlet('wizardDownloadProducts', 
controller.get('content'));
+        self.scrollTop();
+        console.timeEnd('downloadProducts connectOutlets');
+      });
+    },
+
+    backTransition: function (router) {
+      router.transitionTo('configureDownload');
+    },
+
+    next: function (router) {
+      console.time('downloadProducts next');
+      if(router.get('btnClickInProgress')) {
+        return;
+      }
+      App.set('router.nextBtnClickInProgress', true);
+      router.transitionTo('step1');
+      console.timeEnd('downloadProducts next');
+    }
+  }),
+
   step4: App.StepRoute.extend({
     route: '/step4',
     connectOutlets: function (router, context) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/88dd7266/ambari-web/app/styles/wizard.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/wizard.less 
b/ambari-web/app/styles/wizard.less
index 89ae562..4962123 100644
--- a/ambari-web/app/styles/wizard.less
+++ b/ambari-web/app/styles/wizard.less
@@ -566,6 +566,38 @@
   max-height: 440px;
 }
 
+#download-step-content {
+  .panel-body .version-contents-body {
+    padding: 10px 0px 20px 0;
+    tbody > tr {
+      height:40px;
+      td {
+        vertical-align: middle;
+        padding: 6px;
+        button {
+          padding: 2px 8px;
+          font-size: 12px;
+          line-height: 1.5;
+          height: 25px;
+        }
+      }
+      .download-status {
+        font-size: 11px;
+        .progress-wrapper {
+          padding:0px;
+          .progress {
+            height:8px;
+            margin:5px 5px 5px 0;
+            .progress-bar {
+              width:100%;
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
 #select-stack .stack-version-selection{
   .select-version-label {
     padding: 5px 25px;

http://git-wip-us.apache.org/repos/asf/ambari/blob/88dd7266/ambari-web/app/templates/installer.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/installer.hbs 
b/ambari-web/app/templates/installer.hbs
index fec466b..20cf109 100644
--- a/ambari-web/app/templates/installer.hbs
+++ b/ambari-web/app/templates/installer.hbs
@@ -29,14 +29,15 @@
           <li {{QAAttr "wizard-nav-step"}} {{bindAttr class="isStep2:active 
view.isStep2Disabled:disabled view.isStep2Completed:completed"}}><a 
href="javascript:void(null);" {{action gotoStep2 target="controller"}}><i 
class="step-marker"><span class="step-index">1</span></i><p 
class="step-name">{{t installer.step2.header}}</p></a></li>
           <li {{QAAttr "wizard-nav-step"}} {{bindAttr class="isStep3:active 
view.isStep3Disabled:disabled view.isStep3Completed:completed"}}><a 
href="javascript:void(null);" {{action gotoStep3 target="controller"}}><i 
class="step-marker"><span class="step-index">2</span></i><p 
class="step-name">{{t installer.step3.header}}</p></a></li>
           <li {{QAAttr "wizard-nav-step"}} {{bindAttr 
class="isConfigureDownload:active view.isConfigureDownloadDisabled:disabled 
view.isConfigureDownloadCompleted:completed"}}><a href="javascript:void(null);" 
{{action gotoConfigureDownload target="controller"}}><i 
class="step-marker"><span class="step-index">3</span></i><p 
class="step-name">{{t installer.configureDownload.header}}</p></a></li>
-          <li {{QAAttr "wizard-nav-step"}} {{bindAttr class="isStep1:active 
view.isStep1Disabled:disabled view.isStep1Completed:completed"}}><a 
href="javascript:void(null);" {{action gotoStep1 target="controller"}}><i 
class="step-marker"><span class="step-index">4</span></i><p 
class="step-name">{{t installer.step1.header}}</p></a></li>
-          <li {{QAAttr "wizard-nav-step"}} {{bindAttr class="isStep4:active 
view.isStep4Disabled:disabled view.isStep4Completed:completed"}}><a 
href="javascript:void(null);" {{action gotoStep4 target="controller"}}><i 
class="step-marker"><span class="step-index">5</span></i><p 
class="step-name">{{t installer.step4.header}}</p></a></li>
-          <li {{QAAttr "wizard-nav-step"}} {{bindAttr class="isStep5:active 
view.isStep5Disabled:disabled view.isStep5Completed:completed"}}><a 
href="javascript:void(null);" {{action gotoStep5 target="controller"}}><i 
class="step-marker"><span class="step-index">6</span></i><p 
class="step-name">{{t installer.step5.header}}</p></a></li>
-          <li {{QAAttr "wizard-nav-step"}} {{bindAttr class="isStep6:active 
view.isStep6Disabled:disabled view.isStep6Completed:completed"}}><a 
href="javascript:void(null);" {{action gotoStep6 target="controller"}}><i 
class="step-marker"><span class="step-index">7</span></i><p 
class="step-name">{{t installer.step6.header}}</p></a></li>
-          <li {{QAAttr "wizard-nav-step"}} {{bindAttr class="isStep7:active 
view.isStep7Disabled:disabled view.isStep7Completed:completed"}}><a 
href="javascript:void(null);" {{action gotoStep7 target="controller"}}><i 
class="step-marker"><span class="step-index">8</span></i><p 
class="step-name">{{t installer.step7.header}}</p></a></li>
-          <li {{QAAttr "wizard-nav-step"}} {{bindAttr class="isStep8:active 
view.isStep8Disabled:disabled view.isStep8Completed:completed"}}><a 
href="javascript:void(null);" {{action gotoStep8 target="controller"}}><i 
class="step-marker"><span class="step-index">9</span></i><p 
class="step-name">{{t installer.step8.header}}</p></a></li>
-          <li {{QAAttr "wizard-nav-step"}} {{bindAttr class="isStep9:active 
view.isStep9Disabled:disabled view.isStep9Completed:completed"}}><a 
href="javascript:void(null);" {{action gotoStep9 target="controller"}}><i 
class="step-marker"><span class="step-index">10</span></i><p 
class="step-name">{{t installer.step9.header}}</p></a></li>
-          <li {{QAAttr "wizard-nav-step"}} {{bindAttr class="isStep10:active 
view.isStep10Disabled:disabled view.isStep10Completed:completed"}}><a 
href="javascript:void(null);" {{action gotoStep10 target="controller"}}><i 
class="step-marker"><span class="step-index">11</span></i><p 
class="step-name">{{t installer.step10.header}}</p></a></li>
+          <li {{QAAttr "wizard-nav-step"}} {{bindAttr 
class="isDownloadProducts:active view.isDownloadProductsDisabled:disabled 
view.isDownloadProductsCompleted:completed"}}><a href="javascript:void(null);" 
{{action gotoDownloadProducts target="controller"}}><i 
class="step-marker"><span class="step-index">4</span></i><p 
class="step-name">{{t installer.downloadProducts.header}}</p></a></li>
+          <li {{QAAttr "wizard-nav-step"}} {{bindAttr class="isStep1:active 
view.isStep1Disabled:disabled view.isStep1Completed:completed"}}><a 
href="javascript:void(null);" {{action gotoStep1 target="controller"}}><i 
class="step-marker"><span class="step-index">5</span></i><p 
class="step-name">{{t installer.step1.header}}</p></a></li>
+          <li {{QAAttr "wizard-nav-step"}} {{bindAttr class="isStep4:active 
view.isStep4Disabled:disabled view.isStep4Completed:completed"}}><a 
href="javascript:void(null);" {{action gotoStep4 target="controller"}}><i 
class="step-marker"><span class="step-index">6</span></i><p 
class="step-name">{{t installer.step4.header}}</p></a></li>
+          <li {{QAAttr "wizard-nav-step"}} {{bindAttr class="isStep5:active 
view.isStep5Disabled:disabled view.isStep5Completed:completed"}}><a 
href="javascript:void(null);" {{action gotoStep5 target="controller"}}><i 
class="step-marker"><span class="step-index">7</span></i><p 
class="step-name">{{t installer.step5.header}}</p></a></li>
+          <li {{QAAttr "wizard-nav-step"}} {{bindAttr class="isStep6:active 
view.isStep6Disabled:disabled view.isStep6Completed:completed"}}><a 
href="javascript:void(null);" {{action gotoStep6 target="controller"}}><i 
class="step-marker"><span class="step-index">8</span></i><p 
class="step-name">{{t installer.step6.header}}</p></a></li>
+          <li {{QAAttr "wizard-nav-step"}} {{bindAttr class="isStep7:active 
view.isStep7Disabled:disabled view.isStep7Completed:completed"}}><a 
href="javascript:void(null);" {{action gotoStep7 target="controller"}}><i 
class="step-marker"><span class="step-index">9</span></i><p 
class="step-name">{{t installer.step7.header}}</p></a></li>
+          <li {{QAAttr "wizard-nav-step"}} {{bindAttr class="isStep8:active 
view.isStep8Disabled:disabled view.isStep8Completed:completed"}}><a 
href="javascript:void(null);" {{action gotoStep8 target="controller"}}><i 
class="step-marker"><span class="step-index">10</span></i><p 
class="step-name">{{t installer.step8.header}}</p></a></li>
+          <li {{QAAttr "wizard-nav-step"}} {{bindAttr class="isStep9:active 
view.isStep9Disabled:disabled view.isStep9Completed:completed"}}><a 
href="javascript:void(null);" {{action gotoStep9 target="controller"}}><i 
class="step-marker"><span class="step-index">11</span></i><p 
class="step-name">{{t installer.step9.header}}</p></a></li>
+          <li {{QAAttr "wizard-nav-step"}} {{bindAttr class="isStep10:active 
view.isStep10Disabled:disabled view.isStep10Completed:completed"}}><a 
href="javascript:void(null);" {{action gotoStep10 target="controller"}}><i 
class="step-marker"><span class="step-index">12</span></i><p 
class="step-name">{{t installer.step10.header}}</p></a></li>
         </ul>
       </div>
         {{! outlet includes body and footer }}

http://git-wip-us.apache.org/repos/asf/ambari/blob/88dd7266/ambari-web/app/templates/wizard/downloadProducts.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/wizard/downloadProducts.hbs 
b/ambari-web/app/templates/wizard/downloadProducts.hbs
new file mode 100644
index 0000000..0cb383e
--- /dev/null
+++ b/ambari-web/app/templates/wizard/downloadProducts.hbs
@@ -0,0 +1,97 @@
+{{!
+* 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="download-step-content" class="wizard-content col-md-9" {{QAAttr 
"select-stack-page"}}>
+  <h4 class="step-title">{{t installer.downloadProducts.header}}</h4>
+
+  <div class="panel panel-default">
+    <div class="panel-body">
+      {{#if App.router.nextBtnClickInProgress}}
+        {{view App.SpinnerView}}
+      {{else}}
+        <div class="panel panel-default">
+          <div class="step-title">
+            <p>{{t installer.downloadProducts.body.title}}</p>
+          </div>
+          <p class="step-description">{{t 
installer.downloadProducts.body.description}}</p>
+
+          <div class="panel-body version-contents-body">
+            <table class="table table-hover">
+              <thead>
+                <tr>
+                  <th class="col-sm-4">{{t common.mpack}}</th>
+                  <th class="col-sm-4">{{t common.status}}</th>
+                  <th class="col-sm-3">{{t common.actions}}</th>
+                </tr>
+              </thead>
+              <tbody>
+                {{#each mpack in mpacks}}
+                  <tr>
+                    <td class="col-sm-4">{{mpack.displayName}}</td>
+                    <td class="download-status col-sm-4">
+                      {{#if mpack.inProgress}}
+                        <div class="progress-wrapper col-sm-9">
+                          <div class="progress">
+                            <div class="active progress-bar-striped 
progress-bar"}}></div>
+                          </div>
+                        </div>
+                      {{else}}
+                        {{#if mpack.success}}
+                          <i class="glyphicon glyphicon-ok"></i>&nbsp;
+                          {{t common.download}}&nbsp;{{t common.complete}}
+                        {{else}}
+                          <i class="glyphicon glyphicon-remove"></i>&nbsp;
+                          {{t common.download}}&nbsp;{{t common.failed}}
+                        {{/if}}
+                      {{/if}}
+                    </td>
+                    <td class="col-sm-3">
+                      {{#if mpack.failed}}
+                        <button type="button" class="btn btn-default btn-xs" 
{{action retryDownload mpack target="controller"}}>
+                          <i class="icon icon-repeat"></i>
+                          {{t common.retry}}
+                        </button>
+                      {{/if}}
+                    </td>
+                  </tr>
+                {{/each}}
+              </tbody>
+            </table>
+          </div>
+        </div>
+      {{/if}}
+
+    </div>
+  </div>
+
+</div>
+
+<div class="wizard-footer col-md-12">
+  <button type="button" class="btn btn-default pull-left installer-back-btn" 
{{bindAttr disabled="App.router.btnClickInProgress"}} {{action back}} {{QAAttr 
"wizard-back"}}>
+    &larr; {{t common.back}}
+    {{#if App.router.backBtnClickInProgress}}
+      {{view App.SpinnerView tagName="span" 
classNames="service-button-spinner"}}
+    {{/if}}
+  </button>
+  <button type="button" class="btn btn-success pull-right" {{bindAttr 
disabled="view.isSubmitDisabled"}} {{action next}} {{QAAttr "wizard-next"}}>
+    {{#if App.router.nextBtnClickInProgress}}
+      {{view App.SpinnerView tagName="span" 
classNames="service-button-spinner"}}
+    {{/if}}
+    {{t common.next}} &rarr;
+  </button>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/88dd7266/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 3dfbf1f..b6cae9b 100644
--- a/ambari-web/app/utils/ajax/ajax.js
+++ b/ambari-web/app/utils/ajax/ajax.js
@@ -3062,7 +3062,29 @@ var urls = {
   'service.components.load': {
     real: 
'/clusters/{clusterName}/servicegroups/{defaultServiceGroupName}/services?fields=components&minimal_response=true',
     mock: '/data/services/components.json'
+  },
+
+  /** Mpack related APIs */
+
+  'mpack.download': {
+    'real': '/mpacks',
+    'format': function (data) {
+      return {
+        type: 'POST',
+        data: JSON.stringify({
+          Body: {
+            "MpackInfo" : {
+              "mpack_name" : data.name,
+              "mpack_version" : data.version,
+              "registry_id" : data.registry
+            }
+          }
+        })
+      };
+    }
   }
+
+
 };
 /**
  * Replace data-placeholders to its values

http://git-wip-us.apache.org/repos/asf/ambari/blob/88dd7266/ambari-web/app/views.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views.js b/ambari-web/app/views.js
index b8fd199..6924d8c 100644
--- a/ambari-web/app/views.js
+++ b/ambari-web/app/views.js
@@ -368,6 +368,7 @@ require('views/wizard/step3/hostLogPopupBody_view');
 require('views/wizard/step3/hostWarningPopupBody_view');
 require('views/wizard/step3/hostWarningPopupFooter_view');
 require('views/wizard/configureDownload_view');
+require('views/wizard/downloadProducts_view');
 require('views/wizard/step4_view');
 require('views/wizard/step5_view');
 require('views/wizard/step6_view');

http://git-wip-us.apache.org/repos/asf/ambari/blob/88dd7266/ambari-web/app/views/wizard/downloadProducts_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/wizard/downloadProducts_view.js 
b/ambari-web/app/views/wizard/downloadProducts_view.js
new file mode 100644
index 0000000..b70275a
--- /dev/null
+++ b/ambari-web/app/views/wizard/downloadProducts_view.js
@@ -0,0 +1,35 @@
+/**
+ * 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.WizardDownloadProductsView = Em.View.extend({
+
+  templateName: require('templates/wizard/downloadProducts'),
+
+  didInsertElement: function () {
+    this._super();
+    var controller = this.get('controller');
+    controller.addMpacks();
+    controller.registerMpacks();
+  },
+
+  willDestroyElement: function () {
+    this.get('controller.mpacks').clear();
+  }
+
+});
\ No newline at end of file

Reply via email to