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);
});
}
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);
});
}
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);
}
});
}
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);
});
}
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);
}
Aggregations