prod-repo-service服务无法创建harbor机器人

  • Choerodon平台版本:0.25

  • 运行环境:自主搭建
    harbor版本:v2.2.1-b0d63082

  • 问题描述:
    创建devops项目时,事务实例卡在 rdupm-docker-repo-create的rdupm-docker-robot-create。
    创建机器人的接口返回了409 conflict
    经检查,harbor中已经创建该机器人

  • 问题分析
    删除harbor机器人后事务重试,发现无法取得机器人生成的sercert。


    检查源码后发现取的是token字段,看起来是字段取错了。
    看环境变量使用的是v2版本的harbor api。这个解析方式是否兼容harbor@2.2.1?

ps:论坛限制,我只能放一张图,保留token检索不到那张

409的错误主要检查harbor上用户名或者邮箱是否冲突了

harbor用户只有admin,没配邮箱,这估计不会冲突吧

我这边harbor的api格式

POST ​/projects​/{project_name_or_id}​/robots
返回格式:

{
  "secret": "string",
  "creation_time": "2021-07-01T02:32:45.017Z",
  "id": 0,
  "expires_at": 0,
  "name": "string"
}

GET /projects​/{project_name_or_id}​/robots

[
  {
    "update_time": "2021-07-01T02:33:51.973Z",
    "description": "string",
    "level": "string",
    "editable": true,
    "creation_time": "2021-07-01T02:33:51.973Z",
    "expires_at": 0,
    "name": "string",
    "secret": "string",
    "disable": true,
    "duration": 0,
    "id": 0,
    "permissions": [
      {
        "access": [
          {
            "action": "string",
            "resource": "string",
            "effect": "string"
          }
        ],
        "kind": "string",
        "namespace": "string"
      }
    ]
  }
]

我们用的harbor是2.1.3 没有2.2.x的环境 你可以试试降到2.1.3看看还有没有这个问题 然后再创建项目,出错后先不要删数据,先把错误截图给我看

2.1.3可以,是因为harbor的api小版本差异。
有计划什么时候支持2.2.x吗?

主要是2.2的返回值有变化
HarborRobotServiceImpl这么改一下就可以了:
// 适配2.2版本
String token = newRobotVO.getToken();
if (StringUtils.isBlank(token)) {
newRobotVO.setToken(newRobotVO.getSecret());
}
AssertUtils.notNull(newRobotVO.getToken(),“the robot response token empty”);
AssertUtils.notNull(newRobotVO.getName(),“the robot response name empty”);
harborRobot.setName(newRobotVO.getName());
harborRobot.setToken(newRobotVO.getToken());

    //查找所有harbor
    ResponseEntity<String> allRobotResponseEntity = harborHttpClient.exchange(HarborConstants.HarborApiEnum.GET_PROJECT_ALL_ROBOTS,null,null,true,harborRobot.getHarborProjectId());
    List<HarborRobotVO> allRobotVOList = new ArrayList<>();
    if ( null != allRobotResponseEntity && StringUtils.isNotBlank(allRobotResponseEntity.getBody())) {
        allRobotVOList = new Gson().fromJson(allRobotResponseEntity.getBody(),new TypeToken<List<HarborRobotVO>>(){}.getType());
    }
    logger.info("<<<<<<<< " + harborRobot.getName() + " >>>>>>>>>");
    logger.info(allRobotVOList.toString());
    HarborRobotVO robotInfo = allRobotVOList.stream().filter(x->x.getName().equals(harborRobot.getName())).collect(Collectors.toList()).get(0);
    // 适配2.2版本
    Boolean disabled = robotInfo.getDisabled();
    if (disabled == null) {
        harborRobot.setEnableFlag(HarborConstants.HarborRobot.ENABLE_FLAG_Y);
    } else {
        harborRobot.setEnableFlag(robotInfo.getDisabled() ? HarborConstants.HarborRobot.ENABLE_FLAG_N : HarborConstants.HarborRobot.ENABLE_FLAG_Y);
    }