Skip to content

Commit

Permalink
Bug 1449908 - Group replica sets by owner reference
Browse files Browse the repository at this point in the history
Fixes https://bugzilla.redhat.com/show_bug.cgi?id=1449908

Use owner references to decide if a replica set is owned by a
deployment. Change maps to use deployment UID instead of deployment
name. This avoids problems when a deployment is deleted and another is
created with the same name.
  • Loading branch information
spadgett committed May 18, 2017
1 parent e234396 commit f4abfc2
Show file tree
Hide file tree
Showing 9 changed files with 459 additions and 393 deletions.
1 change: 1 addition & 0 deletions app/index.html
Expand Up @@ -212,6 +212,7 @@ <h1>JavaScript Required</h1>
<script src="scripts/services/apps.js"></script>
<script src="scripts/services/resourceAlerts.js"></script>
<script src="scripts/services/listRowUtils.js"></script>
<script src="scripts/services/ownerReferences.js"></script>
<script src="scripts/controllers/landingPage.js"></script>
<script src="scripts/controllers/projects.js"></script>
<script src="scripts/controllers/pods.js"></script>
Expand Down
9 changes: 3 additions & 6 deletions app/scripts/controllers/deployment.js
Expand Up @@ -19,6 +19,7 @@ angular.module('openshiftConsole')
ImageStreamResolver,
ModalsService,
Navigate,
OwnerReferencesService,
Logger,
ProjectsService,
StorageService) {
Expand Down Expand Up @@ -187,16 +188,12 @@ angular.module('openshiftConsole')
}));

// Watch replica sets for this deployment
// TODO: Use controller ref
watches.push(DataService.watch({
group: 'extensions',
resource: 'replicasets'
}, context, function(replicaSetData) {
var replicaSets = replicaSetData.by('metadata.name');
var deploymentSelector = new LabelSelector(deployment.spec.selector);
replicaSets = _.filter(replicaSets, function(replicaSet) {
return deploymentSelector.covers(new LabelSelector(replicaSet.spec.selector));
});
replicaSets = OwnerReferencesService.filterForController(replicaSets, deployment);
$scope.inProgressDeployment = _.chain(replicaSets).filter('status.replicas').size() > 1;
$scope.replicaSetsForDeployment = DeploymentsService.sortByRevision(replicaSets);
}));
Expand All @@ -207,7 +204,7 @@ angular.module('openshiftConsole')
$scope.alerts["load"] = {
type: "error",
message: e.status === 404 ? "This deployment can not be found, it may have been deleted." : "The deployment details could not be loaded.",
details: e.status === 404 ? "Any remaining deployment history for this deployment will be shown." : "Reason: " + $filter('getErrorDetails')(e)
details: $filter('getErrorDetails')(e)
};
}
);
Expand Down
24 changes: 14 additions & 10 deletions app/scripts/controllers/deployments.js
Expand Up @@ -15,8 +15,8 @@ angular.module('openshiftConsole')
DataService,
DeploymentsService,
LabelFilter,
LabelsService,
Logger,
OwnerReferencesService,
ProjectsService) {
$scope.projectName = $routeParams.project;
$scope.replicationControllers = {};
Expand All @@ -36,24 +36,28 @@ angular.module('openshiftConsole')
});
AlertMessageService.clearAlerts();

var replicaSets, deployments;
var replicaSets, deploymentsByUID;
var annotation = $filter('annotation');

