Search in sources :

Example 1 with Query

use of com.vmware.xenon.services.common.QueryTask.Query in project photon-model by vmware.

the class AWSComputeStateCreationAdapterService method collectEbsDiskLinks.

/**
 * Collect EBS selfLinks by querying for all EBS disk IDs. Map these selfLinks to
 * their respective instances. These will be used for reconciliation with local state while
 * creating/updating compute state's diskLinks.
 */
private void collectEbsDiskLinks(AWSComputeStateCreationContext context, AWSComputeStateCreationStage next) {
    List<String> diskIds = new ArrayList<>();
    Map<String, Instance> instancesByDiskIds = new HashMap<>();
    context.request.instancesToBeCreated.stream().forEach(instance -> {
        instance.getBlockDeviceMappings().stream().forEach(instanceBlockDeviceMapping -> {
            String id = instanceBlockDeviceMapping.getEbs().getVolumeId();
            instancesByDiskIds.put(id, instance);
            diskIds.add(id);
        });
    });
    context.request.instancesToBeUpdated.values().stream().forEach(instance -> {
        instance.getBlockDeviceMappings().stream().forEach(instanceBlockDeviceMapping -> {
            String id = instanceBlockDeviceMapping.getEbs().getVolumeId();
            instancesByDiskIds.put(id, instance);
            diskIds.add(id);
        });
    });
    // No disks found for current page of instances.
    if (diskIds.isEmpty()) {
        context.creationStage = next;
        handleComputeStateCreateOrUpdate(context);
        return;
    }
    Query ebsQuery = Query.Builder.create().addKindFieldClause(DiskState.class).addCollectionItemClause(ResourceState.FIELD_NAME_ENDPOINT_LINKS, context.request.endpointLink).addInClause(DiskState.FIELD_NAME_ID, diskIds).build();
    QueryTask ebsQueryTask = QueryTask.Builder.createDirectTask().setQuery(ebsQuery).addOption(QueryOption.EXPAND_CONTENT).build();
    ebsQueryTask.tenantLinks = context.request.tenantLinks;
    QueryUtils.startInventoryQueryTask(this, ebsQueryTask).whenComplete((qrt, e) -> {
        if (e != null) {
            logWarning("Error querying diskLinks for endpoint %s", context.request.endpointLink);
            context.creationStage = next;
            handleComputeStateCreateOrUpdate(context);
            return;
        }
        if (qrt.results != null && qrt.results.documentCount > 0) {
            qrt.results.documents.entrySet().forEach(entry -> {
                DiskState state = Utils.fromJson(entry.getValue(), DiskState.class);
                Instance instance = instancesByDiskIds.get(state.id);
                if (instance != null) {
                    if (context.diskLinksByInstances.containsKey(instance)) {
                        context.diskLinksByInstances.get(instance).add(entry.getKey());
                    } else {
                        context.diskLinksByInstances.put(instance, new ArrayList<>(Arrays.asList(entry.getKey())));
                    }
                }
            });
        }
        context.creationStage = next;
        handleComputeStateCreateOrUpdate(context);
    });
}
Also used : QueryTask(com.vmware.xenon.services.common.QueryTask) Query(com.vmware.xenon.services.common.QueryTask.Query) AWSEnumerationUtils.getCDsRepresentingVMsInLocalSystemCreatedByEnumerationQuery(com.vmware.photon.controller.model.adapters.awsadapter.util.AWSEnumerationUtils.getCDsRepresentingVMsInLocalSystemCreatedByEnumerationQuery) Instance(com.amazonaws.services.ec2.model.Instance) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) HashMap(java.util.HashMap) DiskState(com.vmware.photon.controller.model.resources.DiskService.DiskState) ArrayList(java.util.ArrayList)

Example 2 with Query

use of com.vmware.xenon.services.common.QueryTask.Query in project photon-model by vmware.

the class AWSEnumerationAndDeletionAdapterService method getLocalResources.

/**
 * Get the list of compute states already known to the local system. Filter them by parent
 * compute link : AWS.
 */
