Search in sources :

Example 41 with InfrastructureException

use of org.eclipse.che.api.workspace.server.spi.InfrastructureException in project che-server by eclipse-che.

the class PluginFQNParser method parsePluginFQNs.

private Collection<PluginFQN> parsePluginFQNs(String attribute) throws InfrastructureException {
    String[] plugins = splitAttribute(attribute);
    if (plugins.length == 0) {
        return emptyList();
    }
    List<PluginFQN> collectedFQNs = new ArrayList<>();
    for (String plugin : plugins) {
        PluginFQN pFQN = parsePluginFQN(plugin);
        String pluginKey = firstNonNull(pFQN.getReference(), pFQN.getId());
        if (collectedFQNs.stream().anyMatch(p -> pluginKey.equals(p.getId()) || pluginKey.equals(p.getReference()))) {
            throw new InfrastructureException(format("Invalid Che tooling plugins configuration: plugin %s is duplicated", // even if different registries
            pluginKey));
        }
        collectedFQNs.add(pFQN);
    }
    return collectedFQNs;
}
Also used : ExtendedPluginFQN(org.eclipse.che.api.workspace.server.wsplugins.model.ExtendedPluginFQN) PluginFQN(org.eclipse.che.api.workspace.server.wsplugins.model.PluginFQN) ArrayList(java.util.ArrayList) InfrastructureException(org.eclipse.che.api.workspace.server.spi.InfrastructureException)

Example 42 with InfrastructureException

use of org.eclipse.che.api.workspace.server.spi.InfrastructureException in project che-server by eclipse-che.

the class KubernetesGitCredentialManager method createOrReplace.

