diff --git a/assets/app/scripts/controllers/overview.js b/assets/app/scripts/controllers/overview.js index e334fc86b739..1228b9264c0a 100644 --- a/assets/app/scripts/controllers/overview.js +++ b/assets/app/scripts/controllers/overview.js @@ -150,7 +150,7 @@ angular.module('openshiftConsole') var foundMatch = false; // TODO this is using the k8s v1beta1 ReplicationControllerState schema, replicaSelector will change to selector eventually var depConfigSelector = new LabelSelector(deploymentConfig.template.controllerTemplate.replicaSelector); - angular.forEach($scope.services, function(service, name){ + angular.forEach($scope.unfilteredServices, function(service, name){ $scope.deploymentConfigsByService[name] = $scope.deploymentConfigsByService[name] || {}; var serviceSelector = new LabelSelector(service.spec.selector); @@ -177,7 +177,7 @@ angular.module('openshiftConsole') depConfigName = deployment.metadata.annotations.deploymentConfig || ""; } - angular.forEach($scope.services, function(service, name){ + angular.forEach($scope.unfilteredServices, function(service, name){ bySvc[name] = bySvc[name] || {}; bySvcByDepCfg[name] = bySvcByDepCfg[name] || {}; diff --git a/assets/app/scripts/misc/labelSelector.js b/assets/app/scripts/misc/labelSelector.js index 3f6a34e8d65b..c6fa8f743af4 100644 --- a/assets/app/scripts/misc/labelSelector.js +++ b/assets/app/scripts/misc/labelSelector.js @@ -1,5 +1,11 @@ -function LabelSelector(selector) { +// selector (optional) - the JSON format as returned by k8s API +// emptySelectsAll (optional) - whether a label selector with no conjuncts +// selects objects. Typical behavior is false. Example of an +// exceptional case is when filtering by labels, no label selectors +// means no filters. +function LabelSelector(selector, emptySelectsAll) { this._conjuncts = {}; + this._emptySelectsAll = !!emptySelectsAll; // expects the JSON format as returned by k8s API // TODO - currently k8s only returns key: value // which represents 'key in (value)' @@ -61,6 +67,9 @@ LabelSelector.prototype.matches = function(resource) { if (!resource) { return false; } + if (this.isEmpty()) { + return this._emptySelectsAll; + } var labels = resource.labels || {}; if (resource.metadata) { labels = resource.metadata.labels || {}; @@ -107,6 +116,12 @@ LabelSelector.prototype.hasConjunct = function(conjunct) { // Test whether this label selector covers the given selector LabelSelector.prototype.covers = function(selector) { + if (this.isEmpty()) { + // TODO don't think we ever want to consider an empty + // label selector as covering any other label selector + return false; + } + // TODO - currently k8s only returns key: value // which represents 'key in (value)' So we only handle // the IN operator with single values for now diff --git a/assets/app/scripts/services/labelFilter.js b/assets/app/scripts/services/labelFilter.js index 88d1c554e545..d5cb74e50f0a 100644 --- a/assets/app/scripts/services/labelFilter.js +++ b/assets/app/scripts/services/labelFilter.js @@ -4,7 +4,7 @@ angular.module('openshiftConsole') .factory('LabelFilter', [function() { function LabelFilter() { this._existingLabels = {}; - this._labelSelector = new LabelSelector(); + this._labelSelector = new LabelSelector(null, true); this._onActiveFiltersChangedCallbacks = $.Callbacks(); } diff --git a/pkg/assets/bindata.go b/pkg/assets/bindata.go index 5d4ca6bb7082..91b7d18792b5 100644 --- a/pkg/assets/bindata.go +++ b/pkg/assets/bindata.go @@ -12477,8 +12477,8 @@ func scripts_oldieshim_js() ([]byte, error) { var _scripts_scripts_js = []byte(`"use strict"; -function LabelSelector(a) { -this._conjuncts = {}, a && angular.forEach(a, function(a, b) { +function LabelSelector(a, b) { +this._conjuncts = {}, this._emptySelectsAll = !!b, a && angular.forEach(a, function(a, b) { this.addConjunct(b, "in", [ a ]); }, this); } @@ -12573,6 +12573,7 @@ c.matches(a) && (b[d] = a); }), b; }, LabelSelector.prototype.matches = function(a) { if (!a) return !1; +if (this.isEmpty()) return this._emptySelectsAll; var b = a.labels || {}; a.metadata && (b = a.metadata.labels || {}); for (var c in this._conjuncts) { @@ -12598,6 +12599,7 @@ return !0; }, LabelSelector.prototype.hasConjunct = function(a) { return this._conjuncts[this._getIdForConjunct(a)] ? !0 :!1; }, LabelSelector.prototype.covers = function(a) { +if (this.isEmpty()) return !1; for (var b in this._conjuncts) if (!a.hasConjunct(this._conjuncts[b])) return !1; return !0; }, LabelSelector.prototype._getStringForConjunct = function(a) { @@ -13167,7 +13169,7 @@ return f["delete"]("oAuthAccessTokens", e, {}, g); } ]; }), angular.module("openshiftConsole").factory("LabelFilter", [ function() { function a() { -this._existingLabels = {}, this._labelSelector = new LabelSelector(), this._onActiveFiltersChangedCallbacks = $.Callbacks(); +this._existingLabels = {}, this._labelSelector = new LabelSelector(null, !0), this._onActiveFiltersChangedCallbacks = $.Callbacks(); } return a.prototype.addLabelSuggestionsFromResources = function(a, b) { if (a.metadata && a.metadata.name) this._extractLabelsFromItem(a, b); else { @@ -13389,7 +13391,7 @@ a.deploymentConfigsByService = { "":{} }, angular.forEach(a.deploymentConfigs, function(b, c) { var d = !1, e = new LabelSelector(b.template.controllerTemplate.replicaSelector); -angular.forEach(a.services, function(f, g) { +angular.forEach(a.unfilteredServices, function(f, g) { a.deploymentConfigsByService[g] = a.deploymentConfigsByService[g] || {}; var h = new LabelSelector(f.spec.selector); h.covers(e) && (a.deploymentConfigsByService[g][c] = b, d = !0); @@ -13403,7 +13405,7 @@ var b = a.deploymentsByService = { }; angular.forEach(a.deployments, function(d, e) { var f = !1, g = new LabelSelector(d.spec.selector), h = ""; -d.metadata.annotations && (h = d.metadata.annotations.deploymentConfig || ""), angular.forEach(a.services, function(a, i) { +d.metadata.annotations && (h = d.metadata.annotations.deploymentConfig || ""), angular.forEach(a.unfilteredServices, function(a, i) { b[i] = b[i] || {}, c[i] = c[i] || {}; var j = new LabelSelector(a.spec.selector); j.covers(g) && (b[i][e] = d, c[i][h] = c[i][h] || {}, c[i][h][e] = d, f = !0);