use of com.vmware.xenon.services.common.QueryTask.Query in project photon-model by vmware.
the class StatsCollectionTaskServiceTest method testStatsQueryCustomization.
@Test
public void testStatsQueryCustomization() throws Throwable {
// Before start clear Computes (if any)
ServiceDocumentQueryResult computes = this.host.getFactoryState(UriUtils.buildExpandLinksQueryUri(UriUtils.buildUri(this.host, ComputeService.FACTORY_LINK)));
for (Map.Entry<String, Object> t : computes.documents.entrySet()) {
deleteServiceSynchronously(t.getKey());
}
// create a compute description for all the computes
ComputeDescription cDesc = new ComputeDescription();
cDesc.name = UUID.randomUUID().toString();
cDesc.statsAdapterReference = UriUtils.buildUri(this.host, MockStatsAdapter.SELF_LINK);
ComputeDescription descReturnState = postServiceSynchronously(ComputeDescriptionService.FACTORY_LINK, cDesc, ComputeDescription.class);
// create multiple computes
ComputeState computeState = new ComputeState();
computeState.name = UUID.randomUUID().toString();
computeState.descriptionLink = descReturnState.documentSelfLink;
List<String> computeLinks = new ArrayList<>();
// Create 20 Computes of different type.
for (int i = 0; i < 20; i++) {
// Set even computes to be ENDPOINT_HOST, the odd one -> VM_GUEST
if (i % 2 == 0) {
computeState.type = ComputeType.ENDPOINT_HOST;
} else {
computeState.type = ComputeType.VM_GUEST;
}
ComputeState res = postServiceSynchronously(ComputeService.FACTORY_LINK, computeState, ComputeState.class);
computeLinks.add(res.documentSelfLink);
}
// create a resource pool including all the created computes. It will be customized during
// StatsCollection task
ResourcePoolState rpState = new ResourcePoolState();
rpState.name = UUID.randomUUID().toString();
rpState.properties = EnumSet.of(ResourcePoolProperty.ELASTIC);
rpState.query = Query.Builder.create().addKindFieldClause(ComputeState.class).addInClause(ServiceDocument.FIELD_NAME_SELF_LINK, computeLinks).build();
ResourcePoolState rpReturnState = postServiceSynchronously(ResourcePoolService.FACTORY_LINK, rpState, ResourcePoolState.class);
// Create additional Query clause
List<Query> queries = new ArrayList<>();
Query typeQuery = new Query();
typeQuery.setOccurance(Occurance.MUST_OCCUR);
typeQuery.setTermPropertyName(ComputeState.FIELD_NAME_TYPE);
typeQuery.setTermMatchValue(ComputeType.ENDPOINT_HOST.name());
queries.add(typeQuery);
// create a stats collection task
StatsCollectionTaskState statCollectionState = new StatsCollectionTaskState();
statCollectionState.resourcePoolLink = rpReturnState.documentSelfLink;
statCollectionState.customizationClauses = queries;
// statCollectionState.options = EnumSet.of(TaskOption.SELF_DELETE_ON_COMPLETION);
StatsCollectionTaskState finalStatCollectionState = postServiceSynchronously(StatsCollectionTaskService.FACTORY_LINK, statCollectionState, StatsCollectionTaskState.class);
// give 1 minute max time for StatsCollection task to finish.
host.setTimeoutSeconds(60);
host.waitFor(String.format("Timeout waiting for StatsCollectionTask: [%s] to complete.", finalStatCollectionState.documentSelfLink), () -> {
StatsCollectionTaskState stats = getServiceSynchronously(finalStatCollectionState.documentSelfLink, StatsCollectionTaskState.class);
return stats.taskInfo != null && stats.taskInfo.stage == TaskStage.FINISHED;
});
ServiceDocumentQueryResult res = this.host.getFactoryState(UriUtils.buildExpandLinksQueryUri(UriUtils.buildUri(this.host, ComputeService.FACTORY_LINK)));
assertEquals(20, res.documents.size());
int vmHosts = 0;
int vmGuests = 0;
// ENDPOINT_HOST should provide statistics.
for (Map.Entry<String, Object> map : res.documents.entrySet()) {
String uri = String.format("%s/stats", map.getKey());
ServiceStats stats = getServiceSynchronously(uri, ServiceStats.class);
ComputeState state = Utils.fromJson(map.getValue(), ComputeState.class);
if (state.type == ComputeType.ENDPOINT_HOST) {
assertTrue(!stats.entries.isEmpty());
vmHosts++;
} else {
assertTrue(stats.entries.isEmpty());
vmGuests++;
}
}
assertEquals(10, vmHosts);
assertEquals(10, vmGuests);
// clean up
deleteServiceSynchronously(finalStatCollectionState.documentSelfLink);
}
use of com.vmware.xenon.services.common.QueryTask.Query in project photon-model by vmware.
the class AWSCostStatsService method createQueryForComputeStatesByAccount.
/**
* Method creates a query operation to get the compute states corresponding to the specified account ID.
* The list of the resultant compute states is then passed to the specified handler for processing.
*
* @param context
* @param accountId
* @param queryResultConsumer
* @return operation object representing the query
*/
protected Operation createQueryForComputeStatesByAccount(AWSCostStatsCreationContext context, String accountId, Consumer<List<ComputeState>> queryResultConsumer) {
Query awsAccountsQuery = Query.Builder.create().addKindFieldClause(ComputeState.class).addFieldClause(ComputeState.FIELD_NAME_TYPE, ComputeType.ENDPOINT_HOST).addCompositeFieldClause(ComputeState.FIELD_NAME_CUSTOM_PROPERTIES, EndpointAllocationTaskService.CUSTOM_PROP_ENPOINT_TYPE, PhotonModelConstants.EndpointType.aws.name()).addCompositeFieldClause(ComputeState.FIELD_NAME_CUSTOM_PROPERTIES, AWS_ACCOUNT_ID_KEY, accountId).addInCollectionItemClause(ComputeState.FIELD_NAME_TENANT_LINKS, context.computeDesc.tenantLinks).build();
QueryTask queryTask = QueryTask.Builder.createDirectTask().addOption(QueryOption.EXPAND_CONTENT).setQuery(awsAccountsQuery).build();
queryTask.setDirect(true);
queryTask.tenantLinks = context.computeDesc.tenantLinks;
return QueryUtils.createQueryTaskOperation(this, queryTask, ServiceTypeCluster.INVENTORY_SERVICE).setCompletion((o, e) -> {
if (e != null) {
getFailureConsumer(context).accept(e);
return;
}
QueryTask responseTask = o.getBody(QueryTask.class);
List<ComputeState> accountComputeStates = responseTask.results.documents.values().stream().map(s -> Utils.fromJson(s, ComputeState.class)).filter(cs -> cs.parentLink == null && cs.endpointLink != null && !CollectionUtils.isEmpty(cs.endpointLinks)).collect(Collectors.toList());
queryResultConsumer.accept(accountComputeStates);
});
}
use of com.vmware.xenon.services.common.QueryTask.Query in project photon-model by vmware.
the class AWSCostStatsService method queryVolumes.
protected void queryVolumes(AWSCostStatsCreationContext statsData, AWSCostStatsCreationStages nextStage, AWSCostStatsCreationSubStage nextSubStage) {
Set<String> endpointLinks = statsData.awsAccountIdToComputeStates.values().stream().flatMap(// flatten collection of lists to single list
List::stream).flatMap(e -> e.endpointLinks.stream()).collect(// extract endpointLinks of all accounts
Collectors.toSet());
List<String> supportedStorageTypes = Arrays.asList(STORAGE_TYPE_EBS, STORAGE_TYPE_S3);
Query query = Query.Builder.create().addKindFieldClause(DiskState.class).addInCollectionItemClause(DiskState.FIELD_NAME_ENDPOINT_LINKS, endpointLinks, Occurance.MUST_OCCUR).addInClause(DiskState.FIELD_NAME_STORAGE_TYPE, supportedStorageTypes).build();
populateAwsResources(query, statsData, nextStage, nextSubStage);
}
use of com.vmware.xenon.services.common.QueryTask.Query in project photon-model by vmware.
the class AWSCostStatsService method queryInstances.
protected void queryInstances(AWSCostStatsCreationContext statsData, AWSCostStatsCreationStages nextStage, AWSCostStatsCreationSubStage nextSubStage) {
Set<String> endpointLinks = statsData.awsAccountIdToComputeStates.values().stream().flatMap(// flatten collection of lists to single list
List::stream).flatMap(e -> e.endpointLinks.stream()).collect(// extract endpointLinks of all accounts
Collectors.toSet());
Query query = Query.Builder.create().addKindFieldClause(ComputeState.class).addFieldClause(ComputeState.FIELD_NAME_TYPE, ComputeDescriptionService.ComputeDescription.ComputeType.VM_GUEST).addInCollectionItemClause(ComputeState.FIELD_NAME_ENDPOINT_LINKS, endpointLinks, Occurance.MUST_OCCUR).build();
populateAwsResources(query, statsData, nextStage, nextSubStage);
}
use of com.vmware.xenon.services.common.QueryTask.Query in project photon-model by vmware.
the class AWSPowerServiceTest method tearDown.
@After
public void tearDown() throws Throwable {
Query resourceQuery = Query.Builder.create().addKindFieldClause(ComputeState.class).addInClause(ComputeState.FIELD_NAME_SELF_LINK, this.computesToRemove).build();
QuerySpecification qSpec = new QuerySpecification();
qSpec.query = resourceQuery;
ResourceRemovalTaskState state = new ResourceRemovalTaskState();
state.isMockRequest = this.isMock;
state.resourceQuerySpec = qSpec;
ResourceRemovalTaskState removalTaskState = TestUtils.doPost(this.host, state, ResourceRemovalTaskState.class, UriUtils.buildUri(this.host, ResourceRemovalTaskService.FACTORY_LINK));
this.host.waitForFinishedTask(ResourceRemovalTaskState.class, removalTaskState.documentSelfLink);
if (this.deleteResourcesFlag) {
this.awsTestContext.put(TestAWSSetupUtils.DELETE_RESOURCES_KEY, TestAWSSetupUtils.DELETE_RESOURCES_KEY);
}
tearDownTestVpc(this.client, this.host, this.awsTestContext, this.isMock);
this.client.shutdown();
}
Aggregations