Commit bda988ee by Samuel Padgett

Avoid multiple selfsubjectrulesreviews requests

If a selfsubjectrulesreviews for a project is already in flight, don't
request the rules a second time.
parent a120f820
...@@ -899,6 +899,10 @@ angular.module("openshiftCommonServices") ...@@ -899,6 +899,10 @@ angular.module("openshiftCommonServices")
}); });
}; };
// Avoid loading rules twice if another request is already in flight. Key
// is the project name, value is the promise.
var inFlightRulesRequests = {};
// forceRefresh is a boolean to bust the cache & request new perms // forceRefresh is a boolean to bust the cache & request new perms
var getProjectRules = function(projectName, forceRefresh) { var getProjectRules = function(projectName, forceRefresh) {
var deferred = $q.defer(); var deferred = $q.defer();
...@@ -908,11 +912,18 @@ angular.module("openshiftCommonServices") ...@@ -908,11 +912,18 @@ angular.module("openshiftCommonServices")
if (!projectRules || projectRules.forceRefresh || forceRefresh) { if (!projectRules || projectRules.forceRefresh || forceRefresh) {
// Check if APIserver contains 'selfsubjectrulesreviews' resource. If not switch to permissive mode. // Check if APIserver contains 'selfsubjectrulesreviews' resource. If not switch to permissive mode.
if (APIService.apiInfo(rulesResource)) { if (APIService.apiInfo(rulesResource)) {
// If a request is already in flight, return the promise for that request.
if (inFlightRulesRequests[projectName]) {
return inFlightRulesRequests[projectName];
}
Logger.log("AuthorizationService, loading user rules for " + projectName + " project"); Logger.log("AuthorizationService, loading user rules for " + projectName + " project");
var object = {kind: "SelfSubjectRulesReview", inFlightRulesRequests[projectName] = deferred.promise;
apiVersion: "v1" var resourceGroupVersion = {
}; kind: "SelfSubjectRulesReview",
DataService.create(rulesResource, null, object, {namespace: projectName}).then( apiVersion: "v1"
};
DataService.create(rulesResource, null, resourceGroupVersion, {namespace: projectName}).then(
function(data) { function(data) {
var normalizedData = normalizeRules(data.status.rules); var normalizedData = normalizeRules(data.status.rules);
var canUserAddToProject = canAddToProjectCheck(data.status.rules); var canUserAddToProject = canAddToProjectCheck(data.status.rules);
...@@ -925,6 +936,8 @@ angular.module("openshiftCommonServices") ...@@ -925,6 +936,8 @@ angular.module("openshiftCommonServices")
}, function() { }, function() {
permissiveMode = true; permissiveMode = true;
deferred.resolve(); deferred.resolve();
}).finally(function() {
delete inFlightRulesRequests[projectName];
}); });
} else { } else {
Logger.log("AuthorizationService, resource 'selfsubjectrulesreviews' is not part of APIserver. Switching into permissive mode."); Logger.log("AuthorizationService, resource 'selfsubjectrulesreviews' is not part of APIserver. Switching into permissive mode.");
......
...@@ -2768,6 +2768,10 @@ angular.module("openshiftCommonServices") ...@@ -2768,6 +2768,10 @@ angular.module("openshiftCommonServices")
}); });
}; };
// Avoid loading rules twice if another request is already in flight. Key
// is the project name, value is the promise.
var inFlightRulesRequests = {};
// forceRefresh is a boolean to bust the cache & request new perms // forceRefresh is a boolean to bust the cache & request new perms
var getProjectRules = function(projectName, forceRefresh) { var getProjectRules = function(projectName, forceRefresh) {
var deferred = $q.defer(); var deferred = $q.defer();
...@@ -2777,11 +2781,18 @@ angular.module("openshiftCommonServices") ...@@ -2777,11 +2781,18 @@ angular.module("openshiftCommonServices")
if (!projectRules || projectRules.forceRefresh || forceRefresh) { if (!projectRules || projectRules.forceRefresh || forceRefresh) {
// Check if APIserver contains 'selfsubjectrulesreviews' resource. If not switch to permissive mode. // Check if APIserver contains 'selfsubjectrulesreviews' resource. If not switch to permissive mode.
if (APIService.apiInfo(rulesResource)) { if (APIService.apiInfo(rulesResource)) {
// If a request is already in flight, return the promise for that request.
if (inFlightRulesRequests[projectName]) {
return inFlightRulesRequests[projectName];
}
Logger.log("AuthorizationService, loading user rules for " + projectName + " project"); Logger.log("AuthorizationService, loading user rules for " + projectName + " project");
var object = {kind: "SelfSubjectRulesReview", inFlightRulesRequests[projectName] = deferred.promise;
apiVersion: "v1" var resourceGroupVersion = {
}; kind: "SelfSubjectRulesReview",
DataService.create(rulesResource, null, object, {namespace: projectName}).then( apiVersion: "v1"
};
DataService.create(rulesResource, null, resourceGroupVersion, {namespace: projectName}).then(
function(data) { function(data) {
var normalizedData = normalizeRules(data.status.rules); var normalizedData = normalizeRules(data.status.rules);
var canUserAddToProject = canAddToProjectCheck(data.status.rules); var canUserAddToProject = canAddToProjectCheck(data.status.rules);
...@@ -2794,6 +2805,8 @@ angular.module("openshiftCommonServices") ...@@ -2794,6 +2805,8 @@ angular.module("openshiftCommonServices")
}, function() { }, function() {
permissiveMode = true; permissiveMode = true;
deferred.resolve(); deferred.resolve();
}).finally(function() {
delete inFlightRulesRequests[projectName];
}); });
} else { } else {
Logger.log("AuthorizationService, resource 'selfsubjectrulesreviews' is not part of APIserver. Switching into permissive mode."); Logger.log("AuthorizationService, resource 'selfsubjectrulesreviews' is not part of APIserver. Switching into permissive mode.");
......
...@@ -1080,17 +1080,18 @@ return _.some(rule.resources, function(resource) { ...@@ -1080,17 +1080,18 @@ return _.some(rule.resources, function(resource) {
return checkResource(resource) && !_.isEmpty(_.intersection(rule.verbs, [ "*", "create", "update" ])); return checkResource(resource) && !_.isEmpty(_.intersection(rule.verbs, [ "*", "create", "update" ]));
}); });
}); });
}, getProjectRules = function(projectName, forceRefresh) { }, inFlightRulesRequests = {}, getProjectRules = function(projectName, forceRefresh) {
var deferred = $q.defer(); var deferred = $q.defer();
currentProject = projectName; currentProject = projectName;
var projectRules = cachedRulesByProject.get(projectName), rulesResource = "selfsubjectrulesreviews"; var projectRules = cachedRulesByProject.get(projectName), rulesResource = "selfsubjectrulesreviews";
if (!projectRules || projectRules.forceRefresh || forceRefresh) if (APIService.apiInfo(rulesResource)) { if (!projectRules || projectRules.forceRefresh || forceRefresh) if (APIService.apiInfo(rulesResource)) {
Logger.log("AuthorizationService, loading user rules for " + projectName + " project"); if (inFlightRulesRequests[projectName]) return inFlightRulesRequests[projectName];
var object = { Logger.log("AuthorizationService, loading user rules for " + projectName + " project"), inFlightRulesRequests[projectName] = deferred.promise;
var resourceGroupVersion = {
kind:"SelfSubjectRulesReview", kind:"SelfSubjectRulesReview",
apiVersion:"v1" apiVersion:"v1"
}; };
DataService.create(rulesResource, null, object, { DataService.create(rulesResource, null, resourceGroupVersion, {
namespace:projectName namespace:projectName
}).then(function(data) { }).then(function(data) {
var normalizedData = normalizeRules(data.status.rules), canUserAddToProject = canAddToProjectCheck(data.status.rules); var normalizedData = normalizeRules(data.status.rules), canUserAddToProject = canAddToProjectCheck(data.status.rules);
...@@ -1102,6 +1103,8 @@ cacheTimestamp:_.now() ...@@ -1102,6 +1103,8 @@ cacheTimestamp:_.now()
}), deferred.resolve(); }), deferred.resolve();
}, function() { }, function() {
permissiveMode = !0, deferred.resolve(); permissiveMode = !0, deferred.resolve();
})["finally"](function() {
delete inFlightRulesRequests[projectName];
}); });
} else Logger.log("AuthorizationService, resource 'selfsubjectrulesreviews' is not part of APIserver. Switching into permissive mode."), permissiveMode = !0, deferred.resolve(); else Logger.log("AuthorizationService, using cached rules for " + projectName + " project"), _.now() - projectRules.cacheTimestamp >= 6e5 && (projectRules.forceRefresh = !0), deferred.resolve(); } else Logger.log("AuthorizationService, resource 'selfsubjectrulesreviews' is not part of APIserver. Switching into permissive mode."), permissiveMode = !0, deferred.resolve(); else Logger.log("AuthorizationService, using cached rules for " + projectName + " project"), _.now() - projectRules.cacheTimestamp >= 6e5 && (projectRules.forceRefresh = !0), deferred.resolve();
return deferred.promise; return deferred.promise;
......
...@@ -52,6 +52,10 @@ angular.module("openshiftCommonServices") ...@@ -52,6 +52,10 @@ angular.module("openshiftCommonServices")
}); });
}; };
// Avoid loading rules twice if another request is already in flight. Key
// is the project name, value is the promise.
var inFlightRulesRequests = {};
// forceRefresh is a boolean to bust the cache & request new perms // forceRefresh is a boolean to bust the cache & request new perms
var getProjectRules = function(projectName, forceRefresh) { var getProjectRules = function(projectName, forceRefresh) {
var deferred = $q.defer(); var deferred = $q.defer();
...@@ -61,11 +65,18 @@ angular.module("openshiftCommonServices") ...@@ -61,11 +65,18 @@ angular.module("openshiftCommonServices")
if (!projectRules || projectRules.forceRefresh || forceRefresh) { if (!projectRules || projectRules.forceRefresh || forceRefresh) {
// Check if APIserver contains 'selfsubjectrulesreviews' resource. If not switch to permissive mode. // Check if APIserver contains 'selfsubjectrulesreviews' resource. If not switch to permissive mode.
if (APIService.apiInfo(rulesResource)) { if (APIService.apiInfo(rulesResource)) {
// If a request is already in flight, return the promise for that request.
if (inFlightRulesRequests[projectName]) {
return inFlightRulesRequests[projectName];
}
Logger.log("AuthorizationService, loading user rules for " + projectName + " project"); Logger.log("AuthorizationService, loading user rules for " + projectName + " project");
var object = {kind: "SelfSubjectRulesReview", inFlightRulesRequests[projectName] = deferred.promise;
apiVersion: "v1" var resourceGroupVersion = {
}; kind: "SelfSubjectRulesReview",
DataService.create(rulesResource, null, object, {namespace: projectName}).then( apiVersion: "v1"
};
DataService.create(rulesResource, null, resourceGroupVersion, {namespace: projectName}).then(
function(data) { function(data) {
var normalizedData = normalizeRules(data.status.rules); var normalizedData = normalizeRules(data.status.rules);
var canUserAddToProject = canAddToProjectCheck(data.status.rules); var canUserAddToProject = canAddToProjectCheck(data.status.rules);
...@@ -78,6 +89,8 @@ angular.module("openshiftCommonServices") ...@@ -78,6 +89,8 @@ angular.module("openshiftCommonServices")
}, function() { }, function() {
permissiveMode = true; permissiveMode = true;
deferred.resolve(); deferred.resolve();
}).finally(function() {
delete inFlightRulesRequests[projectName];
}); });
} else { } else {
Logger.log("AuthorizationService, resource 'selfsubjectrulesreviews' is not part of APIserver. Switching into permissive mode."); Logger.log("AuthorizationService, resource 'selfsubjectrulesreviews' is not part of APIserver. Switching into permissive mode.");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment