Skip to content

Commit 9d9772c

Browse files
committed
chore: Reduce Kubernetes namespace list request
Signed-off-by: Anatolii Bazko <[email protected]>
1 parent 00bf0fb commit 9d9772c

File tree

14 files changed

+84
-55
lines changed

14 files changed

+84
-55
lines changed

infrastructures/infrastructure-factory/src/main/java/org/eclipse/che/api/factory/server/scm/kubernetes/KubernetesPersonalAccessTokenManager.java

+25-12
Original file line numberDiff line numberDiff line change
@@ -150,19 +150,14 @@ public PersonalAccessToken fetchAndSave(Subject cheUser, String scmServerUrl)
150150
return personalAccessToken;
151151
}
152152

153-
@Override
154-
public Optional<PersonalAccessToken> get(Subject cheUser, String scmServerUrl)
155-
throws ScmConfigurationPersistenceException, ScmCommunicationException {
156-
return doGetPersonalAccessTokens(cheUser, null, scmServerUrl).stream().findFirst();
157-
}
158-
159153
@Override
160154
public PersonalAccessToken get(String scmServerUrl)
161155
throws ScmConfigurationPersistenceException, ScmUnauthorizedException,
162156
ScmCommunicationException, UnknownScmProviderException,
163157
UnsatisfiedScmPreconditionException {
164158
Subject subject = EnvironmentContext.getCurrent().getSubject();
165-
Optional<PersonalAccessToken> tokenOptional = get(subject, scmServerUrl);
159+
Optional<PersonalAccessToken> tokenOptional =
160+
doGetPersonalAccessTokens(subject, null, scmServerUrl, null).stream().findFirst();
166161
if (tokenOptional.isPresent()) {
167162
return tokenOptional.get();
168163
} else {
@@ -173,21 +168,38 @@ public PersonalAccessToken get(String scmServerUrl)
173168

174169
@Override
175170
public Optional<PersonalAccessToken> get(
176-
Subject cheUser, String oAuthProviderName, @Nullable String scmServerUrl)
171+
Subject cheUser,
172+
String oAuthProviderName,
173+
@Nullable String scmServerUrl,
174+
@Nullable String namespaceName)
177175
throws ScmConfigurationPersistenceException, ScmCommunicationException {
178-
return doGetPersonalAccessTokens(cheUser, oAuthProviderName, scmServerUrl).stream().findFirst();
176+
return doGetPersonalAccessTokens(cheUser, oAuthProviderName, scmServerUrl, namespaceName)
177+
.stream()
178+
.findFirst();
179179
}
180180

181181
private List<PersonalAccessToken> doGetPersonalAccessTokens(
182-
Subject cheUser, @Nullable String oAuthProviderName, @Nullable String scmServerUrl)
182+
Subject cheUser,
183+
@Nullable String oAuthProviderName,
184+
@Nullable String scmServerUrl,
185+
@Nullable String namespaceName)
183186
throws ScmConfigurationPersistenceException, ScmCommunicationException {
184187
List<PersonalAccessToken> result = new ArrayList<>();
185188
try {
186189
LOG.debug(
187190
"Fetching personal access token for user {} and OAuth provider {}",
188191
cheUser.getUserId(),
189192
oAuthProviderName);
190-
for (KubernetesNamespaceMeta namespaceMeta : namespaceFactory.list()) {
193+
194+
// Reduce number of request
195+
List<KubernetesNamespaceMeta> namespaceMetas = new ArrayList<>();
196+
if (namespaceName != null) {
197+
namespaceFactory.fetchNamespace(namespaceName).ifPresent(namespaceMetas::add);
198+
} else {
199+
namespaceMetas.addAll(namespaceFactory.list());
200+
}
201+
202+
for (KubernetesNamespaceMeta namespaceMeta : namespaceMetas) {
191203
List<Secret> secrets = doGetPersonalAccessTokenSecrets(namespaceMeta);
192204

193205
for (Secret secret : secrets) {
@@ -394,7 +406,8 @@ public void storeGitCredentials(String scmServerUrl)
394406
throws UnsatisfiedScmPreconditionException, ScmConfigurationPersistenceException,
395407
ScmCommunicationException, ScmUnauthorizedException {
396408
Subject subject = EnvironmentContext.getCurrent().getSubject();
397-
Optional<PersonalAccessToken> tokenOptional = get(subject, scmServerUrl);
409+
Optional<PersonalAccessToken> tokenOptional =
410+
doGetPersonalAccessTokens(subject, null, scmServerUrl, null).stream().findFirst();
398411
if (tokenOptional.isPresent()) {
399412
PersonalAccessToken personalAccessToken = tokenOptional.get();
400413
gitCredentialManager.createOrReplace(personalAccessToken);

infrastructures/infrastructure-factory/src/test/java/org/eclipse/che/api/factory/server/scm/kubernetes/KubernetesPersonalAccessTokenManagerTest.java

+9-10
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ public void shouldTrimBlankCharsInToken() throws Exception {
120120
// when
121121
PersonalAccessToken token =
122122
personalAccessTokenManager
123-
.get(new SubjectImpl("user", "user", "t1", false), "http://host1")
123+
.get(new SubjectImpl("user", "user", "t1", false), null, "http://host1", null)
124124
.get();
125125

126126
// then
@@ -231,7 +231,7 @@ public void testGetTokenFromNamespace() throws Exception {
231231
// when
232232
PersonalAccessToken token =
233233
personalAccessTokenManager
234-
.get(new SubjectImpl("user", "user1", "t1", false), "http://host1")
234+
.get(new SubjectImpl("user", "user1", "t1", false), null, "http://host1", null)
235235
.get();
236236

237237
// then
@@ -276,8 +276,7 @@ public void shouldGetTokenFromASecretWithSCMUsername() throws Exception {
276276
// when
277277
Optional<PersonalAccessToken> tokenOptional =
278278
personalAccessTokenManager.get(
279-
new SubjectImpl("user", "user1", "t1", false), "http://host1");
280-
279+
new SubjectImpl("user", "user1", "t1", false), null, "http://host1", null);
281280
// then
282281
assertTrue(tokenOptional.isPresent());
283282
assertEquals(tokenOptional.get().getCheUserId(), "user1");
@@ -319,7 +318,7 @@ public void shouldGetTokenFromASecretWithoutSCMUsername() throws Exception {
319318
// when
320319
Optional<PersonalAccessToken> tokenOptional =
321320
personalAccessTokenManager.get(
322-
new SubjectImpl("user", "user1", "t1", false), "http://host1");
321+
new SubjectImpl("user", "user1", "t1", false), null, "http://host1", null);
323322

324323
// then
325324
assertTrue(tokenOptional.isPresent());
@@ -378,11 +377,11 @@ public void testGetTokenFromNamespaceWithTrailingSlashMismatch() throws Exceptio
378377
// when
379378
PersonalAccessToken token1 =
380379
personalAccessTokenManager
381-
.get(new SubjectImpl("user", "user1", "t1", false), "http://host1.com")
380+
.get(new SubjectImpl("user", "user1", "t1", false), null, "http://host1.com", null)
382381
.get();
383382
PersonalAccessToken token2 =
384383
personalAccessTokenManager
385-
.get(new SubjectImpl("user", "user1", "t1", false), "http://host2.com/")
384+
.get(new SubjectImpl("user", "user1", "t1", false), null, "http://host2.com/", null)
386385
.get();
387386

388387
// then
@@ -419,7 +418,7 @@ public void shouldDeleteMisconfiguredTokensOnGet() throws Exception {
419418
// when
420419
Optional<PersonalAccessToken> token =
421420
personalAccessTokenManager.get(
422-
new SubjectImpl("user", "user1", "t1", false), "http://host1");
421+
new SubjectImpl("user", "user1", "t1", false), null, "http://host1", null);
423422
// then
424423
assertFalse(token.isPresent());
425424
verify(nonNamespaceOperation, times(1)).delete(eq(secret1));
@@ -457,7 +456,7 @@ public void shouldDeleteInvalidTokensOnGet() throws Exception {
457456
// when
458457
Optional<PersonalAccessToken> token =
459458
personalAccessTokenManager.get(
460-
new SubjectImpl("user", "user1", "t1", false), "http://host1");
459+
new SubjectImpl("user", "user1", "t1", false), null, "http://host1", null);
461460
// then
462461
assertFalse(token.isPresent());
463462
verify(nonNamespaceOperation, times(1)).delete(eq(secret1));
@@ -523,7 +522,7 @@ public void shouldReturnFirstValidTokenAndDeleteTheInvalidOne() throws Exception
523522
// when
524523
Optional<PersonalAccessToken> token =
525524
personalAccessTokenManager.get(
526-
new SubjectImpl("user", "user1", "t1", false), "http://host1");
525+
new SubjectImpl("user", "user1", "t1", false), null, "http://host1", null);
527526
// then
528527
assertTrue(token.isPresent());
529528
assertEquals(token.get().getScmTokenId(), "id2");

infrastructures/kubernetes/src/main/java/org/eclipse/che/workspace/infrastructure/kubernetes/namespace/configurator/OAuthTokenSecretsConfigurator.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,10 @@ public void configure(NamespaceResolutionContext namespaceResolutionContext, Str
7878
try {
7979
Subject cheSubject = EnvironmentContext.getCurrent().getSubject();
8080
personalAccessTokenManager.get(
81-
cheSubject, s.getMetadata().getAnnotations().get(ANNOTATION_SCM_URL));
81+
cheSubject,
82+
null,
83+
s.getMetadata().getAnnotations().get(ANNOTATION_SCM_URL),
84+
namespaceName);
8285
} catch (ScmConfigurationPersistenceException | ScmCommunicationException e) {
8386
LOG.error(e.getMessage(), e);
8487
}

wsmaster/che-core-api-auth/src/main/java/org/eclipse/che/security/oauth/EmbeddedOAuthAPI.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -245,9 +245,10 @@ public OAuthToken getOrRefreshToken(String oauthProvider)
245245
} else {
246246
Optional<PersonalAccessToken> tokenOptional;
247247
try {
248-
tokenOptional = personalAccessTokenManager.get(subject, oauthProvider, null);
248+
tokenOptional = personalAccessTokenManager.get(subject, oauthProvider, null, null);
249249
if (tokenOptional.isEmpty()) {
250-
tokenOptional = personalAccessTokenManager.get(subject, provider.getEndpointUrl());
250+
tokenOptional =
251+
personalAccessTokenManager.get(subject, null, provider.getEndpointUrl(), null);
251252
}
252253
if (tokenOptional.isPresent()) {
253254
return newDto(OAuthToken.class).withToken(tokenOptional.get().getToken());

wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerURLParser.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ private boolean isUserTokenPresent(String repositoryUrl) {
9494
.anyMatch(t -> Pattern.compile(format(t, schema, host)).matcher(repositoryUrl).matches())) {
9595
try {
9696
Optional<PersonalAccessToken> token =
97-
personalAccessTokenManager.get(EnvironmentContext.getCurrent().getSubject(), serverUrl);
97+
personalAccessTokenManager.get(
98+
EnvironmentContext.getCurrent().getSubject(), null, serverUrl, null);
9899
return token.isPresent() && token.get().getScmTokenName().equals(OAUTH_PROVIDER_NAME);
99100
} catch (ScmConfigurationPersistenceException | ScmCommunicationException exception) {
100101
return false;

wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerUserDataFetcher.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public BitbucketServerUserDataFetcher(
7373
}
7474

7575
@Override
76-
public GitUserData fetchGitUserData()
76+
public GitUserData fetchGitUserData(String namespaceName)
7777
throws ScmUnauthorizedException, ScmCommunicationException,
7878
ScmConfigurationPersistenceException, ScmItemNotFoundException {
7979
Subject cheSubject = EnvironmentContext.getCurrent().getSubject();
@@ -90,7 +90,7 @@ public GitUserData fetchGitUserData()
9090

9191
// Try go get user data using personal access token
9292
Optional<PersonalAccessToken> personalAccessToken =
93-
this.personalAccessTokenManager.get(cheSubject, OAUTH_PROVIDER_NAME, null);
93+
this.personalAccessTokenManager.get(cheSubject, OAUTH_PROVIDER_NAME, null, namespaceName);
9494
if (personalAccessToken.isPresent()) {
9595
PersonalAccessToken token = personalAccessToken.get();
9696
HttpBitbucketServerApiClient httpBitbucketServerApiClient =

wsmaster/che-core-api-factory-bitbucket/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketUserDataFetcher.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ public BitbucketUserDataFetcher(
6464
}
6565

6666
@Override
67-
public GitUserData fetchGitUserData() throws ScmUnauthorizedException, ScmCommunicationException {
67+
public GitUserData fetchGitUserData(String namespaceName)
68+
throws ScmUnauthorizedException, ScmCommunicationException {
6869
OAuthToken oAuthToken;
6970
try {
7071
oAuthToken = oAuthAPI.getOrRefreshToken(OAUTH_PROVIDER_NAME);

wsmaster/che-core-api-factory-github-common/src/main/java/org/eclipse/che/api/factory/server/github/AbstractGithubURLParser.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ private boolean isUserTokenPresent(String repositoryUrl) {
115115
String serverUrl = serverUrlOptional.get();
116116
try {
117117
Optional<PersonalAccessToken> token =
118-
tokenManager.get(EnvironmentContext.getCurrent().getSubject(), serverUrl);
118+
tokenManager.get(EnvironmentContext.getCurrent().getSubject(), null, serverUrl, null);
119119
if (token.isPresent()) {
120120
PersonalAccessToken accessToken = token.get();
121121
return accessToken.getScmTokenName().equals(providerName);
@@ -265,7 +265,7 @@ private GithubPullRequest getPullRequest(
265265
// prepare token
266266
Subject subject = EnvironmentContext.getCurrent().getSubject();
267267
PersonalAccessToken personalAccessToken = null;
268-
Optional<PersonalAccessToken> token = tokenManager.get(subject, githubEndpoint);
268+
Optional<PersonalAccessToken> token = tokenManager.get(subject, null, githubEndpoint, null);
269269
if (token.isPresent()) {
270270
personalAccessToken = token.get();
271271
} else if (authenticationRequired) {
@@ -322,7 +322,7 @@ private GithubCommit getLatestCommit(
322322
// prepare token
323323
Subject subject = EnvironmentContext.getCurrent().getSubject();
324324
PersonalAccessToken personalAccessToken = null;
325-
Optional<PersonalAccessToken> token = tokenManager.get(subject, githubEndpoint);
325+
Optional<PersonalAccessToken> token = tokenManager.get(subject, null, githubEndpoint, null);
326326
if (token.isPresent()) {
327327
personalAccessToken = token.get();
328328
} else if (authenticationRequired) {

wsmaster/che-core-api-factory-github/src/test/java/org/eclipse/che/api/factory/server/github/GithubURLParserTest.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ public void checkPullRequestFromForkedRepository() throws Exception {
239239

240240
PersonalAccessToken personalAccessToken = mock(PersonalAccessToken.class);
241241
when(personalAccessToken.getToken()).thenReturn("token");
242-
when(personalAccessTokenManager.get(any(Subject.class), anyString()))
242+
when(personalAccessTokenManager.get(any(Subject.class), anyString(), eq(null), eq(null)))
243243
.thenReturn(Optional.of(personalAccessToken));
244244

245245
when(githubApiClient.isConnected(eq("https://github.com"))).thenReturn(true);
@@ -288,7 +288,7 @@ public void checkPullRequestMergedState() throws Exception {
288288
GithubPullRequest githubPullRequest = mock(GithubPullRequest.class);
289289
when(githubPullRequest.getState()).thenReturn("merged");
290290
when(personalAccessToken.getToken()).thenReturn("token");
291-
when(personalAccessTokenManager.get(any(Subject.class), anyString()))
291+
when(personalAccessTokenManager.get(any(Subject.class), anyString(), eq(null), eq(null)))
292292
.thenReturn(Optional.of(personalAccessToken));
293293
when(githubApiClient.isConnected(eq("https://github.com"))).thenReturn(true);
294294
when(githubApiClient.getPullRequest(anyString(), anyString(), anyString(), anyString()))
@@ -331,7 +331,7 @@ public void shouldParseServerUrWithPullRequestId() throws Exception {
331331

332332
// then
333333
verify(personalAccessTokenManager, times(2))
334-
.get(any(Subject.class), eq("https://github-server.com"));
334+
.get(any(Subject.class), eq("https://github-server.com"), eq(null), eq(null));
335335
}
336336

337337
@Test

wsmaster/che-core-api-factory-gitlab-common/src/main/java/org/eclipse/che/api/factory/server/gitlab/AbstractGitlabUrlParser.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ private boolean isUserTokenPresent(String repositoryUrl) {
8181
String serverUrl = serverUrlOptional.get();
8282
try {
8383
Optional<PersonalAccessToken> token =
84-
personalAccessTokenManager.get(EnvironmentContext.getCurrent().getSubject(), serverUrl);
84+
personalAccessTokenManager.get(
85+
EnvironmentContext.getCurrent().getSubject(), null, serverUrl, null);
8586
if (token.isPresent()) {
8687
PersonalAccessToken accessToken = token.get();
8788
return accessToken.getScmTokenName().equals(providerName);

wsmaster/che-core-api-factory-gitlab/src/test/java/org/eclipse/che/api/factory/server/gitlab/GitlabUserDataFetcherTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public void shouldFetchGitUserData() throws Exception {
8282
PersonalAccessToken token = mock(PersonalAccessToken.class);
8383
when(token.getToken()).thenReturn("oauthtoken");
8484
when(token.getScmProviderUrl()).thenReturn(wireMockServer.url("/"));
85-
when(personalAccessTokenManager.get(any(Subject.class), eq("gitlab"), eq(null)))
85+
when(personalAccessTokenManager.get(any(Subject.class), eq("gitlab"), eq(null), eq(null)))
8686
.thenReturn(Optional.of(token));
8787

8888
GitUserData gitUserData = gitlabUserDataFetcher.fetchGitUserData();

wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/AbstractGitUserDataFetcher.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,17 @@ public AbstractGitUserDataFetcher(
3636
this.personalAccessTokenManager = personalAccessTokenManager;
3737
}
3838

39-
public GitUserData fetchGitUserData()
39+
public GitUserData fetchGitUserData(String namespaceName)
4040
throws ScmUnauthorizedException, ScmCommunicationException,
4141
ScmConfigurationPersistenceException, ScmItemNotFoundException, ScmBadRequestException {
4242
Subject cheSubject = EnvironmentContext.getCurrent().getSubject();
4343
Optional<PersonalAccessToken> tokenOptional =
44-
personalAccessTokenManager.get(cheSubject, oAuthProviderName, null);
44+
personalAccessTokenManager.get(cheSubject, oAuthProviderName, null, namespaceName);
4545
if (tokenOptional.isPresent()) {
4646
return fetchGitUserDataWithPersonalAccessToken(tokenOptional.get());
4747
} else {
4848
Optional<PersonalAccessToken> oAuthTokenOptional =
49-
personalAccessTokenManager.get(cheSubject, oAuthProviderUrl);
49+
personalAccessTokenManager.get(cheSubject, oAuthProviderUrl, null, namespaceName);
5050
if (oAuthTokenOptional.isPresent()) {
5151
return fetchGitUserDataWithOAuthToken(oAuthTokenOptional.get().getToken());
5252
}

wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/GitUserDataFetcher.java

+21-1
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616
import org.eclipse.che.api.factory.server.scm.exception.ScmConfigurationPersistenceException;
1717
import org.eclipse.che.api.factory.server.scm.exception.ScmItemNotFoundException;
1818
import org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;
19+
import org.eclipse.che.commons.annotation.Nullable;
1920

2021
public interface GitUserDataFetcher {
2122

2223
/**
2324
* Retrieve a {@link GitUserData} object from concrete scm provider. If OAuthProvider is not
2425
* configured, then personal access token should be taken into account.
2526
*
27+
* @param namespaceName - the user's namespace name.
2628
* @return - {@link GitUserData} object.
2729
* @throws ScmUnauthorizedException - in case if user is not authorized che server to create a new
2830
* token. Further user interaction is needed before calling this method next time.
@@ -31,7 +33,25 @@ public interface GitUserDataFetcher {
3133
* @throws ScmConfigurationPersistenceException - problem occurred during communication with
3234
* permanent storage.
3335
*/
34-
GitUserData fetchGitUserData()
36+
GitUserData fetchGitUserData(@Nullable String namespaceName)
3537
throws ScmUnauthorizedException, ScmCommunicationException,
3638
ScmConfigurationPersistenceException, ScmItemNotFoundException, ScmBadRequestException;
39+
40+
/**
41+
* Retrieve a {@link GitUserData} object from concrete scm provider. If OAuthProvider is not
42+
* configured, then personal access token should be taken into account.
43+
*
44+
* @return - {@link GitUserData} object.
45+
* @throws ScmUnauthorizedException - in case if user is not authorized che server to create a new
46+
* token. Further user interaction is needed before calling this method next time.
47+
* @throws ScmCommunicationException - Some unexpected problem occurred during communication with
48+
* scm provider.
49+
* @throws ScmConfigurationPersistenceException - problem occurred during communication with
50+
* permanent storage.
51+
*/
52+
default GitUserData fetchGitUserData()
53+
throws ScmUnauthorizedException, ScmCommunicationException,
54+
ScmConfigurationPersistenceException, ScmItemNotFoundException, ScmBadRequestException {
55+
return fetchGitUserData(null);
56+
}
3757
}

wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/PersonalAccessTokenManager.java

+4-14
Original file line numberDiff line numberDiff line change
@@ -40,19 +40,6 @@ PersonalAccessToken fetchAndSave(Subject cheUser, String scmServerUrl)
4040
throws UnsatisfiedScmPreconditionException, ScmConfigurationPersistenceException,
4141
ScmUnauthorizedException, ScmCommunicationException, UnknownScmProviderException;
4242

43-
/**
44-
* Gets {@link PersonalAccessToken} from permanent storage.
45-
*
46-
* @param cheUser Che user object
47-
* @param scmServerUrl Git provider endpoint
48-
* @return personal access token
49-
* @throws ScmConfigurationPersistenceException - problem occurred during communication with
50-
* permanent storage.
51-
* @throws ScmCommunicationException - problem occurred during communication with SCM server.
52-
*/
53-
Optional<PersonalAccessToken> get(Subject cheUser, String scmServerUrl)
54-
throws ScmConfigurationPersistenceException, ScmCommunicationException;
55-
5643
/**
5744
* Gets {@link PersonalAccessToken} from permanent storage.
5845
*
@@ -83,7 +70,10 @@ PersonalAccessToken get(String scmServerUrl)
8370
* @throws ScmCommunicationException - problem occurred during communication with SCM server.
8471
*/
8572
Optional<PersonalAccessToken> get(
86-
Subject cheUser, String oAuthProviderName, @Nullable String scmServerUrl)
73+
Subject cheUser,
74+
@Nullable String oAuthProviderName,
75+
@Nullable String scmServerUrl,
76+
@Nullable String namespaceName)
8777
throws ScmConfigurationPersistenceException, ScmCommunicationException;
8878

8979
/**

0 commit comments

Comments
 (0)