Skip to content

Commit 14f91eb

Browse files
committed
Bug 1470010 - Use owner references to find deployment on replica set page
- Avoids a problem where the label selector from another deployment might match a replica set, showing the wrong deployment link on the browse replica set page. - Fixes a bug where an old replica set that becomes active while the user is on the page cannot be scaled. (This can happen if an old replica set revision is reused because it matches the current deployment spec.) Fixes https://bugzilla.redhat.com/show_bug.cgi?id=1470010
1 parent d4e91d8 commit 14f91eb

File tree

2 files changed

+136
-135
lines changed

2 files changed

+136
-135
lines changed

app/scripts/controllers/replicaSet.js

Lines changed: 41 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,18 @@ angular.module('openshiftConsole')
2222
MetricsService,
2323
ModalsService,
2424
Navigate,
25+
OwnerReferencesService,
2526
PodsService,
2627
ProjectsService,
2728
StorageService,
2829
keyValueEditorUtils,
2930
kind) {
3031
var hasDC = false;
32+
3133
var annotation = $filter('annotation');
3234
var displayKind = $filter('humanizeKind')(kind);
35+
var hasDeployment = $filter('hasDeployment');
36+
3337
switch (kind) {
3438
case 'ReplicaSet':
3539
$scope.resource = {
@@ -278,37 +282,47 @@ angular.module('openshiftConsole')
278282
$scope.isActive = DeploymentsService.isActiveReplicaSet($scope.replicaSet, $scope.deployment);
279283
};
280284

281-
var hasDeployment = $filter('hasDeployment');
282-
var inProgressDeployment = false;
285+
var hasInProgressRollout = function(replicaSets) {
286+
// See if there is any other replica set owned by the deployment with active pods.
287+
return _.some(replicaSets, function(replicaSet) {
288+
// Check if the replica set has pods.
289+
if (!_.get(replicaSet, 'status.replicas')) {
290+
return;
291+
}
292+
293+
// Check if it's the same replica set we're viewing.
294+
if (_.get(replicaSet, 'metadata.uid') === _.get($scope.replicaSet, 'metadata.uid')) {
295+
return;
296+
}
297+
298+
// Check if it's owned by same deployment.
299+
var controllerReferences = OwnerReferencesService.getControllerReferences(replicaSet);
300+
return _.some(controllerReferences, { uid: $scope.deployment.metadata.uid });
301+
});
302+
};
303+
304+
var rolloutInProgress = false;
283305
var updateDeployment = function() {
284-
if (!hasDeployment($scope.replicaSet)) {
306+
var controllerRefs = OwnerReferencesService.getControllerReferences($scope.replicaSet);
307+
var deploymentRef = _.find(controllerRefs, { kind: 'Deployment' });
308+
if (!deploymentRef) {
285309
return;
286310
}
287311

288-
DataService.list({
312+
DataService.get({
289313
group: 'extensions',
290314
resource: 'deployments'
291-
}, context).then(function(resp) {
292-
var deployments = resp.by('metadata.name');
293-
var replicaSetSelector = new LabelSelector($scope.replicaSet.spec.selector);
294-
$scope.deployment = _.find(deployments, function(deployment) {
295-
var deploymentSelector = new LabelSelector(deployment.spec.selector);
296-
return deploymentSelector.covers(replicaSetSelector);
297-
});
298-
if (!$scope.deployment) {
299-
$scope.deploymentMissing = true;
300-
return;
301-
}
302-
315+
}, deploymentRef.name, context).then(function(deployment) {
316+
$scope.deployment = deployment;
303317
$scope.healthCheckURL = Navigate.healthCheckURL($routeParams.project,
304318
"Deployment",
305-
$scope.deployment.metadata.name,
319+
deployment.metadata.name,
306320
"extensions");
307321

308322
watches.push(DataService.watchObject({
309323
group: 'extensions',
310324
resource: 'deployments'
311-
}, $scope.deployment.metadata.name, context, function(deployment, action) {
325+
}, deployment.metadata.name, context, function(deployment, action) {
312326
if (action === "DELETED") {
313327
$scope.alerts['deployment-deleted'] = {
314328
type: "warning",
@@ -323,6 +337,7 @@ angular.module('openshiftConsole')
323337
return;
324338
}
325339

340+
$scope.deployment = deployment;
326341
$scope.breadcrumbs = BreadcrumbsService.getBreadcrumbs({
327342
object: $scope.replicaSet,
328343
displayName: '#' + DeploymentsService.getRevision($scope.replicaSet),
@@ -341,31 +356,9 @@ angular.module('openshiftConsole')
341356
watches.push(DataService.watch({
342357
group: 'extensions',
343358
resource: 'replicasets'
344-
}, context, function(replicaSets) {
345-
var deploymentSelector = new LabelSelector($scope.deployment.spec.selector);
346-
inProgressDeployment = false;
347-
348-
// See if there is more than one replica set that matches the
349-
// deployment selector with active replicas.
350-
var numActive = 0;
351-
_.each(replicaSets.by('metadata.name'), function(replicaSet) {
352-
if (!replicaSet.status.replicas) {
353-
return;
354-
}
355-
356-
if (!deploymentSelector.covers(new LabelSelector(replicaSet.spec.selector))) {
357-
return;
358-
}
359-
360-
numActive++;
361-
362-
if (numActive > 1) {
363-
inProgressDeployment = true;
364-
365-
// Stop looping.
366-
return false;
367-
}
368-
});
359+
}, context, function(replicaSetData) {
360+
var replicaSets = replicaSetData.by('metadata.name');
361+
rolloutInProgress = hasInProgressRollout(replicaSets);
369362
}));
370363
});
371364
};
@@ -429,6 +422,10 @@ angular.module('openshiftConsole')
429422
setLogVars(replicaSet);
430423
updateHPAWarnings();
431424
getImageStreamImage();
425+
426+
if ($scope.deployment) {
427+
checkActiveRevision();
428+
}
432429
}));
433430

434431
if ($scope.deploymentConfigName) {
@@ -589,7 +586,7 @@ angular.module('openshiftConsole')
589586
return false;
590587
}
591588

592-
return $scope.isActive && !inProgressDeployment;
589+
return $scope.isActive && !rolloutInProgress;
593590
};
594591

595592
$scope.removeVolume = function(volume) {

0 commit comments

Comments
 (0)