@Override
public void createOrReplace(PersonalAccessToken personalAccessToken) throws UnsatisfiedScmPreconditionException, ScmConfigurationPersistenceException {
    try {
        final String namespace = getFirstNamespace();
        final KubernetesClient client = clientFactory.create();
        // to avoid duplicating secrets we try to reuse existing one by matching
        // hostname/username if possible, and update it. Otherwise, create new one.
        Optional<Secret> existing = client.secrets().inNamespace(namespace).withLabels(SEARCH_LABELS).list().getItems().stream().filter(s -> s.getMetadata().getAnnotations() != null).filter(s -> Boolean.parseBoolean(s.getMetadata().getAnnotations().get(ANNOTATION_GIT_CREDENTIALS)) && personalAccessToken.getScmProviderUrl().equals(StringUtils.trimEnd(s.getMetadata().getAnnotations().get(ANNOTATION_SCM_URL), '/')) && personalAccessToken.getCheUserId().equals(s.getMetadata().getAnnotations().get(ANNOTATION_CHE_USERID)) && personalAccessToken.getScmUserName().equals(s.getMetadata().getAnnotations().get(ANNOTATION_SCM_USERNAME))).findFirst();
        Secret secret = existing.orElseGet(() -> {
            Map<String, String> annotations = new HashMap<>(DEFAULT_SECRET_ANNOTATIONS);
            annotations.put(ANNOTATION_SCM_URL, personalAccessToken.getScmProviderUrl());
            annotations.put(ANNOTATION_SCM_USERNAME, personalAccessToken.getScmUserName());
            annotations.put(ANNOTATION_CHE_USERID, personalAccessToken.getCheUserId());
            ObjectMeta meta = new ObjectMetaBuilder().withName(NameGenerator.generate(NAME_PATTERN, 5)).withAnnotations(annotations).withLabels(NEW_SECRET_LABELS).build();
            return new SecretBuilder().withMetadata(meta).build();
        });
        URL scmUrl = new URL(personalAccessToken.getScmProviderUrl());
        secret.setData(Map.of("credentials", Base64.getEncoder().encodeToString(format("%s://%s:%s@%s%s", scmUrl.getProtocol(), personalAccessToken.getScmTokenName().startsWith(OAUTH_2_PREFIX) ? "oauth2" : personalAccessToken.getScmUserName(), URLEncoder.encode(personalAccessToken.getToken(), UTF_8), scmUrl.getHost(), scmUrl.getPort() != 80 && scmUrl.getPort() != -1 ? ":" + scmUrl.getPort() : "").getBytes())));
        client.secrets().inNamespace(namespace).createOrReplace(secret);
    } catch (InfrastructureException | MalformedURLException e) {
        throw new ScmConfigurationPersistenceException(e.getMessage(), e);
    }
}
Also used : ANNOTATION_MOUNT_PATH(org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_MOUNT_PATH) KubernetesClientFactory(org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesClientFactory) ANNOTATION_DEV_WORKSPACE_MOUNT_PATH(org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_DEV_WORKSPACE_MOUNT_PATH) URL(java.net.URL) ANNOTATION_AUTOMOUNT(org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_AUTOMOUNT) HashMap(java.util.HashMap) OAUTH_2_PREFIX(org.eclipse.che.api.factory.server.scm.PersonalAccessTokenFetcher.OAUTH_2_PREFIX) Singleton(javax.inject.Singleton) Inject(javax.inject.Inject) PersonalAccessToken(org.eclipse.che.api.factory.server.scm.PersonalAccessToken) DEV_WORKSPACE_PREFIX(org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.DEV_WORKSPACE_PREFIX) Map(java.util.Map) ScmConfigurationPersistenceException(org.eclipse.che.api.factory.server.scm.exception.ScmConfigurationPersistenceException) ANNOTATION_MOUNT_AS(org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_MOUNT_AS) NameGenerator(org.eclipse.che.commons.lang.NameGenerator) ObjectMetaBuilder(io.fabric8.kubernetes.api.model.ObjectMetaBuilder) ImmutableMap(com.google.common.collect.ImmutableMap) MalformedURLException(java.net.MalformedURLException) GitCredentialManager(org.eclipse.che.api.factory.server.scm.GitCredentialManager) KubernetesNamespaceMeta(org.eclipse.che.workspace.infrastructure.kubernetes.api.shared.KubernetesNamespaceMeta) UTF_8(java.nio.charset.StandardCharsets.UTF_8) String.format(java.lang.String.format) KubernetesNamespaceFactory(org.eclipse.che.workspace.infrastructure.kubernetes.namespace.KubernetesNamespaceFactory) InfrastructureException(org.eclipse.che.api.workspace.server.spi.InfrastructureException) URLEncoder(java.net.URLEncoder) Base64(java.util.Base64) UnsatisfiedScmPreconditionException(org.eclipse.che.api.factory.server.scm.exception.UnsatisfiedScmPreconditionException) ANNOTATION_GIT_CREDENTIALS(org.eclipse.che.workspace.infrastructure.kubernetes.provision.secret.KubernetesSecretAnnotationNames.ANNOTATION_GIT_CREDENTIALS) ObjectMeta(io.fabric8.kubernetes.api.model.ObjectMeta) KubernetesClient(io.fabric8.kubernetes.client.KubernetesClient) Secret(io.fabric8.kubernetes.api.model.Secret) Optional(java.util.Optional) SecretBuilder(io.fabric8.kubernetes.api.model.SecretBuilder) StringUtils(org.eclipse.che.commons.lang.StringUtils) ObjectMeta(io.fabric8.kubernetes.api.model.ObjectMeta) KubernetesClient(io.fabric8.kubernetes.client.KubernetesClient) MalformedURLException(java.net.MalformedURLException) HashMap(java.util.HashMap) ObjectMetaBuilder(io.fabric8.kubernetes.api.model.ObjectMetaBuilder) URL(java.net.URL) Secret(io.fabric8.kubernetes.api.model.Secret) SecretBuilder(io.fabric8.kubernetes.api.model.SecretBuilder) InfrastructureException(org.eclipse.che.api.workspace.server.spi.InfrastructureException) ScmConfigurationPersistenceException(org.eclipse.che.api.factory.server.scm.exception.ScmConfigurationPersistenceException)

Example 43 with InfrastructureException

use of org.eclipse.che.api.workspace.server.spi.InfrastructureException in project che-server by eclipse-che.

the class KubernetesPersonalAccessTokenManager method save.

@VisibleForTesting
void save(PersonalAccessToken personalAccessToken) throws UnsatisfiedScmPreconditionException, ScmConfigurationPersistenceException {
    try {
        String namespace = getFirstNamespace();
        ObjectMeta meta = new ObjectMetaBuilder().withName(NameGenerator.generate(NAME_PATTERN, 5)).withAnnotations(new ImmutableMap.Builder<String, String>().put(ANNOTATION_CHE_USERID, personalAccessToken.getCheUserId()).put(ANNOTATION_SCM_USERID, personalAccessToken.getScmUserId()).put(ANNOTATION_SCM_USERNAME, personalAccessToken.getScmUserName()).put(ANNOTATION_SCM_URL, personalAccessToken.getScmProviderUrl()).put(ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_ID, personalAccessToken.getScmTokenId()).put(ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME, personalAccessToken.getScmTokenName()).build()).withLabels(SECRET_LABELS).build();
        Secret secret = new SecretBuilder().withMetadata(meta).withData(Map.of(TOKEN_DATA_FIELD, Base64.getEncoder().encodeToString(personalAccessToken.getToken().getBytes(StandardCharsets.UTF_8)))).build();
        clientFactory.create().secrets().inNamespace(namespace).createOrReplace(secret);
    } catch (KubernetesClientException | InfrastructureException e) {
        throw new ScmConfigurationPersistenceException(e.getMessage(), e);
    }
}
Also used : Secret(io.fabric8.kubernetes.api.model.Secret) SecretBuilder(io.fabric8.kubernetes.api.model.SecretBuilder) ObjectMeta(io.fabric8.kubernetes.api.model.ObjectMeta) ObjectMetaBuilder(io.fabric8.kubernetes.api.model.ObjectMetaBuilder) LabelSelectorBuilder(io.fabric8.kubernetes.api.model.LabelSelectorBuilder) SecretBuilder(io.fabric8.kubernetes.api.model.SecretBuilder) ObjectMetaBuilder(io.fabric8.kubernetes.api.model.ObjectMetaBuilder) InfrastructureException(org.eclipse.che.api.workspace.server.spi.InfrastructureException) KubernetesClientException(io.fabric8.kubernetes.client.KubernetesClientException) ScmConfigurationPersistenceException(org.eclipse.che.api.factory.server.scm.exception.ScmConfigurationPersistenceException) VisibleForTesting(com.google.common.annotations.VisibleForTesting)