public void getLocalResources(EnumerationDeletionContext context, AWSEnumerationDeletionSubStage next) {
    // query all ComputeState resources known to the local system.
    logFine(() -> "Getting local resources that need to be reconciled with the AWS endpoint.");
    Query.Builder qBuilder = Query.Builder.create().addKindFieldClause(ComputeState.class).addFieldClause(ComputeState.FIELD_NAME_PARENT_LINK, context.request.original.resourceLink()).addInClause(ComputeState.FIELD_NAME_LIFECYCLE_STATE, Arrays.asList(LifecycleState.PROVISIONING.toString(), LifecycleState.RETIRED.toString()), Occurance.MUST_NOT_OCCUR);
    addScopeCriteria(qBuilder, context);
    QueryTask queryTask = QueryTask.Builder.createDirectTask().setQuery(qBuilder.build()).addOption(QueryOption.EXPAND_CONTENT).setResultLimit(getQueryResultLimit()).build();
    queryTask.tenantLinks = context.parentCompute.tenantLinks;
    // create the query to find resources
    QueryUtils.startInventoryQueryTask(this, queryTask).whenComplete((qrt, e) -> {
        if (e != null) {
            logSevere(() -> String.format("Failure retrieving query results: %s", e.toString()));
            signalErrorToEnumerationAdapter(context, e);
            return;
        }
        populateLocalInstanceInformationFromQueryResults(context, qrt);
        logFine(() -> String.format("Got page No. %d of local resources. %d instances" + " found.", context.pageNo, qrt.results.documentCount));
        context.subStage = next;
        deleteResourcesInLocalSystem(context);
    });
}
Also used : QueryTask(com.vmware.xenon.services.common.QueryTask) Query(com.vmware.xenon.services.common.QueryTask.Query)

Example 3 with Query

use of com.vmware.xenon.services.common.QueryTask.Query in project photon-model by vmware.

the class AWSNetworkService method deleteSubnetStates.

/**
 * Delete all subnet states that refer the NetworkState we are about to delete.
 */
private void deleteSubnetStates(AWSNetworkContext context, AWSNetworkStage next) {
    Query queryForReferrers = QueryUtils.queryForReferrers(context.network.documentSelfLink, SubnetState.class, SubnetState.FIELD_NAME_NETWORK_LINK);
    QueryByPages<SubnetState> subnetStates = new QueryByPages<>(getHost(), queryForReferrers, SubnetState.class, context.network.tenantLinks, context.network.endpointLink);
    subnetStates.setClusterType(ServiceTypeCluster.INVENTORY_SERVICE);
    DeferredResult<Void> query = subnetStates.queryDocuments(subnetState -> {
        // First delete Subnet in AWS
        try {
            context.client.deleteSubnet(subnetState.id);
        } catch (AmazonEC2Exception ex) {
            if (AWSNetworkClient.STATUS_CODE_SUBNET_NOT_FOUND.equals(ex.getErrorCode())) {
                // Ignore exception if the subnet is no longer available in AWS.
                this.logWarning(() -> "Unable to delete the subnet in AWS. Reason: " + ex.getMessage());
            } else {
                throw ex;
            }
        }
        // Then delete tracking SubnetState
        Operation.createDelete(this, subnetState.documentSelfLink).sendWith(this);
    });
    query.whenComplete((v, e) -> {
        if (e != null) {
            handleStages(context, e);
        } else {
            handleStages(context, next);
        }
    });
}
Also used : QueryByPages(com.vmware.photon.controller.model.query.QueryUtils.QueryByPages) Query(com.vmware.xenon.services.common.QueryTask.Query) SubnetState(com.vmware.photon.controller.model.resources.SubnetService.SubnetState) AmazonEC2Exception(com.amazonaws.services.ec2.model.AmazonEC2Exception)

Example 4 with Query

use of com.vmware.xenon.services.common.QueryTask.Query in project photon-model by vmware.

the class AzureSubscriptionEndpointsEnumerationService method fetchExistingSubscriptionEndpoints.

