/** * Comes in here for a http patch on an existing doc * For patch only the values being changed are sent. * getState() method fills in the missing values from the existing doc. */ @Override public void handlePatch(Operation patch) { checkHasBody(patch); try { SubnetRangeState currentState = getState(patch); // Merge the patch values to current state // In order to validate the merged result EnumSet<Utils.MergeResult> mergeResult = Utils.mergeWithStateAdvanced(getStateDescription(), currentState, SubnetRangeState.class, patch); boolean hasStateChanged = mergeResult.contains(Utils.MergeResult.STATE_CHANGED); if (hasStateChanged) { validateAll(currentState) .thenAccept((ignored) -> setState(patch, currentState)) .whenCompleteNotify(patch); } else { patch.setStatusCode(Operation.STATUS_CODE_NOT_MODIFIED); patch.complete(); } } catch (Exception e) { this.logSevere(String.format("SubnetRangeService: failed to perform patch [%s]", e.getMessage())); patch.fail(e); } }
/** * Fetch subnet state by document link. * * @param link Document link for the subnet service * @return A deferred result of an operation, that has the subnet state */ private <T> DeferredResult<Operation> getSubnetState(String link) { AssertUtil.assertNotEmpty(link, "Cannot fetch subnet details with an empty subnet link"); URI uri = UriUtils.buildUri(getHost(), link); return sendWithDeferredResult(Operation.createGet(uri)); }
/** * Comes in here for a http put on an existing doc */ @Override public void handlePut(Operation put) { try { SubnetRangeState subnetRangeState = getOperationBody(put); validateAll(subnetRangeState) .thenAccept((ignored) -> setState(put, subnetRangeState)) .whenCompleteNotify(put); } catch (Throwable t) { put.fail(t); } }
/** * Comes in here for a http post for a new document */ @Override public void handleCreate(Operation create) { try { SubnetRangeState subnetRangeState = getOperationBody(create); validateAll(subnetRangeState) .whenCompleteNotify(create); } catch (Throwable t) { create.fail(t); } }
/** * Returns a Deferred result if start IP address and end IP address are within the network * specfied by the subnet CIDR. If not an exception is raised in the method this calls. * * @param subnetRangeState The subnet state that is being validated. * @return a deferred result, that has no data. This method returning just validates the data. */ private DeferredResult<Void> validateIps(SubnetRangeState subnetRangeState) { if (subnetRangeState.subnetLink != null) { return getSubnetState(subnetRangeState.subnetLink) .thenAccept((op) -> { SubnetState subnetState = op.getBody(SubnetState.class); validateIpInRange(subnetRangeState, subnetState); }); } return DeferredResult.completed(null); }
/** * Returns a Deferred result if there is no overlap of the current ip range with the pre * existing ip ranges. Else exception is raised (in the method this calls). * * @param subnetRangeState * @return A deferred result which indicates there was no range overlap. */ private DeferredResult<Void> validateNoRangeOverlap(SubnetRangeState subnetRangeState) { if (subnetRangeState.subnetLink != null) { return getSubnetRangesInSubnet(subnetRangeState.subnetLink) .thenAccept((subnetRangeList) -> { validateIpsOutsideDefinedRanges( subnetRangeState.documentSelfLink, subnetRangeState.startIPAddress, subnetRangeState.endIPAddress, subnetRangeList); }); } return DeferredResult.completed(null); }
private SubnetRangeState getOperationBody(Operation operation) { checkHasBody(operation); SubnetRangeState subnetRangeState = operation.getBody(SubnetRangeState.class); return subnetRangeState; }
private static void startFactoryServices(BaseModelTest test) throws Throwable { PhotonModelTaskServices.startServices(test.getHost()); MockAdapter.startFactories(test); test.getHost().startFactory(new SubnetRangeService()); test.getHost().startFactory(new IPAddressService()); test.getHost().startFactory(new IPAddressAllocationTaskService()); }
/** * Fetch all pre existing subnet ranges * * @param subnetLink * @return A deferred result that contains a list of pre-existing subnet ranges */ private DeferredResult<List<SubnetRangeState>> getSubnetRangesInSubnet(String subnetLink) { Query.Builder qBuilder = Query.Builder.create() .addKindFieldClause(SubnetRangeState.class) .addFieldClause(FIELD_NAME_SUBNET_LINK, subnetLink); QueryTop<SubnetRangeState> queryTop = new QueryUtils.QueryTop<>( this.getHost(), qBuilder.build(), SubnetRangeState.class, null ); return queryTop.collectDocuments(Collectors.toList()); }
Utils.validateState(getStateDescription(), state);
/** * Comes in here for a http post for a new document */ @Override public void handleCreate(Operation start) { if (PhotonModelUtils.isFromMigration(start)) { start.complete(); return; } SubnetRangeState subnetRangeState = getOperationBody(start); validateAll(subnetRangeState) .thenCompose(__ -> ResourceUtils.populateTags(this, subnetRangeState)) .whenCompleteNotify(start); }
/** * Returns a Deferred result if start IP address and end IP address are within the network * specfied by the subnet CIDR. If not an exception is raised in the method this calls. * * @param subnetRangeState The subnet state that is being validated. * @return a deferred result, that has no data. This method returning just validates the data. */ private DeferredResult<Void> validateIps(SubnetRangeState subnetRangeState) { if (subnetRangeState.subnetLink != null) { return getSubnetState(subnetRangeState.subnetLink) .thenAccept((op) -> { SubnetState subnetState = op.getBody(SubnetState.class); validateIpInRange(subnetRangeState, subnetState); }); } return DeferredResult.completed(null); }
/** * Returns a Deferred result if there is no overlap of the current ip range with the pre * existing ip ranges. Else exception is raised (in the method this calls). * * @param subnetRangeState * @return A deferred result which indicates there was no range overlap. */ private DeferredResult<Void> validateNoRangeOverlap(SubnetRangeState subnetRangeState) { if (subnetRangeState.subnetLink != null) { return getSubnetRangesInSubnet(subnetRangeState.subnetLink, subnetRangeState.tenantLinks) .thenAccept((subnetRangeList) -> { validateIpsOutsideDefinedRanges( subnetRangeState.documentSelfLink, subnetRangeState.startIPAddress, subnetRangeState.endIPAddress, subnetRangeList); }); } return DeferredResult.completed(null); }
private SubnetRangeState getOperationBody(Operation operation) { checkHasBody(operation); SubnetRangeState subnetRangeState = operation.getBody(SubnetRangeState.class); return subnetRangeState; }
public static void startServices(ServiceHost host) throws Throwable { host.startFactory(new ComputeDescriptionService()); host.startFactory(new ComputeService()); host.startFactory(new ResourcePoolService()); host.startFactory(new ResourceDescriptionService()); host.startFactory(new DiskService()); host.startFactory(new SnapshotService()); host.startFactory(new NetworkInterfaceService()); host.startFactory(new NetworkInterfaceDescriptionService()); host.startFactory(new SubnetService()); host.startFactory(new SubnetRangeService()); host.startFactory(new IPAddressService()); host.startFactory(new ResourceGroupService()); host.startFactory(new NetworkService()); host.startFactory(new FirewallService()); host.startFactory(new SecurityGroupService()); host.startFactory(new StorageDescriptionService()); host.startFactory(new EndpointService()); host.startFactory(new ImageService()); host.startFactory(new InMemoryResourceMetricService()); host.startFactory(TagService.class, TagFactoryService::new); host.startFactory(new LoadBalancerDescriptionService()); host.startFactory(new LoadBalancerService()); host.startFactory(new RouterService()); } }
/** * Fetch all pre existing subnet ranges * * @param subnetLink * @param queryTaskTenantLinks * @return A deferred result that contains a list of pre-existing subnet ranges */ private DeferredResult<List<SubnetRangeState>> getSubnetRangesInSubnet(String subnetLink, List<String> queryTaskTenantLinks) { Query.Builder qBuilder = Query.Builder.create() .addKindFieldClause(SubnetRangeState.class) .addFieldClause(FIELD_NAME_SUBNET_LINK, subnetLink); QueryTop<SubnetRangeState> queryTop = new QueryUtils.QueryTop<>( this.getHost(), qBuilder.build(), SubnetRangeState.class, null ).setQueryTaskTenantLinks(queryTaskTenantLinks); queryTop.setClusterType(ServiceTypeCluster.INVENTORY_SERVICE); return queryTop.collectDocuments(Collectors.toList()); }
Utils.validateState(getStateDescription(), state);
checkHasBody(patch); SubnetRangeState currentState = getState(patch); SubnetRangeState patchBody = patch.getBody(SubnetRangeState.class); Utils.mergeWithStateAdvanced(getStateDescription(), currentState, SubnetRangeState.class, patch); validateAll(currentState) .thenAccept((ignored) -> setState(patch, currentState)) .whenCompleteNotify(patch); } else { this.logSevere(String.format("SubnetRangeService: failed to perform patch [%s]", e.getMessage())); patch.fail(e);
/** * Comes in here for a http put on an existing doc */ @Override public void handlePut(Operation put) { if (PhotonModelUtils.isFromMigration(put)) { super.handlePut(put); return; } SubnetRangeState subnetRangeState = getOperationBody(put); validateAll(subnetRangeState) .thenCompose((ignored) -> ResourceUtils.populateTags(this, subnetRangeState)) .thenAccept((ignored) -> setState(put, subnetRangeState)) .whenCompleteNotify(put); }
/** * Fetch subnet state by document link. * * @param link Document link for the subnet service * @return A deferred result of an operation, that has the subnet state */ private <T> DeferredResult<Operation> getSubnetState(String link) { AssertUtil.assertNotEmpty(link, "Cannot fetch subnet details with an empty subnet link"); URI uri = UriUtils.buildUri(getHost(), link); return sendWithDeferredResult(Operation.createGet(uri)); }