Search in sources :

Example 76 with Operation

use of com.vmware.xenon.common.Operation 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;
    });
}
Also used : IpHelper(com.vmware.photon.controller.model.util.IpHelper) Service(com.vmware.xenon.common.Service) IPAddressStatus(com.vmware.photon.controller.model.resources.IPAddressService.IPAddressState.IPAddressStatus) IPVersion(com.vmware.photon.controller.model.support.IPVersion) IPAddressState(com.vmware.photon.controller.model.resources.IPAddressService.IPAddressState) ServiceTypeCluster(com.vmware.photon.controller.model.util.ClusterUtil.ServiceTypeCluster) SubnetValidator(com.vmware.photon.controller.model.util.SubnetValidator) QueryTask(com.vmware.xenon.services.common.QueryTask) STORE_ONLY(com.vmware.xenon.common.ServiceDocumentDescription.PropertyIndexingOption.STORE_ONLY) ServiceDocument(com.vmware.xenon.common.ServiceDocument) LINKS(com.vmware.xenon.common.ServiceDocumentDescription.PropertyUsageOption.LINKS) HashMap(java.util.HashMap) PhotonModelUtils(com.vmware.photon.controller.model.resources.util.PhotonModelUtils) StringUtils(org.apache.commons.lang3.StringUtils) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) Utils(com.vmware.xenon.common.Utils) UriPaths(com.vmware.photon.controller.model.UriPaths) SubnetState(com.vmware.photon.controller.model.resources.SubnetService.SubnetState) Map(java.util.Map) IPAddressService(com.vmware.photon.controller.model.resources.IPAddressService) SINGLE_ASSIGNMENT(com.vmware.xenon.common.ServiceDocumentDescription.PropertyUsageOption.SINGLE_ASSIGNMENT) SERVICE_USE(com.vmware.xenon.common.ServiceDocumentDescription.PropertyUsageOption.SERVICE_USE) ServiceErrorResponse(com.vmware.xenon.common.ServiceErrorResponse) Operation(com.vmware.xenon.common.Operation) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) QueryUtils(com.vmware.photon.controller.model.query.QueryUtils) Set(java.util.Set) CompletionException(java.util.concurrent.CompletionException) Collectors(java.util.stream.Collectors) Consumer(java.util.function.Consumer) Collectors.toList(java.util.stream.Collectors.toList) OPTIONAL(com.vmware.xenon.common.ServiceDocumentDescription.PropertyUsageOption.OPTIONAL) List(java.util.List) ServiceTaskCallbackResponse(com.vmware.photon.controller.model.tasks.ServiceTaskCallback.ServiceTaskCallbackResponse) DeferredResult(com.vmware.xenon.common.DeferredResult) UriUtils(com.vmware.xenon.common.UriUtils) SubnetRangeState(com.vmware.photon.controller.model.resources.SubnetRangeService.SubnetRangeState) Optional(java.util.Optional) ReleaseConstants(com.vmware.photon.controller.model.constants.ReleaseConstants) TaskState(com.vmware.xenon.common.TaskState) ServiceDocumentDescription(com.vmware.xenon.common.ServiceDocumentDescription) TaskService(com.vmware.xenon.services.common.TaskService) Since(com.esotericsoftware.kryo.serializers.VersionFieldSerializer.Since) IPAddressState(com.vmware.photon.controller.model.resources.IPAddressService.IPAddressState) ArrayList(java.util.ArrayList) Operation(com.vmware.xenon.common.Operation) DeferredResult(com.vmware.xenon.common.DeferredResult)

Example 77 with Operation

