@Override protected void handleStartedStagePatch(EpzComputeEnumerationTaskState state) { switch (state.taskSubStage) { case CREATED: retrieveResourcePoolState(state); break; case QUERY_COMPUTES_TO_UNASSIGN: queryComputesToUnassign(state); break; case UNASSIGN_COMPUTES: updateComputes(state, false); break; case QUERY_COMPUTES_TO_ASSIGN: queryComputesToAssign(state); break; case ASSIGN_COMPUTES: updateComputes(state, true); break; case COMPLETED: complete(); break; case ERROR: completeWithError(); break; default: break; } }
private void updateComputes(EpzComputeEnumerationTaskState state, boolean assign) { sendRequest(Operation .createGet(getHost(), state.nextPageLink) .setCompletion((o, e) -> { if (e != null) { failTask("Error retrieving computes", e); return; } updateComputes(state, o.getBody(QueryTask.class).results, assign, assign ? EpzComputeEnumerationTaskState.SubStage.COMPLETED : EpzComputeEnumerationTaskState.SubStage.QUERY_COMPUTES_TO_ASSIGN); })); }
private void retrieveResourcePoolState(EpzComputeEnumerationTaskState state) { sendRequest(Operation.createGet(getHost(), state.resourcePoolLink).setCompletion((o, e) -> { if (e != null) { failTask(String.format("Error retrieving resource pool %s", state.resourcePoolLink), e, !(e instanceof ServiceNotFoundException)); return; } proceedTo(EpzComputeEnumerationTaskState.SubStage.QUERY_COMPUTES_TO_UNASSIGN, s -> { s.resourcePoolQuery = o.getBody(ResourcePoolState.class).query; }); })); }
logFine("Empty compute page returned, nothing to %s", assign ? "assign" : "unassign"); proceedTo(nextStage); return; logFine("Resource pool %s: %s %d computes, %s", state.resourcePoolLink, assign ? "assigning" : "unassigning", computes.size(), result.nextPageLink != null ? "there are more pages" : "no more pages"); patchBody.customProperties.put(EPZ_CUSTOM_PROP_NAME_PREFIX + extractRpId(state), assign ? EPZ_CUSTOM_PROP_VALUE : null); patchOps.add( Operation.createPatch(getHost(), compute.documentSelfLink).setBody(patchBody)); failTask("Error updating computes", exs.values().iterator().next()); return; proceedTo(nextStage); } else { proceedTo(state.taskSubStage, s -> { s.nextPageLink = result.nextPageLink; });
private void queryComputes(EpzComputeEnumerationTaskState state, Query computeQuery, EpzComputeEnumerationTaskState.SubStage updateStage, EpzComputeEnumerationTaskState.SubStage nextStage) { QueryTask task = QueryTask.Builder.createDirectTask().setQuery(computeQuery) .setResultLimit(COMPUTE_PAGE_SIZE).addOption(QueryOption.EXPAND_CONTENT).build(); sendRequest(Operation .createPost(this, ServiceUriPaths.CORE_QUERY_TASKS) .setBody(task) .setCompletion((o, e) -> { if (e != null) { failTask("Error quering for computes", e); return; } ServiceDocumentQueryResult result = o.getBody(QueryTask.class).results; if (result.nextPageLink == null) { logFine("No computes found to %s resource pool %s", updateStage == EpzComputeEnumerationTaskState.SubStage.ASSIGN_COMPUTES ? "assign to" : "unassign from", state.resourcePoolLink); proceedTo(nextStage); } else { proceedTo(updateStage, s -> { s.nextPageLink = result.nextPageLink; }); } })); }
private void queryComputesToUnassign(EpzComputeEnumerationTaskState state) { Query mustBeOut = Utils.clone(state.resourcePoolQuery) .setOccurance(Occurance.MUST_NOT_OCCUR); Query areIn = Query.Builder.create() .addKindFieldClause(ComputeState.class) .addCompositeFieldClause(ResourceState.FIELD_NAME_CUSTOM_PROPERTIES, EPZ_CUSTOM_PROP_NAME_PREFIX + extractRpId(state), EPZ_CUSTOM_PROP_VALUE) .build(); Query combinedQuery = Query.Builder.create().addClauses(mustBeOut, areIn).build(); queryComputes(state, combinedQuery, EpzComputeEnumerationTaskState.SubStage.UNASSIGN_COMPUTES, EpzComputeEnumerationTaskState.SubStage.QUERY_COMPUTES_TO_ASSIGN); }
/** * Triggers the enumeration task for the given resource pool. Makes sure no multiple tasks are * run in parallel for the same resource pool. */ public static void triggerForResourcePool(Service sender, String resourcePoolLink) { EpzComputeEnumerationTaskState task = new EpzComputeEnumerationTaskState(); task.resourcePoolLink = resourcePoolLink; task.documentSelfLink = extractRpId(task); Operation.createPost(sender.getHost(), EpzComputeEnumerationTaskService.FACTORY_LINK) .addPragmaDirective(Operation.PRAGMA_DIRECTIVE_FORCE_INDEX_UPDATE) .setBody(task) .setCompletion((o, e) -> { if (o.getStatusCode() == Operation.STATUS_CODE_NOT_MODIFIED) { sender.getHost().log(Level.FINE, "Enumeration task already running for " + resourcePoolLink); return; } if (e != null) { sender.getHost().log(Level.WARNING, "Failed to start enumeration task for %s: %s", resourcePoolLink, e.getMessage()); return; } sender.getHost().log(Level.INFO, "Started enumeration task for " + resourcePoolLink); }).sendWith(sender); }
private void queryComputesToAssign(EpzComputeEnumerationTaskState state) { Query mustBeIn = Utils.clone(state.resourcePoolQuery); Query areOut = Query.Builder.create() .addKindFieldClause(ComputeState.class) .addFieldClause( QuerySpecification.buildCompositeFieldName( ResourceState.FIELD_NAME_CUSTOM_PROPERTIES, EPZ_CUSTOM_PROP_NAME_PREFIX + extractRpId(state)), EPZ_CUSTOM_PROP_VALUE, MatchType.TERM, Occurance.MUST_NOT_OCCUR) .build(); Query combinedQuery = Query.Builder.create().addClauses(mustBeIn, areOut).build(); queryComputes(state, combinedQuery, EpzComputeEnumerationTaskState.SubStage.ASSIGN_COMPUTES, EpzComputeEnumerationTaskState.SubStage.COMPLETED); }