Example 44 with InfrastructureException

use of org.eclipse.che.api.workspace.server.spi.InfrastructureException in project che-server by eclipse-che.

the class PVCSubPathHelperTest method testLogErrorWhenKubernetesProjectCreationFailed.

@Test
public void testLogErrorWhenKubernetesProjectCreationFailed() throws Exception {
    when(osDeployments.create(any())).thenThrow(new InfrastructureException("Kubernetes namespace creation failed"));
    pvcSubPathHelper.execute(WORKSPACE_ID, NAMESPACE, PVC_NAME, MKDIR_COMMAND_BASE, WORKSPACE_ID + PROJECTS_PATH);
    verify(k8sNamespaceFactory).access(WORKSPACE_ID, NAMESPACE);
    verify(osDeployments).create(any());
    verify(osDeployments, never()).waitAsync(anyString(), any());
}
Also used : InfrastructureException(org.eclipse.che.api.workspace.server.spi.InfrastructureException) Test(org.testng.annotations.Test)

Example 45 with InfrastructureException

use of org.eclipse.che.api.workspace.server.spi.InfrastructureException in project che-server by eclipse-che.

the class PVCSubPathHelperTest method testLogErrorWhenKubernetesPodCreationFailed.

@Test
public void testLogErrorWhenKubernetesPodCreationFailed() throws Exception {
    when(osDeployments.create(any())).thenThrow(new InfrastructureException("Kubernetes pod creation failed"));
    pvcSubPathHelper.execute(WORKSPACE_ID, NAMESPACE, PVC_NAME, MKDIR_COMMAND_BASE, WORKSPACE_ID + PROJECTS_PATH);
    verify(k8sNamespaceFactory).access(WORKSPACE_ID, NAMESPACE);
    verify(k8sNamespace).deployments();
    verify(osDeployments).create(any());
    verify(osDeployments, never()).waitAsync(anyString(), any());
}
Also used : InfrastructureException(org.eclipse.che.api.workspace.server.spi.InfrastructureException) Test(org.testng.annotations.Test)

Aggregations

InfrastructureException (org.eclipse.che.api.workspace.server.spi.InfrastructureException)242 InternalInfrastructureException (org.eclipse.che.api.workspace.server.spi.InternalInfrastructureException)64 Test (org.testng.annotations.Test)56 KubernetesInfrastructureException (org.eclipse.che.workspace.infrastructure.kubernetes.KubernetesInfrastructureException)44 RuntimeIdentity (org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity)42 KubernetesClientException (io.fabric8.kubernetes.client.KubernetesClientException)38 CompletableFuture (java.util.concurrent.CompletableFuture)36 ExecutionException (java.util.concurrent.ExecutionException)36 TimeoutException (java.util.concurrent.TimeoutException)32 ServerException (org.eclipse.che.api.core.ServerException)32 Pod (io.fabric8.kubernetes.api.model.Pod)30 Map (java.util.Map)26 ValidationException (org.eclipse.che.api.core.ValidationException)22 Traced (org.eclipse.che.commons.annotation.Traced)20 Container (io.fabric8.kubernetes.api.model.Container)18 List (java.util.List)18 Set (java.util.Set)18 Inject (javax.inject.Inject)18 RuntimeStartInterruptedException (org.eclipse.che.api.workspace.server.spi.RuntimeStartInterruptedException)18 KubernetesEnvironment (org.eclipse.che.workspace.infrastructure.kubernetes.environment.KubernetesEnvironment)18