public static Operation createForcedPost(Service sender, String targetPath) { return createForcedPost(UriUtils.buildUri(sender.getHost(), targetPath)); }
@Override public void handleGet(Operation get) { try { URI registryAdapterUri = HostInitRegistryAdapterServiceConfig.registryAdapterReference; AssertUtil.assertNotNull(registryAdapterUri, "registryAdapterReference"); Map<String, String> queryParams = UriUtils.parseUriQueryParams(get.getUri()); String imageName = queryParams.get(SEARCH_QUERY_PROP_NAME); AssertUtil.assertNotNull(registryAdapterUri, SEARCH_QUERY_PROP_NAME); String rawTenantLinks = queryParams.get(TENANT_LINKS_PARAM_NAME); HashSet<String> tenantLinks = new HashSet<>(); if (rawTenantLinks != null && !rawTenantLinks.isEmpty()) { tenantLinks.addAll(Arrays.asList(rawTenantLinks.split(TENANT_LINKS_SEPARATOR))); } String projectHeader = OperationUtil.extractProjectFromHeader(get); if (projectHeader != null && !projectHeader.isEmpty()) { tenantLinks.add(projectHeader); } handleListTagsRequest(get, registryAdapterUri, imageName, tenantLinks); } catch (Exception x) { logSevere(x); get.fail(x); } }
/** * Extract the project link from the header and extend operation's URI with filter that contains * clause to return only documents which have the project link from the header in their * tenantLinks field. * * If there is no project link in header the URI is not modified. If there is already filter * query the method will not override it, but extend it with 'and' and the new clause, example * for this case: If there operation's URI have existing filter: "name eq 'test'", after the * modification the filter will look like: "name eq 'test' and tenantLinks.item eq * '/projects/test'" * * Calling this method is equivalent to calling * {@link #transformProjectHeaderToFilterQuery(Operation, boolean)} with * <code>includeGlobalEntries</code> set to <code>false</code> */ public static void transformProjectHeaderToFilterQuery(Operation get) { transformProjectHeaderToFilterQuery(get, false); }
String projectLink = OperationUtil.extractProjectFromHeader(get); if (projectLink == null || projectLink.isEmpty()) { return; String filterQuery = UriUtils.getODataFilterParamValue(opUri); if (filterQuery == null || filterQuery.isEmpty()) { filterQuery = constructFilterWithTenantLinks(projectLink, includeGlobalEntries); } else { filterQuery = filterQuery + " and " + constructFilterWithTenantLinks(projectLink, includeGlobalEntries);
URI containerFactoryUri = UriUtils.buildUri(getHost(), ContainerFactoryService.class); sendRequest(OperationUtil .createForcedPost(containerFactoryUri) .setBody(containerState) .setCompletion((o, ex) -> { if (ex != null) { if (OperationUtil.isServiceAlreadyStarted(ex, o)) { logWarning("Container state already exists for container (id=%s)", containerState.id);
UriUtils.URI_PARAM_ODATA_EXPAND_NO_DOLLAR_SIGN, ""); String projectLink = OperationUtil.extractProjectFromHeader(get); OperationUtil.transformProjectHeaderToFilterQuery(getPlacementZone);
tenantLink = OperationUtil.extractTenantFromProjectHeader(get); } else { tenantLink = OperationUtil.extractProjectFromHeader(get);
/** * Helper method executing Operation.createGet. * Calls {@code callbackFunction} passing the result, * or in case of exception just logs it and returns. * * @param service {@link Service} * @param link document link * @param callbackFunction callback to receive the result * @param <T> document state class, extends {@link ServiceDocument} */ public static <T extends ServiceDocument> void getDocumentState(Service service, String link, Class<T> classT, Consumer<T> callbackFunction) { getDocumentState(service, link, classT, callbackFunction, null); }
@Test public void testIsServiceAlreadyStarted() { assertFalse(OperationUtil.isServiceAlreadyStarted(null, null)); assertFalse(OperationUtil.isServiceAlreadyStarted(new Exception(), null)); assertFalse(OperationUtil.isServiceAlreadyStarted(new Exception(), new Operation())); assertTrue(OperationUtil .isServiceAlreadyStarted(new ServiceAlreadyStartedException("simulated"), null)); assertTrue(OperationUtil.isServiceAlreadyStarted( new Exception(new ServiceAlreadyStartedException("simulated")), null)); assertTrue(OperationUtil.isServiceAlreadyStarted(null, new Operation().setStatusCode(Operation.STATUS_CODE_CONFLICT))); } }
@Test public void testExtractTenantFromBGHeader() throws Throwable { String businessGroup = "/tenants/qe/groups/22c64610-84d0-49e9-8dd7-dee32539dcfe"; Operation op = new Operation(); op.addRequestHeader(OperationUtil.PROJECT_ADMIRAL_HEADER, businessGroup); String tenantLink = OperationUtil.extractTenantFromProjectHeader(op); Assert.assertTrue(tenantLink.equals("/tenants/qe")); }
OperationUtil.getDocumentState(this, descriptionLink, ContainerDescription.class, (ContainerDescription contDesc) -> installSystemContainerToHost( containerHostLink, systemContainerName, contDesc)); OperationUtil.getDocumentState(this, containerHostLink, ComputeState.class, (ComputeState host) -> { if (ContainerHostUtil.getDriver(host) == null) {
.setCompletion((o, e) -> { if (e != null) { if (OperationUtil.isServiceAlreadyStarted(e, o)) { getHost().log(Level.WARNING, "Service %s already started.", allocationTask.documentSelfLink);
@Test public void testExtractTenantFromBGHeaderInvalid() throws Throwable { String businessGroup = "test"; Operation op = new Operation(); op.addRequestHeader(OperationUtil.PROJECT_ADMIRAL_HEADER, businessGroup); String tenantLink = OperationUtil.extractTenantFromProjectHeader(op); Assert.assertTrue(tenantLink == null); }
private void createDiscoveredEntity(AtomicInteger counter, BaseKubernetesState entity, Runnable callback) { logFine("Creating KubernetesState for discovered entity: %s", entity.id); String type = KubernetesUtil.getResourceType(entity.getType()).getName(); AtomicBoolean hasError = new AtomicBoolean(false); sendRequest(OperationUtil .createForcedPost(this, CompositeComponentRegistry.stateFactoryLinkByType(type)) .setBody(entity) .setCompletion( (o, ex) -> { if (ex != null) { logSevere("Failed to create KubernetesState for discovered entity" + " (id=%s): %s", entity.id, ex.getMessage()); if (hasError.compareAndSet(false, true)) { callback.run(); } } else { logInfo("Created KubernetesState for discovered entity: %s", entity.id); } if (counter.decrementAndGet() == 0) { callback.run(); } })); }
@Override public void handleGet(Operation get) { OperationUtil.transformProjectHeaderToFilterQuery(get); super.handleGet(get); } }
@Override public void handlePost(Operation post) { if (!post.hasBody()) { post.fail(new IllegalArgumentException("body is required")); return; } Map<String, String> queryParams = UriUtils.parseUriQueryParams(post.getUri()); String reverseParam = queryParams.remove(REVERSE_PARENT_LINKS_PARAM); boolean reverse = Boolean.TRUE.equals(Boolean.parseBoolean(reverseParam)); String projectLink = OperationUtil.extractProjectFromHeader(post); try { CompositeDescription cd = post.getBody(CompositeDescription.class); validateStateOnStart(cd); String requestURL = cd.documentSelfLink + ManagementUriParts.EXPAND_SUFFIX; cloneCompositeDescription(requestURL, reverse, null, projectLink, (cdClone) -> post.setBody(cdClone).complete()); } catch (Throwable e) { logSevere(e); post.fail(e); } }
protected void uploadCertificate(String hostLink, String registryAddress, String certificate, List<String> tenantLinks) { OperationUtil.getDocumentState(this, hostLink, ComputeState.class, (ComputeState host) -> { if (ContainerHostUtil.isVicHost(host)) { logInfo("Skip installing certificate for VIC host [%s]", hostLink); return; } ShellContainerExecutorState execState = new ShellContainerExecutorState(); execState.command = new String[] { "sh", "/copy-certificate.sh", getCertificateDirName(registryAddress), certificate }; try { processUploadCertificateQuery(execState, hostLink, MAX_RETRIES, registryAddress, tenantLinks); } catch (Throwable t) { logSevere("Fail to upload registry certificate to host %s: " + "failed to connect to shell container executor service.", hostLink); } }); }
private void createDiscoveredContainerVolume(Consumer<Throwable> callback, AtomicInteger counter, ContainerVolumeState volumeState) { logFine("Creating ContainerVolumeState for discovered volume: %s", volumeState.name); sendRequest(OperationUtil .createForcedPost(this, ContainerVolumeService.FACTORY_LINK) .setBodyNoCloning(volumeState) .setCompletion( (o, ex) -> { if (ex != null) { logSevere("Failed to create ContainerVolumeState for discovered" + " volume (name=%s): %s", volumeState.name, ex.getMessage()); callback.accept(ex); return; } logInfo("Created ContainerVolumeState for discovered volume: %s", volumeState.name); ContainerVolumeState body = o.getBody(ContainerVolumeState.class); createDiscoveredContainerVolumeDescription(body); inspectVolumeWithRetry(body, VOLUME_INSPECT_RETRY_COUNT); if (counter.decrementAndGet() == 0) { callback.accept(null); } })); }
@Override public void handleGet(Operation get) { OperationUtil.transformProjectHeaderToFilterQuery(get); super.handleGet(get); } }
String projectHeader = OperationUtil.extractProjectFromHeader(startOp); if (projectHeader != null) { projectLinks.add(projectHeader);