From 15a5ebd494e5df8d11f5e47963250cc9c27c214c Mon Sep 17 00:00:00 2001 From: Sergii Kabashniuk Date: Mon, 18 Jan 2021 09:51:31 +0200 Subject: [PATCH] Code cleanup Signed-off-by: Sergii Kabashniuk --- .../KubernetesPersonalAccessTokenManager.java | 36 -------------- .../BitbucketServerOAuthAuthenticator.java | 8 +--- ...ucketServerOAuthAuthenticatorProvider.java | 4 +- ...ucketServerPersonalAccessTokenFetcher.java | 8 ++-- .../server/bitbucket/BitbucketURLParser.java | 6 +-- .../bitbucket/server/BitbucketServerApi.java | 6 ++- .../server/BitbucketServerApiHttpClient.java | 48 +++++++++++-------- .../bitbucket/server/JsonBodyPublishers.java | 36 -------------- .../server/NopBitbucketServerApi.java | 4 ++ 9 files changed, 43 insertions(+), 113 deletions(-) delete mode 100644 wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/server/JsonBodyPublishers.java diff --git a/infrastructures/infrastructure-factory/src/main/java/org/eclipse/che/api/factory/server/scm/kubernetes/KubernetesPersonalAccessTokenManager.java b/infrastructures/infrastructure-factory/src/main/java/org/eclipse/che/api/factory/server/scm/kubernetes/KubernetesPersonalAccessTokenManager.java index 1816eca7ea0..95ae072ebe0 100644 --- a/infrastructures/infrastructure-factory/src/main/java/org/eclipse/che/api/factory/server/scm/kubernetes/KubernetesPersonalAccessTokenManager.java +++ b/infrastructures/infrastructure-factory/src/main/java/org/eclipse/che/api/factory/server/scm/kubernetes/KubernetesPersonalAccessTokenManager.java @@ -15,12 +15,10 @@ import com.google.common.collect.ImmutableMap; import io.fabric8.kubernetes.api.model.LabelSelector; import io.fabric8.kubernetes.api.model.LabelSelectorBuilder; -import io.fabric8.kubernetes.api.model.Namespace; import io.fabric8.kubernetes.api.model.ObjectMeta; import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; import io.fabric8.kubernetes.api.model.Secret; import io.fabric8.kubernetes.api.model.SecretBuilder; -import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.KubernetesClientException; import java.nio.charset.StandardCharsets; import java.util.Base64; @@ -43,16 +41,10 @@ import org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientFactory; import org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta; import org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespaceFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** Manages personal access token secrets used for private repositories authentication. */ @Singleton public class KubernetesPersonalAccessTokenManager implements PersonalAccessTokenManager { - - private static final Logger LOG = - LoggerFactory.getLogger(KubernetesPersonalAccessTokenManager.class); - public static final Map SECRET_LABELS = ImmutableMap.of( "app.kubernetes.io/part-of", "che.eclipse.org", @@ -91,7 +83,6 @@ void save(PersonalAccessToken personalAccessToken) throws UnsatisfiedScmPreconditionException, ScmConfigurationPersistenceException { try { String namespace = getFirstNamespace(); - LOG.info(" save in namespace {}", namespace); ObjectMeta meta = new ObjectMetaBuilder() .withName(NameGenerator.generate(NAME_PATTERN, 5)) @@ -143,9 +134,6 @@ public Optional get(Subject cheUser, String scmServerUrl) throws ScmConfigurationPersistenceException { try { - String namespace = getFirstNamespace(); - LOG.info(" save in namespace {}", namespace); - for (KubernetesNamespaceMeta namespaceMeta : namespaceFactory.list()) { List secrets = namespaceFactory @@ -170,8 +158,6 @@ public Optional get(Subject cheUser, String scmServerUrl) } } catch (InfrastructureException e) { throw new ScmConfigurationPersistenceException(e.getMessage(), e); - } catch (UnsatisfiedScmPreconditionException e) { - return Optional.empty(); } return Optional.empty(); } @@ -192,26 +178,4 @@ private String getFirstNamespace() throw new ScmConfigurationPersistenceException(e.getMessage(), e); } } - - private boolean canCreateDeleteSecrets(Namespace namespace) { - LOG.info("testing namespace {}", namespace); - ObjectMeta meta = - new ObjectMetaBuilder().withName(NameGenerator.generate(NAME_PATTERN, "tmp", 5)).build(); - Secret secret = new SecretBuilder().withMetadata(meta).build(); - try { - KubernetesClient kubernetesClient = clientFactory.create(); - Secret result = - kubernetesClient - .secrets() - .inNamespace(namespace.getMetadata().getName()) - .createOrReplace(secret); - kubernetesClient.secrets().delete(result); - LOG.info(" namespace {} is ok", namespace); - return true; - } catch (InfrastructureException e) { - LOG.error(e.getMessage(), e); - } - LOG.info(" namespace {} is not ok", namespace); - return false; - } } diff --git a/wsmaster/che-core-api-auth-bitbucket/src/main/java/org/eclipse/che/security/oauth1/BitbucketServerOAuthAuthenticator.java b/wsmaster/che-core-api-auth-bitbucket/src/main/java/org/eclipse/che/security/oauth1/BitbucketServerOAuthAuthenticator.java index 1860f005f8e..1a9c3b52a25 100644 --- a/wsmaster/che-core-api-auth-bitbucket/src/main/java/org/eclipse/che/security/oauth1/BitbucketServerOAuthAuthenticator.java +++ b/wsmaster/che-core-api-auth-bitbucket/src/main/java/org/eclipse/che/security/oauth1/BitbucketServerOAuthAuthenticator.java @@ -11,9 +11,7 @@ */ package org.eclipse.che.security.oauth1; -import com.google.inject.Inject; import com.google.inject.Singleton; -import com.google.inject.name.Named; /** * OAuth1 authentication for Bitbucket Server account. @@ -23,12 +21,8 @@ @Singleton public class BitbucketServerOAuthAuthenticator extends OAuthAuthenticator { - @Inject public BitbucketServerOAuthAuthenticator( - @Named("che.oauth1.bitbucket.consumerkey") String consumerKey, - @Named("che.oauth1.bitbucket.privatekey") String privateKey, - @Named("che.oauth1.bitbucket.endpoint") String bitbucketEndpoint, - @Named("che.api") String apiEndpoint) { + String consumerKey, String privateKey, String bitbucketEndpoint, String apiEndpoint) { super( consumerKey, bitbucketEndpoint + "/plugins/servlet/oauth/request-token", diff --git a/wsmaster/che-core-api-auth-bitbucket/src/main/java/org/eclipse/che/security/oauth1/BitbucketServerOAuthAuthenticatorProvider.java b/wsmaster/che-core-api-auth-bitbucket/src/main/java/org/eclipse/che/security/oauth1/BitbucketServerOAuthAuthenticatorProvider.java index 3d384108fbc..48bd3255470 100644 --- a/wsmaster/che-core-api-auth-bitbucket/src/main/java/org/eclipse/che/security/oauth1/BitbucketServerOAuthAuthenticatorProvider.java +++ b/wsmaster/che-core-api-auth-bitbucket/src/main/java/org/eclipse/che/security/oauth1/BitbucketServerOAuthAuthenticatorProvider.java @@ -40,7 +40,7 @@ public BitbucketServerOAuthAuthenticatorProvider( authenticator = getOAuthAuthenticator(consumerKeyPath, privateKeyPath, bitbucketEndpoint, apiEndpoint); - LOG.info("authenticator={}", authenticator); + LOG.debug("{} Bitbucket OAuthAuthenticator is used.", authenticator); } @Override @@ -51,11 +51,9 @@ public OAuthAuthenticator get() { private static OAuthAuthenticator getOAuthAuthenticator( String consumerKeyPath, String privateKeyPath, String bitbucketEndpoint, String apiEndpoint) throws IOException { - LOG.info("1"); if (!isNullOrEmpty(bitbucketEndpoint) && consumerKeyPath != null && privateKeyPath != null) { String consumerKey = Files.readString(Path.of(consumerKeyPath)); String privateKey = Files.readString(Path.of(privateKeyPath)); - LOG.info("consumerKey={} privateKey={}", consumerKey, privateKey); if (!isNullOrEmpty(consumerKey) && !isNullOrEmpty(privateKey)) { return new BitbucketServerOAuthAuthenticator( consumerKey, privateKey, bitbucketEndpoint, apiEndpoint); diff --git a/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerPersonalAccessTokenFetcher.java b/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerPersonalAccessTokenFetcher.java index 112147a2389..2b6180eb5d6 100644 --- a/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerPersonalAccessTokenFetcher.java +++ b/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerPersonalAccessTokenFetcher.java @@ -59,14 +59,14 @@ public BitbucketServerPersonalAccessTokenFetcher( public PersonalAccessToken fetchPersonalAccessToken(Subject cheUser, String scmServerUrl) throws ScmUnauthorizedException, ScmCommunicationException { if (!bitbucketServerApi.isConnected(scmServerUrl)) { - LOG.info("not valid url {} for current fetcher ", scmServerUrl); + LOG.debug("not a valid url {} for current fetcher ", scmServerUrl); return null; } String tokenName = format(TOKEN_NAME_TEMPLATE, cheUser.getUserId(), apiEndpoint.getHost()); try { BitbucketUser user = bitbucketServerApi.getUser(EnvironmentContext.getCurrent().getSubject()); - LOG.info("Current bitbucket user {} ", user); + LOG.debug("Current bitbucket user {} ", user); // cleanup existed List existedTokens = bitbucketServerApi @@ -75,14 +75,14 @@ public PersonalAccessToken fetchPersonalAccessToken(Subject cheUser, String scmS .filter(p -> p.getName().equals(tokenName)) .collect(Collectors.toList()); for (BitbucketPersonalAccessToken existedToken : existedTokens) { - LOG.info("Deleting existed che token {} {}", existedToken.getId(), existedToken.getName()); + LOG.debug("Deleting existed che token {} {}", existedToken.getId(), existedToken.getName()); bitbucketServerApi.deletePersonalAccessTokens(user.getSlug(), existedToken.getId()); } BitbucketPersonalAccessToken token = bitbucketServerApi.createPersonalAccessTokens( user.getSlug(), tokenName, ImmutableSet.of("PROJECT_WRITE", "REPO_WRITE")); - LOG.info("Token = {} for {}", token.getId(), token.getUser()); + LOG.debug("Token created = {} for {}", token.getId(), token.getUser()); return new PersonalAccessToken( scmServerUrl, EnvironmentContext.getCurrent().getSubject().getUserId(), diff --git a/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketURLParser.java b/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketURLParser.java index faabaa4d1ae..460bffb7666 100644 --- a/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketURLParser.java +++ b/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketURLParser.java @@ -25,8 +25,6 @@ import org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider; import org.eclipse.che.commons.annotation.Nullable; import org.eclipse.che.commons.lang.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Parser of String Bitbucket URLs and provide {@link BitbucketUrl} objects. @@ -35,7 +33,7 @@ */ @Singleton public class BitbucketURLParser { - private static final Logger LOG = LoggerFactory.getLogger(BitbucketURLParser.class); + private final DevfileFilenamesProvider devfileFilenamesProvider; private static final String bitbucketUrlPatternTemplate = "^(?%s)/scm/(?[^/]++)/(?[^.]++).git(\\?at=)?(?[\\w\\d-_]*)"; @@ -45,7 +43,6 @@ public class BitbucketURLParser { public BitbucketURLParser( @Nullable @Named("che.integration.bitbucket.server_endpoints") String bitbucketEndpoints, DevfileFilenamesProvider devfileFilenamesProvider) { - LOG.info("bitbucketEndpoints={}", bitbucketEndpoints); this.devfileFilenamesProvider = devfileFilenamesProvider; if (bitbucketEndpoints != null) { for (String bitbucketEndpoint : Splitter.on(",").split(bitbucketEndpoints)) { @@ -57,7 +54,6 @@ public BitbucketURLParser( } public boolean isValid(@NotNull String url) { - LOG.info("isValid={}", url); return !bitbucketUrlPatterns.isEmpty() && bitbucketUrlPatterns.stream().anyMatch(pattern -> pattern.matcher(url).matches()); } diff --git a/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/server/BitbucketServerApi.java b/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/server/BitbucketServerApi.java index 8e48ddac991..7d5cae262d1 100644 --- a/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/server/BitbucketServerApi.java +++ b/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/server/BitbucketServerApi.java @@ -19,8 +19,12 @@ import org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException; import org.eclipse.che.commons.subject.Subject; +/** Bitbucket Server API client. */ public interface BitbucketServerApi { - + /** + * @param bitbucketServerUrl + * @return - true if client is connected to the given bitbucket server. + */ boolean isConnected(String bitbucketServerUrl); /** * @param cheUser - Che user. diff --git a/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/server/BitbucketServerApiHttpClient.java b/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/server/BitbucketServerApiHttpClient.java index 1b00770e4a3..5123e5bedf4 100644 --- a/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/server/BitbucketServerApiHttpClient.java +++ b/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/server/BitbucketServerApiHttpClient.java @@ -13,6 +13,7 @@ import static java.time.Duration.ofSeconds; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.type.TypeFactory; @@ -44,6 +45,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +/** + * Implementation of @{@link BitbucketServerApi} that is using @{@link HttpClient} to communicate + * with Bitbucket Server.s + */ public class BitbucketServerApiHttpClient implements BitbucketServerApi { private static final ObjectMapper OM = new ObjectMapper(); @@ -61,9 +66,7 @@ public BitbucketServerApiHttpClient( @Override public boolean isConnected(String bitbucketServerUrl) { - boolean equals = serverUri.equals(URI.create(bitbucketServerUrl)); - LOG.info("{}={}={}", serverUri, bitbucketServerUrl, equals); - return equals; + return serverUri.equals(URI.create(bitbucketServerUrl)); } @Override @@ -112,6 +115,7 @@ public BitbucketUser getUser(String slug) .build(); try { + LOG.debug("executeRequest={}", request); return executeRequest( httpClient, request, @@ -166,6 +170,7 @@ public void deletePersonalAccessTokens(String userSlug, Long tokenId) .build(); try { + LOG.debug("executeRequest={}", request); executeRequest( httpClient, request, @@ -187,22 +192,24 @@ public BitbucketPersonalAccessToken createPersonalAccessTokens( throws ScmBadRequestException, ScmUnauthorizedException, ScmCommunicationException { HttpClient httpClient = HttpClient.newHttpClient(); URI uri = serverUri.resolve("/rest/access-tokens/1.0/users/" + userSlug); - HttpRequest request = - HttpRequest.newBuilder(uri) - .PUT( - JsonBodyPublishers.fromObject( - new BitbucketPersonalAccessToken(tokenName, permissions))) - .headers( - HttpHeaders.AUTHORIZATION, - headerProvider.computeAuthorizationHeader("PUT", uri.toString()), - HttpHeaders.ACCEPT, - MediaType.APPLICATION_JSON, - HttpHeaders.CONTENT_TYPE, - MediaType.APPLICATION_JSON) - .timeout(ofSeconds(10)) - .build(); try { + HttpRequest request = + HttpRequest.newBuilder(uri) + .PUT( + HttpRequest.BodyPublishers.ofString( + OM.writeValueAsString( + new BitbucketPersonalAccessToken(tokenName, permissions)))) + .headers( + HttpHeaders.AUTHORIZATION, + headerProvider.computeAuthorizationHeader("PUT", uri.toString()), + HttpHeaders.ACCEPT, + MediaType.APPLICATION_JSON, + HttpHeaders.CONTENT_TYPE, + MediaType.APPLICATION_JSON) + .timeout(ofSeconds(10)) + .build(); + LOG.debug("executeRequest={}", request); return executeRequest( httpClient, request, @@ -213,7 +220,7 @@ public BitbucketPersonalAccessToken createPersonalAccessTokens( throw new UncheckedIOException(e); } }); - } catch (ScmItemNotFoundException e) { + } catch (ScmItemNotFoundException | JsonProcessingException e) { throw new ScmCommunicationException(e.getMessage(), e); } } @@ -232,9 +239,7 @@ public List getPersonalAccessTokens(String userSlu private Optional findCurrentUser(Set userSlugs) throws ScmCommunicationException, ScmUnauthorizedException, ScmItemNotFoundException { - LOG.info("Testing {} items {}", userSlugs.size(), userSlugs); for (String userSlug : userSlugs) { - LOG.info("findCurrentUser={}", userSlug); BitbucketUser user = getUser(userSlug); try { getPersonalAccessTokens(userSlug); @@ -275,6 +280,7 @@ private Page doGetPage(Class tClass, String api, int start, int limit, "Authorization", headerProvider.computeAuthorizationHeader("GET", uri.toString())) .timeout(ofSeconds(10)) .build(); + LOG.debug("executeRequest={}", request); final JavaType typeReference = TypeFactory.defaultInstance().constructParametricType(Page.class, tClass); return executeRequest( @@ -296,7 +302,7 @@ private T executeRequest( try { HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofInputStream()); - LOG.info("executeRequest={} response {}", request, response.statusCode()); + LOG.debug("executeRequest={} response {}", request, response.statusCode()); if (response.statusCode() == 200) { return function.apply(response.body()); } else if (response.statusCode() == 204) { diff --git a/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/server/JsonBodyPublishers.java b/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/server/JsonBodyPublishers.java deleted file mode 100644 index 76454333c6d..00000000000 --- a/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/server/JsonBodyPublishers.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2012-2018 Red Hat, Inc. - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: - * Red Hat, Inc. - initial API and implementation - */ -package org.eclipse.che.api.factory.server.bitbucket.server; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import java.io.UncheckedIOException; -import java.net.http.HttpRequest; -import java.util.function.Supplier; - -/** - * {@link Supplier} because https://bugs.openjdk.java.net/browse/JDK-8217264 see - * https://stackoverflow.com/questions/53379087/wrapping-bodysubscriberinputstream-in-gzipinputstream-leads-to-hang - */ -public class JsonBodyPublishers { - private static final ObjectMapper OM = new ObjectMapper(); - - private JsonBodyPublishers() {} - - public static HttpRequest.BodyPublisher fromObject(Object object) { - try { - return HttpRequest.BodyPublishers.ofString(OM.writeValueAsString(object)); - } catch (JsonProcessingException e) { - throw new UncheckedIOException(e.getMessage(), e); - } - } -} diff --git a/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/server/NopBitbucketServerApi.java b/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/server/NopBitbucketServerApi.java index 9d2ad7fcaf3..6ca1d9fbf78 100644 --- a/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/server/NopBitbucketServerApi.java +++ b/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/server/NopBitbucketServerApi.java @@ -19,6 +19,10 @@ import org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException; import org.eclipse.che.commons.subject.Subject; +/** + * Implementation of @{@link BitbucketServerApi} that is going to be deployed in container in case + * if no integration with Bitbucket server is needed. + */ public class NopBitbucketServerApi implements BitbucketServerApi { @Override public boolean isConnected(String bitbucketServerUrl) {