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")
});
};
// 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
var getProjectRules = function(projectName, forceRefresh) {
var deferred = $q.defer();
......@@ -908,11 +912,18 @@ angular.module("openshiftCommonServices")
if (!projectRules || projectRules.forceRefresh || forceRefresh) {
// Check if APIserver contains 'selfsubjectrulesreviews' resource. If not switch to permissive mode.
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");
var object = {kind: "SelfSubjectRulesReview",
apiVersion: "v1"
};
DataService.create(rulesResource, null, object, {namespace: projectName}).then(
inFlightRulesRequests[projectName] = deferred.promise;
var resourceGroupVersion = {
kind: "SelfSubjectRulesReview",
apiVersion: "v1"
};
DataService.create(rulesResource, null, resourceGroupVersion, {namespace: projectName}).then(
function(data) {
var normalizedData = normalizeRules(data.status.rules);
var canUserAddToProject = canAddToProjectCheck(data.status.rules);
......@@ -925,6 +936,8 @@ angular.module("openshiftCommonServices")
}, function() {
permissiveMode = true;
deferred.resolve();
}).finally(function() {
delete inFlightRulesRequests[projectName];
});
} else {
Logger.log("AuthorizationService, resource 'selfsubjectrulesreviews' is not part of APIserver. Switching into permissive mode.");
......
......@@ -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
var getProjectRules = function(projectName, forceRefresh) {
var deferred = $q.defer();
......@@ -2777,11 +2781,18 @@ angular.module("openshiftCommonServices")
if (!projectRules || projectRules.forceRefresh || forceRefresh) {
// Check if APIserver contains 'selfsubjectrulesreviews' resource. If not switch to permissive mode.
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");
var object = {kind: "SelfSubjectRulesReview",
apiVersion: "v1"
};
DataService.create(rulesResource, null, object, {namespace: projectName}).then(
inFlightRulesRequests[projectName] = deferred.promise;
var resourceGroupVersion = {
kind: "SelfSubjectRulesReview",
apiVersion: "v1"
};
DataService.create(rulesResource, null, resourceGroupVersion, {namespace: projectName}).then(
function(data) {
var normalizedData = normalizeRules(data.status.rules);
var canUserAddToProject = canAddToProjectCheck(data.status.rules);
......@@ -2794,6 +2805,8 @@ angular.module("openshiftCommonServices")
}, function() {
permissiveMode = true;
deferred.resolve();
}).finally(function() {
delete inFlightRulesRequests[projectName];
});
} else {
Logger.log("AuthorizationService, resource 'selfsubjectrulesreviews' is not part of APIserver. Switching into permissive mode.");
......
......@@ -1080,17 +1080,18 @@ return _.some(rule.resources, function(resource) {
return checkResource(resource) && !_.isEmpty(_.intersection(rule.verbs, [ "*", "create", "update" ]));
});
});
}, getProjectRules = function(projectName, forceRefresh) {
}, inFlightRulesRequests = {}, getProjectRules = function(projectName, forceRefresh) {
var deferred = $q.defer();
currentProject = projectName;
var projectRules = cachedRulesByProject.get(projectName), rulesResource = "selfsubjectrulesreviews";
if (!projectRules || projectRules.forceRefresh || forceRefresh) if (APIService.apiInfo(rulesResource)) {
Logger.log("AuthorizationService, loading user rules for " + projectName + " project");
var object = {
if (inFlightRulesRequests[projectName]) return inFlightRulesRequests[projectName];
Logger.log("AuthorizationService, loading user rules for " + projectName + " project"), inFlightRulesRequests[projectName] = deferred.promise;
var resourceGroupVersion = {
kind:"SelfSubjectRulesReview",
apiVersion:"v1"
};
DataService.create(rulesResource, null, object, {
DataService.create(rulesResource, null, resourceGroupVersion, {
namespace:projectName
}).then(function(data) {
var normalizedData = normalizeRules(data.status.rules), canUserAddToProject = canAddToProjectCheck(data.status.rules);
......@@ -1102,6 +1103,8 @@ cacheTimestamp:_.now()
}), deferred.resolve();
}, function() {
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();
return deferred.promise;
......
......@@ -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
var getProjectRules = function(projectName, forceRefresh) {
var deferred = $q.defer();
......@@ -61,11 +65,18 @@ angular.module("openshiftCommonServices")
if (!projectRules || projectRules.forceRefresh || forceRefresh) {
// Check if APIserver contains 'selfsubjectrulesreviews' resource. If not switch to permissive mode.
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");
var object = {kind: "SelfSubjectRulesReview",
apiVersion: "v1"
};
DataService.create(rulesResource, null, object, {namespace: projectName}).then(
inFlightRulesRequests[projectName] = deferred.promise;
var resourceGroupVersion = {
kind: "SelfSubjectRulesReview",
apiVersion: "v1"
};
DataService.create(rulesResource, null, resourceGroupVersion, {namespace: projectName}).then(
function(data) {
var normalizedData = normalizeRules(data.status.rules);
var canUserAddToProject = canAddToProjectCheck(data.status.rules);
......@@ -78,6 +89,8 @@ angular.module("openshiftCommonServices")
}, function() {
permissiveMode = true;
deferred.resolve();
}).finally(function() {
delete inFlightRulesRequests[projectName];
});
} else {
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