Harbor升级后,prod-service读取log出错

  • Choerodon平台版本:0.25.0

  • 运行环境:自主搭建

  • 问题描述:

    升级0.25后,需要升级harbor到2.1.4。升级后harbor的历史日志会出现资源显示类似 open/tiller: 这种,没有版本号的清空。而且,资源显示在有些操作显示是 open/choerodon-cluster-agent:sha256:52bf786cee75f0a8599d9256814dcfda9ba6a9b3ac727ebd93a63b4d5f65e776这种。导致prod-repo-service服务在提取habor信息时报错:

  • 执行的操作:

按官网步骤升级到0.25。 查看制品库,界面报错。

  • 报错信息(请尽量使用代码块或系统截图的形式展现):
java.lang.ArrayIndexOutOfBoundsException: 1
	at org.hrds.rdupm.harbor.infra.operator.HarborClientOperator.lambda$listImageLogs$1(HarborClientOperator.java:157) ~[classes!/:0.25.10]
	at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) ~[na:1.8.0_275]
	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1384) ~[na:1.8.0_275]
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482) ~[na:1.8.0_275]
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472) ~[na:1.8.0_275]
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) ~[na:1.8.0_275]
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:1.8.0_275]
	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:566) ~[na:1.8.0_275]
  • 建议:

    listImageLogs方法中会将log日志的resource按“:”split, 在以上两种情况下,都存在bug。建议这里调整下,兼容下升级后harbor的日志不完整的情况。
    或者,不解析这个resouce了~

prod-repo先升级到0.25.10 看看

0.25.10依然有这个问题。
我删除了harbor项目,重建后可以显示,但资源和版本全部显示为null。
另,V2版本好像无法过滤操作类型了

界面上是怎么体现的?

可以过滤

文件:src/main/java/org/hrds/rdupm/harbor/app/service/impl/HarborLogServiceImpl.java

方法:processImageLogList
代码:感觉这里没有兼容V2版本返回的数据,这个应该是V1版本的数据格式?

dto.setContent(String.format("%s(%s) %s 镜像【%s:%s】",realName,loginName,operateTypeName,dto.getRepoName(), dto.getTagName()));

嗯嗯 是的 我正在处理

2021-08-20 14:43:09.428 DEBUG 7 --- [ XNIO-3 task-25] o.h.r.h.infra.util.HarborHttpClient      : url:https://registry.xxx.x/api/v2.0/projects/xxx-xxx/logs?page=0&operation=pull&page_size=0
2021-08-20 14:43:09.428 DEBUG 7 --- [ XNIO-3 task-25] o.h.r.h.infra.util.HarborHttpClient      : body:null
2021-08-20 14:43:09.430 ERROR 7 --- [ XNIO-3 task-25] o.h.r.c.a.c.v1.ProductLibraryController  : query harbor error

java.lang.ArrayIndexOutOfBoundsException: 1
	at org.hrds.rdupm.harbor.infra.operator.HarborClientOperator.lambda$listImageLogs$1(HarborClientOperator.java:157) ~[classes!/:0.25.11]
	at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) ~[na:1.8.0_275]
	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1384) ~[na:1.8.0_275]
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482) ~[na:1.8.0_275]
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472) ~[na:1.8.0_275]
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) ~[na:1.8.0_275]
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:1.8.0_275]
	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:566) ~[na:1.8.0_275]
	at org.hrds.rdupm.harbor.infra.operator.HarborClientOperator.listImageLogs(HarborClientOperator.java:160) ~[classes!/:0.25.11]

亲,为撒要提取所有日志呢? 而且日志查询失败,直接导致界面上仓库不显示了。

如果有人不小心docker pull xxxxx: 的话,日志里就会有一条带“:”但是splite只有只有前半部分的记录。由于提取所有日志,会一直报这个错误。

你部署的还是0.25.10版本吗

是的
prod-repo-service上master分支代码 第147行

                paramMap.put("page", 0);
                paramMap.put("page_size", 0);
                responseEntity = harborHttpClient.exchange(HarborConstants.HarborApiEnum.LIST_LOGS_PROJECT, paramMap, null, adminAccountFlag, harborProjectCode);
                logListResult = gson.fromJson(responseEntity.getBody(), new TypeToken<List<HarborImageLog>>() {
                }.getType());
                if (logListResult != null) {
                    logListResult = logListResult.stream().map(t -> {
                        if (t.getResource().contains(":")) {
                            String[] strings = t.getResource().split(":");
                            t.setRepoName(strings[0]);
                            t.setTagName(strings[1]);
                        }
                        return t;
                    }).collect(Collectors.toList());
                }