use of com.vmware.xenon.common.DeferredResult in project photon-model by vmware.
the class IPAddressAllocationTaskService method deallocateIpAddress.
/**
* De-allocates an IP address, based on IP address resource link.
*
* @param state IP Address allocation task state.
*/
private void deallocateIpAddress(IPAddressAllocationTaskState state) {
IPAddressState addressState = new IPAddressState();
addressState.connectedResourceLink = state.connectedResourceLink;
addressState.ipAddressStatus = IPAddressState.IPAddressStatus.RELEASED;
List<DeferredResult<Operation>> deferredResults = new ArrayList<>();
for (int i = 0; i < state.ipAddressLinks.size(); i++) {
String ipAddressResourceLink = state.ipAddressLinks.get(i);
Operation patchOp = Operation.createPatch(this, ipAddressResourceLink).setBody(addressState);
deferredResults.add(this.sendWithDeferredResult(patchOp));
}
DeferredResult.allOf(deferredResults).thenAccept(dr -> proceedTo(IPAddressAllocationTaskState.SubStage.FINISHED, null)).exceptionally(e -> {
if (e != null) {
failTask(e, "Failed to de-allocate IP addresses due to failure %s", e.getMessage());
}
return null;
});
}
use of com.vmware.xenon.common.DeferredResult in project photon-model by vmware.
the class IPAddressAllocationTaskService method createNewIpAddressResource.
/**
* Creates new IP address resource with the specified IP address and moves the task state to completed,
* once it is done. Then it creates IP Address resource, it first creates it with AVAILABLE state. It then
* changes the state to ALLOCATED. This is done in two steps, due to concurrency issues. When multiple allocation
* requests are invoked at the same time, they end up creating single IP Address resource. Only one of them
* succeeds in their PATCH and the other one will retry the allocation operation.
*
* @param ipAddress IP address to use for the new IP address resource.
* @param subnetRangeResourceLink Subnet range resource link to use for the new IP address resource.
* @param connectedResourceLink Link to the resource this IP is assigned to.
*/
private DeferredResult<IPAddressState> createNewIpAddressResource(String ipAddress, String subnetRangeResourceLink, String connectedResourceLink, IPAddressAllocationContext context) {
IPAddressState ipAddressState = new IPAddressState();
ipAddressState.ipAddressStatus = IPAddressState.IPAddressStatus.AVAILABLE;
ipAddressState.ipAddress = ipAddress;
ipAddressState.subnetRangeLink = subnetRangeResourceLink;
ipAddressState.documentSelfLink = generateIPAddressDocumentSelfLink(subnetRangeResourceLink, ipAddress);
logInfo("Creating IPAddressState with IP %s, subnet %s, for connected resource " + "%s", ipAddress, subnetRangeResourceLink, connectedResourceLink);
return sendWithDeferredResult(Operation.createPost(this, IPAddressService.FACTORY_LINK).setBody(ipAddressState)).thenApply((out) -> {
IPAddressState availableIPAddress = out.getBody(IPAddressState.class);
availableIPAddress.ipAddressStatus = IPAddressState.IPAddressStatus.ALLOCATED;
availableIPAddress.connectedResourceLink = connectedResourceLink;
return availableIPAddress;
}).thenCompose((availableIPAddress) -> (updateExistingIpAddressResource(availableIPAddress, context)));
}
use of com.vmware.xenon.common.DeferredResult in project photon-model by vmware.
the class ImageEnumerationTaskService method deletePublicImagesByEndpointType.
private DeferredResult<SendImageEnumerationAdapterContext> deletePublicImagesByEndpointType(SendImageEnumerationAdapterContext ctx) {
QueryByPages<ImageState> queryAll = new QueryByPages<ImageState>(getHost(), publicImagesByEndpointTypeQuery(ctx).build(), ImageState.class, null).setQueryTaskTenantLinks(ctx.taskState.tenantLinks);
queryAll.setMaxPageSize(QueryUtils.DEFAULT_MAX_RESULT_LIMIT);
queryAll.setClusterType(ServiceTypeCluster.INVENTORY_SERVICE);
final List<DeferredResult<Operation>> deleteDRs = new ArrayList<>();
queryAll.queryLinks(imageLink -> {
Operation delOp = Operation.createDelete(UriUtils.buildUri(getHost(), imageLink));
DeferredResult<Operation> delDR = sendWithDeferredResult(delOp).whenComplete((op, e) -> {
final String msg = "Deleting '%s' public image state [%s]";
if (e != null) {
// Be tolerant on individual images delete
log(Level.WARNING, () -> String.format(msg + ": FAILED with %s", ctx.taskState.endpointType, imageLink, Utils.toString(e)));
} else {
log(Level.FINEST, () -> String.format(msg + ": SUCCESS", ctx.taskState.endpointType, imageLink));
}
});
deleteDRs.add(delDR);
});
return DeferredResult.allOf(deleteDRs).thenApply(ignore -> ctx);
}
use of com.vmware.xenon.common.DeferredResult in project photon-model by vmware.
the class ResourceAllocationTaskService method createDiskResources.
/**
* Create disks to attach to the compute resource. Use the disk description links to figure out
* what type of disks to create.
*
* @param currentState
* @param parentLink
* @param computeResourceId
*/
private void createDiskResources(ResourceAllocationTaskState currentState, ComputeDescription cd, String parentLink, String computeResourceId, String name, List<String> networkLinks) {
if (cd.diskDescLinks == null || cd.diskDescLinks.isEmpty()) {
createComputeResource(currentState, cd, parentLink, computeResourceId, name, new ArrayList<>(), networkLinks);
return;
}
DeferredResult<List<String>> result = DeferredResult.allOf(cd.diskDescLinks.stream().map(link -> {
Operation op = Operation.createGet(this, link);
return this.sendWithDeferredResult(op, DiskState.class);
}).map(dr -> dr.thenCompose(d -> {
String link = d.documentSelfLink;
// create a new disk based off the template but use a
// unique ID
d.id = UUID.randomUUID().toString();
d.documentSelfLink = null;
d.tenantLinks = currentState.tenantLinks;
if (d.customProperties == null) {
d.customProperties = new HashMap<>();
}
d.descriptionLink = link;
return this.sendWithDeferredResult(Operation.createPost(this, DiskService.FACTORY_LINK).setBody(d), DiskState.class);
})).map(dsr -> dsr.thenApply(ds -> ds.documentSelfLink)).collect(Collectors.toList()));
result.whenComplete((diskLinks, e) -> {
if (e != null) {
logWarning(() -> String.format("Failure creating disk: %s", e.toString()));
this.sendFailureSelfPatch(e);
return;
}
// we have created all the disks. Now create the compute host
// resource
createComputeResource(currentState, cd, parentLink, computeResourceId, name, diskLinks, networkLinks);
});
}
use of com.vmware.xenon.common.DeferredResult in project photon-model by vmware.
the class IPAddressReleaseTaskService method markIPAddressesAsAvailable.
/**
* Releases IP Addresses and marks them as available.
* @param ipAddressStates IP Address states
*/
private DeferredResult<List<Operation>> markIPAddressesAsAvailable(List<IPAddressService.IPAddressState> ipAddressStates) {
IPAddressService.IPAddressState addressState = new IPAddressService.IPAddressState();
addressState.ipAddressStatus = IPAddressService.IPAddressState.IPAddressStatus.AVAILABLE;
List<DeferredResult<Operation>> ipAddressOperations = new ArrayList<>();
for (IPAddressService.IPAddressState ipAddressState : ipAddressStates) {
Operation patchOp = Operation.createPatch(this, ipAddressState.documentSelfLink).setBody(addressState).setCompletion((o, e) -> {
if (e != null) {
logWarning("Failed to mark IP address resource %s as available due to failure %s", ipAddressState.ipAddress, e.getMessage());
} else {
logInfo("The IP address %s is made available", ipAddressState.ipAddress);
}
});
ipAddressOperations.add(this.sendWithDeferredResult(patchOp));
}
return DeferredResult.allOf(ipAddressOperations);
}
Aggregations