private void fetchExistingSubscriptionEndpoints(AzureSubscriptionEndpointsEnumerationContext enumerationContext, AzureSubscriptionEndpointComputeEnumerationStages nextStage) {
    Query azureEndpointsQuery = createQueryForAzureSubscriptionEndpoints(enumerationContext);
    // Use Top query with 10K max EndpointStates
    QueryTop<EndpointState> querySubscriptionEndpoints = new QueryTop<>(getHost(), azureEndpointsQuery, EndpointState.class, enumerationContext.parent.tenantLinks);
    querySubscriptionEndpoints.setClusterType(ServiceTypeCluster.INVENTORY_SERVICE);
    querySubscriptionEndpoints.queryDocuments(epState -> {
        if (epState.endpointProperties != null && epState.endpointProperties.containsKey(EndpointConfigRequest.USER_LINK_KEY)) {
            String subscriptionUuid = epState.endpointProperties.get(EndpointConfigRequest.USER_LINK_KEY);
            enumerationContext.idToSubscription.remove(subscriptionUuid);
        }
    }).whenComplete((aVoid, t) -> {
        if (t != null) {
            getFailureConsumer(enumerationContext).accept(t);
            return;
        }
        enumerationContext.stage = nextStage;
        handleAzureCostComputeEnumerationRequest(enumerationContext);
    });
}
Also used : EndpointState(com.vmware.photon.controller.model.resources.EndpointService.EndpointState) AdapterUtils(com.vmware.photon.controller.model.adapters.util.AdapterUtils) StatelessService(com.vmware.xenon.common.StatelessService) Collection(java.util.Collection) ServiceTypeCluster(com.vmware.photon.controller.model.util.ClusterUtil.ServiceTypeCluster) Operation(com.vmware.xenon.common.Operation) AzureUriPaths(com.vmware.photon.controller.model.adapters.azure.AzureUriPaths) BaseAdapterStage(com.vmware.photon.controller.model.adapters.util.BaseAdapterContext.BaseAdapterStage) BaseAdapterContext(com.vmware.photon.controller.model.adapters.util.BaseAdapterContext) Collectors(java.util.stream.Collectors) QueryTop(com.vmware.photon.controller.model.query.QueryUtils.QueryTop) ResourceRequest(com.vmware.photon.controller.model.adapterapi.ResourceRequest) Consumer(java.util.function.Consumer) Utils(com.vmware.xenon.common.Utils) EndpointConfigRequest(com.vmware.photon.controller.model.adapterapi.EndpointConfigRequest) Query(com.vmware.xenon.services.common.QueryTask.Query) AzureSubscriptionEndpointCreationRequest(com.vmware.photon.controller.model.adapters.azure.ea.enumeration.AzureSubscriptionEndpointCreationService.AzureSubscriptionEndpointCreationRequest) ClusterUtil(com.vmware.photon.controller.model.util.ClusterUtil) Map(java.util.Map) UriUtils(com.vmware.xenon.common.UriUtils) EndpointType(com.vmware.photon.controller.model.constants.PhotonModelConstants.EndpointType) AzureSubscription(com.vmware.photon.controller.model.adapters.azure.model.cost.AzureSubscription) OperationJoin(com.vmware.xenon.common.OperationJoin) EndpointState(com.vmware.photon.controller.model.resources.EndpointService.EndpointState) Query(com.vmware.xenon.services.common.QueryTask.Query) QueryTop(com.vmware.photon.controller.model.query.QueryUtils.QueryTop)

Example 5 with Query

use of com.vmware.xenon.services.common.QueryTask.Query in project photon-model by vmware.

the class AzureComputeHostStatsGatherer method handleComputeQueryCompletion.

/**
 * Get all the children computes and create a query task for each to query the metrics.
 */
