/** * Retrieve all the registries available to the given group (and global registries) * * @param tenantLinks * @param registryFilter * @param consumer */ public static void findRegistries(ServiceHost serviceHost, Collection<String> tenantLinks, String registryFilter, BiConsumer<Collection<RegistryState>, Collection<Throwable>> consumer) { List<QueryTask> queryTasks = new ArrayList<>(); if (registryFilter != null && !registryFilter.isEmpty()) { // add query for a registry with a specific name and group queryTasks.add(buildRegistryQueryByNameAndTenantLinks(registryFilter, tenantLinks)); if (tenantLinks != null) { // add query for a global registry with a specific name queryTasks.add(buildRegistryQueryByNameAndTenantLinks(registryFilter, null)); } } else if (tenantLinks != null && !tenantLinks.isEmpty()) { // add query for global groups queryTasks.add(buildRegistryQueryByTenantLinks(null)); // add query for registries of a specific tenant queryTasks.add(buildRegistryQueryByTenantLinks(tenantLinks)); } else { // add query for all registries if no tenant queryTasks.add(buildAllRegistriesQuery()); } queryForRegistries(serviceHost, queryTasks, consumer); }
/** * Retrieve the registries available to the given group for the given host (and global registries) * @param serviceHost * @param hostname * @param tenantLinks * @param consumer */ public static void findRegistriesByHostname(ServiceHost serviceHost, String hostname, Collection<String> tenantLinks, BiConsumer<Collection<RegistryState>, Collection<Throwable>> consumer) { List<QueryTask> queryTasks = new ArrayList<>(); if (tenantLinks != null && !tenantLinks.isEmpty()) { // add query for global groups queryTasks.add(buildRegistryQuery(buildQueryByTenantLinks(null), buildQueryByHostname(hostname))); // add query for registries of a specific tenant queryTasks.add(buildRegistryQuery(buildQueryByTenantLinks(tenantLinks), buildQueryByHostname(hostname))); } else { // add query for all registries if no tenant queryTasks.add(buildRegistryQuery(buildQueryByHostname(hostname))); } queryForRegistries(serviceHost, queryTasks, consumer); }
/** * Create a query to return all RegistryState links within a group, tenant or global * RegistryState links if the tenantLinks collection is null/empty. * * @param tenantLinks * @return QueryTask */ private static QueryTask buildRegistryQueryByTenantLinks(Collection<String> tenantLinks) { return buildRegistryQuery(buildQueryByTenantLinks(tenantLinks)); }
String registryHost = nonNullValue(parsedImage.getHost(), DEFAULT_DOCKER_REGISTRY_ADDRESS); Collection<String> filteredTenantLinks = filterWhitelistRelatedTenantLinks( requestTenantLinks); serviceHost.log(Level.INFO, findRegistriesByHostname(serviceHost, registryHost, filteredTenantLinks, (registries, errors) -> { if (errors != null && !errors.isEmpty()) { Collection<RegistryState> filteredRegistries = filterRegistriesByPath(serviceHost, registries, parsedImage);
RegistryUtil.findRegistriesByHostname(getHost(), image.getHost(), tenantLinks, (registries, errors) -> { if (errors != null && !errors.isEmpty()) { RegistryUtil.findRegistries(getHost(), tenantLinks, registryFilter, registriesConsumer); return; }); } else { RegistryUtil.findRegistries(getHost(), tenantLinks, registryFilter, registriesConsumer);
private void handleListTagsRequest(Operation op, URI registryAdapterUri, String imageName, Collection<String> tenantLinks) { DockerImage image = DockerImage.fromImageName(imageName); if (image.getHost() == null) { sendListTagRequest(op, registryAdapterUri, imageName, DEFAULT_INSTANCE_LINK); return; } RegistryUtil.findRegistriesByHostname(getHost(), image.getHost(), tenantLinks, (registries, errors) -> { if (errors != null && !errors.isEmpty()) { op.fail(errors.iterator().next()); return; } if (registries.isEmpty()) { String errMsg = String.format( "Failed to find registry state with address '%s'.", image.getHost()); getHost().log(Level.WARNING, errMsg); op.fail(new Exception(errMsg)); return; } String link = registries.iterator().next().documentSelfLink; sendListTagRequest(op, registryAdapterUri, imageName, link); }); }
private List<Result> filterResultsByRegistryPath(Collection<Result> results, Collection<RegistryState> registries, Map<Long, Throwable> failures) { List<Result> filteredResults = new ArrayList<>(); results.stream().forEach(res -> { String imageName = res.name; DockerImage parsedImage; try { parsedImage = DockerImage.fromImageName(imageName); } catch (Throwable ex) { log(Level.SEVERE, "Failed to parse docker image from String '%s': %s", imageName, Utils.toString(ex)); long nextFailureNumber = failures.keySet().iterator().next(); failures.put(nextFailureNumber, ex); return; } List<RegistryState> filteredRegistryStates = RegistryUtil .filterRegistriesByPath(getHost(), registries, parsedImage); log(Level.FINE, "Found %s matching registries.", filteredRegistryStates == null ? 0 : filteredRegistryStates.size()); if (filteredRegistryStates.size() > 0) { filteredResults.add(res); } }); return filteredResults; }
private void verifyIncludedRegistries(String tenantLink, boolean shouldIncludeGrouped) { List<String> tenantLinks = tenantLink == null ? null : Collections.singletonList(tenantLink); RegistryUtil.findRegistries(host, tenantLinks, null, (registries, FAIL_ON_ERROR_HANDLER) -> { Set<String> registryLinks = registries.stream().map(r -> r.documentSelfLink).collect( Collectors.toSet()); if (!registryLinks.contains(globalRegistryState.documentSelfLink)) { host.log(Level.SEVERE, "Global registry %s missing", globalRegistryState.documentSelfLink); return; } if (shouldIncludeGrouped ? !registryLinks .contains(groupedRegistryState.documentSelfLink) : registryLinks .contains(groupedRegistryState.documentSelfLink)) { host.log(Level.SEVERE, "Grouped registry %s should%s be included", groupedRegistryState.documentSelfLink, shouldIncludeGrouped ? "" : "n't"); return; } expectedResultFound.set(true); }); } }
/** * Create a query to return all RegistryState links. * * @return */ private static QueryTask buildAllRegistriesQuery() { return buildRegistryQuery(); }
private void verifyRegistryLinksByHostname(String hostname, Collection<String> tenantLinks, Collection<RegistryState> expectedRegistries) { assertNotNull(expectedRegistries); host.testStart(1); RegistryUtil.findRegistriesByHostname(host, hostname, tenantLinks, (registries, errors) -> { if (errors != null && !errors.isEmpty()) { host.failIteration(errors.iterator().next()); } verifyFoundRegistries(expectedRegistries, registries); }); host.testWait(); }
DockerImage image = DockerImage.fromParts("test.registry.com:5000", "vmware", "admiral", "latest"); List<RegistryState> filteredRegistries = RegistryUtil.filterRegistriesByPath(host, registries, image); assertNotNull(filteredRegistries); assertEquals(1, filteredRegistries.size()); image = DockerImage.fromParts("test.registry.com:5001", "", "admiral", "latest"); filteredRegistries = RegistryUtil.filterRegistriesByPath(host, registries, image); assertNotNull(filteredRegistries); assertEquals(1, filteredRegistries.size()); image = DockerImage.fromParts("test.registry.com:5001", "vmware", "admiral", "latest"); filteredRegistries = RegistryUtil.filterRegistriesByPath(host, registries, image); assertNotNull(filteredRegistries); assertEquals(2, filteredRegistries.size()); filteredRegistries = RegistryUtil.filterRegistriesByPath(host, registries, image); assertNotNull(filteredRegistries); assertEquals(2, filteredRegistries.size()); filteredRegistries = RegistryUtil.filterRegistriesByPath(host, registries, image); assertNotNull(filteredRegistries); assertEquals(1, filteredRegistries.size()); filteredRegistries = RegistryUtil.filterRegistriesByPath(host, registries, image); assertNotNull(filteredRegistries); assertEquals(1, filteredRegistries.size());
private void verifyRegistryLinksByRegistryFilter(String registryFilter, Collection<String> tenantLinks, Collection<RegistryState> expectedRegistries) { assertNotNull(expectedRegistries); host.testStart(1); RegistryUtil.findRegistries(host, tenantLinks, registryFilter, (registries, errors) -> { if (errors != null && !errors.isEmpty()) { host.failIteration(errors.iterator().next()); } verifyFoundRegistries(expectedRegistries, registries); }); host.testWait(); }
/** * Create a query to return all RegistryState links matching a given name. Results are filtered * within a specified group/tenant or are global RegistryState links if the tenantLinks * collection is null/empty. * * @param registryName * @param tenantLinks * @return QueryTask */ private static QueryTask buildRegistryQueryByNameAndTenantLinks(String registryName, Collection<String> tenantLinks) { Query nameClause = new Query() .setTermPropertyName(RegistryState.FIELD_NAME_NAME) .setTermMatchValue(registryName); Query tenantsClause = buildQueryByTenantLinks(tenantLinks); return buildRegistryQuery(nameClause, tenantsClause); }
RegistryUtil.findRegistries(host, Collections.singletonList(TEST_GROUP_TENANT_LINK), null, (registries, FAIL_ON_ERROR_HANDLER) -> { Set<String> registryLinks = registries.stream().map(r -> r.documentSelfLink).collect(Collectors.toSet()); RegistryUtil.findRegistries(host, Collections.singletonList(TEST_GROUP_TENANT_LINK), null, (registries, FAIL_ON_ERROR_HANDLER) -> {