fix(制品库功能完善): 新建docker虚拟仓库,接口报错

1. 创建Docker虚拟仓库时,必须传入docker参数(包含映射端口相关字段)
2. 检查发现检查docker端口占用时,取的JSON属性错误,修复该问题
This commit is contained in:
OTTO 2024-07-26 14:25:37 +08:00
parent 1aa98d0c43
commit 63d7c166fe
5 changed files with 44 additions and 29 deletions

View File

@ -119,7 +119,7 @@ public class PmsProductLibraryRepositoriesController extends BaseController {
@PutMapping("/group/{format}/{name}")
@ApiOperation(value = "更新虚拟仓库")
public AjaxResult editGroup(@PathVariable String enterpriseIdentifier,
@ApiParam(value = "制品库名称", required = true) @PathVariable String name,
@ApiParam(value = "虚拟仓库名称", required = true) @PathVariable String name,
@Valid @RequestBody GroupRepositoriesOperateVo groupRepositoriesOperateVo) {
groupRepositoriesOperateVo.setEnterpriseIdentifier(enterpriseIdentifier);
groupRepositoriesOperateVo.setName(name);

View File

@ -20,6 +20,8 @@ import javax.validation.constraints.NotNull;
@Data
@ApiModel("虚拟仓库操作对象")
public class GroupRepositoriesOperateVo {
@ApiModelProperty(value = "制品库Id", hidden = true)
private Long id;
@ApiModelProperty(value = "虚拟仓库名称", hidden = true)
private String name;
@ApiModelProperty(value = "企业标识", hidden = true)
@ -34,6 +36,9 @@ public class GroupRepositoriesOperateVo {
@ApiModelProperty(value = "成员对象")
@NotNull(message = "虚拟仓库成员对象不能为空")
private NexusRepoGroupVo group;
@Valid
@ApiModelProperty(value = "Docker制品库输入对象")
private NexusRepoDockerVo docker;
public NexusGroupRepoInputVo toNexusGroupRepoInputVo() {
NexusGroupRepoInputVo target = new NexusGroupRepoInputVo();
@ -41,6 +46,7 @@ public class GroupRepositoriesOperateVo {
target.setName(PmsProductLibraryRepositories.getNexusRepositoriesName(this.enterpriseIdentifier, this.name));
target.setGroup(group.toNexusRepoGroupVo(this.enterpriseIdentifier));
target.setStorage(new NexusRepoStorageVo());
target.setDocker(this.getDocker());
return target;
}
@ -50,6 +56,9 @@ public class GroupRepositoriesOperateVo {
JSONObject attributeJson = new JSONObject();
attributeJson.put("online", online);
attributeJson.put("group", group);
if (docker != null) {
attributeJson.put("docker", docker);
}
pmsProductLibraryRepositories.setAttributes(attributeJson.toJSONString());
return pmsProductLibraryRepositories;
}

View File

@ -19,7 +19,7 @@ import javax.validation.Valid;
@Data
@ApiModel("托管制品库操作对象")
public class HostedRepositoriesOperateVo {
@ApiModelProperty(value = "制品库标识", hidden = true)
@ApiModelProperty(value = "制品库Id", hidden = true)
private Long id;
@ApiModelProperty(value = "制品库名称", hidden = true)
private String name;

View File

@ -16,5 +16,6 @@ public class NexusGroupRepoInputVo {
private boolean online;
private NexusRepoStorageVo storage;
private NexusRepoGroupVo group;
private NexusRepoDockerVo docker;
}

View File

@ -119,13 +119,38 @@ public class PmsProductLibraryRepositoriesServiceImpl implements IPmsProductLibr
for (String memberRepoName : groupRepositoriesOperateVo.getGroup().getMemberNames()) {
PmsProductLibraryRepositories pmsProductLibraryRepositories =
selectPmsProductLibraryRepositoriesByName(groupRepositoriesOperateVo.getEnterpriseIdentifier(), memberRepoName);
// if (!pmsProductLibraryRepositories.getType().equals(ProductLibraryRepositoriesTypeEnum.HOSTED.getKey())) {
// throw new ServiceException("请选择托管类型的制品库作为虚拟仓库成员");
// }
if (!pmsProductLibraryRepositories.getFormat().equals(groupRepositoriesOperateVo.getFormat())) {
throw new ServiceException("请选择相同格式的制品库作为虚拟仓库成员(制品库格式[%s])", groupRepositoriesOperateVo.getFormat());
}
}
checkDockerRepoParameter(groupRepositoriesOperateVo.getDocker(), groupRepositoriesOperateVo.getId());
}
private void checkDockerRepoParameter(NexusRepoDockerVo nexusRepoDockerVo, Long oldRepoId) {
if (nexusRepoDockerVo == null) {
throw new ServiceException("新增【%s】格式制品库时docker参数不能为空", ProductLibraryRepositoriesFormatEnum.DOCKER.getName());
}
// 检查映射端口是否已被占用
PmsProductLibraryRepositories searchRepo = new PmsProductLibraryRepositories();
searchRepo.setFormat(ProductLibraryRepositoriesFormatEnum.DOCKER.getKey());
List<PmsProductLibraryRepositories> dockerRepoList =
pmsProductLibraryRepositoriesMapper.selectPmsProductLibraryRepositoriesList(searchRepo);
// 获取端口相同的仓库
PmsProductLibraryRepositories sameDockerRepo = dockerRepoList.stream().filter(repo -> {
String attributeStr = repo.getAttributes();
JSONObject attributeJson = JSONObject.parseObject(attributeStr);
if (attributeJson.containsKey("docker")) {
NexusRepoDockerVo repoDockerVo = attributeJson.getObject("docker", NexusRepoDockerVo.class);
return repoDockerVo.getHttpPort() != null &&
repoDockerVo.getHttpPort().equals(nexusRepoDockerVo.getHttpPort());
}
return false;
}).findFirst().orElse(null);
// 判断端口相同的仓库是否为当前仓库代表更新若不是则返回错误信息
if (sameDockerRepo != null && !sameDockerRepo.getId().equals(oldRepoId)) {
throw new ServiceException("Docker类型制品库的HTTP端口映射已被占用(HTTP端口映射[%d])", nexusRepoDockerVo.getHttpPort());
}
}
/**
@ -182,29 +207,7 @@ public class PmsProductLibraryRepositoriesServiceImpl implements IPmsProductLibr
VersionPolicyEnum.getByKey(hostedRepositoriesOperateVo.getMaven().getVersionPolicy());
LayoutPolicyEnum.getByKey(hostedRepositoriesOperateVo.getMaven().getLayoutPolicy());
} else if (ProductLibraryRepositoriesFormatEnum.DOCKER.getKey().equals(hostedRepositoriesOperateVo.getFormat())) {
NexusRepoDockerVo nexusRepoDockerVo = hostedRepositoriesOperateVo.getDocker();
if (nexusRepoDockerVo == null) {
throw new ServiceException("新增【%s】格式制品库时docker参数不能为空", ProductLibraryRepositoriesFormatEnum.DOCKER.getName());
}
VersionPolicyEnum.getByKey(nexusRepoDockerVo.getVersionPolicy());
// 检查映射端口是否已被占用
PmsProductLibraryRepositories searchRepo = new PmsProductLibraryRepositories();
searchRepo.setFormat(ProductLibraryRepositoriesFormatEnum.DOCKER.getKey());
List<PmsProductLibraryRepositories> dockerRepoList =
pmsProductLibraryRepositoriesMapper.selectPmsProductLibraryRepositoriesList(searchRepo);
// 获取端口相同的仓库
PmsProductLibraryRepositories sameDockerRepo = dockerRepoList.stream().filter(repo -> {
String attributeStr = repo.getAttributes();
NexusRepoDockerVo repoDockerVo = JSONObject.parseObject(attributeStr, NexusRepoDockerVo.class);
return repoDockerVo.getHttpPort() != null &&
repoDockerVo.getHttpPort().equals(nexusRepoDockerVo.getHttpPort());
}).findFirst().orElse(null);
// 判断端口相同的仓库是否为当前仓库代表更新若不是则返回错误信息
if (sameDockerRepo != null && !sameDockerRepo.getId().equals(hostedRepositoriesOperateVo.getId())) {
throw new ServiceException("Docker类型制品库的HTTP端口映射已被占用(HTTP端口映射[%d])", nexusRepoDockerVo.getHttpPort());
}
checkDockerRepoParameter(hostedRepositoriesOperateVo.getDocker(), hostedRepositoriesOperateVo.getId());
}
}
@ -222,12 +225,13 @@ public class PmsProductLibraryRepositoriesServiceImpl implements IPmsProductLibr
hostedRepositoriesOperateVo.getName());
checkLockRepositoryStatus(hostedRepositoriesOperateVo.getEnterpriseIdentifier(), oldRepo.getId());
hostedRepositoriesOperateVo.setFormat(oldRepo.getFormat());
hostedRepositoriesOperateVo.setId(oldRepo.getId());
checkInputParameter(hostedRepositoriesOperateVo);
// 构建更新对象
PmsProductLibraryRepositories pmsProductLibraryRepositories = hostedRepositoriesOperateVo.toPmsProductLibraryRepositories();
pmsProductLibraryRepositories.setId(oldRepo.getId());
pmsProductLibraryRepositories.setUpdateTime(DateUtils.getNowDate());
pmsProductLibraryRepositories.setUpdateBy(SecurityUtils.getUsername());
checkInputParameter(hostedRepositoriesOperateVo);
NexusHostedRepoInputVo requestBody = hostedRepositoriesOperateVo.toNexusRepoDataVo();
// 调用制品库更新接口更新制品库
@ -248,6 +252,7 @@ public class PmsProductLibraryRepositoriesServiceImpl implements IPmsProductLibr
groupRepositoriesOperateVo.getEnterpriseIdentifier(),
groupRepositoriesOperateVo.getName());
groupRepositoriesOperateVo.setFormat(oldRepo.getFormat());
groupRepositoriesOperateVo.setId(oldRepo.getId());
checkGroupMemberRepoList(groupRepositoriesOperateVo);
NexusGroupRepoInputVo requestBody = groupRepositoriesOperateVo.toNexusGroupRepoInputVo();
// 调用制品库更新接口更新制品库