This is an automated email from the ASF dual-hosted git repository. jonathanhurley pushed a commit to branch branch-feature-AMBARI-14714 in repository https://gitbox.apache.org/repos/asf/ambari.git
The following commit(s) were added to refs/heads/branch-feature-AMBARI-14714 by this push: new bb72d33 [AMBARI-23518] Fix install wizard summary OS/repo info (#960) bb72d33 is described below commit bb72d3335f1bbb496d557bb6e3dfdb22feeb7a1c Author: Jason Golieb <j...@golieb.net> AuthorDate: Wed Apr 11 10:08:32 2018 -0400 [AMBARI-23518] Fix install wizard summary OS/repo info (#960) --- ambari-web/app/controllers/installer.js | 2 +- ambari-web/app/controllers/wizard.js | 2 +- .../wizard/customProductRepos_controller.js | 236 ++++++++++++--------- .../wizard/downloadMpacks_controller.js | 4 +- .../app/controllers/wizard/step8_controller.js | 44 ++-- ambari-web/app/mappers/stack_mapper.js | 2 +- ambari-web/app/routes/installer.js | 2 + ambari-web/app/utils/ajax/ajax.js | 4 +- 8 files changed, 171 insertions(+), 125 deletions(-) diff --git a/ambari-web/app/controllers/installer.js b/ambari-web/app/controllers/installer.js index 290b75f..0fe9dc0 100644 --- a/ambari-web/app/controllers/installer.js +++ b/ambari-web/app/controllers/installer.js @@ -826,6 +826,7 @@ App.InstallerController = App.WizardController.extend(App.Persist, { { type: 'async', callback: function () { + this.loadRegisteredMpacks(); return this.loadSelectedServiceInfo(this.getStepSavedState('customProductRepos')); } }, @@ -835,7 +836,6 @@ App.InstallerController = App.WizardController.extend(App.Persist, { type: 'sync', callback: function () { this.loadConfirmedHosts(); - this.loadRegisteredMpacks(); } } ], diff --git a/ambari-web/app/controllers/wizard.js b/ambari-web/app/controllers/wizard.js index ad60107..f8f37d4 100644 --- a/ambari-web/app/controllers/wizard.js +++ b/ambari-web/app/controllers/wizard.js @@ -1428,7 +1428,7 @@ App.WizardController = Em.Controller.extend(App.LocalStorage, App.ThemesMappingM this.set('content.serviceGroups', serviceGroups); registeredMpacks.forEach(rmp => { - App.stackMapper.map(rmp); + App.stackMapper.map(JSON.parse(JSON.stringify(rmp))); }); }, diff --git a/ambari-web/app/controllers/wizard/customProductRepos_controller.js b/ambari-web/app/controllers/wizard/customProductRepos_controller.js index c0ae0aa..bfe2b56 100644 --- a/ambari-web/app/controllers/wizard/customProductRepos_controller.js +++ b/ambari-web/app/controllers/wizard/customProductRepos_controller.js @@ -44,116 +44,117 @@ App.WizardCustomProductReposController = App.WizardStepController.extend({ return false; }, - getRegisteredMpackInfo: function () { - return App.ajax.send({ - name: 'mpack.get_all_registered', - sender: this - }) + /** + * Gets registered mpack info and updates it with info from user's selections. + * Returns mapped mpacks for use in this step. + */ + getRegisteredMpackInfo: function (selectedMpacks) { + const registeredMpacks = this.get('content.registeredMpacks'); + const mpacks = []; + + registeredMpacks.forEach(mpack => { + const selectedMpack = selectedMpacks.find(selectedMpack => selectedMpack.name === mpack.MpackInfo.mpack_name && selectedMpack.version === mpack.MpackInfo.mpack_version); + + mpacks.push(Em.Object.create({ + id: mpack.MpackInfo.id, + name: mpack.MpackInfo.mpack_name, + displayName: mpack.MpackInfo.mpack_display_name, + publicUrl: selectedMpack.publicUrl, + downloadUrl: selectedMpack.downloadUrl, + version: mpack.MpackInfo.mpack_version, + operatingSystems: mpack.default_operating_systems.map(os => { + //determines if the OS was selected in the database (as when the mpack is initially registered) + let initiallySelected; + if (mpack.operating_systems) { + initiallySelected = mpack.operating_systems.find(mpackOs => mpackOs.OperatingSystems.os_type === os.OperatingSystems.os_type); + } + + //checks if the OS was selected in the UI + let selectedOs; + if (selectedMpack && selectedMpack.operatingSystems) { + selectedOs = selectedMpack.operatingSystems.find(mpackOs => mpackOs.type === os.OperatingSystems.os_type); + } + + return Em.Object.create({ + postdata: JSON.parse(JSON.stringify(os.OperatingSystems)), + type: os.OperatingSystems.os_type, + initiallySelected: initiallySelected ? true : false, + selected: selectedOs ? true : false, + isFirstSelected: false, + isLastSelected: false, + repos: os.OperatingSystems.repositories.map((repo, index, repos) => { + let downloadUrl; + + if (selectedOs && selectedOs.repos) { + const selectedRepo = selectedOs.repos.findProperty('repoId', repo.repo_id); + + if (selectedRepo) { + downloadUrl = selectedRepo.downloadUrl; + } + } + + return Em.Object.create({ + id: `${mpack.MpackInfo.mpack_name}-${mpack.MpackInfo.mpack_version}-${os.OperatingSystems.os_type}-${repo.repo_id}`, //this is a unique ID used in client logic + repoId: repo.repo_id, //this is the repo ID used by the server and displayed in the UI + name: repo.repo_name, + publicUrl: repo.base_url, + downloadUrl: downloadUrl || repo.base_url, + isFirst: index === 0, + isLast: index === repos.length - 1 + }); + }) + }); + }) + })) + }); + + return mpacks; }, /** * Populates mpacks array, repos array, and operatingSystems array based on info about registered mpacks. */ loadStep: function () { - this.getRegisteredMpackInfo().then(registeredMpacks => { - const selectedMpacks = this.get('content.selectedMpacks'); - const mpacks = []; + const selectedMpacks = this.get('content.selectedMpacks'); - registeredMpacks.items.forEach(mpack => { - const selectedMpack = selectedMpacks.find(selectedMpack => selectedMpack.name === mpack.MpackInfo.mpack_name && selectedMpack.version === mpack.MpackInfo.mpack_version); - - mpacks.push(Em.Object.create({ - id: mpack.MpackInfo.id, - name: mpack.MpackInfo.mpack_name, - displayName: mpack.MpackInfo.mpack_display_name, - publicUrl: selectedMpack.publicUrl, - downloadUrl: selectedMpack.downloadUrl, - version: mpack.MpackInfo.mpack_version, - operatingSystems: mpack.default_operating_systems.map(os => { - //determines if the OS was selected in the database (as when the mpack is initially registered) - let initiallySelected; - if (mpack.operating_systems) { - initiallySelected = mpack.operating_systems.find(mpackOs => mpackOs.OperatingSystems.os_type === os.OperatingSystems.os_type); - } - - //checks if the OS was selected in the UI - let selectedOs; - if (selectedMpack && selectedMpack.operatingSystems) { - selectedOs = selectedMpack.operatingSystems.find(mpackOs => mpackOs.type === os.OperatingSystems.os_type); - } - - return Em.Object.create({ - postdata: os.OperatingSystems, - type: os.OperatingSystems.os_type, - initiallySelected: initiallySelected ? true : false, - selected: selectedOs ? true : false, - isFirstSelected: false, - isLastSelected: false, - repos: os.OperatingSystems.repositories.map((repo, index, repos) => { - let downloadUrl; - - if (selectedOs && selectedOs.repos) { - const selectedRepo = selectedOs.repos.findProperty('repoId', repo.repo_id); - - if (selectedRepo) { - downloadUrl = selectedRepo.downloadUrl; - } - } - - return Em.Object.create({ - id: `${mpack.MpackInfo.mpack_name}-${mpack.MpackInfo.mpack_version}-${os.OperatingSystems.os_type}-${repo.repo_id}`, //this is a unique ID used in client logic - repoId: repo.repo_id, //this is the repo ID used by the server and displayed in the UI - name: repo.repo_name, - publicUrl: repo.base_url, - downloadUrl: downloadUrl || repo.base_url, - isFirst: index === 0, - isLast: index === repos.length - 1 - }); - }) - }); - }) - })) - }); - this.set('mpacks', mpacks); - - const repos = mpacks.reduce( - (repos, mpack) => repos.concat( - mpack.get('operatingSystems').reduce( - (repos, os) => repos.concat( - os.get('repos') - ), - []) + const mpacks = this.getRegisteredMpackInfo(selectedMpacks); + this.set('mpacks', mpacks); + + const repos = mpacks.reduce( + (repos, mpack) => repos.concat( + mpack.get('operatingSystems').reduce( + (repos, os) => repos.concat( + os.get('repos') ), - [] - ); - this.set('repos', repos); + []) + ), + [] + ); + this.set('repos', repos); - const uniqueOperatingSystems = {}; - mpacks.forEach(mpack => { - mpack.get('operatingSystems').forEach(os => { - const osType = os.get('type'); - uniqueOperatingSystems[osType] - ? uniqueOperatingSystems[osType].mpacks.pushObject(mpack) - : uniqueOperatingSystems[osType] = { - selected: os.get('selected'), - mpacks: [mpack] - }; - }) - }); - - const operatingSystems = []; - for (let osType in uniqueOperatingSystems) { - operatingSystems.pushObject(Em.Object.create({ - type: osType, - selected: uniqueOperatingSystems[osType].selected, - mpacks: uniqueOperatingSystems[osType].mpacks - })) - } - operatingSystems.sort((a, b) => a.get('type').localeCompare(b.get('type'))); - this.set('operatingSystems', operatingSystems); - }, - - this.get('wizardController').addErrors); + const uniqueOperatingSystems = {}; + mpacks.forEach(mpack => { + mpack.get('operatingSystems').forEach(os => { + const osType = os.get('type'); + uniqueOperatingSystems[osType] + ? uniqueOperatingSystems[osType].mpacks.pushObject(mpack) + : uniqueOperatingSystems[osType] = { + selected: os.get('selected'), + mpacks: [mpack] + }; + }) + }); + + const operatingSystems = []; + for (let osType in uniqueOperatingSystems) { + operatingSystems.pushObject(Em.Object.create({ + type: osType, + selected: uniqueOperatingSystems[osType].selected, + mpacks: uniqueOperatingSystems[osType].mpacks + })) + } + operatingSystems.sort((a, b) => a.get('type').localeCompare(b.get('type'))); + this.set('operatingSystems', operatingSystems); }, /** @@ -224,8 +225,8 @@ App.WizardCustomProductReposController = App.WizardStepController.extend({ ({ name: selectedMpack.name, displayName: selectedMpack.displayName, - publicUrl: selectedMpack.publicUrl, - downloadUrl: selectedMpack.downloadUrl, + publicUrl: selectedMpack.publicUrl, //these are the URLs of the mpack itself + downloadUrl: selectedMpack.downloadUrl, //don't delete them thinking they're not used :) version: selectedMpack.version, operatingSystems: selectedMpack.get('operatingSystems').filterProperty('selected').map(os => ({ @@ -275,8 +276,35 @@ App.WizardCustomProductReposController = App.WizardStepController.extend({ }); $.when(...osRepoPromises).then(() => { + //update registeredMpacks with user's changes so they will be persisted and mapped to App.Stack model + this.updateRegisteredMpacks(selectedMpacks); + App.router.send('next'); - }, () => this.get('wizardController').addError(Em.i18n.t('installer.error.mpackOsModifications'))); + }, () => this.get('wizardController').addError(Em.I18n.t('installer.error.mpackOsModifications'))); + }, + + updateRegisteredMpacks: function (selectedMpacks) { + const registeredMpacks = this.get('content.registeredMpacks'); + + selectedMpacks.forEach(mpack => { + const rmp = registeredMpacks.find(rmp => rmp.MpackInfo.mpack_name === mpack.name && rmp.MpackInfo.mpack_version === mpack.version); + if (rmp) { + mpack.operatingSystems.forEach(os => { + const ros = rmp.operating_systems.find(ros => ros.os_type === os.type); + if (ros) { + ros.is_selected = os.selected; + os.repositories.forEach(repo => { + const rr = ros.repos.find(rr => rr.repo_id === repo.id); + if (rr) { + rr.base_url = repo.downloadUrl; + } + }) + } + }) + } + }); + + this.set('content.registeredMpacks', registeredMpacks); }, createOsRepos: function (mpack, os, data) { diff --git a/ambari-web/app/controllers/wizard/downloadMpacks_controller.js b/ambari-web/app/controllers/wizard/downloadMpacks_controller.js index 471080e..5eb63d4 100644 --- a/ambari-web/app/controllers/wizard/downloadMpacks_controller.js +++ b/ambari-web/app/controllers/wizard/downloadMpacks_controller.js @@ -86,14 +86,14 @@ App.WizardDownloadMpacksController = App.WizardStepController.extend({ failureMessage = request.statusText; break; default: - failureMessage = Em.i18n.t('installer.downloadMpacks.failure.default'); + failureMessage = Em.I18n.t('installer.downloadMpacks.failure.default'); } this.get('mpacks').findProperty('name', params.name).set('failureMessage', failureMessage); } }, - loadMpackInfo(data) { + loadMpackInfo: function (data) { App.ajax.send({ name: 'mpack.get_registered_mpack', sender: this, diff --git a/ambari-web/app/controllers/wizard/step8_controller.js b/ambari-web/app/controllers/wizard/step8_controller.js index 91a01d1..2ca005e 100644 --- a/ambari-web/app/controllers/wizard/step8_controller.js +++ b/ambari-web/app/controllers/wizard/step8_controller.js @@ -315,23 +315,39 @@ App.WizardStep8Controller = App.WizardStepController.extend(App.AddSecurityConfi } else { // from install wizard var downloadConfig = this.get('downloadConfig'); - var selectedStack = this.getSelectedStack(); var allRepos = []; - if (selectedStack && selectedStack.get('operatingSystems')) { - selectedStack.get('operatingSystems').forEach(function (os) { - if (os.get('isSelected')) { - os.get('repositories').forEach(function(repo) { - if (repo.get('showRepo')) { - allRepos.push(Em.Object.create({ - base_url: repo.get('baseUrl'), - os_type: repo.get('osType'), - repo_id: repo.get('repoId') - })); + var selectedMpacks = this.get('content.selectedMpacks'); + var registeredMpacks = this.get('content.registeredMpacks'); + if (selectedMpacks && registeredMpacks) { + selectedMpacks.forEach(mpack => { + if (mpack.operatingSystems) { //repos have been customized + mpack.operatingSystems.forEach(os => { + if (os.selected) { + os.repos.forEach(function (repo) { + allRepos.push(Em.Object.create({ + base_url: repo.downloadUrl, + os_type: os.type, + repo_id: repo.repoId + })); + }); } - }, this); + }) + } else { //repos have not been customized, so use default info + const rmp = registeredMpacks.find(rmp => rmp.MpackInfo.mpack_name === mpack.name && rmp.MpackInfo.mpack_version === mpack.version); + if (rmp) { + rmp.operating_systems.forEach(os => { + os.OperatingSystems.repositories.forEach(function (repo) { + allRepos.push(Em.Object.create({ + base_url: repo.base_url, + os_type: repo.os_type, + repo_id: repo.repo_id + })); + }) + }) + } } - }, this); - } + }); + } allRepos.set('display_name', Em.I18n.t("installer.step8.repoInfo.displayName")); this.get('clusterInfo').set('useRedhatSatellite', downloadConfig.useRedhatSatellite); this.get('clusterInfo').set('repoInfo', allRepos); diff --git a/ambari-web/app/mappers/stack_mapper.js b/ambari-web/app/mappers/stack_mapper.js index 162d24e..09167e0 100644 --- a/ambari-web/app/mappers/stack_mapper.js +++ b/ambari-web/app/mappers/stack_mapper.js @@ -123,7 +123,7 @@ App.stackMapper = App.QuickDataMapper.create({ operatingSystems.id = stack.id + "-" + operatingSystems.os_type; operatingSystems.stack_id = stack.id; operatingSystems.repositories = repositoriesArray; - operatingSystems.is_selected = ops.isSelected == true || ops.isSelected == undefined; + operatingSystems.is_selected = false; resultOS.push(this.parseIt(operatingSystems, this.get('configOS'))); operatingSystemsArray.pushObject(operatingSystems); diff --git a/ambari-web/app/routes/installer.js b/ambari-web/app/routes/installer.js index ac1bb6d..03171d2 100644 --- a/ambari-web/app/routes/installer.js +++ b/ambari-web/app/routes/installer.js @@ -315,6 +315,7 @@ module.exports = Em.Route.extend(App.RouterRedirections, { router.get('wizardStep6Controller').set('isClientsSet', false); } controller.setStepSaved('selectMpacks'); + controller.save('downloadConfig'); const downloadConfig = controller.get('content.downloadConfig'); if (downloadConfig && downloadConfig.useCustomRepo) { router.transitionTo('customMpackRepos'); @@ -467,6 +468,7 @@ module.exports = Em.Route.extend(App.RouterRedirections, { const controller = router.get('installerController'); controller.clearErrors(); controller.save('selectedMpacks'); + controller.save('registeredMpacks'); controller.setStepSaved('customProductRepos'); router.transitionTo('verifyProducts'); console.timeEnd('customProductRepos next'); diff --git a/ambari-web/app/utils/ajax/ajax.js b/ambari-web/app/utils/ajax/ajax.js index 6f4d8bc..8b1522b 100644 --- a/ambari-web/app/utils/ajax/ajax.js +++ b/ambari-web/app/utils/ajax/ajax.js @@ -57,7 +57,7 @@ var urls = { }, 'common.services.update' : { - 'real': '/clusters/{clusterName}/servicegroups/{serviceGroupName}/services?{urlParams}', + 'real': '/clusters/{clusterName}/servicegroups/{serviceGroup}/services?{urlParams}', 'mock': '/data/wizard/deploy/poll_1.json', 'format': function (data) { return { @@ -247,7 +247,7 @@ var urls = { 'common.service.create.configs': { 'type': 'POST', - 'real':'/clusters/{clusterName}/servicegroups/{serviceGroupName}/services/{serviceName}/configurations', + 'real':'/clusters/{clusterName}/servicegroups/{serviceGroup}/services/{serviceName}/configurations', 'format': function(data) { return { apiPrefix: 'api/v2', -- To stop receiving notification emails like this one, please contact jonathanhur...@apache.org.