use of org.eclipse.che.api.workspace.server.spi.InfrastructureException in project che-server by eclipse-che.
the class RuntimeHangingDetector method handleHangingStoppingRuntime.
private void handleHangingStoppingRuntime(KubernetesInternalRuntime runtime) {
RuntimeIdentity runtimeId = runtime.getContext().getIdentity();
eventPublisher.sendAbnormalStoppingEvent(runtimeId, "Workspace is not stopped in time. Trying to stop it forcibly");
try {
LOG.info("Runtime '{}:{}:{}' is not stopped in time. Stopped it forcibly", runtimeId.getWorkspaceId(), runtimeId.getEnvName(), runtimeId.getOwnerId());
runtime.internalStop(emptyMap());
} catch (InfrastructureException e) {
LOG.error("Error occurred during forcibly stopping of hanging runtime '{}:{}:{}'. Error: {}", runtimeId.getWorkspaceId(), runtimeId.getEnvName(), runtimeId.getOwnerId(), e.getMessage(), e);
} finally {
try {
runtime.markStopped();
} catch (InfrastructureException e) {
LOG.error("Error occurred during marking hanging runtime as stopped '{}:{}:{}'. Error: {}", runtimeId.getWorkspaceId(), runtimeId.getEnvName(), runtimeId.getOwnerId(), e.getMessage(), e);
}
eventPublisher.sendAbnormalStoppedEvent(runtimeId, "Workspace stop reached timeout");
}
}
use of org.eclipse.che.api.workspace.server.spi.InfrastructureException in project devspaces-images by redhat-developer.
the class KubernetesPersonalAccessTokenManager method get.
@Override
public Optional<PersonalAccessToken> get(Subject cheUser, String scmServerUrl) throws ScmConfigurationPersistenceException, ScmUnauthorizedException, ScmCommunicationException {
try {
for (KubernetesNamespaceMeta namespaceMeta : namespaceFactory.list()) {
List<Secret> secrets = namespaceFactory.access(null, namespaceMeta.getName()).secrets().get(KUBERNETES_PERSONAL_ACCESS_TOKEN_LABEL_SELECTOR);
for (Secret secret : secrets) {
Map<String, String> annotations = secret.getMetadata().getAnnotations();
String trimmedUrl = StringUtils.trimEnd(annotations.get(ANNOTATION_SCM_URL), '/');
if (annotations.get(ANNOTATION_CHE_USERID).equals(cheUser.getUserId()) && trimmedUrl.equals(StringUtils.trimEnd(scmServerUrl, '/'))) {
PersonalAccessToken token = new PersonalAccessToken(trimmedUrl, annotations.get(ANNOTATION_CHE_USERID), annotations.get(ANNOTATION_SCM_USERNAME), annotations.get(ANNOTATION_SCM_USERID), annotations.get(ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME), annotations.get(ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_ID), new String(Base64.getDecoder().decode(secret.getData().get("token"))));
if (scmPersonalAccessTokenFetcher.isValid(token)) {
return Optional.of(token);
} else {
// Removing token that is no longer valid. If several tokens exist the next one could
// be valid. If no valid token can be found, the caller should react in the same way
// as it reacts if no token exists. Usually, that means that process of new token
// retrieval would be initiated.
clientFactory.create().secrets().inNamespace(namespaceMeta.getName()).delete(secret);
}
}
}
}
} catch (InfrastructureException | UnknownScmProviderException e) {
throw new ScmConfigurationPersistenceException(e.getMessage(), e);
}
return Optional.empty();
}
use of org.eclipse.che.api.workspace.server.spi.InfrastructureException in project devspaces-images by redhat-developer.
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);
}
}
use of org.eclipse.che.api.workspace.server.spi.InfrastructureException in project devspaces-images by redhat-developer.
the class AsyncStoragePodInterceptor method deleteAsyncStorageDeployment.
private CompletableFuture<Void> deleteAsyncStorageDeployment(RollableScalableResource<Deployment> resource) throws InfrastructureException {
Watch toCloseOnException = null;
try {
final CompletableFuture<Void> deleteFuture = new CompletableFuture<>();
final Watch watch = resource.watch(new DeleteWatcher<>(deleteFuture));
toCloseOnException = watch;
Boolean deleteSucceeded = resource.withPropagationPolicy(BACKGROUND).delete();
if (deleteSucceeded == null || !deleteSucceeded) {
deleteFuture.complete(null);
}
return deleteFuture.whenComplete((v, e) -> {
if (e != null) {
LOG.warn("Failed to remove deployment {} cause {}", ASYNC_STORAGE, e.getMessage());
}
watch.close();
});
} catch (KubernetesClientException e) {
if (toCloseOnException != null) {
toCloseOnException.close();
}
throw new KubernetesInfrastructureException(e);
} catch (Exception e) {
if (toCloseOnException != null) {
toCloseOnException.close();
}
throw e;
}
}
use of org.eclipse.che.api.workspace.server.spi.InfrastructureException in project devspaces-images by redhat-developer.
the class AsyncStoragePodInterceptor method intercept.
public void intercept(KubernetesEnvironment k8sEnv, RuntimeIdentity identity) throws InfrastructureException {
if (!COMMON_STRATEGY.equals(pvcStrategy) || isEphemeral(k8sEnv.getAttributes())) {
return;
}
removeAsyncStoragePodWithoutDeployment(identity);
String namespace = identity.getInfrastructureNamespace();
String workspaceId = identity.getWorkspaceId();
RollableScalableResource<Deployment> asyncStorageDeploymentResource = getAsyncStorageDeploymentResource(namespace, workspaceId);
if (asyncStorageDeploymentResource.get() == null) {
// deployment doesn't exist
return;
}
try {
deleteAsyncStorageDeployment(asyncStorageDeploymentResource).get(DELETE_DEPLOYMENT_TIMEOUT_IN_MIN, TimeUnit.MINUTES);
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
throw new InfrastructureException(format("Interrupted while waiting for deployment '%s' removal. " + ex.getMessage(), ASYNC_STORAGE), ex);
} catch (ExecutionException ex) {
throw new InfrastructureException(format("Error occurred while waiting for deployment '%s' removal. " + ex.getMessage(), ASYNC_STORAGE), ex);
} catch (TimeoutException ex) {
throw new InfrastructureException(format("Pod '%s' removal timeout reached " + ex.getMessage(), ASYNC_STORAGE), ex);
}
}
Aggregations