java habor认证 docker认证

2021-07-13  本文已影响0人  _micang

harbor 认证关键代码

public class AuthUtils {
    public static HttpHeaders createHeaders(String username, String password) {
        return new HttpHeaders() {
            {
                String auth = username + ":" + password;
                String authHeader = "Basic " + Base64.getEncoder().encodeToString(auth.getBytes(StandardCharsets.US_ASCII));
                set("Authorization", authHeader);
            }
        };
    }
}

harbor 镜像搜索关键代码

public List<Object> searchRepositories(String name, String page, String pageSize) {
        try {
            // 构建url
            StringBuilder url = new StringBuilder()
                    .append(harborConfig.getTemplate().getApiurl())
                    .append("/projects/")
                    .append(harborConfig.getTemplate().getProjectname())
                    .append("/repositories?")
                    .append("q=name=~").append(name);
            if (StringUtils.isNotBlank(page)) {url.append("&page=").append(page);}
            if (StringUtils.isNotBlank(pageSize)) {url.append("&page_size=").append(pageSize);}

            // 认证
            HttpHeaders headers = AuthUtils.createHeaders(
                    harborConfig.getTemplate().getUsername(),
                    harborConfig.getTemplate().getPassword()
            );

            //请求
            ResponseEntity<List<Object>> response = restTemplate.exchange(
                    url.toString(),
                    HttpMethod.GET,
                    new HttpEntity<>(headers),
                    new ParameterizedTypeReference<List<Object>>(){}
            );
            return response.getBody();
        } catch (Exception e) {
            logger.error("【Harbor Search】镜像搜索异常, ", e);
            return new ArrayList<>();
        }
    }

docker 认证代码

DockerContainer dc = new DockerContainer().setTag(tag);
            String url = DockerApiUrlEnum.PUSH.url(host, dockerConfig.getDaemonport(), name);

            DockerAuther dockerAuth = new DockerAuther()
                    .setPassword(dockerConfig.getPassword())
                    .setUsername(dockerConfig.getUsername())
                    .setServeraddress(dockerConfig.getHost())
                    .setEmail(dockerConfig.getEmail());

            Connection.Response response = Jsoup.connect(url)
                    .timeout(TIMEOUT_THRESHOLD)
                    .ignoreContentType(true)
                    .headers(new HashMap<String, String>() {{
                        put("X-Registry-Auth", UriEncoder.encode(
                                Base64.getEncoder().encodeToString(
                                    JSON.toJSONString(dockerAuth).getBytes(StandardCharsets.UTF_8))
                                )
                        );
                        put("Content-Type", APPLICATION_JSON_UTF8_VALUE);
                    }})
                    // 不加data,requestBody 不会当json格式处理, 而是默认格式
                    .data(BeanUtils.objToMap(dc))
                    .requestBody(JSON.toJSONString(dc))
                    .method(Connection.Method.POST)
                    .execute();

docker 镜像查询关键代码

public Optional<List<ImageInfo>> searchImage(String host, String imageTag) {
        try {
            Map<String, String[]> reference = new HashMap<String, String[]>() {{
                put("reference", new String[]{imageTag});
            }};
            String url = DockerApiUrlEnum.IMAGE_LIST.url(host, dockerConfig.getDaemonport());

            Connection.Response response = Jsoup.connect(url)
                    .timeout(TIMEOUT_THRESHOLD)
                    .ignoreContentType(true)
                    .header("Content-Type", APPLICATION_JSON_UTF8_VALUE)
                    .data("filters", JSON.toJSONString(reference))
                    .method(Connection.Method.GET)
                    .execute();
            if (response.statusCode() != HttpStatus.OK.value()) {
                logger.error("【DOCKER SEARCH】镜像{}@{}查找失败, response: {}", host, imageTag, response.body());
                return Optional.empty();
            }
            if (JSON.parseArray(response.body()).isEmpty()) {
                logger.info("【DOCKER SEARCH】节点{}@{}镜像不存在", host, imageTag);
                return Optional.empty();
            }
            return Optional.of(JSON.parseArray(response.body(), ImageInfo.class));
        } catch (Exception e) {
            logger.error("【DOCKER SEARCH】镜像{}@{}查找失败, ", host, imageTag, e);
            return Optional.empty();
        }
    }
上一篇下一篇

猜你喜欢

热点阅读