blob: c6ba2416a902e2c45bbf87232bb228b93095d871 [file] [log] [blame]
/**
* 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.
*/
'use strict';
angular.module('ambariAdminConsole')
.controller('StackVersionsEditCtrl', ['$scope', '$location', 'Cluster', 'Stack', '$routeParams', 'ConfirmationModal', 'Alert', '$translate', 'AddRepositoryModal', function($scope, $location, Cluster, Stack, $routeParams, ConfirmationModal, Alert, $translate, AddRepositoryModal) {
var $t = $translate.instant;
$scope.constants = {
os: $t('versions.os')
};
$scope.editController = true;
$scope.osList = [];
$scope.skipValidation = false;
$scope.useRedhatSatellite = false;
$scope.selectedOS = 0;
$scope.upgradeStack = {
stack_name: '',
stack_version: '',
display_name: ''
};
$scope.loadStackVersionInfo = function () {
return Stack.getRepo($routeParams.versionId, $routeParams.stackName).then(function (response) {
$scope.activeStackVersion = response;
$scope.id = response.id;
$scope.isPatch = response.type == 'PATCH';
$scope.stackNameVersion = response.stackNameVersion || $t('common.NA');
$scope.displayName = response.displayName || $t('common.NA');
$scope.version = response.version || $t('common.NA');
$scope.actualVersion = response.actualVersion || $t('common.NA');
$scope.useRedhatSatellite = !response.ambari_managed_repositories;
$scope.updateObj = response.updateObj;
$scope.upgradeStack = {
stack_name: response.stackName,
stack_version: response.stackVersion,
display_name: response.displayName
};
$scope.services = response.services.filter(function (service) {
var skipServices = ['MAPREDUCE2', 'GANGLIA', 'KERBEROS'];
return skipServices.indexOf(service.name) === -1;
}) || [];
//save default values of repos to check if they were changed
$scope.defaulfOSRepos = {};
response.updateObj.operating_systems.forEach(function(os) {
$scope.defaulfOSRepos[os.OperatingSystems.os_type] = {};
os.repositories.forEach(function(repo) {
$scope.defaulfOSRepos[os.OperatingSystems.os_type][repo.Repositories.repo_id] = repo.Repositories.base_url;
});
});
$scope.repoVersionFullName = response.repoVersionFullName;
angular.forEach(response.osList, function (os) {
os.selected = true;
});
$scope.osList = response.osList;
// load supported os type base on stack version
$scope.afterStackVersionRead();
// if user reach here from UI click, repo status should be cached
// otherwise re-fetch repo status from cluster end point.
$scope.repoStatus = Cluster.repoStatusCache[$scope.id];
if (!$scope.repoStatus) {
$scope.fetchClusters()
.then(function () {
return $scope.fetchRepoClusterStatus();
})
.then(function () {
$scope.deleteEnabled = $scope.isDeletable();
});
} else {
$scope.deleteEnabled = $scope.isDeletable();
}
// fetch all repos to display the left menu
$scope.fetchRepos();
});
};
/**
* Load supported OS list
*/
$scope.afterStackVersionRead = function () {
Stack.getSupportedOSList($scope.upgradeStack.stack_name, $scope.upgradeStack.stack_version)
.then(function (data) {
var operatingSystems = data.operating_systems;
operatingSystems.map(function (os) {
var existingOSHash = {};
angular.forEach($scope.osList, function (os) {
os.repositories.forEach(function(repo) {
repo.Repositories.initial_base_url = repo.Repositories.base_url;
});
existingOSHash[os.OperatingSystems.os_type] = os;
});
// if os not in the list, mark as un-selected, add this to the osList
if (!existingOSHash[os.OperatingSystems.os_type]) {
os.selected = false;
os.repositories.forEach(function(repo) {
repo.Repositories.base_url = '';
});
$scope.osList.push(os);
}
});
})
.catch(function (data) {
Alert.error($t('versions.alerts.osListError'), data.message);
});
};
$scope.isDeletable = function() {
return !($scope.repoStatus == 'current' || $scope.repoStatus == 'installed');
};
$scope.disableUnusedOS = function() {
Cluster.getClusterOS().then(function(usedOS){
angular.forEach($scope.osList, function (os) {
if (os.OperatingSystems.os_type !== usedOS) {
os.disabled = true;
}
});
});
};
$scope.defaulfOSRepos = {};
$scope.save = function () {
$scope.editVersionDisabled = true;
delete $scope.updateObj.href;
$scope.updateObj.operating_systems = [];
var updateRepoUrl = false;
angular.forEach($scope.osList, function (os) {
var savedUrls = $scope.defaulfOSRepos[os.OperatingSystems.os_type];
os.OperatingSystems.ambari_managed_repositories = !$scope.useRedhatSatellite;
if (os.selected) {
var currentRepos = os.repositories;
var urlChanged = false;
angular.forEach(currentRepos, function (repo) {
if (repo.Repositories.base_url != savedUrls[repo.Repositories.repo_id]) {
urlChanged = true;
}
});
if (!savedUrls || urlChanged) {
updateRepoUrl = true;
}
$scope.updateObj.operating_systems.push(os);
} else if (savedUrls) {
updateRepoUrl = true;
}
});
if (updateRepoUrl && !$scope.deleteEnabled) {
ConfirmationModal.show(
$t('versions.changeBaseURLConfirmation.title'),
$t('versions.changeBaseURLConfirmation.message'),
$t('common.controls.confirmChange')
).then(function() {
$scope.updateRepoVersions();
});
} else {
$scope.updateRepoVersions();
}
};
$scope.updateRepoVersions = function () {
var skip = $scope.skipValidation || $scope.useRedhatSatellite;
return Stack.validateBaseUrls(skip, $scope.osList, $scope.upgradeStack).then(function (invalidUrls) {
if (invalidUrls.length === 0) {
Stack.updateRepo($scope.upgradeStack.stack_name, $scope.upgradeStack.stack_version, $scope.id, $scope.updateObj).then(function () {
Alert.success($t('versions.alerts.versionEdited', {
stackName: $scope.upgradeStack.stack_name,
versionName: $scope.actualVersion,
displayName: $scope.repoVersionFullName
}));
$location.path('/stackVersions');
}).catch(function (data) {
Alert.error($t('versions.alerts.versionUpdateError'), data.message);
});
} else {
Stack.highlightInvalidUrls(invalidUrls);
}
});
};
$scope.fetchRepoClusterStatus = function () {
var clusterName = ($scope.clusters && $scope.clusters.length > 0)
? $scope.clusters[0].Clusters.cluster_name : null; // only support one cluster at the moment
if (!clusterName) {
return null;
}
return Cluster.getRepoVersionStatus(clusterName, $scope.id).then(function (response) {
$scope.repoStatus = response.status;
});
};
$scope.fetchClusters = function () {
return Cluster.getAllClusters().then(function (clusters) {
$scope.clusters = clusters;
});
};
$scope.delete = function () {
ConfirmationModal.show(
$t('versions.deregister'),
{
"url": 'views/modals/BodyForDeregisterVersion.html',
"scope": {"displayName": $scope.repoVersionFullName }
}
).then(function() {
Stack.deleteRepo($scope.upgradeStack.stack_name, $scope.upgradeStack.stack_version, $scope.id).then( function () {
$location.path('/stackVersions');
}).catch(function (data) {
Alert.error($t('versions.alerts.versionDeleteError'), data.message);
});
});
};
/**
* On click handler for removing OS
*/
$scope.removeOS = function() {
if ($scope.useRedhatSatellite) {
return;
}
this.os.selected = false;
if (this.os.repositories) {
this.os.repositories.forEach(function(repo) {
repo.hasError = false;
});
}
};
/**
* On click handler for adding new OS
*/
$scope.addOS = function() {
this.os.selected = true;
if (this.os.repositories) {
this.os.repositories.forEach(function(repo) {
repo.hasError = false;
});
}
};
$scope.isAddOsButtonDisabled = function () {
var selectedCnt = 0;
angular.forEach($scope.osList, function (os) {
if (os.selected) {
selectedCnt ++;
}
});
return $scope.osList.length == selectedCnt || $scope.useRedhatSatellite;
};
$scope.hasNotDeletedRepo = function () {
//check if any repository has been selected for deleting
//if yes, drop down should be displayed
var repoNotDeleted = true;
for(var i=0;i<$scope.osList.length;i++) {
if (!$scope.osList[i].selected) {
repoNotDeleted=false;
break;
}
}
return repoNotDeleted;
};
/**
* On click handler for adding a new repository
*/
$scope.addRepository = function() {
AddRepositoryModal.show($scope.osList, $scope.upgradeStack.stack_name, $scope.upgradeStack.stack_version, $scope.id);
};
$scope.isSaveButtonDisabled = function() {
var enabled = false;
$scope.osList.forEach(function(os) {
if (os.selected) {
enabled = true
}
});
return !enabled;
};
$scope.cancel = function () {
$scope.editVersionDisabled = true;
$location.path('/stackVersions');
};
$scope.undoChange = function(repo) {
repo.Repositories.base_url = repo.Repositories.initial_base_url;
};
$scope.clearErrors = function() {
if ($scope.osList) {
$scope.osList.forEach(function(os) {
if (os.repositories) {
os.repositories.forEach(function(repo) {
repo.hasError = false;
})
}
});
}
if ($scope.useRedhatSatellite) {
ConfirmationModal.show(
$t('common.important'),
{
"url": 'views/modals/BodyForUseRedhatSatellite.html'
}
).catch(function () {
$scope.useRedhatSatellite = !$scope.useRedhatSatellite;
});
}
};
$scope.clearError = function () {
this.repository.hasError = false;
};
$scope.hasValidationErrors = function () {
var hasErrors = false;
if ($scope.osList) {
$scope.osList.forEach(function (os) {
if (os.repositories) {
os.repositories.forEach(function (repo) {
if (repo.hasError) {
hasErrors = true;
}
})
}
});
}
return hasErrors;
};
// add all repos list
$scope.filter = {
version: '',
cluster: {
options: [],
current: null
}
};
$scope.pagination = {
totalRepos: 100,
maxVisiblePages: 1,
itemsPerPage: 100,
currentPage: 1
};
$scope.allRepos = [];
$scope.stackVersions = [];
/**
* Formatted object to display all repos:
*
* [{ 'name': 'HDP-2.3',
* 'repos': ['2.3.6.0-2343', '2.3.4.1', '2.3.4.0-56']
* },
* { 'name': 'HDP-2.2',
* 'repos': ['2.2.6.0', '2.2.4.5', '2.2.4.0']
* }
* ]
*
*/
$scope.fetchRepos = function () {
return Stack.allRepos($scope.filter, $scope.pagination).then(function (repos) {
$scope.allRepos = repos.items.sort(function(a, b){return a.repository_version < b.repository_version});
var existingStackHash = {};
var stackVersions = [];
angular.forEach($scope.allRepos, function (repo) {
var stackVersionName = repo.stack_name + '-' + repo.stack_version;
var currentStackVersion = $scope.upgradeStack.stack_name + '-' + $scope.upgradeStack.stack_version;
repo.isActive = $scope.actualVersion == repo.repository_version;
if (!existingStackHash[stackVersionName]) {
existingStackHash[stackVersionName] = true;
stackVersions.push({
'name': stackVersionName,
'isOpened': stackVersionName == currentStackVersion,
'repos': [repo]
});
} else {
if (stackVersions[stackVersions.length -1].repos) {
stackVersions[stackVersions.length -1].repos.push(repo);
}
}
});
$scope.stackVersions = stackVersions;
});
};
$scope.loadStackVersionInfo();
}]);