var groupReplicaSets = function() {
$scope.replicaSetsByDeployment = LabelsService.groupBySelector(replicaSets, deployments, { matchSelector: true });
$scope.unfilteredReplicaSets = _.get($scope, ['replicaSetsByDeployment', ''], {});
if (!replicaSets || !deploymentsByUID) {
return;
}

$scope.replicaSetsByDeploymentUID = OwnerReferencesService.groupByControllerUID(replicaSets);
$scope.unfilteredReplicaSets = _.get($scope, ['replicaSetsByDeploymentUID', ''], {});
LabelFilter.addLabelSuggestionsFromResources($scope.unfilteredReplicaSets, $scope.labelSuggestions);
LabelFilter.setLabelSuggestions($scope.labelSuggestions);
$scope.replicaSets = LabelFilter.getLabelSelector().select($scope.unfilteredReplicaSets);

$scope.latestReplicaSetByDeployment = {};
_.each($scope.replicaSetsByDeployment, function(replicaSets, deploymentName) {
if (!deploymentName) {
$scope.latestReplicaSetByDeploymentUID = {};
_.each($scope.replicaSetsByDeploymentUID, function(replicaSets, deploymentUID) {
if (!deploymentUID) {
return;
}

$scope.latestReplicaSetByDeployment[deploymentName] =
DeploymentsService.getActiveReplicaSet(replicaSets, deployments[deploymentName]);
$scope.latestReplicaSetByDeploymentUID[deploymentUID] =
DeploymentsService.getActiveReplicaSet(replicaSets, deploymentsByUID[deploymentUID]);
});
};

Expand Down Expand Up @@ -139,7 +143,7 @@ angular.module('openshiftConsole')
group: "extensions",
resource: "deployments"
}, context, function(deploymentData) {
deployments = $scope.unfilteredDeployments = deploymentData.by("metadata.name");
deploymentsByUID = $scope.unfilteredDeployments = deploymentData.by("metadata.uid");
LabelFilter.addLabelSuggestionsFromResources($scope.unfilteredDeployments, $scope.labelSuggestions);
LabelFilter.setLabelSuggestions($scope.labelSuggestions);
$scope.deployments = LabelFilter.getLabelSelector().select($scope.unfilteredDeployments);
Expand Down
46 changes: 24 additions & 22 deletions app/scripts/controllers/newOverview.js
Expand Up @@ -20,6 +20,7 @@ angular.module('openshiftConsole').controller('NewOverviewController', [
'Logger',
'MetricsService',
'Navigate',
'OwnerReferencesService',
'ProjectsService',
'ResourceAlertsService',
'RoutesService',
Expand All @@ -44,6 +45,7 @@ function OverviewController($scope,
Logger,
MetricsService,
Navigate,
OwnerReferencesService,
ProjectsService,
ResourceAlertsService,
RoutesService) {
Expand Down Expand Up @@ -155,7 +157,7 @@ function OverviewController($scope,
var size = function() {
return _.size(overview.deploymentConfigs) +
_.size(overview.vanillaReplicationControllers) +
_.size(overview.deployments) +
_.size(overview.deploymentsByUID) +
_.size(overview.vanillaReplicaSets) +
_.size(overview.statefulSets) +
_.size(overview.monopods) +
Expand Down Expand Up @@ -184,7 +186,7 @@ function OverviewController($scope,
// Check if we've loaded the top-level items we show on the overview.
var loaded = overview.deploymentConfigs &&
overview.replicationControllers &&
overview.deployments &&
overview.deploymentsByUID &&
overview.replicaSets &&
overview.statefulSets &&
overview.pods &&
Expand Down Expand Up @@ -292,7 +294,7 @@ function OverviewController($scope,
overview.pipelineViewHasOtherResources =
!_.isEmpty(overview.deploymentConfigsNoPipeline) ||
!_.isEmpty(overview.vanillaReplicationControllers) ||
!_.isEmpty(overview.deployments) ||
!_.isEmpty(overview.deploymentsByUID) ||
!_.isEmpty(overview.vanillaReplicaSets) ||
!_.isEmpty(overview.statefulSets) ||
!_.isEmpty(overview.monopods);
Expand Down Expand Up @@ -335,7 +337,7 @@ function OverviewController($scope,
var updateFilter = function() {
overview.filteredDeploymentConfigs = filterItems(overview.deploymentConfigs);
overview.filteredReplicationControllers = filterItems(overview.vanillaReplicationControllers);
overview.filteredDeployments = filterItems(overview.deployments);
overview.filteredDeployments = filterItems(overview.deploymentsByUID);
overview.filteredReplicaSets = filterItems(overview.vanillaReplicaSets);
overview.filteredStatefulSets = filterItems(overview.statefulSets);
overview.filteredMonopods = filterItems(overview.monopods);
Expand Down Expand Up @@ -519,11 +521,11 @@ function OverviewController($scope,
// Get the replica sets that are displayed for a deployment. This will return
// only the active replica set unless a deployment is in progress.
var getVisibleReplicaSets = function(deployment) {
var name = getName(deployment);
if (!name) {
var uid = getUID(deployment);
if (!uid) {
return {};
}
return _.get(overview, ['replicaSetsByDeployment', name]);
return _.get(overview, ['replicaSetsByDeploymentUID', uid]);
};

// Set warnings for a Kubernetes deployment, including any active replica sets.
Expand All @@ -546,7 +548,7 @@ function OverviewController($scope,

// Update warnings for all Kubernetes deployments.
var updateAllDeploymentWarnings = function() {
_.each(overview.deployments, updateDeploymentWarnings);
_.each(overview.deploymentsByUID, updateDeploymentWarnings);
};

// Update all pod warnings, indexing the errors by owner UID.
Expand Down Expand Up @@ -764,28 +766,28 @@ function OverviewController($scope,

// Group replica sets by deployment and filter the visible replica sets.
var groupReplicaSets = function() {
if (!overview.replicaSets || !overview.deployments) {
if (!overview.replicaSets || !overview.deploymentsByUID) {
return;
}

overview.replicaSetsByDeployment = LabelsService.groupBySelector(overview.replicaSets, overview.deployments, { matchSelector: true });
overview.currentByDeployment = {};
overview.replicaSetsByDeploymentUID = OwnerReferencesService.groupByControllerUID(overview.replicaSets);
overview.currentByDeploymentUID = {};

// Sort the visible replica sets.
_.each(overview.replicaSetsByDeployment, function(replicaSets, deploymentName) {
if (!deploymentName) {
_.each(overview.replicaSetsByDeploymentUID, function(replicaSets, deploymentUID) {
if (!deploymentUID) {
return;
}

var deployment = overview.deployments[deploymentName];
var deployment = overview.deploymentsByUID[deploymentUID];
var visibleReplicaSets = _.filter(replicaSets, function(replicaSet) {
return isReplicaSetVisible(replicaSet, deployment);
});
var ordered = DeploymentsService.sortByRevision(visibleReplicaSets);
overview.replicaSetsByDeployment[deploymentName] = ordered;
overview.currentByDeployment[deploymentName] = _.head(ordered);
overview.replicaSetsByDeploymentUID[deploymentUID] = ordered;
overview.currentByDeploymentUID[deploymentUID] = _.head(ordered);
});
overview.vanillaReplicaSets = _.sortBy(overview.replicaSetsByDeployment[''], 'metadata.name');
overview.vanillaReplicaSets = _.sortBy(overview.replicaSetsByDeploymentUID[''], 'metadata.name');

// Since the visible replica sets for each deployment have changed, update
// the deployment warnings.
Expand Down Expand Up @@ -833,7 +835,7 @@ function OverviewController($scope,
var toUpdate = [
overview.deploymentConfigs,
overview.vanillaReplicationControllers,
overview.deployments,
overview.deploymentsByUID,
overview.vanillaReplicaSets,
overview.statefulSets,
overview.monopods
Expand Down Expand Up @@ -1195,13 +1197,13 @@ function OverviewController($scope,
group: "extensions",
resource: "deployments"
}, context, function(deploymentData) {
overview.deployments = deploymentData.by('metadata.name');
overview.deploymentsByUID = deploymentData.by('metadata.uid');
groupReplicaSets();
updateServicesForObjects(overview.deployments);
updateServicesForObjects(overview.deploymentsByUID);
updateServicesForObjects(overview.vanillaReplicaSets);
updateLabelSuggestions(overview.deployments);
updateLabelSuggestions(overview.deploymentsByUID);
updateFilter();
Logger.log("deployments (subscribe)", overview.deployments);
Logger.log("deployments (subscribe)", overview.deploymentsByUID);
}));

watches.push(DataService.watch("builds", context, function(buildData) {
Expand Down
43 changes: 43 additions & 0 deletions app/scripts/services/ownerReferences.js
@@ -0,0 +1,43 @@
'use strict';

angular.module("openshiftConsole")
.factory("OwnerReferencesService", function() {
var getOwnerReferences = function(apiObject) {
return _.get(apiObject, 'metadata.ownerReferences');
};

return {
getOwnerReferences: getOwnerReferences,

groupByControllerUID: function(apiObjects) {
var objectsByControllerUID = {};
_.each(apiObjects, function(apiObject) {
var hasController = false;
_.each(getOwnerReferences(apiObject), function(ownerRef) {
if (ownerRef.controller) {
hasController = true;
objectsByControllerUID[ownerRef.uid] = objectsByControllerUID[ownerRef.uid] || [];
objectsByControllerUID[ownerRef.uid].push(apiObject);
}
});

if (!hasController) {
objectsByControllerUID[''] = objectsByControllerUID[''] || [];
objectsByControllerUID[''].push(apiObject);
}
});

return objectsByControllerUID;
},

filterForController: function(apiObjects, controller) {
var controllerUID = _.get(controller, 'metadata.uid');
return _.filter(apiObjects, function(apiObject) {
return _.some(getOwnerReferences(apiObject), {
uid: controllerUID,
controller: true
});
});
}
};
});
12 changes: 6 additions & 6 deletions app/views/deployments.html
Expand Up @@ -28,7 +28,7 @@ <h1>
<alerts alerts="alerts"></alerts>
<div class="row">
<div class="col-md-12">
<h3 ng-if="(deployments | hashSize) || (replicaSets | hashSize)">Deployment Configurations</h3>
<h3 ng-if="(deployments | size) || (replicaSets | size)">Deployment Configurations</h3>
<table class="table table-bordered table-hover table-mobile table-layout-fixed">
<colgroup>
<col class="col-sm-3">
Expand Down Expand Up @@ -113,7 +113,7 @@ <h3 ng-if="(deployments | hashSize) || (replicaSets | hashSize)">Deployment Conf
<tr ng-repeat-end style="display: none;"></tr>
</tbody>
</table>
<div ng-if="deployments | hashSize">
<div ng-if="deployments | size">
<h3>Deployments</h3>
<table class="table table-bordered table-hover table-mobile table-layout-fixed">
<colgroup>
Expand All @@ -138,15 +138,15 @@ <h3>Deployments</h3>
<a ng-href="{{deployment | navigateResourceURL}}">{{deployment.metadata.name}}</a>
</td>
<td data-title="Last Version">
<span ng-if="latestReplicaSetByDeployment[deployment.metadata.name]">
<a ng-href="{{latestReplicaSetByDeployment[deployment.metadata.name] | navigateResourceURL}}">{{deployment | lastDeploymentRevision}}</a>
<span ng-if="latestReplicaSetByDeploymentUID[deployment.metadata.uid]">
<a ng-href="{{latestReplicaSetByDeploymentUID[deployment.metadata.uid] | navigateResourceURL}}">{{deployment | lastDeploymentRevision}}</a>
</span>
<span ng-if="!latestReplicaSetByDeployment[deployment.metadata.name]">
<span ng-if="!latestReplicaSetByDeploymentUID[deployment.metadata.uid]">
{{deployment | lastDeploymentRevision}}
</span>
</td>
<td data-title="Replicas">
<span ng-if="deployment.status.replicas !== deployment.spec.replicas">{{deployment.status.replicas}}/</span>{{deployment.spec.replicas}} replica<span ng-if="deployment.spec.replicas != 1">s</span>
<span ng-if="!(deployment.status.replicas | isNil) && deployment.status.replicas !== deployment.spec.replicas">{{deployment.status.replicas}}/</span>{{deployment.spec.replicas}} replica<span ng-if="deployment.spec.replicas != 1">s</span>
</td>
<td data-title="Created">
<span am-time-ago="deployment.metadata.creationTimestamp"></span>
Expand Down
16 changes: 8 additions & 8 deletions app/views/new-overview.html
Expand Up @@ -143,8 +143,8 @@ <h2 ng-if="!app">
<overview-list-row
ng-repeat="deployment in overview.filteredDeploymentsByApp[app] track by (deployment | uid)"
api-object="deployment"
current="overview.currentByDeployment[deployment.metadata.name]"
previous="overview.replicaSetsByDeployment[deployment.metadata.name][1]"
current="overview.currentByDeploymentUID[deployment.metadata.uid]"
previous="overview.replicaSetsByDeploymentUID[deployment.metadata.uid][1]"
state="overview.state">
</overview-list-row>
<overview-list-row
Expand Down Expand Up @@ -173,10 +173,10 @@ <h2 ng-if="!app">
<div ng-if="overview.viewBy === 'resource'">
<div ng-if="overview.filteredDeploymentConfigs | hashSize">
<h2>
<span ng-if="overview.deployments | hashSize">
<span ng-if="overview.deploymentsByUID | hashSize">
Deployment Configs
</span>
<span ng-if="!(overview.deployments | hashSize)">
<span ng-if="!(overview.deploymentsByUID | hashSize)">
Deployments
</span>
</h2>
Expand All @@ -197,8 +197,8 @@ <h2>Deployments</h2>
<overview-list-row
ng-repeat="deployment in overview.filteredDeployments track by (deployment | uid)"
api-object="deployment"
current="overview.currentByDeployment[deployment.metadata.name]"
previous="overview.replicaSetsByDeployment[deployment.metadata.name][1]"
current="overview.currentByDeploymentUID[deployment.metadata.uid]"
previous="overview.replicaSetsByDeploymentUID[deployment.metadata.uid][1]"
state="overview.state">
</overview-list-row>
</div>
Expand Down Expand Up @@ -324,10 +324,10 @@ <h2>Other Resources</h2>
state="overview.state">
</overview-list-row>
<overview-list-row
ng-repeat="deployment in overview.deployments track by (deployment | uid)"
ng-repeat="deployment in overview.deploymentsByUID track by (deployment | uid)"
api-object="deployment"
current="overview.currentByDeployment[deployment.metadata.name]"
previous="overview.replicaSetsByDeployment[deployment.metadata.name][1]"
previous="overview.replicaSetsByDeploymentUID[deployment.metadata.uid][1]"
state="overview.state">
</overview-list-row>
<overview-list-row
Expand Down

0 comments on commit f4abfc2

Please sign in to comment.