use of com.vmware.xenon.common.Operation 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)));
}
Also used : IpHelper(com.vmware.photon.controller.model.util.IpHelper) Service(com.vmware.xenon.common.Service) IPAddressStatus(com.vmware.photon.controller.model.resources.IPAddressService.IPAddressState.IPAddressStatus) IPVersion(com.vmware.photon.controller.model.support.IPVersion) IPAddressState(com.vmware.photon.controller.model.resources.IPAddressService.IPAddressState) ServiceTypeCluster(com.vmware.photon.controller.model.util.ClusterUtil.ServiceTypeCluster) SubnetValidator(com.vmware.photon.controller.model.util.SubnetValidator) QueryTask(com.vmware.xenon.services.common.QueryTask) STORE_ONLY(com.vmware.xenon.common.ServiceDocumentDescription.PropertyIndexingOption.STORE_ONLY) ServiceDocument(com.vmware.xenon.common.ServiceDocument) LINKS(com.vmware.xenon.common.ServiceDocumentDescription.PropertyUsageOption.LINKS) HashMap(java.util.HashMap) PhotonModelUtils(com.vmware.photon.controller.model.resources.util.PhotonModelUtils) StringUtils(org.apache.commons.lang3.StringUtils) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) Utils(com.vmware.xenon.common.Utils) UriPaths(com.vmware.photon.controller.model.UriPaths) SubnetState(com.vmware.photon.controller.model.resources.SubnetService.SubnetState) Map(java.util.Map) IPAddressService(com.vmware.photon.controller.model.resources.IPAddressService) SINGLE_ASSIGNMENT(com.vmware.xenon.common.ServiceDocumentDescription.PropertyUsageOption.SINGLE_ASSIGNMENT) SERVICE_USE(com.vmware.xenon.common.ServiceDocumentDescription.PropertyUsageOption.SERVICE_USE) ServiceErrorResponse(com.vmware.xenon.common.ServiceErrorResponse) Operation(com.vmware.xenon.common.Operation) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) QueryUtils(com.vmware.photon.controller.model.query.QueryUtils) Set(java.util.Set) CompletionException(java.util.concurrent.CompletionException) Collectors(java.util.stream.Collectors) Consumer(java.util.function.Consumer) Collectors.toList(java.util.stream.Collectors.toList) OPTIONAL(com.vmware.xenon.common.ServiceDocumentDescription.PropertyUsageOption.OPTIONAL) List(java.util.List) ServiceTaskCallbackResponse(com.vmware.photon.controller.model.tasks.ServiceTaskCallback.ServiceTaskCallbackResponse) DeferredResult(com.vmware.xenon.common.DeferredResult) UriUtils(com.vmware.xenon.common.UriUtils) SubnetRangeState(com.vmware.photon.controller.model.resources.SubnetRangeService.SubnetRangeState) Optional(java.util.Optional) ReleaseConstants(com.vmware.photon.controller.model.constants.ReleaseConstants) TaskState(com.vmware.xenon.common.TaskState) ServiceDocumentDescription(com.vmware.xenon.common.ServiceDocumentDescription) TaskService(com.vmware.xenon.services.common.TaskService) Since(com.esotericsoftware.kryo.serializers.VersionFieldSerializer.Since) IPAddressState(com.vmware.photon.controller.model.resources.IPAddressService.IPAddressState)

Example 78 with Operation

use of com.vmware.xenon.common.Operation in project photon-model by vmware.

the class ImageEnumerationTaskService method getImageEnumerationAdapterReference.

/**
 * Go to {@link PhotonModelAdaptersRegistryService Service Registry} and get the
 * 'image-enumeration' URI for passed end-point.
 *
 * @return <code>null</code> is returned if 'image-enumeration' adapter is not registered by
 *         passed end-point.
 *
 * @see PhotonModelAdapterConfig
 * @see AdapterTypePath#IMAGE_ENUMERATION_ADAPTER
 */
private DeferredResult<SendImageEnumerationAdapterContext> getImageEnumerationAdapterReference(SendImageEnumerationAdapterContext ctx) {
    // Use 'endpointType' (such as aws, azure) as AdapterConfig id/selfLink!
    String configLink = buildUriPath(PhotonModelAdaptersConfigAccessService.SELF_LINK, ctx.endpointState.endpointType);
    Operation getConfigOp = Operation.createGet(this, configLink);
    return sendWithDeferredResult(getConfigOp, PhotonModelAdapterConfig.class).thenApply(endpointConfig -> {
        // Lookup the 'image-enumeration' URI for passed end-point
        if (endpointConfig.adapterEndpoints != null) {
            String uriStr = endpointConfig.adapterEndpoints.get(AdapterTypePath.IMAGE_ENUMERATION_ADAPTER.key);
            if (uriStr != null && !uriStr.isEmpty()) {
                ctx.adapterRef = URI.create(uriStr);
            }
        }
        logInfo(() -> String.format("[getImageEnumerationAdapterReference] adapterRef = %s: SUCCESS", ctx.adapterRef));
        return ctx;
    });
}
Also used : Operation(com.vmware.xenon.common.Operation) PhotonModelAdapterConfig(com.vmware.photon.controller.model.adapters.registry.PhotonModelAdaptersRegistryService.PhotonModelAdapterConfig)

