private void cleanKubernetesDescriptionsAndFail(List<String> selfLinks, Map<Long, Throwable> errors, Operation op) { if (selfLinks == null || selfLinks.isEmpty()) { failOperation(op, errors, new IllegalStateException(FAIL_ON_CREATE_MSG)); return; } logWarning("Cleaning successfully created Kubernetes Descriptions"); List<Operation> deleteOps = new ArrayList<>(); for (String selfLink : selfLinks) { deleteOps.add(Operation.createDelete(this, selfLink)); } OperationJoin.create(deleteOps) .setCompletion((ops, errs) -> { if (errs != null) { errs.values().forEach(e -> logWarning(Utils.toString(e))); } op.fail(new IllegalStateException(FAIL_ON_CREATE_MSG)); }).sendWith(this); }
@Override public void handlePost(Operation post) { if (!post.hasBody()) { post.fail(new LocalizableValidationException("body is required", "compute.body" + ".required")); return; } List<String> kubernetesDefinitions = splitYaml(post.getBody(String.class)); OperationJoin.create(createOperations(kubernetesDefinitions)) .setCompletion((ops, errors) -> { List<String> resourceLinks = new ArrayList<>(); ops.values().forEach(o -> { if (o == null) { return; } KubernetesDescription desc = o.getBody(KubernetesDescription.class); if (!isNullOrEmpty(desc.documentSelfLink)) { resourceLinks.add(desc.documentSelfLink); } }); if (errors != null) { errors.values().forEach(e -> logWarning("Failed to create " + "KubernetesDescription: %s", Utils.toString(e))); cleanKubernetesDescriptionsAndFail(resourceLinks, errors, post); } else { post.setBody(resourceLinks); post.complete(); } }).sendWith(this); }