private void handleComputeQueryCompletion(QueryTask queryTask, Throwable failure, AzureStatsDataHolder statsData) {
    if (failure != null) {
        logSevere(failure.getMessage());
        statsData.error = failure;
        statsData.stage = ComputeHostMetricsStages.ERROR;
        handleMetricDiscovery(statsData);
        return;
    }
    if (queryTask == null || queryTask.results == null) {
        sendFailurePatch(statsData, new RuntimeException(String.format("Unexpected query result for '%s'", queryTask.documentSelfLink)));
        return;
    }
    if (queryTask.results.documentLinks != null) {
        statsData.childComputeLinks.addAll(queryTask.results.documentLinks);
    }
    if (queryTask.results.nextPageLink != null) {
        Operation op = Operation.createGet(createInventoryUri(this.getHost(), queryTask.results.nextPageLink));
        sendWithDeferredResult(op).whenComplete((o, e) -> handleComputeQueryCompletion(o.getBody(QueryTask.class), e, statsData));
        return;
    }
    int computeCount = Math.toIntExact(statsData.childComputeLinks.size());
    // No children found, proceed to finish
    if (computeCount <= 0) {
        statsData.stage = ComputeHostMetricsStages.FINISHED;
        handleMetricDiscovery(statsData);
        return;
    }
    // Create multiple operations, one each for a VM compute.
    List<Operation> statOperations = new ArrayList<>(computeCount);
    for (String computeLink : statsData.childComputeLinks) {
        Operation statsOp = getStatsQueryTaskOperation(statsData, computeLink);
        statOperations.add(statsOp);
    }
    OperationJoin.create(statOperations).setCompletion((ops, failures) -> handleQueryTaskResponseAndConsolidateStats(ops, failures, statsData)).sendWith(this, 50);
}
Also used : ServiceTypeCluster(com.vmware.photon.controller.model.util.ClusterUtil.ServiceTypeCluster) QueryTask(com.vmware.xenon.services.common.QueryTask) ServiceDocument(com.vmware.xenon.common.ServiceDocument) HashMap(java.util.HashMap) AzureUriPaths(com.vmware.photon.controller.model.adapters.azure.AzureUriPaths) ResourceMetricsService(com.vmware.photon.controller.model.monitoring.ResourceMetricsService) MatchType(com.vmware.xenon.services.common.QueryTask.QueryTerm.MatchType) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) Utils(com.vmware.xenon.common.Utils) Query(com.vmware.xenon.services.common.QueryTask.Query) ComputeState(com.vmware.photon.controller.model.resources.ComputeService.ComputeState) Map(java.util.Map) URI(java.net.URI) ComputeStats(com.vmware.photon.controller.model.adapterapi.ComputeStatsResponse.ComputeStats) ExecutorService(java.util.concurrent.ExecutorService) AdapterUtils(com.vmware.photon.controller.model.adapters.util.AdapterUtils) AzureConstants.getQueryResultLimit(com.vmware.photon.controller.model.adapters.azure.constants.AzureConstants.getQueryResultLimit) ComputeStatsResponse(com.vmware.photon.controller.model.adapterapi.ComputeStatsResponse) ComputeStatsRequest(com.vmware.photon.controller.model.adapterapi.ComputeStatsRequest) StatelessService(com.vmware.xenon.common.StatelessService) Operation(com.vmware.xenon.common.Operation) QueryUtils(com.vmware.photon.controller.model.query.QueryUtils) Set(java.util.Set) ServiceStat(com.vmware.xenon.common.ServiceStats.ServiceStat) Consumer(java.util.function.Consumer) List(java.util.List) ConcurrentSkipListMap(java.util.concurrent.ConcurrentSkipListMap) UriUtils(com.vmware.xenon.common.UriUtils) PhotonModelConstants(com.vmware.photon.controller.model.constants.PhotonModelConstants) ComputeService(com.vmware.photon.controller.model.resources.ComputeService) QueryOption(com.vmware.xenon.services.common.QueryTask.QuerySpecification.QueryOption) Collections(java.util.Collections) OperationJoin(com.vmware.xenon.common.OperationJoin) PhotonModelUriUtils.createInventoryUri(com.vmware.photon.controller.model.util.PhotonModelUriUtils.createInventoryUri) ResourceMetrics(com.vmware.photon.controller.model.monitoring.ResourceMetricsService.ResourceMetrics) ArrayList(java.util.ArrayList) Operation(com.vmware.xenon.common.Operation)

Aggregations

Query (com.vmware.xenon.services.common.QueryTask.Query)81 QueryTask (com.vmware.xenon.services.common.QueryTask)50 Operation (com.vmware.xenon.common.Operation)39 ArrayList (java.util.ArrayList)29 HashMap (java.util.HashMap)26 ComputeState (com.vmware.photon.controller.model.resources.ComputeService.ComputeState)25 Utils (com.vmware.xenon.common.Utils)22 List (java.util.List)21 Map (java.util.Map)21 QueryUtils (com.vmware.photon.controller.model.query.QueryUtils)20 UriUtils (com.vmware.xenon.common.UriUtils)20 HashSet (java.util.HashSet)20 QueryByPages (com.vmware.photon.controller.model.query.QueryUtils.QueryByPages)19 ServiceTypeCluster (com.vmware.photon.controller.model.util.ClusterUtil.ServiceTypeCluster)18 Set (java.util.Set)18 URI (java.net.URI)17 OperationJoin (com.vmware.xenon.common.OperationJoin)16 StatelessService (com.vmware.xenon.common.StatelessService)16 Collections (java.util.Collections)15 Collectors (java.util.stream.Collectors)15