Example 79 with Operation

use of com.vmware.xenon.common.Operation 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);
}
Also used : ArrayList(java.util.ArrayList) Operation(com.vmware.xenon.common.Operation) ImageState(com.vmware.photon.controller.model.resources.ImageService.ImageState) DeferredResult(com.vmware.xenon.common.DeferredResult)

Example 80 with Operation

use of com.vmware.xenon.common.Operation in project photon-model by vmware.

the class ImageEnumerationTaskService method callImageEnumerationAdapter.

/**
 * Call 'image-enumeration' adapter if registered by the end-point OR fail if not registered.
 */
private DeferredResult<SendImageEnumerationAdapterContext> callImageEnumerationAdapter(SendImageEnumerationAdapterContext ctx) {
    if (ctx.adapterRef == null) {
        // No 'image-enumeration' URI registered for passed end-point
        return DeferredResult.failed(new IllegalStateException(String.format("No '%s' URI registered by '%s' end-point.", AdapterTypePath.IMAGE_ENUMERATION_ADAPTER.key, ctx.taskState.endpointType)));
    }
    // Create 'image-enumeration' adapter request
    final ImageEnumerateRequest adapterReq = new ImageEnumerateRequest();
    // Set ImageEnumerateRequest specific params
    adapterReq.enumerationAction = ctx.taskState.enumerationAction;
    if (ctx.taskState.enumeratePrivateImages()) {
        adapterReq.requestType = ImageEnumerateRequestType.PRIVATE;
    } else if (ctx.taskState.enumeratePublicImages()) {
        adapterReq.requestType = ImageEnumerateRequestType.PUBLIC;
    }
    // Set generic ResourceRequest params
    // The end-point is ALWAYS set regardless of Private/Public enum type
    // In case of Public, end-point credentials are used to run the enumeration
    adapterReq.resourceReference = createInventoryUri(this.getHost(), ctx.endpointState.documentSelfLink);
    adapterReq.regionId = ctx.taskState.regionId;
    adapterReq.taskReference = buildUri(getHost(), ctx.taskState.documentSelfLink);
    adapterReq.isMockRequest = ctx.taskState.options.contains(TaskOption.IS_MOCK);
    Operation callAdapterOp = Operation.createPatch(ctx.adapterRef).setBody(adapterReq);
    return sendWithDeferredResult(callAdapterOp).thenApply(op -> {
        logInfo(() -> String.format("[callImageEnumerationAdapter] adpterRef = %s: SUCCESS", op.getUri()));
        return ctx;
    });
}
Also used : ImageEnumerateRequest(com.vmware.photon.controller.model.adapterapi.ImageEnumerateRequest) Operation(com.vmware.xenon.common.Operation)

Aggregations

Operation (com.vmware.xenon.common.Operation)391 URI (java.net.URI)142 ArrayList (java.util.ArrayList)132 QueryTask (com.vmware.xenon.services.common.QueryTask)118 List (java.util.List)118 Utils (com.vmware.xenon.common.Utils)111 StatelessService (com.vmware.xenon.common.StatelessService)108 UriUtils (com.vmware.xenon.common.UriUtils)106 ComputeState (com.vmware.photon.controller.model.resources.ComputeService.ComputeState)98 Map (java.util.Map)92 HashMap (java.util.HashMap)90 OperationJoin (com.vmware.xenon.common.OperationJoin)86 Query (com.vmware.xenon.services.common.QueryTask.Query)86 QueryUtils (com.vmware.photon.controller.model.query.QueryUtils)82 Collectors (java.util.stream.Collectors)79 HashSet (java.util.HashSet)78 AuthCredentialsServiceState (com.vmware.xenon.services.common.AuthCredentialsService.AuthCredentialsServiceState)73 AdapterUtils (com.vmware.photon.controller.model.adapters.util.AdapterUtils)70 DeferredResult (com.vmware.xenon.common.DeferredResult)69 Consumer (java.util.function.Consumer)69