Skip to content

Commit b6e60df

Browse files
committed
Avoid multiple selfsubjectrulesreviews requests
If a selfsubjectrulesreviews for a project is already in flight, don't request the rules a second time.
1 parent a120f82 commit b6e60df

File tree

4 files changed

+57
-15
lines changed

4 files changed

+57
-15
lines changed

dist/origin-web-common-services.js

+17-4
Original file line numberDiff line numberDiff line change
@@ -899,6 +899,10 @@ angular.module("openshiftCommonServices")
899899
});
900900
};
901901

902+
// Avoid loading rules twice in another request is already in flight.
903+
// Key is the project name, value is the promise.
904+
var inFlightRulesRequests = {};
905+
902906
// forceRefresh is a boolean to bust the cache & request new perms
903907
var getProjectRules = function(projectName, forceRefresh) {
904908
var deferred = $q.defer();
@@ -908,11 +912,18 @@ angular.module("openshiftCommonServices")
908912
if (!projectRules || projectRules.forceRefresh || forceRefresh) {
909913
// Check if APIserver contains 'selfsubjectrulesreviews' resource. If not switch to permissive mode.
910914
if (APIService.apiInfo(rulesResource)) {
915+
// If a request is already in flight, return the promise for that request.
916+
if (inFlightRulesRequests[projectName]) {
917+
return inFlightRulesRequests[projectName];
918+
}
919+
911920
Logger.log("AuthorizationService, loading user rules for " + projectName + " project");
912-
var object = {kind: "SelfSubjectRulesReview",
913-
apiVersion: "v1"
914-
};
915-
DataService.create(rulesResource, null, object, {namespace: projectName}).then(
921+
var resourceGroupVersion = {
922+
kind: "SelfSubjectRulesReview",
923+
apiVersion: "v1"
924+
};
925+
inFlightRulesRequests[projectName] = deferred.promise;
926+
DataService.create(rulesResource, null, resourceGroupVersion, {namespace: projectName}).then(
916927
function(data) {
917928
var normalizedData = normalizeRules(data.status.rules);
918929
var canUserAddToProject = canAddToProjectCheck(data.status.rules);
@@ -925,6 +936,8 @@ angular.module("openshiftCommonServices")
925936
}, function() {
926937
permissiveMode = true;
927938
deferred.resolve();
939+
}).finally(function() {
940+
delete inFlightRulesRequests[projectName];
928941
});
929942
} else {
930943
Logger.log("AuthorizationService, resource 'selfsubjectrulesreviews' is not part of APIserver. Switching into permissive mode.");

dist/origin-web-common.js

+17-4
Original file line numberDiff line numberDiff line change
@@ -2768,6 +2768,10 @@ angular.module("openshiftCommonServices")
27682768
});
27692769
};
27702770

2771+
// Avoid loading rules twice in another request is already in flight.
2772+
// Key is the project name, value is the promise.
2773+
var inFlightRulesRequests = {};
2774+
27712775
// forceRefresh is a boolean to bust the cache & request new perms
27722776
var getProjectRules = function(projectName, forceRefresh) {
27732777
var deferred = $q.defer();
@@ -2777,11 +2781,18 @@ angular.module("openshiftCommonServices")
27772781
if (!projectRules || projectRules.forceRefresh || forceRefresh) {
27782782
// Check if APIserver contains 'selfsubjectrulesreviews' resource. If not switch to permissive mode.
27792783
if (APIService.apiInfo(rulesResource)) {
2784+
// If a request is already in flight, return the promise for that request.
2785+
if (inFlightRulesRequests[projectName]) {
2786+
return inFlightRulesRequests[projectName];
2787+
}
2788+
27802789
Logger.log("AuthorizationService, loading user rules for " + projectName + " project");
2781-
var object = {kind: "SelfSubjectRulesReview",
2782-
apiVersion: "v1"
2783-
};
2784-
DataService.create(rulesResource, null, object, {namespace: projectName}).then(
2790+
var resourceGroupVersion = {
2791+
kind: "SelfSubjectRulesReview",
2792+
apiVersion: "v1"
2793+
};
2794+
inFlightRulesRequests[projectName] = deferred.promise;
2795+
DataService.create(rulesResource, null, resourceGroupVersion, {namespace: projectName}).then(
27852796
function(data) {
27862797
var normalizedData = normalizeRules(data.status.rules);
27872798
var canUserAddToProject = canAddToProjectCheck(data.status.rules);
@@ -2794,6 +2805,8 @@ angular.module("openshiftCommonServices")
27942805
}, function() {
27952806
permissiveMode = true;
27962807
deferred.resolve();
2808+
}).finally(function() {
2809+
delete inFlightRulesRequests[projectName];
27972810
});
27982811
} else {
27992812
Logger.log("AuthorizationService, resource 'selfsubjectrulesreviews' is not part of APIserver. Switching into permissive mode.");

dist/origin-web-common.min.js

+6-3
Original file line numberDiff line numberDiff line change
@@ -1080,17 +1080,18 @@ return _.some(rule.resources, function(resource) {
10801080
return checkResource(resource) && !_.isEmpty(_.intersection(rule.verbs, [ "*", "create", "update" ]));
10811081
});
10821082
});
1083-
}, getProjectRules = function(projectName, forceRefresh) {
1083+
}, inFlightRulesRequests = {}, getProjectRules = function(projectName, forceRefresh) {
10841084
var deferred = $q.defer();
10851085
currentProject = projectName;
10861086
var projectRules = cachedRulesByProject.get(projectName), rulesResource = "selfsubjectrulesreviews";
10871087
if (!projectRules || projectRules.forceRefresh || forceRefresh) if (APIService.apiInfo(rulesResource)) {
1088+
if (inFlightRulesRequests[projectName]) return inFlightRulesRequests[projectName];
10881089
Logger.log("AuthorizationService, loading user rules for " + projectName + " project");
1089-
var object = {
1090+
var resourceGroupVersion = {
10901091
kind:"SelfSubjectRulesReview",
10911092
apiVersion:"v1"
10921093
};
1093-
DataService.create(rulesResource, null, object, {
1094+
inFlightRulesRequests[projectName] = deferred.promise, DataService.create(rulesResource, null, resourceGroupVersion, {
10941095
namespace:projectName
10951096
}).then(function(data) {
10961097
var normalizedData = normalizeRules(data.status.rules), canUserAddToProject = canAddToProjectCheck(data.status.rules);
@@ -1102,6 +1103,8 @@ cacheTimestamp:_.now()
11021103
}), deferred.resolve();
11031104
}, function() {
11041105
permissiveMode = !0, deferred.resolve();
1106+
})["finally"](function() {
1107+
delete inFlightRulesRequests[projectName];
11051108
});
11061109
} 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();
11071110
return deferred.promise;

src/services/authorizationService.js

+17-4
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ angular.module("openshiftCommonServices")
5252
});
5353
};
5454

55+
// Avoid loading rules twice in another request is already in flight.
56+
// Key is the project name, value is the promise.
57+
var inFlightRulesRequests = {};
58+
5559
// forceRefresh is a boolean to bust the cache & request new perms
5660
var getProjectRules = function(projectName, forceRefresh) {
5761
var deferred = $q.defer();
@@ -61,11 +65,18 @@ angular.module("openshiftCommonServices")
6165
if (!projectRules || projectRules.forceRefresh || forceRefresh) {
6266
// Check if APIserver contains 'selfsubjectrulesreviews' resource. If not switch to permissive mode.
6367
if (APIService.apiInfo(rulesResource)) {
68+
// If a request is already in flight, return the promise for that request.
69+
if (inFlightRulesRequests[projectName]) {
70+
return inFlightRulesRequests[projectName];
71+
}
72+
6473
Logger.log("AuthorizationService, loading user rules for " + projectName + " project");
65-
var object = {kind: "SelfSubjectRulesReview",
66-
apiVersion: "v1"
67-
};
68-
DataService.create(rulesResource, null, object, {namespace: projectName}).then(
74+
var resourceGroupVersion = {
75+
kind: "SelfSubjectRulesReview",
76+
apiVersion: "v1"
77+
};
78+
inFlightRulesRequests[projectName] = deferred.promise;
79+
DataService.create(rulesResource, null, resourceGroupVersion, {namespace: projectName}).then(
6980
function(data) {
7081
var normalizedData = normalizeRules(data.status.rules);
7182
var canUserAddToProject = canAddToProjectCheck(data.status.rules);
@@ -78,6 +89,8 @@ angular.module("openshiftCommonServices")
7889
}, function() {
7990
permissiveMode = true;
8091
deferred.resolve();
92+
}).finally(function() {
93+
delete inFlightRulesRequests[projectName];
8194
});
8295
} else {
8396
Logger.log("AuthorizationService, resource 'selfsubjectrulesreviews' is not part of APIserver. Switching into permissive mode.");

0 commit comments

Comments
 (0)