Quellcode durchsuchen

AMBARI-9264 Stack and Versions: Integrate view/edit repositories with API. (ababiichuk)

aBabiichuk vor 10 Jahren
Ursprung
Commit
11efa2f558

+ 1 - 1
ambari-web/app/assets/test/tests.js

@@ -211,10 +211,10 @@ var files = ['test/init_model_test',
   'test/views/common/configs/service_config_container_view_test',
   'test/views/common/configs/service_configs_by_category_view_test',
   'test/views/common/configs/custom_category_views/notification_configs_view_test',
+  'test/views/common/controls_view_test',
   'test/views/wizard/step3/hostLogPopupBody_view_test',
   'test/views/wizard/step3/hostWarningPopupBody_view_test',
   'test/views/wizard/step3/hostWarningPopupFooter_view_test',
-  'test/views/wizard/controls_view_test',
   'test/views/wizard/step0_view_test',
   'test/views/wizard/step1_view_test',
   'test/views/wizard/step2_view_test',

+ 109 - 2
ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js

@@ -401,8 +401,115 @@ App.MainAdminStackAndUpgradeController = Em.Controller.extend(App.LocalStorage,
     });
   },
 
-  saveRepoOS: function () {
-    //TODO integrate with API
+  /**
+   * transform repo data into json for
+   * saving changes to repository version
+   * @param {Em.Object} repo
+   * @returns {{operating_systems: Array}}
+   */
+  prepareRepoForSaving: function(repo) {
+    var repoVersion = { "operating_systems": [] };
+
+    repo.get('operatingSystems').forEach(function (os, k) {
+      repoVersion.operating_systems.push({
+        "OperatingSystems": {
+          "os_type": os.get("osType")
+        },
+        "repositories": []
+      });
+      os.get('repositories').forEach(function (repository) {
+        repoVersion.operating_systems[k].repositories.push({
+          "Repositories": {
+            "base_url": repository.get('baseUrl'),
+            "repo_id": repository.get('repoId'),
+            "repo_name": repository.get('repoName')
+          }
+        });
+      });
+    });
+    return repoVersion;
+  },
+
+  /**
+   * perform validation if <code>skip<code> is  false and run save if
+   * validation successfull or run save without validation is <code>skip<code> is true
+   * @param {Em.Object} repo
+   * @param {boolean} skip
+   * @returns {$.Deferred}
+   */
+  saveRepoOS: function (repo, skip) {
+    var self = this;
+    var deferred = $.Deferred();
+    this.validateRepoVersions(repo, skip).done(function(data) {
+      if (data.length > 0) {
+        deferred.resolve(data);
+      } else {
+        var repoVersion = self.prepareRepoForSaving(repo);
+
+        App.ajax.send({
+          name: 'admin.stack_versions.edit.repo',
+          sender: this,
+          data: {
+            stackName: App.get('currentStackName'),
+            stackVersion: App.get('currentStackVersionNumber'),
+            repoVersionId: repo.get('repoVersionId'),
+            repoVersion: repoVersion
+          }
+        }).success(function() {
+          deferred.resolve([]);
+        });
+      }
+    });
+    return deferred.promise();
+  },
+
+  /**
+   * send request for validation for each repository
+   * @param {Em.Object} repo
+   * @param {boolean} skip
+   * @returns {*}
+   */
+  validateRepoVersions: function(repo, skip) {
+    var deferred = $.Deferred(),
+      totalCalls = 0,
+      invalidUrls = [];
+
+    if (skip) {
+      deferred.resolve(invalidUrls);
+    } else {
+      repo.get('operatingSystems').forEach(function (os) {
+        if (os.get('isSelected')) {
+          os.get('repositories').forEach(function (repo) {
+            totalCalls++;
+            App.ajax.send({
+              name: 'admin.stack_versions.validate.repo',
+              sender: this,
+              data: {
+                repo: repo,
+                repoId: repo.get('repoId'),
+                baseUrl: repo.get('baseUrl'),
+                osType: os.get('osType'),
+                stackName: App.get('currentStackName'),
+                stackVersion: App.get('currentStackVersionNumber')
+              }
+            })
+              .success(function () {
+                totalCalls--;
+                if (totalCalls === 0) deferred.resolve(invalidUrls);
+              })
+              .error(function () {
+                repo.set('hasError', true);
+                invalidUrls.push(repo);
+                totalCalls--;
+                if (totalCalls === 0) deferred.resolve(invalidUrls);
+              });
+          });
+        } else {
+          return deferred.resolve(invalidUrls);
+        }
+      });
+    }
+    return deferred.promise();
   },
 
   /**

+ 1 - 0
ambari-web/app/messages.js

@@ -1311,6 +1311,7 @@ Em.I18n.translations = {
   'admin.stackVersions.filter.current': "Current ({0})",
 
   'admin.stackVersions.editRepositories.info': 'Provide Base URLs for the Operating Systems you are configuring. Uncheck all other Operating Systems.',
+  'admin.stackVersions.editRepositories.validation.warning': 'Some of the repositories failed validation. Make changes to the base url or skip validation if you are sure that urls are correct',
   'admin.stackVersions.version.install.confirm': 'You are about to install version <strong>{0}</strong> on all hosts.',
   'admin.stackVersions.version.linkTooltip': 'Click to Edit Repositories',
   'admin.stackVersions.version.hostsTooltip': 'Click to List Hosts',

+ 11 - 9
ambari-web/app/templates/main/admin/stack_upgrade/edit_repositories.hbs

@@ -19,7 +19,9 @@
 <div class="alert alert-info">
   {{t admin.stackVersions.editRepositories.info}}
 </div>
-
+<div {{bindAttr class="view.parentView.hasErrors::hidden :alert :alert-warning"}}>
+  {{t admin.stackVersions.editRepositories.validation.warning}}
+</div>
 <div class="row-fluid">
   <div class="span2"><strong>{{t common.os}}</strong></div>
   <div class="span10 row-fluid">
@@ -30,13 +32,13 @@
 {{#each os in view.content.operatingSystems}}
   <div class="row-fluid os-block">
     <div class="span2">
-      {{view Ember.Checkbox class="align-checkbox" checkedBinding="os.isSelected"}}&nbsp;{{os.osType}}
+      {{view view.OSCheckBox osBinding="os"}}&nbsp;{{os.osType}}
     </div>
-    <div class="span10">
-      {{#each repository in os.repositories}}
-        <div class="row-fluid">
-          <div class="span3">{{repository.repoName}}</div>
-          <div class="span9">{{view Ember.TextField valueBinding="repository.baseUrl" disabledBinding="os.isDisabled"}}</div>
+  <div class="span10">
+  {{#each repository in os.repositories}}
+    <div class="row-fluid">
+      <div class="span3">{{repository.repoName}}</div>
+      <div {{bindAttr class="repository.hasError:error :control-group :span9"}}>{{view App.BaseUrlTextField repositoryBinding="repository" disabledBinding="os.isDisabled"}}</div>
         </div>
       {{/each}}
     </div>
@@ -44,7 +46,7 @@
 {{/each}}
 
 <div>
-  <label>{{view Ember.Checkbox checkedBinding="view.skipValidation" class="align-checkbox"}}{{t installer.step1.advancedRepo.skipValidation.message}}
+  <label>{{view view.skipCheckBox checkedBinding="view.parentView.skipValidation"}}{{t installer.step1.advancedRepo.skipValidation.message}}
     <i class="icon-question-sign" rel="skip-validation-tooltip"
-       data-toggle="tooltip" {{translateAttr title="installer.step1.advancedRepo.skipValidation.tooltip"}}></i></label>
+  data-toggle="tooltip" {{translateAttr title="installer.step1.advancedRepo.skipValidation.tooltip"}}></i></label>
 </div>

+ 26 - 0
ambari-web/app/utils/ajax/ajax.js

@@ -1393,6 +1393,32 @@ var urls = {
     },
     'mock': ''
   },
+
+  'admin.stack_versions.edit.repo': {
+    'real': '/stacks/{stackName}/versions/{stackVersion}/repository_versions/{repoVersionId}',
+    'mock': '',
+    'type': 'PUT',
+    'format': function (data) {
+      return {
+        data: JSON.stringify(data.repoVersion)
+      }
+    }
+  },
+  'admin.stack_versions.validate.repo': {
+    'real': '/stacks/{stackName}/versions/{stackVersion}/operating_systems/{osType}/repositories/{repoId}?validate_only=true',
+    'mock': '',
+    'type': 'POST',
+    'format': function (data) {
+      return {
+        data: JSON.stringify({
+          "Repositories": {
+            "base_url": data.baseUrl
+          }
+        })
+      }
+    }
+  },
+
   'admin.rolling_upgrade.pre_upgrade_check': {
     'real': '/clusters/{clusterName}/rolling_upgrades_check?fields=*&UpgradeChecks/repository_version={value}',
     'mock': '/data/stack_versions/pre_upgrade_check.json'

+ 1 - 1
ambari-web/app/views.js

@@ -53,6 +53,7 @@ require('views/common/filter_combobox');
 require('views/common/filter_combo_cleanable');
 require('views/common/table_view');
 require('views/common/progress_bar_view');
+require('views/common/controls_view');
 require('views/login');
 require('views/main');
 require('views/main/menu');
@@ -278,7 +279,6 @@ require('views/main/charts/heatmap/heatmap_host_detail');
 require('views/main/views_view');
 
 require('views/installer');
-require('views/wizard/controls_view');
 require('views/wizard/step0_view');
 require('views/wizard/step1_view');
 require('views/wizard/step2_view');

+ 16 - 0
ambari-web/app/views/wizard/controls_view.js → ambari-web/app/views/common/controls_view.js

@@ -1206,3 +1206,19 @@ App.CheckDBConnectionView = Ember.View.extend({
   }
 });
 
+/**
+ *
+ * @type {*}
+ */
+App.BaseUrlTextField = Ember.TextField.extend({
+
+  valueBinding: 'repository.baseUrl',
+
+  keyUp: function (event) {
+    if (Em.get(this, 'repository.hasError')) {
+      Em.set(this, 'repository.hasError', false);
+    }
+  }
+
+});
+

+ 35 - 5
ambari-web/app/views/main/admin/stack_upgrade/upgrade_version_box_view.js

@@ -129,6 +129,7 @@ App.UpgradeVersionBoxView = Em.View.extend({
     var repoRecord = App.RepositoryVersion.find(this.get('content.id'));
     //make deep copy of repoRecord
     var repo = Em.Object.create({
+      repoVersionId: repoRecord.get('id'),
       displayName: repoRecord.get('displayName'),
       repositoryVersion: repoRecord.get('displayName'),
       operatingSystems: repoRecord.get('operatingSystems').map(function (os) {
@@ -140,7 +141,8 @@ App.UpgradeVersionBoxView = Em.View.extend({
             return Em.Object.create({
               repoName: repository.get('repoName'),
               repoId: repository.get('repoId'),
-              baseUrl: repository.get('baseUrl')
+              baseUrl: repository.get('baseUrl'),
+              hasError: false
             });
           })
         });
@@ -149,20 +151,48 @@ App.UpgradeVersionBoxView = Em.View.extend({
 
     return App.ModalPopup.show({
       classNames: ['repository-list', 'sixty-percent-width-modal'],
+      skipValidation: false,
+      hasErrors: false,
       bodyClass: Ember.View.extend({
         content: repo,
+        skipCheckBox: Ember.Checkbox.extend({
+          classNames: ["align-checkbox"],
+          change: function() {
+            this.get('parentView.content.operatingSystems').forEach(function(os) {
+              if (Em.get(os, 'repositories.length') > 0) {
+                os.get('repositories').forEach(function(repo) {
+                  Em.set(repo, 'hasError', false);
+                })
+              }
+            });
+          }
+        }),
         templateName: require('templates/main/admin/stack_upgrade/edit_repositories'),
-        skipValidation: false,
         didInsertElement: function () {
           App.tooltip($("[rel=skip-validation-tooltip]"), {placement: 'right'});
-        }
+        },
+        OSCheckBox: Ember.Checkbox.extend({
+          classNames: ["align-checkbox"],
+
+          checkedBinding: "os.isSelected",
+
+          change: function () {
+            this.get('os.repositories').setEach('hasError', false);
+          }
+        })
       }),
       header: Em.I18n.t('common.repositories'),
       primary: Em.I18n.t('common.save'),
       disablePrimary: !(App.get('isAdmin') && !App.get('isOperator')),
       onPrimary: function () {
-        this.hide();
-        self.get('controller').saveRepoOS();
+        var self = this;
+        App.get('router.mainAdminStackAndUpgradeController').saveRepoOS(repo, this.get('skipValidation')).done(function(data){
+          if (data.length > 0) {
+            self.set('hasErrors', true);
+          } else {
+            self.hide();
+          }
+        })
       }
     });
   },

+ 50 - 0
ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js

@@ -531,4 +531,54 @@ describe('App.MainAdminStackAndUpgradeController', function() {
       expect(item.get('status')).to.equal('PENDING');
     });
   });
+
+  describe("#prepareRepoForSaving()", function () {
+    it("prepare date for saving", function () {
+      var repo = Em.Object.create({
+        operatingSystems: [
+          Em.Object.create({
+            osType: "redhat6",
+            isDisabled: Ember.computed.not('isSelected'),
+            repositories: [Em.Object.create({
+                "baseUrl": "111121",
+                "repoId": "HDP-2.2",
+                "repoName": "HDP",
+                hasError: false
+            }),
+              Em.Object.create({
+                "baseUrl": "1",
+                "repoId": "HDP-UTILS-1.1.0.20",
+                "repoName": "HDP-UTILS",
+                hasError: false
+              })]
+           })
+        ]
+      });
+      var result = {
+        "operating_systems": [
+          {
+            "OperatingSystems": {
+              "os_type": "redhat6"
+            },
+            "repositories": [
+              {
+                "Repositories": {
+                  "base_url": "111121",
+                  "repo_id": "HDP-2.2",
+                  "repo_name": "HDP"
+                }
+              },
+              {
+                "Repositories": {
+                  "base_url": "1",
+                  "repo_id": "HDP-UTILS-1.1.0.20",
+                  "repo_name": "HDP-UTILS"
+                }
+              }
+            ]
+          }
+        ]}
+      expect(controller.prepareRepoForSaving(repo)).to.eql(result);
+    });
+  });
 });

+ 1 - 1
ambari-web/test/views/wizard/controls_view_test.js → ambari-web/test/views/common/controls_view_test.js

@@ -17,7 +17,7 @@
  */
 
 var App = require('app');
-require('views/wizard/controls_view');
+require('views/common/controls_view');
 
 describe('App.ServiceConfigRadioButtons', function () {