private DeferredResult<Endpoint> getEndpoint(RequestContext ctx) { if (ctx.request.customProperties.containsKey(VALIDATE_CONNECTION)) { return buildFakeEndpoint(ctx); } String path = ctx.request.resourceReference.getPath(); Operation op = Operation.createGet(this, path); return sendWithDeferredResult(op, Endpoint.class) .exceptionally(ex -> { throw DeferredUtils.logErrorAndThrow(ex, e -> String.format("Unable to get PKS endpoint state %s, reason: %s", path, e.getMessage()), getClass()); }); }
private DeferredResult<AuthCredentialsServiceState> getCredentials(String selfLink) { if (selfLink == null || selfLink.isEmpty()) { return DeferredResult.completed(null); } Operation op = Operation.createGet(this, selfLink); return sendWithDeferredResult(op, AuthCredentialsServiceState.class) .exceptionally(ex -> { throw DeferredUtils.logErrorAndThrow(ex, e -> String.format("Unable to get PKS endpoint credentials state %s," + " reason: %s", selfLink, e.getMessage()), getClass()); }); }
private PKSContext createNewPKSContext(Endpoint endpoint) throws ExecutionException, InterruptedException { return getCredentials(endpoint.authCredentialsLink) .thenCompose(authCredentials -> login(endpoint, authCredentials)) .exceptionally(t -> { throw DeferredUtils.logErrorAndThrow(t, Throwable::getMessage, getClass()); }) .toCompletionStage() .toCompletableFuture() .get(); }
private DeferredResult<Void> freeProjectName(String name) { return UniquePropertiesUtil.freeProperty(this, UniquePropertiesService.PROJECT_NAMES_ID, name) .exceptionally(ex -> { logWarning("Unable to free name %s: %s", name, Utils.toString(ex)); return null; }); }
private DeferredResult<Void> freeProjectIndex(int index) { if (index < 0) { return DeferredResult.completed(null); } return UniquePropertiesUtil.freeProperty(this, UniquePropertiesService.PROJECT_INDEXES_ID, Integer.toString(index)) .exceptionally(ex -> { logWarning("Unable to free project index %d: %s", index, Utils.toString(ex)); return null; }); }
private <T> DeferredResult<T> doDeleteDocument(String groupLink, Class<T> documentClass, URI referer) { return sendWithDeferredResult(Operation.createDelete(this, groupLink) .setReferer(referer), documentClass) .exceptionally(ex -> { logWarning( "Couldn't delete document of type %s with document link %s: %s", documentClass.getName(), groupLink, Utils.toString(ex)); return null; }); }
private static DeferredResult<UserState> getUserState(Service requestorService, String principalId) { Operation getUserStateOp = Operation.createGet(requestorService, AuthUtil.buildUserServicePathFromPrincipalId(encode(principalId))); requestorService.setAuthorizationContext(getUserStateOp, requestorService.getSystemAuthorizationContext()); return requestorService.sendWithDeferredResult(getUserStateOp, UserState.class) .exceptionally((ex) -> { if (ex.getCause() instanceof ServiceNotFoundException) { return new UserState(); } return null; }); }
private DeferredResult<BaseKubernetesState> getState(RequestContext context, String selfLink) { return sendWithDeferredResult(Operation.createGet(this, selfLink)) .exceptionally(ex -> { Throwable cause = ex instanceof CompletionException ? ex.getCause() : ex; logWarning("Unable to get resource state for %s, reason: %s", selfLink, Utils.toString(cause)); throw ex instanceof CompletionException ? (CompletionException) ex : new CompletionException(ex); }).thenApply(op -> { Class<? extends ResourceState> stateClass = CompositeComponentRegistry .metaByStateLink(selfLink).stateClass; return (BaseKubernetesState) op.getBody(stateClass); }); } }
private void validatePlanSelection(PKSProvisioningTaskState taskState, Runnable nextAction) { final String planName = taskState.getCustomProperty(PKS_PLAN_NAME_FIELD); Operation getEndpoint = Operation.createGet(getHost(), taskState.endpointLink) .setReferer(getSelfLink()); getHost().sendWithDeferredResult(getEndpoint, Endpoint.class) .thenAccept(endpoint -> doValidatePlanSelection(planName, taskState.tenantLinks, endpoint)) .thenAccept(v -> nextAction.run()) .exceptionally(ex -> { failTask(String.format("Plan selection validation failed: %s", Utils.toString(ex)), ex); return null; }); }
public static DeferredResult<String> getHarborUrl(Service service) { Operation getConfigProp = Operation.createGet(service, UriUtils.buildUriPath( ConfigurationFactoryService.SELF_LINK, Harbor.CONFIGURATION_URL_PROPERTY_NAME)); DeferredResult<String> result = new DeferredResult<>(); service.sendWithDeferredResult(getConfigProp, ConfigurationState.class) .thenAccept(state -> result.complete(state.value)) .exceptionally(ex -> { ex = (ex instanceof CompletionException) ? ex.getCause() : ex; if (ex instanceof ServiceNotFoundException) { result.complete(null); } else { result.fail(ex); } return null; }); return result; }
/** * Triggers an enumeration task for each resource pool. Makes sure no multiple tasks are * run in parallel for the same resource pool. */ public static void triggerForAllResourcePools(Service sender) { // TODO pmitrov: add support for tenant links Query rpQuery = Query.Builder.create().addKindFieldClause(ResourcePoolState.class).build(); new QueryByPages<ResourcePoolState>(sender.getHost(), rpQuery, ResourcePoolState.class, null) .queryLinks(rpLink -> EpzComputeEnumerationTaskService.triggerForResourcePool(sender, rpLink)) .exceptionally(e -> { sender.getHost().log(Level.WARNING, "Failed to start enumeration task for all resource pools: %s", e.getMessage()); return null; }); }
/** * Triggers a capacity update task for each resource pool. Makes sure no multiple tasks are * run in parallel for the same resource pool. */ public static void triggerForAllResourcePools(Service sender) { // TODO pmitrov: add support for tenant links Query rpQuery = Query.Builder.create().addKindFieldClause(ResourcePoolState.class).build(); new QueryByPages<ResourcePoolState>(sender.getHost(), rpQuery, ResourcePoolState.class, null) .queryLinks(rpLink -> PlacementCapacityUpdateTaskService.triggerForResourcePool(sender, rpLink)) .exceptionally(e -> { sender.getHost().log(Level.WARNING, "Failed to start capacity update task for all resource pools: %s", e.getMessage()); return null; }); }
@SuppressWarnings("unchecked") private <T extends ServiceDocument> T createEntity(T entityState, String factoryLink) throws Throwable { Operation post = Operation.createPost(host, factoryLink) .setReferer(host.getUri()) .setBody(entityState); T result = host.sendWithDeferredResult(post, (Class<T>) entityState.getClass()) .exceptionally(ex -> { host.log(Level.SEVERE, "Failed to create entity for factory [%s]: %s", factoryLink, Utils.toString(ex)); throw ex instanceof CompletionException ? (CompletionException) ex : new CompletionException(ex); }) .toCompletionStage() .toCompletableFuture().get(); entitiesToDelete.add(result.documentSelfLink); return result; }
@Test public void testExceptionallyRethrow() throws Throwable { TestContext ctx = new TestContext(1, TestContext.DEFAULT_WAIT_DURATION); AtomicInteger invocations = new AtomicInteger(); DeferredResult<Integer> original = new DeferredResult<>(); original .exceptionally(ex -> { Assert.assertNotNull(ex); Assert.assertEquals(RuntimeException.class, ex.getClass()); invocations.incrementAndGet(); throw new TestException(); }) .whenComplete(getExpectedExceptionCompletion(ctx)); runAfter(10, () -> original.fail(new RuntimeException())); ctx.await(); Assert.assertEquals(1, invocations.get()); }
@Test public void testExceptionallyRethrow() throws Throwable { TestContext ctx = new TestContext(1, TestContext.DEFAULT_WAIT_DURATION); AtomicInteger invocations = new AtomicInteger(); DeferredResult<Integer> original = new DeferredResult<>(); original .exceptionally(ex -> { Assert.assertNotNull(ex); Assert.assertEquals(RuntimeException.class, ex.getClass()); invocations.incrementAndGet(); throw new TestException(); }) .whenComplete(getExpectedExceptionCompletion(ctx)); runAfter(10, () -> original.fail(new RuntimeException())); ctx.await(); Assert.assertEquals(1, invocations.get()); }
public static void deletePlacementZoneAndPlacement(String pathPZLink, String resourcePoolLink, Operation delete, ServiceHost host) { host.sendWithDeferredResult( Operation.createDelete(UriUtils.buildUri(host, pathPZLink)) .setBody(new ElasticPlacementZoneConfigurationState()) .setReferer(host.getUri()), ElasticPlacementZoneConfigurationState.class) .thenCompose(epz -> deletePlacementWithResourcePoolLink(resourcePoolLink, host)) .exceptionally(f -> { if (f instanceof ServiceNotFoundException) { return null; } else { throw new CompletionException(f); } }) .whenCompleteNotify(delete); }
@Test public void testExceptionallyNoException() throws Throwable { TestContext ctx = new TestContext(1, TestContext.DEFAULT_WAIT_DURATION); AtomicInteger invocations = new AtomicInteger(); DeferredResult<Integer> original = new DeferredResult<>(); int recoverValue = 5; DeferredResult<Integer> result = original .exceptionally(ex -> { invocations.incrementAndGet(); return recoverValue; }) .thenApply(x -> x + 1); result.whenComplete(ctx.getCompletionDeferred()); runAfter(10, () -> original.complete(1)); ctx.await(); Assert.assertEquals(0, invocations.get()); Assert.assertEquals(2, result.getNow(exceptionSupplier()).intValue()); }
@Test public void testExceptionallyNoException() throws Throwable { TestContext ctx = new TestContext(1, TestContext.DEFAULT_WAIT_DURATION); AtomicInteger invocations = new AtomicInteger(); DeferredResult<Integer> original = new DeferredResult<>(); int recoverValue = 5; DeferredResult<Integer> result = original .exceptionally(ex -> { invocations.incrementAndGet(); return recoverValue; }) .thenApply(x -> x + 1); result.whenComplete(ctx.getCompletionDeferred()); runAfter(10, () -> original.complete(1)); ctx.await(); Assert.assertEquals(0, invocations.get()); Assert.assertEquals(2, result.getNow(exceptionSupplier()).intValue()); }
@Test public void testExceptionally() throws Throwable { TestContext ctx = new TestContext(1, TestContext.DEFAULT_WAIT_DURATION); AtomicInteger invocations = new AtomicInteger(); DeferredResult<Integer> original = new DeferredResult<>(); int recoverValue = 5; DeferredResult<Integer> result = original .exceptionally(ex -> { Assert.assertNotNull(ex); Assert.assertEquals(TestException.class, ex.getClass()); invocations.incrementAndGet(); return recoverValue; }) .thenApply(x -> x + 1); result.whenComplete(ctx.getCompletionDeferred()); runAfter(10, () -> original.fail(new TestException())); ctx.await(); Assert.assertEquals(1, invocations.get()); Assert.assertEquals(recoverValue + 1, result.getNow(exceptionSupplier()).intValue()); }
@Test public void testRecover() throws Throwable { TestContext ctx = this.host.testCreate(1); Operation get = Operation .createGet(host, UriUtils.buildUriPath(ExampleService.FACTORY_LINK, "unknown")); DeferredResult<ExampleServiceState> deferredResult = this.host.sendWithDeferredResult(get, ExampleServiceState.class) .exceptionally(ex -> { ExampleServiceState doc = new ExampleServiceState(); doc.name = "?"; return doc; }); ctx.await(deferredResult); ExampleServiceState doc = deferredResult.getNow(() -> null); Assert.assertEquals("?", doc.name); }