use of com.vmware.photon.controller.model.resources.IPAddressService.IPAddressState 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.photon.controller.model.resources.IPAddressService.IPAddressState 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.photon.controller.model.resources.IPAddressService.IPAddressState in project photon-model by vmware.
the class IPAddressServiceTest method buildValidStartState.
private static IPAddressState buildValidStartState() {
IPAddressState ipAddressState = new IPAddressState();
ipAddressState.id = UUID.randomUUID().toString();
ipAddressState.name = "ipAddress";
ipAddressState.ipAddress = "192.130.120.110";
ipAddressState.ipVersion = IPVersion.IPv4;
ipAddressState.ipAddressStatus = IPAddressStatus.ALLOCATED;
ipAddressState.subnetRangeLink = SubnetRangeService.FACTORY_LINK + "/subnet-range-1";
ipAddressState.tenantLinks = new ArrayList<>();
ipAddressState.tenantLinks.add("tenant-linkA");
ipAddressState.connectedResourceLink = ComputeService.FACTORY_LINK + "/machine-1";
return ipAddressState;
}
use of com.vmware.photon.controller.model.resources.IPAddressService.IPAddressState in project photon-model by vmware.
the class IPAddressAllocationTaskService method addResultToState.
private void addResultToState(IPAddressAllocationContext context, IPAddressAllocationTaskState state) {
state.subnetLink = context.subnetState.documentSelfLink;
List<String> ctxtSubnetRangeLinks = context.subnetRangeStates.stream().map(s -> s.documentSelfLink).collect(toList());
state.subnetRangeLinks.addAll(ctxtSubnetRangeLinks);
for (String connectedResource : context.connectedResourceToAllocatedIpsMap.keySet()) {
// Multiple IPs per connected resource
List<IPAddressState> addressStates = context.connectedResourceToAllocatedIpsMap.get(connectedResource);
List<String> ipAddressSelfLinks = new ArrayList<>();
for (IPAddressState ipAddressState : addressStates) {
ipAddressSelfLinks.add(ipAddressState.documentSelfLink);
state.ipAddresses.add(ipAddressState.ipAddress);
state.ipAddressLinks.add(ipAddressState.documentSelfLink);
}
state.rsrcToAllocatedIpsMap.put(connectedResource, ipAddressSelfLinks);
}
}
use of com.vmware.photon.controller.model.resources.IPAddressService.IPAddressState in project photon-model by vmware.
the class IPAddressAllocationTaskService method allocateIpInRange.
private DeferredResult<IPAddressAllocationContext> allocateIpInRange(IPAddressState ipAddressState, String connectedResourceLink, IPAddressAllocationContext context) {
// Found a record for the specified IP
if (IPAddressStatus.AVAILABLE.equals(ipAddressState.ipAddressStatus)) {
IPAddressState patchedState = new IPAddressState();
patchedState.ipAddressStatus = IPAddressStatus.ALLOCATED;
patchedState.connectedResourceLink = connectedResourceLink;
return sendWithDeferredResult(Operation.createPatch(this, ipAddressState.documentSelfLink).setBody(patchedState)).thenAccept(oper -> {
logInfo("Allocated IP address %s within range %s to resource %s", ipAddressState.ipAddress, context.subnetRangeState.name, connectedResourceLink);
addIpToContext(context, connectedResourceLink, ipAddressState);
}).thenApply(oper -> context);
} else {
if (connectedResourceLink.equals(ipAddressState.connectedResourceLink)) {
logInfo("IP address '%s' is already allocated to the same resource [%s]", ipAddressState.ipAddress, connectedResourceLink);
addIpToContext(context, connectedResourceLink, ipAddressState);
return DeferredResult.completed(context);
} else {
String errMsg = String.format("IP address '%s' is already allocated to a different resource [%s]", ipAddressState.ipAddress, ipAddressState.connectedResourceLink);
logSevere(errMsg);
return DeferredResult.failed(new IllegalArgumentException(errMsg));
}
}
}
Aggregations