| @@ -48,4 +48,6 @@ output/ | |||
| .project | |||
| .classpath | |||
| logs/ | |||
| *.log | |||
| *.log | |||
| kubeconfig_test | |||
| @@ -11,8 +11,8 @@ Nacos + Fegin + Gateway + (Spring Security + JWT + OAuth2) | |||
| 初始化sql位置 /sql | |||
| **地址:** 127.0.0.1:3306 | |||
| **用户名:** test **密码:** test | |||
| **地址:** 10.5.29.66:3306 | |||
| **用户名:** test **密码:** zj12345678 | |||
| ### Nacos | |||
| @@ -42,10 +42,10 @@ public class ResourceSpecsCreateDTO implements Serializable { | |||
| @Pattern(regexp = StringConstant.REGEXP_SPECS, message = "规格名称支持字母、数字、汉字、英文横杠、下划线和空白字符") | |||
| private String specsName; | |||
| @ApiModelProperty(value = "所属业务场景(0:通用,1:dubhe-notebook,2:dubhe-train,3:dubhe-serving, 4:dubhe-tadl)", required = true) | |||
| @ApiModelProperty(value = "所属业务场景(0:通用,1:dubhe-notebook,2:dubhe-train,3:dubhe-serving, 4:dubhe-tadl, 5:dubhe-point-cloud,6:data-annotation,7:atlas)", required = true) | |||
| @NotNull(message = "所属业务场景不能为空") | |||
| @Min(value = MagicNumConstant.ZERO, message = "所属业务场景错误") | |||
| @Max(value = MagicNumConstant.FOUR, message = "所属业务场景错误") | |||
| @Max(value = MagicNumConstant.SEVEN, message = "所属业务场景错误") | |||
| private Integer module; | |||
| @ApiModelProperty(value = "CPU数量,单位:核", required = true) | |||
| @@ -71,4 +71,4 @@ public class ResourceSpecsCreateDTO implements Serializable { | |||
| @Min(value = MagicNumConstant.ZERO, message = "工作空间的存储配额不能小于0") | |||
| @Max(value = MagicNumConstant.TWO_BILLION, message = "工作空间的存储配额超限") | |||
| private Integer workspaceRequest; | |||
| } | |||
| } | |||
| @@ -47,8 +47,8 @@ public class ResourceSpecsQueryDTO extends PageQueryBase implements Serializable | |||
| @ApiModelProperty("规格类型(0为CPU, 1为GPU)") | |||
| private Boolean resourcesPoolType; | |||
| @ApiModelProperty("所属业务场景(0:通用,1:dubhe-notebook,2:dubhe-train,3:dubhe-serving,4:dubhe-tadl)") | |||
| @ApiModelProperty("所属业务场景(0:通用,1:dubhe-notebook,2:dubhe-train,3:dubhe-serving,4:dubhe-tadl,5:dubhe-point-cloud,6:data-annotation,7:atlas)") | |||
| @Min(value = MagicNumConstant.ZERO, message = "所属业务场景错误") | |||
| @Max(value = MagicNumConstant.FOUR, message = "所属业务场景错误") | |||
| @Max(value = MagicNumConstant.SEVEN, message = "所属业务场景错误") | |||
| private Integer module; | |||
| } | |||
| } | |||
| @@ -49,10 +49,10 @@ public class ResourceSpecsUpdateDTO implements Serializable { | |||
| @Pattern(regexp = StringConstant.REGEXP_SPECS, message = "规格名称支持字母、数字、汉字、英文横杠、下划线和空白字符") | |||
| private String specsName; | |||
| @ApiModelProperty(value = "所属业务场景(0:通用,1:dubhe-notebook,2:dubhe-train,3:dubhe-serving, 4:dubhe-tadl)", required = true) | |||
| @ApiModelProperty(value = "所属业务场景(0:通用,1:dubhe-notebook,2:dubhe-train,3:dubhe-serving, 4:dubhe-tadl, 5:dubhe-point-cloud,6:data-annotation,7:atlas)", required = true) | |||
| @NotNull(message = "所属业务场景不能为空") | |||
| @Min(value = MagicNumConstant.ZERO, message = "所属业务场景错误") | |||
| @Max(value = MagicNumConstant.FOUR, message = "所属业务场景错误") | |||
| @Max(value = MagicNumConstant.SEVEN, message = "所属业务场景错误") | |||
| private Integer module; | |||
| @ApiModelProperty(value = "CPU数量,单位:核") | |||
| @@ -74,4 +74,4 @@ public class ResourceSpecsUpdateDTO implements Serializable { | |||
| @Min(value = MagicNumConstant.ZERO, message = "工作空间的存储配额不能小于0") | |||
| @Max(value = MagicNumConstant.TWO_BILLION, message = "工作空间的存储配额超限") | |||
| private Integer workspaceRequest; | |||
| } | |||
| } | |||
| @@ -0,0 +1,46 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.admin.rest; | |||
| import io.swagger.annotations.Api; | |||
| import io.swagger.annotations.ApiOperation; | |||
| import org.dubhe.admin.service.MinIoService; | |||
| import org.dubhe.biz.base.vo.DataResponseBody; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.web.bind.annotation.GetMapping; | |||
| import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RestController; | |||
| /** | |||
| * @description minio 服务 | |||
| * @date 2022-06-08 | |||
| */ | |||
| @Api(tags = "系统:minio服务") | |||
| @RestController | |||
| @RequestMapping("/minio") | |||
| public class MinIoController { | |||
| @Autowired | |||
| private MinIoService minIoService; | |||
| @ApiOperation("获取MinIO相关信息") | |||
| @GetMapping(value = "/info") | |||
| public DataResponseBody getMinIOInfo() { | |||
| return new DataResponseBody(minIoService.getMinIOInfo()); | |||
| } | |||
| } | |||
| @@ -30,7 +30,9 @@ import org.dubhe.biz.base.context.UserContext; | |||
| import org.dubhe.biz.base.dto.UserDTO; | |||
| import org.dubhe.biz.base.vo.DataResponseBody; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.beans.factory.annotation.Value; | |||
| import org.springframework.security.access.prepost.PreAuthorize; | |||
| import org.springframework.security.core.Authentication; | |||
| import org.springframework.validation.annotation.Validated; | |||
| import org.springframework.web.bind.annotation.*; | |||
| @@ -121,7 +123,7 @@ public class UserController { | |||
| @ApiOperation("根据用户昵称搜索用户列表") | |||
| @GetMapping(value = "/findByNickName") | |||
| public DataResponseBody<List<UserDTO>> findByNickName(@RequestParam(value = "nickName",required = false) String nickName) { | |||
| public DataResponseBody<List<UserDTO>> findByNickName(@RequestParam(value = "nickName", required = false) String nickName) { | |||
| return new DataResponseBody(userService.findByNickName(nickName)); | |||
| } | |||
| @@ -130,4 +132,10 @@ public class UserController { | |||
| public DataResponseBody<List<UserDTO>> getUserList(@RequestParam(value = "ids") List<Long> ids) { | |||
| return new DataResponseBody(userService.getUserList(ids)); | |||
| } | |||
| @ApiOperation("见微平台专用") | |||
| @GetMapping("/decryptVisUser") | |||
| public DataResponseBody<String> encryptVisUser(Authentication authentication) { | |||
| return new DataResponseBody<>(userService.encryptUserForVis(authentication)); | |||
| } | |||
| } | |||
| @@ -0,0 +1,31 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.admin.service; | |||
| import java.util.Map; | |||
| /** | |||
| * @description minIo服务 service | |||
| * @date 2022-6-8 | |||
| **/ | |||
| public interface MinIoService { | |||
| /** | |||
| * 对minio 的账户密码进行加密操作 | |||
| * @return Map<String,String> minio账户密码加密map | |||
| */ | |||
| Map<String,String> getMinIOInfo(); | |||
| } | |||
| @@ -26,6 +26,7 @@ import org.dubhe.biz.base.dto.TeamDTO; | |||
| import org.dubhe.biz.base.dto.UserDTO; | |||
| import org.dubhe.biz.base.vo.DataResponseBody; | |||
| import org.dubhe.cloud.authconfig.service.AdminUserService; | |||
| import org.springframework.security.core.Authentication; | |||
| import javax.servlet.http.HttpServletResponse; | |||
| import java.io.IOException; | |||
| @@ -239,4 +240,6 @@ public interface UserService extends AdminUserService, IService<User> { | |||
| * @return org.dubhe.admin.domain.vo.UserConfigCreateVO 用户配置 VO | |||
| */ | |||
| UserConfigCreateVO createOrUpdateUserConfig(UserConfigDTO userConfigDTO); | |||
| String encryptUserForVis(Authentication authentication); | |||
| } | |||
| @@ -384,6 +384,7 @@ public class MenuServiceImpl implements MenuService { | |||
| menuVo1.setComponent(menuVo.getComponent()); | |||
| } else { | |||
| menuVo1.setPath(menuDTO.getPath()); | |||
| menuVo1.setName(menuDTO.getComponentName()); | |||
| } | |||
| menuVo.setName(null); | |||
| menuVo.setMeta(null); | |||
| @@ -0,0 +1,70 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.admin.service.impl; | |||
| import org.dubhe.admin.service.MinIoService; | |||
| import org.dubhe.biz.base.constant.MagicNumConstant; | |||
| import org.dubhe.biz.base.exception.BusinessException; | |||
| import org.dubhe.biz.base.utils.RsaEncrypt; | |||
| import org.springframework.beans.factory.annotation.Value; | |||
| import org.springframework.stereotype.Service; | |||
| import java.util.HashMap; | |||
| import java.util.Map; | |||
| /** | |||
| * @description minIo服务 实现类 | |||
| * @date 2022-06-08 | |||
| */ | |||
| @Service | |||
| public class MinIoServiceImpl implements MinIoService { | |||
| /** | |||
| * minIO公钥 | |||
| */ | |||
| @Value("${minio.accessKey}") | |||
| private String accessKey; | |||
| /** | |||
| * minIO私钥 | |||
| */ | |||
| @Value("${minio.secretKey}") | |||
| private String secretKey; | |||
| /** | |||
| * 加密字符串 | |||
| */ | |||
| @Value("${minio.url}") | |||
| private String url; | |||
| @Override | |||
| public Map<String, String> getMinIOInfo() { | |||
| try { | |||
| Map<String, String> keyPair = RsaEncrypt.genKeyPair(); | |||
| String publicKey = RsaEncrypt.getPublicKey(keyPair); | |||
| String privateKey = RsaEncrypt.getPrivateKey(keyPair); | |||
| return new HashMap<String, String>(MagicNumConstant.FOUR) {{ | |||
| put("url", RsaEncrypt.encrypt(url, publicKey)); | |||
| put("accessKey", RsaEncrypt.encrypt(accessKey, publicKey)); | |||
| put("secretKey", RsaEncrypt.encrypt(secretKey, publicKey)); | |||
| put("privateKey", privateKey); | |||
| }}; | |||
| } catch (Exception e) { | |||
| throw new BusinessException("MinIo info empty"); | |||
| } | |||
| } | |||
| } | |||
| @@ -47,6 +47,7 @@ import org.dubhe.admin.service.convert.UserConvert; | |||
| import org.dubhe.biz.base.constant.AuthConst; | |||
| import org.dubhe.biz.base.constant.ResponseCode; | |||
| import org.dubhe.biz.base.constant.UserConstant; | |||
| import org.dubhe.biz.base.context.EncryptVisUser; | |||
| import org.dubhe.biz.base.context.UserContext; | |||
| import org.dubhe.biz.base.dto.*; | |||
| import org.dubhe.biz.base.enums.BaseErrorCodeEnum; | |||
| @@ -55,6 +56,7 @@ import org.dubhe.biz.base.exception.BusinessException; | |||
| import org.dubhe.biz.base.exception.CaptchaException; | |||
| import org.dubhe.biz.base.utils.DateUtil; | |||
| import org.dubhe.biz.base.utils.Md5Util; | |||
| import org.dubhe.biz.base.utils.RSAUtil; | |||
| import org.dubhe.biz.base.utils.RandomUtil; | |||
| import org.dubhe.biz.base.utils.RsaEncrypt; | |||
| import org.dubhe.biz.base.vo.DataResponseBody; | |||
| @@ -73,6 +75,7 @@ import org.springframework.beans.BeanUtils; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.beans.factory.annotation.Value; | |||
| import org.springframework.cglib.beans.BeanMap; | |||
| import org.springframework.security.core.Authentication; | |||
| import org.springframework.security.crypto.password.PasswordEncoder; | |||
| import org.springframework.stereotype.Service; | |||
| import org.springframework.transaction.annotation.Transactional; | |||
| @@ -81,6 +84,8 @@ import org.springframework.util.CollectionUtils; | |||
| import javax.annotation.Resource; | |||
| import javax.servlet.http.HttpServletResponse; | |||
| import java.io.IOException; | |||
| import java.security.NoSuchAlgorithmException; | |||
| import java.security.spec.InvalidKeySpecException; | |||
| import java.util.*; | |||
| import java.util.stream.Collectors; | |||
| @@ -109,6 +114,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us | |||
| @Value("${user.config.gpu-limit}") | |||
| private Integer gpuLimit; | |||
| @Value("${vis.public_key}") | |||
| private String visPublicKey; | |||
| @Autowired | |||
| private UserMapper userMapper; | |||
| @@ -783,6 +791,22 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us | |||
| return userConfigCreateVO; | |||
| } | |||
| @Override | |||
| public String encryptUserForVis(Authentication authentication) { | |||
| String encodeStr = ""; | |||
| try { | |||
| JwtUserDTO jwtUser = (JwtUserDTO) authentication.getPrincipal(); | |||
| EncryptVisUser visUser = new EncryptVisUser(); | |||
| BeanUtils.copyProperties(jwtUser.getUser(), visUser); | |||
| encodeStr = RSAUtil.publicEncrypt(JSONObject.toJSONString(visUser), RSAUtil.getPublicKey(visPublicKey)); | |||
| } catch (NoSuchAlgorithmException e) { | |||
| e.printStackTrace(); | |||
| } catch (InvalidKeySpecException e) { | |||
| e.printStackTrace(); | |||
| } | |||
| return encodeStr; | |||
| } | |||
| /** | |||
| * 校验验证码 | |||
| @@ -11,7 +11,7 @@ spring: | |||
| config: | |||
| enabled: true | |||
| server-addr: 127.0.0.1:8848 | |||
| namespace: dubhe-server-cloud-prod | |||
| namespace: dubhe-prod | |||
| shared-configs[0]: | |||
| data-id: common-biz.yaml | |||
| group: dubhe | |||
| @@ -29,9 +29,13 @@ spring: | |||
| data-id: admin.yaml | |||
| group: dubhe | |||
| refresh: true | |||
| shared-configs[4]: | |||
| data-id: kubeconfig.yaml | |||
| group: dubhe | |||
| refresh: true | |||
| discovery: | |||
| enabled: true | |||
| namespace: dubhe-server-cloud-dev | |||
| namespace: dubhe-prod | |||
| group: dubhe | |||
| server-addr: 127.0.0.1:8848 | |||
| @@ -1,3 +1,20 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.admin; | |||
| import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | |||
| @@ -12,7 +12,7 @@ spring: | |||
| config: | |||
| enabled: true | |||
| server-addr: 127.0.0.1:8848 | |||
| namespace: dubhe-server-cloud-prod | |||
| namespace: dubhe-prod | |||
| shared-configs[0]: | |||
| data-id: common-biz.yaml | |||
| group: dubhe | |||
| @@ -23,7 +23,7 @@ spring: | |||
| refresh: true | |||
| discovery: | |||
| enabled: true | |||
| namespace: dubhe-server-cloud-dev | |||
| namespace: dubhe-prod | |||
| group: dubhe | |||
| server-addr: 127.0.0.1:8848 | |||
| @@ -1,3 +1,20 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.auth; | |||
| import org.junit.jupiter.api.Test; | |||
| @@ -63,6 +63,19 @@ | |||
| <groupId>commons-codec</groupId> | |||
| <artifactId>commons-codec</artifactId> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>com.google.guava</groupId> | |||
| <artifactId>guava</artifactId> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>commons-io</groupId> | |||
| <artifactId>commons-io</artifactId> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>com.alibaba</groupId> | |||
| <artifactId>fastjson</artifactId> | |||
| <version>1.2.70</version> | |||
| </dependency> | |||
| </dependencies> | |||
| @@ -94,4 +94,9 @@ public class ApplicationNameConst { | |||
| * 专业版终端 | |||
| */ | |||
| public final static String TERMINAL = "dubhe-terminal"; | |||
| /** | |||
| * 点云服务 | |||
| */ | |||
| public final static String SERVER_POINT_CLOUD ="dubhe-point-cloud"; | |||
| } | |||
| @@ -37,6 +37,8 @@ public final class MagicNumConstant { | |||
| public static final int TEN = 10; | |||
| public static final int ELEVEN = 11; | |||
| public static final int TWELVE = 12; | |||
| public static final int SIXTEEN = 16; | |||
| public static final int TWENTY = 20; | |||
| public static final int TWENTY_TWO = 22; | |||
| @@ -113,6 +113,7 @@ public final class Permissions { | |||
| public static final String IMAGE_UPLOAD = "hasAuthority('ROLE_training:image:upload')"; | |||
| public static final String IMAGE_EDIT = "hasAuthority('ROLE_training:image:edit')"; | |||
| public static final String IMAGE_DELETE = "hasAuthority('ROLE_training:image:delete')"; | |||
| public static final String IMAGE_EDIT_DEFAULT = "hasAuthority('ROLE_training:image:editDefault')"; | |||
| /** | |||
| * 度量管理 | |||
| @@ -127,6 +127,13 @@ public final class StringConstant { | |||
| public static final String CACHE_TASK_NAME ="task_name"; | |||
| public static final String DEFAULT_IMAGE_PROJECT ="dubhe"; | |||
| /** | |||
| * python命令行参数格式 | |||
| */ | |||
| public static final String PYTHON_COMMAND_PATTERN = " --%s=%s"; | |||
| private StringConstant() { | |||
| } | |||
| } | |||
| @@ -0,0 +1,37 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.biz.base.context; | |||
| import lombok.Data; | |||
| import java.time.Instant; | |||
| /** | |||
| * @description 见微平台加密用户信息 | |||
| * @date 2022-07-28 | |||
| */ | |||
| @Data | |||
| public class EncryptVisUser { | |||
| private Long id; | |||
| private String username; | |||
| private String phone; | |||
| private long timestamp = Instant.now().toEpochMilli(); | |||
| } | |||
| @@ -0,0 +1,36 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.biz.base.dto; | |||
| import lombok.Data; | |||
| import lombok.EqualsAndHashCode; | |||
| import lombok.experimental.Accessors; | |||
| import javax.validation.constraints.NotNull; | |||
| import java.io.Serializable; | |||
| @Data | |||
| @Accessors(chain = true) | |||
| @EqualsAndHashCode | |||
| public class PtImageIdDTO { | |||
| /** | |||
| * 镜像ID | |||
| */ | |||
| @NotNull(message = "镜像ID不能为空") | |||
| private Long id; | |||
| } | |||
| @@ -0,0 +1,36 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.biz.base.dto; | |||
| import lombok.Data; | |||
| import lombok.EqualsAndHashCode; | |||
| import lombok.experimental.Accessors; | |||
| import javax.validation.constraints.NotNull; | |||
| import java.util.List; | |||
| @Data | |||
| @Accessors(chain = true) | |||
| @EqualsAndHashCode | |||
| public class PtImageIdsDTO { | |||
| /** | |||
| * 镜像ID | |||
| */ | |||
| @NotNull(message = "镜像ID不能为空") | |||
| private List<Long> ids; | |||
| } | |||
| @@ -20,6 +20,8 @@ import lombok.Data; | |||
| import lombok.EqualsAndHashCode; | |||
| import lombok.experimental.Accessors; | |||
| import java.util.List; | |||
| /** | |||
| * @description 查询镜像路径 | |||
| * @date 2020-12-14 | |||
| @@ -35,6 +37,8 @@ public class PtImageQueryUrlDTO { | |||
| private String imageTag; | |||
| private Integer projectType; | |||
| private Boolean isDefault; | |||
| private List<Integer> imageTypes; | |||
| } | |||
| @@ -0,0 +1,35 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.biz.base.dto; | |||
| import lombok.Data; | |||
| import javax.validation.constraints.NotEmpty; | |||
| import java.io.Serializable; | |||
| import java.util.List; | |||
| @Data | |||
| public class PtModelBranchQueryByIdsDTO implements Serializable { | |||
| private static final long serialVersionUID = 1L; | |||
| /** | |||
| * 模型版本ID | |||
| */ | |||
| @NotEmpty(message = "模型版本ID列表不能为空") | |||
| private List<Long> ids; | |||
| } | |||
| @@ -45,10 +45,10 @@ public class QueryResourceSpecsDTO implements Serializable { | |||
| private String specsName; | |||
| /** | |||
| * 所属业务场景(0:通用,1:dubhe-notebook,2:dubhe-train,3:dubhe-serving,4:dubhe-tadl) | |||
| * 所属业务场景(0:通用,1:dubhe-notebook,2:dubhe-train,3:dubhe-serving,4:dubhe-tadl, 5:dubhe-point-cloud,6:data-annotation,7:atlas) | |||
| */ | |||
| @NotNull(message = "所属业务场景不能为空") | |||
| @Min(value = MagicNumConstant.ZERO, message = "所属业务场景错误") | |||
| @Max(value = MagicNumConstant.FOUR, message = "所属业务场景错误") | |||
| @Max(value = MagicNumConstant.SEVEN, message = "所属业务场景错误") | |||
| private Integer module; | |||
| } | |||
| } | |||
| @@ -0,0 +1,35 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.biz.base.dto; | |||
| import lombok.Data; | |||
| import org.dubhe.biz.base.constant.MagicNumConstant; | |||
| import org.hibernate.validator.constraints.Length; | |||
| import javax.validation.constraints.NotBlank; | |||
| import java.io.Serializable; | |||
| @Data | |||
| public class TrainAlgorithmSelectByNameDTO implements Serializable { | |||
| private static final long serialVersionUID = 1L; | |||
| @Length(max = MagicNumConstant.THIRTY_TWO, message = "算法名称有误") | |||
| @NotBlank | |||
| private String algorithmName; | |||
| } | |||
| @@ -64,7 +64,15 @@ public enum BizEnum { | |||
| /** | |||
| * TADL | |||
| */ | |||
| TADL("TADL服务", "tadl", 8); | |||
| TADL("TADL服务", "tadl", 8), | |||
| /** | |||
| * POINT_CLOUD | |||
| */ | |||
| POINT_CLOUD("点云服务","pointcloud",9), | |||
| /** | |||
| * DATA | |||
| */ | |||
| DATA("数据服务","data",10); | |||
| /** | |||
| * 业务模块名称 | |||
| @@ -47,7 +47,11 @@ public enum ImageTypeEnum { | |||
| /** | |||
| * terminal镜像 | |||
| */ | |||
| TERMINAL("terminal镜像", "terminal", 3) | |||
| TERMINAL("terminal镜像", "terminal", 3), | |||
| /** | |||
| * 点云镜像 | |||
| */ | |||
| POINT_CLOUD("点云镜像","pointCloud",4) | |||
| ; | |||
| /** | |||
| @@ -59,7 +63,7 @@ public enum ImageTypeEnum { | |||
| */ | |||
| private String code; | |||
| /** | |||
| * 镜像项目类型 | |||
| * 镜像用途 | |||
| */ | |||
| private Integer type; | |||
| @@ -89,7 +93,7 @@ public enum ImageTypeEnum { | |||
| /** | |||
| * 根据type获取code | |||
| * | |||
| * @param type 镜像项目类型 | |||
| * @param type 镜像用途 | |||
| * @return String 镜像项目代码 | |||
| */ | |||
| public static String getType(Integer type) { | |||
| @@ -0,0 +1,79 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.biz.base.utils; | |||
| import com.google.common.collect.Lists; | |||
| import com.google.common.collect.Maps; | |||
| import javax.servlet.ServletRequest; | |||
| import java.util.Collections; | |||
| import java.util.Enumeration; | |||
| import java.util.List; | |||
| import java.util.Map; | |||
| /** | |||
| * @description | |||
| * @date 2022-07-06 | |||
| */ | |||
| public class BaseUtils { | |||
| /** | |||
| * 获取request 中的参数,以map形式返回 | |||
| * @param request | |||
| * @return | |||
| */ | |||
| public static Map<String, Object> getParamMap(ServletRequest request) { | |||
| //Assert.notNull(request,"参数不能为空"); | |||
| Map<String, Object> map = Maps.newHashMap(); | |||
| Enumeration<String> en = request.getParameterNames(); | |||
| while (en.hasMoreElements()) { | |||
| String name = en.nextElement(); | |||
| String[] values = request.getParameterValues(name); | |||
| if (values == null || values.length == 0) { | |||
| continue; | |||
| } | |||
| String value = values[0]; | |||
| if (value != null) { | |||
| map.put(name, value); | |||
| } | |||
| } | |||
| return map; | |||
| } | |||
| /** | |||
| * 把数组所有元素,按字母排序,然后按照“参数=参数值”的模式用“&”字符拼接成字符串 | |||
| * | |||
| * @param param | |||
| * 需要签名的参数 | |||
| * @return 签名的字符串 | |||
| */ | |||
| public static String createLinkString(Map<String, Object> param) { | |||
| Map<String, Object> params = Maps.newHashMap(); | |||
| params.putAll(param); | |||
| params.put("dev-name", "VMS"); | |||
| params.put("project", "TIANSHU"); | |||
| List<String> keys = Lists.newArrayList(params.keySet().iterator()); | |||
| Collections.sort(keys); | |||
| StringBuilder signStr = new StringBuilder(); | |||
| for (String key : keys) { | |||
| if (!StringUtils.isNotEmpty(params.get(key).toString())) { | |||
| continue; | |||
| } | |||
| signStr.append(key).append("=").append(params.get(key)).append("&"); | |||
| } | |||
| return signStr.deleteCharAt(signStr.length() - 1).toString(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,44 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.biz.base.utils; | |||
| import com.alibaba.fastjson.JSONObject; | |||
| import static org.dubhe.biz.base.constant.StringConstant.PYTHON_COMMAND_PATTERN; | |||
| /** | |||
| * @description 命令行工具类 | |||
| * @date 2022-05-16 | |||
| */ | |||
| public class CommandUtil { | |||
| /** | |||
| * 构造python运行命令 | |||
| * | |||
| * @param runCommand | |||
| * @param runParams | |||
| * @return | |||
| */ | |||
| public static String buildPythonCommand(String runCommand, JSONObject runParams) { | |||
| StringBuilder sb = new StringBuilder(); | |||
| sb.append(runCommand); | |||
| if (null != runParams && !runParams.isEmpty()) { | |||
| runParams.forEach((k, v) -> sb.append(String.format(PYTHON_COMMAND_PATTERN, k, v))); | |||
| } | |||
| return sb.toString(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,101 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.biz.base.utils; | |||
| import com.google.common.collect.Maps; | |||
| import javax.crypto.Cipher; | |||
| import javax.crypto.SecretKey; | |||
| import javax.crypto.SecretKeyFactory; | |||
| import javax.crypto.spec.DESKeySpec; | |||
| import javax.crypto.spec.IvParameterSpec; | |||
| import java.nio.charset.StandardCharsets; | |||
| import java.util.Map; | |||
| /** | |||
| * @description vms服务加解密工具类 | |||
| * @date 2022-07-06 | |||
| */ | |||
| public class EncryptUtils { | |||
| private static final String STR_PARAM = "Passw0rd"; | |||
| private static Cipher cipher; | |||
| private static final IvParameterSpec IV = new IvParameterSpec(STR_PARAM.getBytes(StandardCharsets.UTF_8)); | |||
| private static DESKeySpec getDesKeySpec(String source) throws Exception { | |||
| if (source == null || source.length() == 0) { | |||
| return null; | |||
| } | |||
| cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); | |||
| String strKey = "Passw0rd"; | |||
| return new DESKeySpec(strKey.getBytes(StandardCharsets.UTF_8)); | |||
| } | |||
| /** | |||
| * 对称加密 | |||
| */ | |||
| public static String desEncrypt(String source) throws Exception { | |||
| DESKeySpec desKeySpec = getDesKeySpec(source); | |||
| SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); | |||
| SecretKey secretKey = keyFactory.generateSecret(desKeySpec); | |||
| cipher.init(Cipher.ENCRYPT_MODE, secretKey, IV); | |||
| return byte2hex( | |||
| cipher.doFinal(source.getBytes(StandardCharsets.UTF_8))).toUpperCase(); | |||
| } | |||
| /** | |||
| * 对称解密 | |||
| */ | |||
| public static String desDecrypt(String source) throws Exception { | |||
| byte[] src = hex2byte(source.getBytes(StandardCharsets.UTF_8)); | |||
| DESKeySpec desKeySpec = getDesKeySpec(source); | |||
| SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); | |||
| SecretKey secretKey = keyFactory.generateSecret(desKeySpec); | |||
| cipher.init(Cipher.DECRYPT_MODE, secretKey, IV); | |||
| byte[] retByte = cipher.doFinal(src); | |||
| return new String(retByte); | |||
| } | |||
| private static String byte2hex(byte[] inStr) { | |||
| String stmp; | |||
| StringBuilder out = new StringBuilder(inStr.length * 2); | |||
| for (byte b : inStr) { | |||
| stmp = Integer.toHexString(b & 0xFF); | |||
| if (stmp.length() == 1) { | |||
| // 如果是0至F的单位字符串,则添加0 | |||
| out.append("0").append(stmp); | |||
| } else { | |||
| out.append(stmp); | |||
| } | |||
| } | |||
| return out.toString(); | |||
| } | |||
| private static byte[] hex2byte(byte[] b) { | |||
| int size = 2; | |||
| if ((b.length % size) != 0) { | |||
| throw new IllegalArgumentException("长度不是偶数"); | |||
| } | |||
| byte[] b2 = new byte[b.length / 2]; | |||
| for (int n = 0; n < b.length; n += size) { | |||
| String item = new String(b, n, 2); | |||
| b2[n / 2] = (byte) Integer.parseInt(item, 16); | |||
| } | |||
| return b2; | |||
| } | |||
| } | |||
| @@ -0,0 +1,39 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.biz.base.utils; | |||
| import com.alibaba.fastjson.JSONObject; | |||
| import com.alibaba.fastjson.TypeReference; | |||
| import java.util.HashMap; | |||
| import java.util.Map; | |||
| /** | |||
| * @description Map工具类 | |||
| * @date 2022-05-16 | |||
| */ | |||
| public class MapUtil { | |||
| public static Map<String, String> convertJsonObject(JSONObject object) { | |||
| if (object == null) { | |||
| return new HashMap<>(); | |||
| } | |||
| return JSONObject.parseObject(object.toJSONString(), | |||
| new TypeReference<Map<String, String>>(){}); | |||
| } | |||
| } | |||
| @@ -36,6 +36,8 @@ public class PtModelUtil { | |||
| public static final int NUMBER_EIGHT = 8; | |||
| public static final int NUMBER_THIRTY_TWO = 32; | |||
| public static final int NUMBER_ONE_HUNDRED_TWENTY_EIGHT = 128; | |||
| public static final int NUMBER_TWO_HUNDRED_FIFTY_FIVE = 255; | |||
| @@ -0,0 +1,178 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.biz.base.utils; | |||
| import com.alibaba.fastjson.JSONObject; | |||
| import org.apache.commons.codec.binary.Base64; | |||
| import org.apache.commons.io.IOUtils; | |||
| import javax.crypto.Cipher; | |||
| import java.io.ByteArrayOutputStream; | |||
| import java.security.Key; | |||
| import java.security.KeyFactory; | |||
| import java.security.KeyPair; | |||
| import java.security.KeyPairGenerator; | |||
| import java.security.NoSuchAlgorithmException; | |||
| import java.security.interfaces.RSAPrivateKey; | |||
| import java.security.interfaces.RSAPublicKey; | |||
| import java.security.spec.InvalidKeySpecException; | |||
| import java.security.spec.PKCS8EncodedKeySpec; | |||
| import java.security.spec.X509EncodedKeySpec; | |||
| import java.time.Instant; | |||
| import java.util.HashMap; | |||
| import java.util.Map; | |||
| /** | |||
| * @Desc RSA 非对称加密 | |||
| * @Author MrAshin | |||
| * @Date 2022-07-27 | |||
| */ | |||
| public class RSAUtil { | |||
| public static final String CHARSET = "UTF-8"; | |||
| public static final String RSA_ALGORITHM = "RSA"; | |||
| /** | |||
| * 生成公钥和私钥 | |||
| * @param keySize | |||
| * @return | |||
| */ | |||
| public static Map<String, String> createKeys(int keySize) { | |||
| //为RSA算法创建一个KeyPairGenerator对象 | |||
| KeyPairGenerator kpg; | |||
| try { | |||
| kpg = KeyPairGenerator.getInstance(RSA_ALGORITHM); | |||
| } catch (NoSuchAlgorithmException e) { | |||
| throw new IllegalArgumentException("No such algorithm-->[" + RSA_ALGORITHM + "]"); | |||
| } | |||
| //初始化KeyPairGenerator对象,密钥长度 | |||
| kpg.initialize(keySize); | |||
| //生成密匙对 | |||
| KeyPair keyPair = kpg.generateKeyPair(); | |||
| //得到公钥 | |||
| Key publicKey = keyPair.getPublic(); | |||
| String publicKeyStr = Base64.encodeBase64URLSafeString(publicKey.getEncoded()); | |||
| //得到私钥 | |||
| Key privateKey = keyPair.getPrivate(); | |||
| String privateKeyStr = Base64.encodeBase64URLSafeString(privateKey.getEncoded()); | |||
| Map<String, String> keyPairMap = new HashMap<String, String>(); | |||
| keyPairMap.put("publicKey", publicKeyStr); | |||
| keyPairMap.put("privateKey", privateKeyStr); | |||
| return keyPairMap; | |||
| } | |||
| /** | |||
| * 得到公钥 | |||
| * @param publicKey 密钥字符串(经过base64编码) | |||
| * @throws Exception | |||
| */ | |||
| public static RSAPublicKey getPublicKey(String publicKey) throws NoSuchAlgorithmException, InvalidKeySpecException { | |||
| //通过X509编码的Key指令获得公钥对象 | |||
| KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM); | |||
| X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKey)); | |||
| RSAPublicKey key = (RSAPublicKey) keyFactory.generatePublic(x509KeySpec); | |||
| return key; | |||
| } | |||
| /** | |||
| * 得到私钥 | |||
| * @param privateKey 密钥字符串(经过base64编码) | |||
| * @throws Exception | |||
| */ | |||
| public static RSAPrivateKey getPrivateKey(String privateKey) throws NoSuchAlgorithmException, InvalidKeySpecException { | |||
| //通过PKCS#8编码的Key指令获得私钥对象 | |||
| KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM); | |||
| PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey)); | |||
| RSAPrivateKey key = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8KeySpec); | |||
| return key; | |||
| } | |||
| /** | |||
| * 公钥加密 | |||
| * @param data | |||
| * @param publicKey | |||
| * @return | |||
| */ | |||
| public static String publicEncrypt(String data, RSAPublicKey publicKey) { | |||
| try { | |||
| Cipher cipher = Cipher.getInstance(RSA_ALGORITHM); | |||
| cipher.init(Cipher.ENCRYPT_MODE, publicKey); | |||
| return Base64.encodeBase64URLSafeString(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes(CHARSET), publicKey.getModulus().bitLength())); | |||
| } catch (Exception e) { | |||
| throw new RuntimeException("加密字符串[" + data + "]时遇到异常", e); | |||
| } | |||
| } | |||
| /** | |||
| * 私钥解密 | |||
| * @param data | |||
| * @param privateKey | |||
| * @return | |||
| */ | |||
| public static String privateDecrypt(String data, RSAPrivateKey privateKey) { | |||
| try { | |||
| Cipher cipher = Cipher.getInstance(RSA_ALGORITHM); | |||
| cipher.init(Cipher.DECRYPT_MODE, privateKey); | |||
| return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(data), privateKey.getModulus().bitLength()), CHARSET); | |||
| } catch (Exception e) { | |||
| throw new RuntimeException("解密字符串[" + data + "]时遇到异常", e); | |||
| } | |||
| } | |||
| /** | |||
| * 分段加解密 | |||
| * @param cipher | |||
| * @param opmode | |||
| * @param datas | |||
| * @param keySize | |||
| * @return | |||
| */ | |||
| private static byte[] rsaSplitCodec(Cipher cipher, int opmode, byte[] datas, int keySize) { | |||
| int maxBlock = 0; | |||
| if (opmode == Cipher.DECRYPT_MODE) { | |||
| maxBlock = keySize / 8; | |||
| } else { | |||
| maxBlock = keySize / 8 - 11; | |||
| } | |||
| ByteArrayOutputStream | |||
| out = new ByteArrayOutputStream(); | |||
| int offSet = 0; | |||
| byte[] buff; | |||
| int i = 0; | |||
| try { | |||
| while (datas.length > offSet) { | |||
| if (datas.length - offSet > maxBlock) { | |||
| buff = cipher.doFinal(datas, offSet, maxBlock); | |||
| } else { | |||
| buff = cipher.doFinal(datas, offSet, datas.length - offSet); | |||
| } | |||
| out.write(buff, 0, buff.length); | |||
| i++; | |||
| offSet = i * maxBlock; | |||
| } | |||
| } catch (Exception e) { | |||
| throw new RuntimeException("加解密阀值为[" + maxBlock + "]的数据时发生异常", e); | |||
| } | |||
| byte[] resultDatas = out.toByteArray(); | |||
| IOUtils.closeQuietly(out); | |||
| return resultDatas; | |||
| } | |||
| } | |||
| @@ -57,4 +57,10 @@ public class ResultUtil { | |||
| throw new BusinessException(String.format(errorMessageTemplate, params)); | |||
| } | |||
| } | |||
| public static void isTrue(Boolean object, String errorMessageTemplate, Object... params) { | |||
| if (!Boolean.TRUE.equals(object)) { | |||
| throw new BusinessException(String.format(errorMessageTemplate, params)); | |||
| } | |||
| } | |||
| } | |||
| @@ -157,4 +157,14 @@ public class DatasetVO implements Serializable { | |||
| */ | |||
| private Integer fileCount; | |||
| /** | |||
| * 模板 | |||
| */ | |||
| private Integer templateType; | |||
| /** | |||
| * 所属模块 | |||
| */ | |||
| private Integer module; | |||
| } | |||
| @@ -0,0 +1,49 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.biz.base.vo; | |||
| import lombok.Data; | |||
| /** | |||
| * @description | |||
| * @date 2022/4/22 | |||
| **/ | |||
| @Data | |||
| public class LabelGroupBaseVO { | |||
| /** | |||
| * 标签组ID | |||
| */ | |||
| private Long id; | |||
| /** | |||
| * 标签组名称 | |||
| */ | |||
| private String name; | |||
| /** | |||
| * 标签组类型:0: private 私有标签组, 1:public 公开标签组 | |||
| */ | |||
| private Integer type; | |||
| /** | |||
| * 标签组描述 | |||
| */ | |||
| private String remark; | |||
| /** | |||
| * 标签组类型 | |||
| */ | |||
| private Integer labelGroupType; | |||
| } | |||
| @@ -47,5 +47,9 @@ public class ProgressVO implements Serializable { | |||
| private Long finishAutoTrack = MagicNumConstant.ZERO_LONG; | |||
| @Builder.Default | |||
| private Long annotationNotDistinguishFile = MagicNumConstant.ZERO_LONG; | |||
| @Builder.Default | |||
| private Long haveAnnotation = MagicNumConstant.ZERO_LONG; | |||
| @Builder.Default | |||
| private Long noAnnotation = MagicNumConstant.ZERO_LONG; | |||
| } | |||
| @@ -0,0 +1,50 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.biz.base.vo; | |||
| import lombok.Data; | |||
| import lombok.experimental.Accessors; | |||
| import java.io.Serializable; | |||
| @Data | |||
| @Accessors(chain = true) | |||
| public class PtImageVO implements Serializable { | |||
| private static final long serialVersionUID = 1L; | |||
| /** | |||
| * 镜像id | |||
| */ | |||
| private Long id; | |||
| /** | |||
| * 镜像名称 | |||
| */ | |||
| private String name; | |||
| /** | |||
| * 镜像地址 | |||
| */ | |||
| private String imageUrl; | |||
| /** | |||
| * 镜像版本 | |||
| */ | |||
| private String tag; | |||
| } | |||
| @@ -55,11 +55,6 @@ public class PtModelInfoQueryVO implements Serializable { | |||
| */ | |||
| private String modelDescription; | |||
| /** | |||
| * 模型分类 | |||
| */ | |||
| private String modelClassName; | |||
| /** | |||
| * 模型地址 | |||
| */ | |||
| @@ -90,6 +85,11 @@ public class PtModelInfoQueryVO implements Serializable { | |||
| */ | |||
| private Long createUserId; | |||
| /** | |||
| * 创建人用户名 | |||
| */ | |||
| private String createUserName; | |||
| /** | |||
| * 修改人ID | |||
| */ | |||
| @@ -124,4 +124,19 @@ public class PtModelInfoQueryVO implements Serializable { | |||
| * 是否能提供服务(true:能,false:否) | |||
| */ | |||
| private Boolean servingModel; | |||
| /** | |||
| * 炼制模型结构名称 | |||
| */ | |||
| private String structName; | |||
| /** | |||
| * 炼制模型尺寸 | |||
| */ | |||
| private Integer modelSize; | |||
| /** | |||
| * 模型分类(目标检测、目标分类) | |||
| */ | |||
| private String modelClassName; | |||
| } | |||
| @@ -59,6 +59,11 @@ public class TrainAlgorithmQureyVO implements Serializable { | |||
| */ | |||
| private String imageName; | |||
| /** | |||
| * 环境镜像版本 | |||
| */ | |||
| private String imageTag; | |||
| /** | |||
| * 代码目录 | |||
| */ | |||
| @@ -87,7 +87,7 @@ public class PaginationInterceptor extends AbstractSqlParserHandler implements I | |||
| /** | |||
| * 单页限制 500 条,小于 0 如 -1 不受限制 | |||
| */ | |||
| protected long limit = 500L; | |||
| protected long limit = -1L; | |||
| /** | |||
| * 数据类型 | |||
| */ | |||
| @@ -78,10 +78,14 @@ public enum LogEnum { | |||
| MEASURE, | |||
| //云端Serving | |||
| SERVING, | |||
| //serving gateway | |||
| SERVING_GATEWAY, | |||
| //专业版终端 | |||
| TERMINAL, | |||
| //tadl | |||
| TADL; | |||
| TADL, | |||
| //点云 | |||
| POINT_CLOUD; | |||
| /** | |||
| * 判断日志类型不能为空 | |||
| @@ -52,6 +52,14 @@ public class RedisUtils { | |||
| // =============================common============================ | |||
| /** | |||
| * 模糊删除 key | |||
| */ | |||
| public void del(String pattern){ | |||
| Set<Object> keys = redisTemplate.keys(pattern); | |||
| redisTemplate.delete(keys); | |||
| } | |||
| /** | |||
| * 指定缓存失效时间 | |||
| * | |||
| @@ -5,8 +5,8 @@ spring: | |||
| password: Tianshu | |||
| context-path: /nacos | |||
| config: | |||
| namespace: dubhe-server-cloud-dev | |||
| server-addr: 127.0.0.1:8848 | |||
| namespace: dubhe-prod | |||
| server-addr: 10.105.1.132:8848 | |||
| discovery: | |||
| namespace: dubhe-server-cloud-dev | |||
| server-addr: 127.0.0.1:8848 | |||
| namespace: dubhe-prod | |||
| server-addr: 10.105.1.132:8848 | |||
| @@ -1,12 +1,12 @@ | |||
| spring: | |||
| cloud: | |||
| nacos: | |||
| username: nacos | |||
| password: Tianshu | |||
| username: root | |||
| password: zjlab | |||
| context-path: /nacos | |||
| config: | |||
| namespace: dubhe-server-cloud-open-dev | |||
| server-addr: 10.105.1.132:8848 | |||
| server-addr: 10.101.12.15:8848 | |||
| discovery: | |||
| namespace: dubhe-server-cloud-open-dev | |||
| server-addr: 10.105.1.132:8848 | |||
| server-addr: 10.101.12.15:8848 | |||
| @@ -6,7 +6,7 @@ spring: | |||
| context-path: /nacos | |||
| config: | |||
| namespace: dubhe-server-cloud-test | |||
| server-addr: 127.0.0.1:8848 | |||
| server-addr: 10.105.1.132:8848 | |||
| discovery: | |||
| namespace: dubhe-server-cloud-test | |||
| server-addr: 127.0.0.1:8848 | |||
| server-addr: 10.105.1.132:8848 | |||
| @@ -0,0 +1,43 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.k8s.api; | |||
| import org.dubhe.k8s.domain.PtBaseResult; | |||
| import org.dubhe.k8s.domain.bo.ModelServiceBO; | |||
| import org.dubhe.k8s.domain.bo.ModelServingBO; | |||
| import org.dubhe.k8s.domain.resource.BizDeployment; | |||
| import org.dubhe.k8s.domain.vo.ModelServiceVO; | |||
| import org.dubhe.k8s.domain.vo.ModelServingVO; | |||
| public interface ModelServiceApi { | |||
| /** | |||
| * 创建 | |||
| * @param bo | |||
| * @return | |||
| */ | |||
| ModelServiceVO create(ModelServiceBO bo); | |||
| /** | |||
| * 删除 | |||
| * @param namespace 命名空间 | |||
| * @param resourceName 资源名称 | |||
| * @return PtBaseResult 基础结果类 | |||
| */ | |||
| PtBaseResult delete(String namespace, String resourceName); | |||
| } | |||
| @@ -0,0 +1,207 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.k8s.api.impl; | |||
| import cn.hutool.core.collection.CollectionUtil; | |||
| import cn.hutool.core.util.RandomUtil; | |||
| import cn.hutool.core.util.StrUtil; | |||
| import com.google.common.collect.Maps; | |||
| import io.fabric8.kubernetes.api.model.*; | |||
| import io.fabric8.kubernetes.api.model.apps.Deployment; | |||
| import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder; | |||
| import io.fabric8.kubernetes.api.model.apps.DeploymentList; | |||
| import io.fabric8.kubernetes.client.KubernetesClient; | |||
| import io.fabric8.kubernetes.client.KubernetesClientException; | |||
| import org.apache.commons.compress.utils.Lists; | |||
| import org.dubhe.biz.base.constant.MagicNumConstant; | |||
| import org.dubhe.biz.base.constant.SymbolConstant; | |||
| import org.dubhe.biz.file.api.FileStoreApi; | |||
| import org.dubhe.biz.log.enums.LogEnum; | |||
| import org.dubhe.biz.log.utils.LogUtil; | |||
| import org.dubhe.k8s.api.ModelServiceApi; | |||
| import org.dubhe.k8s.api.ResourceIisolationApi; | |||
| import org.dubhe.k8s.api.ResourceQuotaApi; | |||
| import org.dubhe.k8s.api.VolumeApi; | |||
| import org.dubhe.k8s.constant.K8sParamConstants; | |||
| import org.dubhe.k8s.domain.PtBaseResult; | |||
| import org.dubhe.k8s.domain.bo.BuildFsVolumeBO; | |||
| import org.dubhe.k8s.domain.bo.ModelServiceBO; | |||
| import org.dubhe.k8s.domain.bo.ModelServingBO; | |||
| import org.dubhe.k8s.domain.resource.BizDeployment; | |||
| import org.dubhe.k8s.domain.vo.ModelServiceVO; | |||
| import org.dubhe.k8s.domain.vo.ModelServingVO; | |||
| import org.dubhe.k8s.domain.vo.VolumeVO; | |||
| import org.dubhe.k8s.enums.*; | |||
| import org.dubhe.k8s.utils.BizConvertUtils; | |||
| import org.dubhe.k8s.utils.K8sUtils; | |||
| import org.dubhe.k8s.utils.LabelUtils; | |||
| import org.dubhe.k8s.utils.YamlUtils; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import javax.annotation.Resource; | |||
| import java.util.*; | |||
| public class ModelServiceApiImpl implements ModelServiceApi { | |||
| @Autowired | |||
| private ResourceQuotaApi resourceQuotaApi; | |||
| @Autowired | |||
| private ResourceIisolationApi resourceIisolationApi; | |||
| @Resource(name = "hostFileStoreApiImpl") | |||
| private FileStoreApi fileStoreApi; | |||
| @Autowired | |||
| private VolumeApi volumeApi; | |||
| private KubernetesClient client; | |||
| private K8sUtils k8sUtils; | |||
| public ModelServiceApiImpl(K8sUtils k8sUtils) { | |||
| this.k8sUtils = k8sUtils; | |||
| this.client = k8sUtils.getClient(); | |||
| } | |||
| @Override | |||
| public ModelServiceVO create(ModelServiceBO bo) { | |||
| //资源配额校验 | |||
| LimitsOfResourcesEnum limitsOfResources = resourceQuotaApi.reachLimitsOfResources(bo.getNamespace(), bo.getCpuNum(), bo.getMemNum(), bo.getGpuNum()); | |||
| if (!LimitsOfResourcesEnum.ADEQUATE.equals(limitsOfResources)) { | |||
| return new ModelServiceVO().error(K8sResponseEnum.LACK_OF_RESOURCES.getCode(), limitsOfResources.getMessage()); | |||
| } | |||
| LogUtil.info(LogEnum.BIZ_K8S, "Params of creating ModelServing--create:{}", bo); | |||
| if (!fileStoreApi.createDirs(bo.getDirList().toArray(new String[MagicNumConstant.ZERO]))) { | |||
| return new ModelServiceVO().error(K8sResponseEnum.INTERNAL_SERVER_ERROR.getCode(), K8sResponseEnum.INTERNAL_SERVER_ERROR.getMessage()); | |||
| } | |||
| //存储卷构建 | |||
| VolumeVO volumeVO = volumeApi.buildFsVolumes(new BuildFsVolumeBO(bo.getNamespace(), bo.getResourceName(), bo.getFsMounts())); | |||
| if (!K8sResponseEnum.SUCCESS.getCode().equals(volumeVO.getCode())) { | |||
| return new ModelServiceVO().error(volumeVO.getCode(), volumeVO.getMessage()); | |||
| } | |||
| //名称生成 | |||
| String deploymentName = StrUtil.format(K8sParamConstants.RESOURCE_NAME_TEMPLATE, bo.getResourceName(), RandomUtil.randomString(MagicNumConstant.EIGHT)); | |||
| //部署deployment | |||
| Deployment deployment = buildDeployment(bo, volumeVO, deploymentName); | |||
| LogUtil.info(LogEnum.BIZ_K8S, "Ready to deploy {}, yaml信息为{}", deploymentName, YamlUtils.dumpAsYaml(deployment)); | |||
| resourceIisolationApi.addIisolationInfo(deployment); | |||
| Deployment deploymentResult = client.apps().deployments().inNamespace(bo.getNamespace()).create(deployment); | |||
| return new ModelServiceVO(BizConvertUtils.toBizDeployment(deploymentResult)); | |||
| } | |||
| /** | |||
| * 构建Deployment | |||
| * | |||
| * @return Deployment | |||
| */ | |||
| private Deployment buildDeployment(ModelServiceBO bo, VolumeVO volumeVO, String deploymentName) { | |||
| Map<String, String> childLabels = LabelUtils.getChildLabels(bo.getResourceName(), deploymentName, | |||
| K8sKindEnum.DEPLOYMENT.getKind(), bo.getBusinessLabel(), bo.getTaskIdentifyLabel()); | |||
| LabelSelector labelSelector = new LabelSelector(); | |||
| labelSelector.setMatchLabels(childLabels); | |||
| return new DeploymentBuilder() | |||
| .withNewMetadata() | |||
| .withName(deploymentName) | |||
| .addToLabels(LabelUtils.getBaseLabels(bo.getResourceName(), bo.getBusinessLabel())) | |||
| .withNamespace(bo.getNamespace()) | |||
| .endMetadata() | |||
| .withNewSpec() | |||
| .withReplicas(bo.getReplicas()) | |||
| .withSelector(labelSelector) | |||
| .withNewTemplate() | |||
| .withNewMetadata() | |||
| .withName(deploymentName) | |||
| .addToLabels(childLabels) | |||
| .withNamespace(bo.getNamespace()) | |||
| .endMetadata() | |||
| .withNewSpec() | |||
| .addToNodeSelector(K8sUtils.gpuSelector(bo.getGpuNum())) | |||
| .addToContainers(buildContainer(bo, volumeVO, deploymentName)) | |||
| .addToVolumes(volumeVO.getVolumes().toArray(new Volume[0])) | |||
| .withRestartPolicy(RestartPolicyEnum.ALWAYS.getRestartPolicy()) | |||
| .endSpec() | |||
| .endTemplate() | |||
| .endSpec() | |||
| .build(); | |||
| } | |||
| /** | |||
| * 构建 Container | |||
| * @param bo | |||
| * @param volumeVO | |||
| * @param name | |||
| * @return | |||
| */ | |||
| private Container buildContainer(ModelServiceBO bo, VolumeVO volumeVO, String name) { | |||
| Map<String, Quantity> resourcesLimitsMap = Maps.newHashMap(); | |||
| Optional.ofNullable(bo.getCpuNum()).ifPresent(v -> resourcesLimitsMap.put(K8sParamConstants.QUANTITY_CPU_KEY, new Quantity(v.toString(), K8sParamConstants.CPU_UNIT))); | |||
| Optional.ofNullable(bo.getGpuNum()).ifPresent(v -> resourcesLimitsMap.put(K8sParamConstants.GPU_RESOURCE_KEY, new Quantity(v.toString()))); | |||
| Optional.ofNullable(bo.getMemNum()).ifPresent(v -> resourcesLimitsMap.put(K8sParamConstants.QUANTITY_MEMORY_KEY, new Quantity(v.toString(), K8sParamConstants.MEM_UNIT))); | |||
| Container container = new ContainerBuilder() | |||
| .withNewName(name) | |||
| .withNewImage(bo.getImage()) | |||
| .withNewImagePullPolicy(ImagePullPolicyEnum.IFNOTPRESENT.getPolicy()) | |||
| .withVolumeMounts(volumeVO.getVolumeMounts()) | |||
| .withNewResources().addToLimits(resourcesLimitsMap).endResources() | |||
| .build(); | |||
| if (bo.getCmdLines() != null) { | |||
| container.setCommand(Arrays.asList(ShellCommandEnum.BIN_BANSH.getShell())); | |||
| container.setArgs(bo.getCmdLines()); | |||
| } | |||
| Probe livenessProbe = new Probe(); | |||
| ExecAction execAction = new ExecAction(); | |||
| List<String> commands = Lists.newArrayList(); | |||
| commands.add("test"); | |||
| commands.add("-e"); | |||
| commands.add("/tmp/.startup"); | |||
| execAction.setCommand(commands); | |||
| livenessProbe.setExec(execAction); | |||
| livenessProbe.setPeriodSeconds(3); | |||
| livenessProbe.setSuccessThreshold(1); | |||
| livenessProbe.setFailureThreshold(10); | |||
| // container.setLivenessProbe(livenessProbe); | |||
| return container; | |||
| } | |||
| @Override | |||
| public PtBaseResult delete(String namespace, String resourceName) { | |||
| try { | |||
| LogUtil.info(LogEnum.BIZ_K8S, "delete model serving namespace:{} resourceName:{}",namespace,resourceName); | |||
| DeploymentList deploymentList = client.apps().deployments().inNamespace(namespace).withLabels(LabelUtils.withEnvResourceName(resourceName)).list(); | |||
| if (deploymentList == null || deploymentList.getItems().size() == 0){ | |||
| return new PtBaseResult(); | |||
| } | |||
| Boolean res = client.extensions().ingresses().inNamespace(namespace).withLabels(LabelUtils.withEnvResourceName(resourceName)).delete() | |||
| && client.services().inNamespace(namespace).withLabels(LabelUtils.withEnvResourceName(resourceName)).delete() | |||
| && client.apps().deployments().inNamespace(namespace).withLabels(LabelUtils.withEnvResourceName(resourceName)).delete() | |||
| && client.secrets().inNamespace(namespace).withLabels(LabelUtils.withEnvResourceName(resourceName)).delete(); | |||
| if (res) { | |||
| return new PtBaseResult(); | |||
| } else { | |||
| return K8sResponseEnum.REPEAT.toPtBaseResult(); | |||
| } | |||
| } catch (KubernetesClientException e) { | |||
| LogUtil.error(LogEnum.BIZ_K8S, "delete error:", e); | |||
| return new PtBaseResult(String.valueOf(e.getCode()), e.getMessage()); | |||
| } | |||
| } | |||
| } | |||
| @@ -173,6 +173,8 @@ public class ModelServingApiImpl implements ModelServingApi { | |||
| if (StringUtils.isNotEmpty(buildIngressBO.getMaxUploadSize())) { | |||
| buildIngressBO.putAnnotation(K8sParamConstants.INGRESS_PROXY_BODY_SIZE_KEY, buildIngressBO.getMaxUploadSize()); | |||
| } | |||
| buildIngressBO.putAnnotation(K8sParamConstants.INGRESS_READ_TIMEOUT_KEY, String.valueOf(MagicNumConstant.TEN)); | |||
| buildIngressBO.putAnnotation(K8sParamConstants.INGRESS_NEXT_UPSTREAM_TIMEOUT_KEY, String.valueOf(MagicNumConstant.TEN)); | |||
| if (bo.getHttpPort() != null) { | |||
| String httpHost = RandomUtil.randomString(MagicNumConstant.SIX) + SymbolConstant.DOT + servingHost; | |||
| buildIngressBO.addIngressRule(ResourceBuildUtils.buildIngressRule(httpHost, svcName, SymbolConstant.HTTP)); | |||
| @@ -23,38 +23,8 @@ import org.apache.http.HttpHost; | |||
| import org.apache.http.client.config.RequestConfig; | |||
| import org.dubhe.biz.log.enums.LogEnum; | |||
| import org.dubhe.biz.log.utils.LogUtil; | |||
| import org.dubhe.k8s.api.DistributeTrainApi; | |||
| import org.dubhe.k8s.api.DubheDeploymentApi; | |||
| import org.dubhe.k8s.api.JupyterResourceApi; | |||
| import org.dubhe.k8s.api.LimitRangeApi; | |||
| import org.dubhe.k8s.api.LogMonitoringApi; | |||
| import org.dubhe.k8s.api.MetricsApi; | |||
| import org.dubhe.k8s.api.ModelOptJobApi; | |||
| import org.dubhe.k8s.api.ModelServingApi; | |||
| import org.dubhe.k8s.api.NamespaceApi; | |||
| import org.dubhe.k8s.api.NativeResourceApi; | |||
| import org.dubhe.k8s.api.NodeApi; | |||
| import org.dubhe.k8s.api.PersistentVolumeClaimApi; | |||
| import org.dubhe.k8s.api.PodApi; | |||
| import org.dubhe.k8s.api.ResourceQuotaApi; | |||
| import org.dubhe.k8s.api.TerminalApi; | |||
| import org.dubhe.k8s.api.TrainJobApi; | |||
| import org.dubhe.k8s.api.impl.DistributeTrainApiImpl; | |||
| import org.dubhe.k8s.api.impl.DubheDeploymentApiImpl; | |||
| import org.dubhe.k8s.api.impl.JupyterResourceApiImpl; | |||
| import org.dubhe.k8s.api.impl.LimitRangeApiImpl; | |||
| import org.dubhe.k8s.api.impl.LogMonitoringApiImpl; | |||
| import org.dubhe.k8s.api.impl.MetricsApiImpl; | |||
| import org.dubhe.k8s.api.impl.ModelOptJobApiImpl; | |||
| import org.dubhe.k8s.api.impl.ModelServingApiImpl; | |||
| import org.dubhe.k8s.api.impl.NamespaceApiImpl; | |||
| import org.dubhe.k8s.api.impl.NativeResourceApiImpl; | |||
| import org.dubhe.k8s.api.impl.NodeApiImpl; | |||
| import org.dubhe.k8s.api.impl.PersistentVolumeClaimApiImpl; | |||
| import org.dubhe.k8s.api.impl.PodApiImpl; | |||
| import org.dubhe.k8s.api.impl.ResourceQuotaApiImpl; | |||
| import org.dubhe.k8s.api.impl.TerminalApiImpl; | |||
| import org.dubhe.k8s.api.impl.TrainJobApiImpl; | |||
| import org.dubhe.k8s.api.*; | |||
| import org.dubhe.k8s.api.impl.*; | |||
| import org.dubhe.k8s.cache.ResourceCache; | |||
| import org.dubhe.k8s.properties.ClusterProperties; | |||
| import org.dubhe.k8s.utils.K8sUtils; | |||
| @@ -92,6 +62,19 @@ public class K8sConfig { | |||
| @Value("${k8s.elasticsearch.hostlist}") | |||
| private String hostlist; | |||
| @Value("${clusters[0].cluster.certificate-authority-data}") | |||
| private String certificateAuthorityData; | |||
| @Value("${clusters[0].cluster.server}") | |||
| private String server; | |||
| @Value("${users[0].user.client-certificate-data}") | |||
| private String clientCertificateData; | |||
| @Value("${users[0].user.client-key-data}") | |||
| private String clientKeyData; | |||
| @Bean | |||
| public K8sUtils k8sUtils() throws IOException { | |||
| LogUtil.debug(LogEnum.BIZ_K8S, "ClusterProperties======{}", JSONObject.toJSONString(clusterProperties)); | |||
| @@ -105,7 +88,7 @@ public class K8sConfig { | |||
| if (StrUtil.isEmpty(url) && StrUtil.isEmpty(kubeconfig)) { | |||
| return null; | |||
| } | |||
| return new K8sUtils(clusterProperties); | |||
| return new K8sUtils(clusterProperties,certificateAuthorityData,server,clientCertificateData,clientKeyData); | |||
| } | |||
| @Bean | |||
| @@ -217,4 +200,8 @@ public class K8sConfig { | |||
| return new TerminalApiImpl(k8sUtils); | |||
| } | |||
| @Bean | |||
| public ModelServiceApi modelServiceApi(K8sUtils k8sUtils){ | |||
| return new ModelServiceApiImpl(k8sUtils); | |||
| } | |||
| } | |||
| @@ -67,6 +67,8 @@ public class K8sParamConstants { | |||
| public static final String INGRESS_CLASS_KEY = "kubernetes.io/ingress.class"; | |||
| public static final String INGRESS_SSL_REDIRECT_KEY = "nginx.ingress.kubernetes.io/ssl-redirect"; | |||
| public static final String INGRESS_BACKEND_PROTOCOL_KEY = "nginx.ingress.kubernetes.io/backend-protocol"; | |||
| public static final String INGRESS_READ_TIMEOUT_KEY = "nginx.ingress.kubernetes.io/proxy-read-timeout"; | |||
| public static final String INGRESS_NEXT_UPSTREAM_TIMEOUT_KEY = "nginx.ingress.kubernetes.io/proxy-next-upstream-timeout"; | |||
| /** | |||
| * k8s资源对象名称校验正则表达式 | |||
| */ | |||
| @@ -0,0 +1,97 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.k8s.domain.bo; | |||
| import cn.hutool.core.collection.CollectionUtil; | |||
| import lombok.Data; | |||
| import lombok.experimental.Accessors; | |||
| import org.dubhe.k8s.annotation.K8sValidation; | |||
| import org.dubhe.k8s.enums.ValidationTypeEnum; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import java.util.Map; | |||
| import java.util.stream.Collectors; | |||
| /** | |||
| * @description 模型服务部署 BO | |||
| */ | |||
| @Data | |||
| @Accessors(chain = true) | |||
| public class ModelServiceBO { | |||
| /** | |||
| * 命名空间 | |||
| **/ | |||
| @K8sValidation(ValidationTypeEnum.K8S_RESOURCE_NAME) | |||
| private String namespace; | |||
| /** | |||
| * 资源名称 | |||
| **/ | |||
| @K8sValidation(ValidationTypeEnum.K8S_RESOURCE_NAME) | |||
| private String resourceName; | |||
| /** | |||
| * Number of desired pods | |||
| */ | |||
| private Integer replicas; | |||
| /** | |||
| * GPU数量 | |||
| **/ | |||
| private Integer gpuNum; | |||
| /** | |||
| * 内存数量 单位Mi Gi | |||
| **/ | |||
| private Integer memNum; | |||
| /** | |||
| * CPU数量 | |||
| **/ | |||
| private Integer cpuNum; | |||
| /** | |||
| * 镜像名称 | |||
| **/ | |||
| private String image; | |||
| /** | |||
| * 执行命令 | |||
| **/ | |||
| private List<String> cmdLines; | |||
| /** | |||
| * 文件存储服务挂载 key:pod内挂载路径 value:文件存储路径及配置 | |||
| **/ | |||
| private Map<String, PtMountDirBO> fsMounts; | |||
| /** | |||
| * 业务标签,用于标识业务模块 | |||
| **/ | |||
| @K8sValidation(ValidationTypeEnum.K8S_RESOURCE_NAME) | |||
| private String businessLabel; | |||
| /** | |||
| * 任务身份标签,用于标识任务唯一身份 | |||
| **/ | |||
| private String taskIdentifyLabel; | |||
| /** | |||
| * 获取nfs路径 | |||
| * @return | |||
| */ | |||
| public List<String> getDirList(){ | |||
| if (CollectionUtil.isNotEmpty(fsMounts)){ | |||
| return fsMounts.values().stream().map(PtMountDirBO::getDir).collect(Collectors.toList()); | |||
| } | |||
| return new ArrayList<>(); | |||
| } | |||
| } | |||
| @@ -24,6 +24,7 @@ import org.dubhe.biz.base.functional.StringFormat; | |||
| import org.dubhe.k8s.domain.vo.GpuTotalMemResultVO; | |||
| import org.dubhe.k8s.domain.vo.MetricsDataResultValueVO; | |||
| import org.springframework.util.CollectionUtils; | |||
| import org.springframework.util.StringUtils; | |||
| import java.util.ArrayList; | |||
| import java.util.HashMap; | |||
| @@ -63,7 +64,7 @@ public class PrometheusMetricBO { | |||
| return gpuMemValueMap; | |||
| } | |||
| StringFormat memMetricsFormat = (value) -> { | |||
| return NumberUtil.isNumber(String.valueOf(value)) ? String.valueOf(Long.valueOf(String.valueOf(value)) / MagicNumConstant.BINARY_TEN_EXP) : String.valueOf(MagicNumConstant.ZERO); | |||
| return NumberUtil.isNumber(String.valueOf(value)) ? String.valueOf(Long.valueOf(String.valueOf(value)) * MagicNumConstant.BINARY_TEN_EXP) : String.valueOf(MagicNumConstant.ZERO); | |||
| }; | |||
| for (MetricResult result : data.getResult()) { | |||
| gpuMemValueMap.put(result.getMetric().getAcc_id(), memMetricsFormat.format(result.getValue().get(1).toString())); | |||
| @@ -81,7 +82,7 @@ public class PrometheusMetricBO { | |||
| return gpuTotalMemValueVOList; | |||
| } | |||
| StringFormat memMetricsFormat = (value) -> { | |||
| return NumberUtil.isNumber(String.valueOf(value)) ? String.valueOf(Long.valueOf(String.valueOf(value)) / MagicNumConstant.BINARY_TEN_EXP) : String.valueOf(MagicNumConstant.ZERO); | |||
| return NumberUtil.isNumber(String.valueOf(value)) ? String.valueOf(Long.valueOf(String.valueOf(value)) * MagicNumConstant.BINARY_TEN_EXP) : String.valueOf(MagicNumConstant.ZERO); | |||
| }; | |||
| for (MetricResult result : data.getResult()) { | |||
| gpuTotalMemValueVOList.add(new GpuTotalMemResultVO(result.getMetric().getAcc_id(), memMetricsFormat.format(result.getValue().get(1).toString()))); | |||
| @@ -162,7 +163,7 @@ public class PrometheusMetricBO { | |||
| return map; | |||
| } | |||
| StringFormat memMetricsFormat = (value) -> { | |||
| return NumberUtil.isNumber(String.valueOf(value)) ? String.valueOf(Long.valueOf(String.valueOf(value)) / MagicNumConstant.BINARY_TEN_EXP) : String.valueOf(MagicNumConstant.ZERO); | |||
| return NumberUtil.isNumber(String.valueOf(value)) ? String.valueOf(Long.valueOf(String.valueOf(value)) * MagicNumConstant.BINARY_TEN_EXP) : String.valueOf(MagicNumConstant.ZERO); | |||
| }; | |||
| for (MetricResult result : data.getResult()) { | |||
| map.put(result.getMetric().getAcc_id(), getFormatValues(result, memMetricsFormat)); | |||
| @@ -195,7 +196,7 @@ public class PrometheusMetricBO { | |||
| return list; | |||
| } | |||
| StringFormat memMetricsFormat = (value) -> { | |||
| return NumberUtil.isNumber(String.valueOf(value)) ? String.valueOf(Long.valueOf(String.valueOf(value)) / MagicNumConstant.BINARY_TEN_EXP) : String.valueOf(MagicNumConstant.ZERO); | |||
| return NumberUtil.isNumber(String.valueOf(value)) ? String.valueOf(Long.valueOf(String.valueOf(value)) * MagicNumConstant.BINARY_TEN_EXP) : String.valueOf(MagicNumConstant.ZERO); | |||
| }; | |||
| for (MetricResult result : data.getResult()) { | |||
| list.add(new GpuTotalMemResultVO(result.getMetric().getAcc_id(), getGpuTotalValues(result, memMetricsFormat))); | |||
| @@ -220,7 +221,16 @@ class MetricResult { | |||
| @Data | |||
| class Metric { | |||
| private String UUID; | |||
| private String acc_id; | |||
| private String pod; | |||
| public String getAcc_id(){ | |||
| if (!StringUtils.isEmpty(acc_id)){ | |||
| return acc_id; | |||
| }else { | |||
| return UUID; | |||
| } | |||
| } | |||
| } | |||
| @@ -41,4 +41,7 @@ public class BizContainerStatus { | |||
| @K8sField("containerID") | |||
| private String containerID; | |||
| @K8sField("ready") | |||
| private Boolean ready; | |||
| } | |||
| @@ -0,0 +1,39 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.k8s.domain.vo; | |||
| import lombok.Data; | |||
| import lombok.NoArgsConstructor; | |||
| import lombok.experimental.Accessors; | |||
| import org.dubhe.k8s.domain.PtBaseResult; | |||
| import org.dubhe.k8s.domain.resource.BizDeployment; | |||
| import org.dubhe.k8s.domain.resource.BizIngress; | |||
| import org.dubhe.k8s.domain.resource.BizSecret; | |||
| import org.dubhe.k8s.domain.resource.BizService; | |||
| @Data | |||
| @NoArgsConstructor | |||
| @Accessors(chain = true) | |||
| public class ModelServiceVO extends PtBaseResult<ModelServiceVO> { | |||
| private BizDeployment bizDeployment; | |||
| public ModelServiceVO( BizDeployment bizDeployment){ | |||
| this.bizDeployment = bizDeployment; | |||
| } | |||
| } | |||
| @@ -55,7 +55,15 @@ public enum BusinessLabelServiceNameEnum { | |||
| /** | |||
| * TADL | |||
| */ | |||
| TADL(BizEnum.TADL.getBizCode(), ApplicationNameConst.SERVER_TADL); | |||
| TADL(BizEnum.TADL.getBizCode(), ApplicationNameConst.SERVER_TADL), | |||
| /** | |||
| * POINT_CLOUD | |||
| */ | |||
| POINT(BizEnum.POINT_CLOUD.getBizCode(),ApplicationNameConst.SERVER_POINT_CLOUD), | |||
| /** | |||
| * DATA | |||
| */ | |||
| DATA(BizEnum.DATA.getBizCode(),ApplicationNameConst.SERVER_DATA); | |||
| /** | |||
| * 业务标签 | |||
| */ | |||
| @@ -82,32 +82,20 @@ public class K8sUtils implements ApplicationContextAware { | |||
| * @param clusterProperties | |||
| * @throws IOException | |||
| */ | |||
| public K8sUtils(ClusterProperties clusterProperties) throws IOException{ | |||
| public K8sUtils(ClusterProperties clusterProperties, String certificateAuthorityData, String server, String clientCertificateData, String clientKeyData) throws IOException{ | |||
| String kubeConfig = clusterProperties.getKubeconfig(); | |||
| if (StrUtil.isNotBlank(kubeConfig)) { | |||
| String kubeConfigFile = getKubeconfigFile(kubeConfig); | |||
| //修改环境变量,重新指定kubeconfig读取位置 | |||
| System.setProperty(Config.KUBERNETES_KUBECONFIG_FILE, kubeConfigFile); | |||
| client = new DefaultKubernetesClient(); | |||
| config = client.getConfiguration(); | |||
| } else { | |||
| LogUtil.warn(LogEnum.BIZ_K8S, "can't find kubeconfig in classpath, ignoring"); | |||
| String k8sUrl = clusterProperties.getUrl(); | |||
| if (k8sUrl.startsWith(HTTPS_PREFIX)) { | |||
| config = new ConfigBuilder().withMasterUrl(k8sUrl) | |||
| .withTrustCerts(true) | |||
| .withCaCertData(IOUtils.toString(clusterProperties.getCaCrt().getInputStream(), "UTF-8")) | |||
| .withClientCertData(Base64.getEncoder().encodeToString(IOUtils.toByteArray(clusterProperties.getClientCrt().getInputStream()))) | |||
| .withClientKeyData(IOUtils.toString(clusterProperties.getClientKey().getInputStream(), "UTF-8")) | |||
| .build(); | |||
| } else { | |||
| config = new ConfigBuilder().withMasterUrl(k8sUrl).build(); | |||
| } | |||
| LogUtil.info(LogEnum.BIZ_K8S, "config信息为{}", JSON.toJSONString(config)); | |||
| client = new DefaultKubernetesClient(config); | |||
| LogUtil.info(LogEnum.BIZ_K8S, "client为{}", JSON.toJSONString(client)); | |||
| } | |||
| LogUtil.warn(LogEnum.BIZ_K8S, "can't find kubeconfig in classpath, ignoring"); | |||
| config = new ConfigBuilder().withMasterUrl(server) | |||
| .withCaCertData(certificateAuthorityData) | |||
| .withClientCertData(clientCertificateData) | |||
| .withClientKeyData(clientKeyData) | |||
| .build(); | |||
| LogUtil.info(LogEnum.BIZ_K8S, "config信息为{}", JSON.toJSONString(config)); | |||
| client = new DefaultKubernetesClient(config); | |||
| LogUtil.info(LogEnum.BIZ_K8S, "client为{}", JSON.toJSONString(client)); | |||
| nfs = clusterProperties.getNfs(); | |||
| host = clusterProperties.getHost(); | |||
| @@ -1,12 +1,13 @@ | |||
| apiVersion: v1 | |||
| clusters: | |||
| - cluster: | |||
| certificate-authority-data: | |||
| server: https://127.0.0.1:6443 | |||
| certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeE1URXlPVEE0TXpNeE4xb1hEVE14TVRFeU56QTRNek14TjFvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTmpCCmxkVWhGQkdqSDNsYXIxTW9wVUgvMW8xNVUwbEhvcGQzZjgyL0tWMlEyOU9BKzhjMkhXYTd3R01QSzhxL1JmSVAKTjlnYXJJd0FqZXFwNHFSMWhEcVhka05WN2NOZUZ2OGdoMUVYSzMyTUxoaFZJdXhkTnF6OW9GVm85RDZqTzQ5awpEOWQrM215eU4zamxsT2wyTWVRMUY0STlHSTFabjFCOG5LQVZWVjFIZTBPTGZjVTIrZG5mU0g4ZFdqV2RPQlBhCkJmbGU4UFRLQy9tOFVmcTQvanArVU92R04yVEhIaXk0V2UyTWFEK0xxWDIzekE0T1FlK3NrdlY4bHlqK0ppVUQKVVRiM2xzazlhTDMxblMxUmpnVStkbVIyR2xHQ1BHWEhNc2Z3MlVCZzljZEM5ZzhKc2dFeTJDa04xMitjeWx3dApDbHFQQ3o0MlNlNEJMNWF1ZGJFQ0F3RUFBYU5DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZCTmFSa0hpTzdvZDd2U3pUUm9qaHFTWStSNXpNQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFDVnZGRUg0ZEYzUTQrRDlOeHBZdDM4ZG9mb0ExYjlYOWNndU5YYktvbGxHK1lQeWl4NwpBcGlMWkp2WFlsbk0rUU5BYjMyOU84VmNkQUp0aDZ4MjVHSVNUVjFGbXBWWHFlRVIvUFJOZURsaHFybzVwYUlVCkV1YUQzYldxaitWb2p6b1AyVzZMU21RdzQwNUIzV0JKRlJtdm51bW9LYStyUWEySVoralRNMVQ5bDV5bXR2YloKS0lXNGZFZ0N2VEhPSmtRLzBGWDg3dEc0VlVJZ3hHRXZJU2lUUkJYc3hnQXdVK0I5SnN4bEZSS3NHYTJ4QkE2bQprZXR1VFVlZkswTGZRMFlMWVVKSVA5Y0RsNm5QSld5U0NTcWFZUGRoaGxERWxEYUt4d2JZeHdBVkI0ZzV1cWhNCnZrMkN0RVFHOWg0b2ZxZjQ4VDFLVlJVRGo5UzdBL2xtbEZxNgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== | |||
| server: https://10.5.26.91:6443 | |||
| name: kubernetes | |||
| contexts: | |||
| - context: | |||
| cluster: kubernetes | |||
| namespace: default | |||
| user: kubernetes-admin | |||
| name: kubernetes-admin@kubernetes | |||
| current-context: kubernetes-admin@kubernetes | |||
| @@ -15,5 +16,5 @@ preferences: {} | |||
| users: | |||
| - name: kubernetes-admin | |||
| user: | |||
| client-certificate-data: | |||
| client-key-data: | |||
| client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURFekNDQWZ1Z0F3SUJBZ0lJT21TandKODdaUWt3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TVRFeE1qa3dPRE16TVRkYUZ3MHlNakV4TWprd09ETXpNVGhhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXdSWTJuYkJZc25KMWxlQ1MKS1lxbCtLSlBoOW5UdkxqanNRczJobEJrcmM0M1o5eUNEUTM5V1RWSkZHdHZzUDVQK1JNdzFOYUY5QlJUbTQ2dQpOQXBYTGt2bTRLZm1mL2taVUh5clpLYTllSnlkbTRWZTNjNWVWeXpidHRVUVgxQUNFOGZIM0VqY21hRHhPZGViCjBHa3dHc2FnVVJiQ1JxSWpZYmQ3V3BkK3F1OGRuUC9TbmJkaURuaU9sNVVoSlhMUEl6TmlLZTZnREt3NUN6VGgKbVVjZnc1azB4WFpwRFBIckwxOG4yMVB0dlRZSEhxYXo0ckx5MWZiWWsyOG54cXZEaHYzUVBXVldRNGhVR25tZQpNRXZlcTRuNU1sRGJOU2tZUHhaSDNUbUhrZldXR1Z2dGI1RDFLeStSbnFISUxNZEIvdHN3YisyaDVBQTE0WXJICjhBbnZ5UUlEQVFBQm8wZ3dSakFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0h3WURWUjBqQkJnd0ZvQVVFMXBHUWVJN3VoM3U5TE5OR2lPR3BKajVIbk13RFFZSktvWklodmNOQVFFTApCUUFEZ2dFQkFNdVZaem5pdlhXeDV1dHl5cGppcHJQWkdxeXVYb1J1NVR0eEZwMVJFcHVIb0Z1NHg4VkNUYkplCnNzNmN2VitORmdIa3BLSHlWb2Y0YStRNHlOcGZmMWcrL3d3a05XcHlBQTZBUWdCbW00djBIV1ZVTzYwVVN0VEcKckFhQVUyZ1R6dGYvWll3RFpreFdIUmo0V3ZIRjZRaDhUYUdFVTdaL1dWbC9rOW82MkJGNGRza1pCRVZmcDFvMApMSkorcGxmdXpLOTNwN0t4ME9hSUhHUFRPcnBydEc1ZmR1U2NmRDFUck1nOE1zbmIyRG5XTHVXNzZPUi92cVRBCmVaRFI0Nis5aTllKytQMUh0eDZZMFJNVVpuS1o0MCtIc3dFUjZFZHFINmdJd3Zia2FvSXQydmF2Y2dxdXQ2bWUKZ1VoaVlYelljREhmRllFOUJVWU5UVm1zdmxNOSt1RT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= | |||
| client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBd1JZMm5iQllzbkoxbGVDU0tZcWwrS0pQaDluVHZMampzUXMyaGxCa3JjNDNaOXlDCkRRMzlXVFZKRkd0dnNQNVArUk13MU5hRjlCUlRtNDZ1TkFwWExrdm00S2ZtZi9rWlVIeXJaS2E5ZUp5ZG00VmUKM2M1ZVZ5emJ0dFVRWDFBQ0U4ZkgzRWpjbWFEeE9kZWIwR2t3R3NhZ1VSYkNScUlqWWJkN1dwZCtxdThkblAvUwpuYmRpRG5pT2w1VWhKWExQSXpOaUtlNmdES3c1Q3pUaG1VY2Z3NWsweFhacERQSHJMMThuMjFQdHZUWUhIcWF6CjRyTHkxZmJZazI4bnhxdkRodjNRUFdWV1E0aFVHbm1lTUV2ZXE0bjVNbERiTlNrWVB4WkgzVG1Ia2ZXV0dWdnQKYjVEMUt5K1JucUhJTE1kQi90c3diKzJoNUFBMTRZckg4QW52eVFJREFRQUJBb0lCQVFDQVA4cmpEbUM3bGo3Mwo0QVAxUjd4WjJ5Vk1MS2p3N3pWOVFOOWtjejJNSEM2ODg4QUYvOGJKWEJWQVZPUUpBY0lJeEhCb3pseUc5SUZjCkQzY3g1YlJtY2MvV1pHODdqUzc5UVBGdWx6bStSUGlDZGlHKzNmWFhuVm9LcEphTldFMG82a2ViejJHSFFWazQKZkRkb1JKWEpFeWtrOHlMelczcDR5ekJKeWRvK21oQmhZWjRCd2xwRVExeURQU0xoTnpSR0NRL0tUTm94T1ZQTQppcVJUdkR2MGhZMTFLdGk1dExMbk1RWnIvaDJRNTliT3VaQVg0NDFiWVJjSzNyU2R0TzFBSGhYVmpSMDlZWFZUCnJwbE44VkhGeE1wZjVaNHFRTW5idk1yb1B0cU5PTzlqWCtrWjQrY2p2UjlQbzNaK1Y5QU5tUHR1bEtMejhFbjYKcUZSYTVTc3BBb0dCQU0vTStvU2t1QVpsT1ZXR1JsdkNlbE0vMHJWUDFrRTdSeHl2NkZDT2EySTlFcTEvUThraQo0N05saHZ2ei9TcmZia040Ymg2Z1RXOUc3WGVpZGtWWEhiaVRmZGlNcXA4YzJ5QTByQVJrWGtZNStycUpZRWlGCmFpOE1jUUVhKzRObzdHOC9xSk5hZTFtVzBGNE5JUTFoRlRMNHMxTnJ5Z0pIaUxDeHhIdVg4cjVUQW9HQkFPM2YKaU9uSm5qY3IrTmltbytGVXYvaHp5SjMzQ2FjNWNjakF5bk0vUGpheGRhOXk4RW1mL2x2eURDQmsranRydlV3NQo4eG1lMHc3UXZJNzlZZkljc2JrYTRnb1dtREIySXZXeGlJRkZCcWwzOUd1eFRYVUpCb2R6MXF4TFJWL2tSekZYCkhIZFM2VTVVTDJINkRQMmo2aVk3NCtWOHhSVlBhQnpPRnQrdDlMM3pBb0dBVjZMVDJGTDdoVDcxWWh0QjJ2cjIKeWRzMXl0K0R0WGtCY1pqQ09nOEdQS1VURm5hQXFQZjgzYkNvcitOalZzeHAzU3lTREhxQWpiaDA5NnBkaExyTAp2d2I4NFBIYUYwWjlKMlR2VXQ3ZFgzS2VTa01iaHhvMUFPaVhVK2NFUVpSamVqdDNwY1ZZRmgxamZQYStoTHozCnlzcFdIbzFyNFhBM3RvVVNIeW1pNXg4Q2dZQlBmZTBXRzU5NDFvUUJlcWEzYllmOXNrdXZwbGVlZjQ3cnhLbWoKRzlaaGxxbzZhSkd1T1A1YW9hZTF4NmpyNUpSTS9leWtlalFUOW1PYzhVWWpENzNBbXlCQXVNNUJHNm1SSzdQdgpaeTdUd1ZkNENiZFZ6aDlWY3J1aHRrSEh5dFNUdzRXcXhwVmE3TDBzNDlBbGp2cDNybm41UGRucXhpK0h1TU5pCkdwTDRTd0tCZ1FET0hRZ1ZGeGV0eU5zVjRkSXd6UThzbVp2ZHF1QzRzRXZTakx4UXd6ZmZadU1aMHFBc1R6VkUKYkE2dk01WlNpQ3A5SUxTd3VKTUc1eGhqMXZUdGVDOHBCSmdsM3BmM1ArS0pXeGZ4S3lYRCtRai9STDN6V2lxcwpFaDd4SFN6UlFCcDJESjhqMWdtakd4em5IbnlDdnBNdFJlQzBzcGp2N0JVZzNqaFR4SVRRdFE9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo= | |||
| @@ -1,8 +1,8 @@ | |||
| apiVersion: v1 | |||
| clusters: | |||
| - cluster: | |||
| certificate-authority-data: | |||
| server: https://127.0.0.1:6443 | |||
| certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeE1EY3hNekEzTlRNek5sb1hEVE14TURjeE1UQTNOVE16Tmxvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTEZlCmp5KzlwTjNybnJpYTlpbDhzOEp0WWZoekVMUU1LbXVmb0Y0VEhjTnFObGtOVDJiL2pTcUUzbGdRYTR2Zm9oL1AKUFVOaWVkZEZvczFoRGNxRnF0QmRpaXJ5QXhSNERPeTJsMWpjSWVpVHJNaHYyd1JZc09ZMG4yanZITFdGdENCaQphY0lEeXFmNmhHM01SV2ZNUEhPVVdDQ0JIUmxLRFlnYkNDZXp5NWxxUEF4QXpmcUpEalUxWkNUVmNNa2Z3R1FDCmFSYVZ4aTFiRHhRSk9Ud2dTTGlJdEJIUGhrdGtOcnY1MU1XZzRSWkVUbWF3azg5Y09oWExpSEg3ZExFZjFvK0oKVE80Q3J1K2pyb3lIRkNvQmo0bGpKZHd4N0ZRS25XZFpEbWZiOFFoZEdyTkRuK21WR3BRNnZSRGN5YzloSVJsMwpyM3U4bkM2TS9mZ29UTHhWaTFFQ0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFIbDZMYWpscFZLMk9PbG1JYzRVK3A4bTZoVGEKd2NCTW5MZjVJcExwME9CRmZ6M1hvVi9EVUlmTE1LU2k2bzY3a1Y0aFYzNDZMTnErU244elBUZEZkbDdjZUlvbQp2azc3YXE4c2VERk5xbTJMSytSUldmUWZQbFQrSGhiWFVpS1lOUUhmanlXdjh6QzFGaWpBQTBqaGVjWVBaSnU4ClpUb2JaenhPaS8yOGNwSmNOSFFDSW14OG16UkU2c3JTRjFsbE4yaWF0eTQ1cWhEZWwyZHpmSldaeTFzTXVwc2YKaTc4Z25qdlhFU3BYaGoweGZNbEdMNnA3QkVjdUw1YkgyN3Y3djJjelh2WVJnbk0vamhscGVzbVRsNzFiSE1KQQpnSzlpR2pqMHhoZ1Jnb3h2VHNQNVZLSUszTFZVbGxNNXJhNXYxTjdOOXpmQVZybnprRGRoaXNZQzZCUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= | |||
| server: https://10.105.0.29:6443 | |||
| name: kubernetes | |||
| contexts: | |||
| - context: | |||
| @@ -15,5 +15,5 @@ preferences: {} | |||
| users: | |||
| - name: kubernetes-admin | |||
| user: | |||
| client-certificate-data: | |||
| client-key-data: | |||
| client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJVjB5b2I4RnFSdGt3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TVRBM01UTXdOelV6TXpaYUZ3MHlNakEzTVRNd056VXpNemhhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXVPN0M2OWNlUjVVbmZuUDIKREZNR1M2RzZ2RkYxLzNxSU85ZVFTR0pZRU15dDhHWmo4QWNlbnMrQTNDS05jRHJ4dk5oQlpvazlPa2w4SnpzRQpZOFhKMTFmZVdPS0Zwb0dYVGtseHBuakcvRWVwbWh1d1JodUZhaTlsZ1BXQnUyei9JOG5meTdjSUhscW1EYW1UCkViaEJGWitSbzlPYjB5dTJ1MklhUWNUTVpPREc5eEdTRURIT1VYTkIzcG5oWGhYRmhZUTZyeUpVMkFzYy9TS0UKa1ZTN3RWY2hoVHZOSHVnWC9YQ1hwZ1dpSXJhMUZNbUNBMGMzY003NDJhNFI4QnhmKzBremNBV0ZqQUIwc2xFdQphcURSK3I2SWQyUWRyVjVBQXUra29rU1MyRnhKNzF6R3VtRnRQdlVyT1UzeXhreWFJbHZ1aFcxZEV5cHl4WjVJCkJvSUNWd0lEQVFBQm95Y3dKVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFLKzRlV280b0g0K1RFS3doUU9ZSFJvWXhWcEVxWDBXZmoxSQp5US9Qbm9sTXh5ZmQxTkc4VzdyeW1FdWJZbEtIV3JjOTNKdHJBOTA3N01BRHMrWGcvWVZrbFdpVnF2b2Eva2xOCm9aY1pVc3Q2VEdMNVJ6QmE5NzFheCt3Q09xMXRiSng0ZGtwSDdmWVVWeXVaTUg0MXhxL1hIZEwzSnV3RzFSbU8KQnEvZWdmY3d0QzdhZGthRU1SbWxlRCtzelVBZkQxYjFmd29JNnpyV2ZyV0JnUTUwTmhFUzk0NldLOER1QU84cQovalFXRlVtd3M3Nzg0d3ZPR0JjTGpSeWNvWGpxSDZXeW5hSE9BRVdCakJaMUtyYjh3LzNucnNucTArOTdtbG1oCi9IMkpNQ1lIbDRZQi9Bb2pXUnhpVE50b3BsM0k1Sll4Vlkza1J1ZWF2c0pQNElmNmJ1MD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= | |||
| client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBdU83QzY5Y2VSNVVuZm5QMkRGTUdTNkc2dkZGMS8zcUlPOWVRU0dKWUVNeXQ4R1pqCjhBY2VucytBM0NLTmNEcnh2TmhCWm9rOU9rbDhKenNFWThYSjExZmVXT0tGcG9HWFRrbHhwbmpHL0VlcG1odXcKUmh1RmFpOWxnUFdCdTJ6L0k4bmZ5N2NJSGxxbURhbVRFYmhCRlorUm85T2IweXUydTJJYVFjVE1aT0RHOXhHUwpFREhPVVhOQjNwbmhYaFhGaFlRNnJ5SlUyQXNjL1NLRWtWUzd0VmNoaFR2Tkh1Z1gvWENYcGdXaUlyYTFGTW1DCkEwYzNjTTc0MmE0UjhCeGYrMGt6Y0FXRmpBQjBzbEV1YXFEUityNklkMlFkclY1QUF1K2tva1NTMkZ4SjcxekcKdW1GdFB2VXJPVTN5eGt5YUlsdnVoVzFkRXlweXhaNUlCb0lDVndJREFRQUJBb0lCQVFDaC9SSmtmdlFaQTcrcQpkbXpwOHJlcS9DbVQxMDhpei9RUlp3c05QSWVqZjRaRTg0dEtyeEhWVGpHem9kaCtuRU12aGNZVHlOY0cvV054CkFiTWdxaG5aTlRDZ2J4dGU5RmpTekdadXlaQ1RYenBpc1NwQTNzNklhcWZneEN3MVBvNW1qT2dwaTFQak1zZ04KWTZKZGZTWVZpTWFMMkVuQU9hUkFrdmdvNy9lUnpBeFowNkhZeEJ5WlM2dzZrRVhpQmJQYThCeUpkd0pIRzRqLwpHSU9yZkhXRWhldkdjcTU3SmF6c3hrTzczZXBYbW5IU21NQWVKcXY0RmF2czBtSUZ4THlRU1NjSmxZZ2xXWlJuCjRmekZVM2tLYmRaak9NdWJpbGY1ODluQUZ4cVpnMzhJblU0bGpzSjRsSFVhU0M1VlZ5UTFvc2pmaGlFeFg1NVMKQmJmSFU3MnhBb0dCQU91T2pHTTlwYi9rQ282ZXhaREZNSlRqbmZMQmtEQlAxNVN6NjByUjY5cjFRQ1hwZk1CWgppT0N1aHZTSnJvRGJQYVVvUXc4QkhvV01BT3d4VU1veXpUZDYwOC8xVWRmY1F2RUtsY0dXSXpGMWJxSTllcFNpCmQ3Q3dSZ2Vxd01rUTF6SHBsYU4rWkY3MEJsZ3RJYkx3Ymd6dWhuSWlZRjVRbi82dWVMQXkzQkhyQW9HQkFNajcKZWoybklVT1JxY2lpeUZwQlVERGUwT01GYWNiYkk2VzA3RUl4cElxRWpLejZPenVmZFBYSFpLVU44QmEwRjlBUgpsSzVBdXd1STErbnFqeTJJOWV3Lzk1QTQ1NGFBYjM0WjRqekUzUm8vS1N0dytQR0xUb0RSeEZneGVhQmYvUkdlClIvZlpTK2h2VHgrYy9pQjRQYU5sOGVpQ2ZFcVFhYS9MbW5WcitncEZBb0dBYnNWN0tWUWROTzdsTkFwZjkrTnoKSkNFaDdyMnRzN3BvTTZxa05Hd2hVTGRTTWtIcGczN1hTbWxvVjJqRG9oNzNqMG91dHNpYzlNcFF5TUdzTDFuUwpmWXVLUGRvc1lhbFg1WWhId21CN0xrLzk5ZGVaWkhvK2ROMkFJU3pnT2Uxc2RURldTQ3N3d2lKWk5YQUx6OTBXCnM0Z2J1MktGRlBVdk9CSU4rVFlCblg4Q2dZRUFyWEdBYTZaSXFaUVNMb2gwV0pkV3llWHY1SXJ1WHVNTW4xdEUKTEZmRkJKa2hBY0lzemVadFBCR29CRnpEM2dQckxPK1BITlhWMVQxeC8zY2h1bzBnbFpJYVpnY0ZudWhGejFBdApFbjVkeE9ITytLTlU0clp5dCs3Ty84RXFra0ZrRndrK1dHRFpCaXpRM3BwUUlOdERiamh6REZGWFM4M1d0eFFCCkp1Wlk4UFVDZ1lBOFlsZnNsQ2VmZktvTVBVK3pKZWF5SUlQNTR0M3NySkFwblNyc1BuNlNBSlB1WjU5ZkYrUTcKNGlvNk0weEw0dE5VckhPQ2ZpODJXSzlRQ29EbDRIYTJGZ0Y3YkNMTTQ1Qld5cVp5THg0b0JRYmFGNE5ybmVuTgpVUVVFbkU2V2ZyN1RFWWVBNngrOG10dXAvcDJzbTd2eWdkYngrRFB1OXYzV1JyZE1DZDBNWUE9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo= | |||
| @@ -1,8 +1,8 @@ | |||
| apiVersion: v1 | |||
| clusters: | |||
| - cluster: | |||
| certificate-authority-data: | |||
| server: https://127.0.0.1:6443 | |||
| certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeE1EVXdOekE0TURFME9Gb1hEVE14TURVd05UQTRNREUwT0Zvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXU2CmRJYWVmOWQzYXByK3lKK3BLY0EyaU5NQXlQVWFsbFgyZHBwelprd282T0R2TW9FYmgrRWFaY0Y1aEdMVnhSWDYKbnhtcUQvVFNCWXdENFNzY1E3c0YzcWtxeWxBLzJXaTg1NTJKbGJQcXFSQm5CaEUwV211ZE9EVXZYYVF0N3BnWApzR1JKcDROcFBsd0tLMUVpZmhsdkJIMmRVWHFjZDRENmZKbWRSSWgrNEpOS3ZOL09Hait4WjNKUG5Cc0pKOUlICms4TWFsc3NuTTYvaFpna0tKVlplc2YvcVorN2I3dXpJSVJteEd3L0RBcmtNaGgvL1VCZUUzVEFsd1lWWisxZWkKU293eldEN3EzYzFhU3NJYkdrbXJWaXNQcVVZTk9sUEplcHJLTVFJRUJKVEdPWUYzSzk0eHNKaEtBMkI0Z0VCRgpOdkJxTzVqZFZ4RkM0SFdxM1VFQ0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFLV254YlZqTFRWZVVyZDB0Q004SE83ejk2QnQKQTBGS3pmclRSTkhtT0I2WVVSRnVRbWZJdE9GTkY4QnJoYVBCZVNKMFZrNVdNUXZBd1BkdnY2R2l1NU1VNU45TApHV3R2eXhsS0Z5aVkxR25RUy9sWjRjR1JaSE9kMmtMNFY3bVNLQmo3ZFpzcDN0dW42d3BQZWM3dUJ6Z1UvNzdxCjN1b3BGMGVzR21wY3ZFaVhNSlRrZUN1NTNhaTVFVHhSS0Q0V0xxUUFhbDViUlB4b0UwL3Mrams5SGI4b1JuNnQKa0RDaElpQnVjL3RDaHhwTmNFVWt6UUwyRjBHR2hRaVlQTFFQdkgzRml5S2tlWjBiYUNHdFdpODEvZG9lVVJKZQpOM21jU3pvZEM1SUhMc1Zta05HTzh3Y2pocjVZck0yVGxHS01sV1huRVk5QWFMUEl1blI0VmQ4ZU1iWT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= | |||
| server: https://10.105.0.1:6443 | |||
| name: kubernetes | |||
| contexts: | |||
| - context: | |||
| @@ -15,5 +15,5 @@ preferences: {} | |||
| users: | |||
| - name: kubernetes-admin | |||
| user: | |||
| client-certificate-data: | |||
| client-key-data: | |||
| client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJSDByc3FWMTBudUF3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TVRBMU1EY3dPREF4TkRoYUZ3MHlNakExTURjd09EQXhOVEJhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXUwVlR6ejIvK1VqbEtVRHkKL211bVYrbTBjejg1UURTUjU1aXN5QmNDTWVzbEJsSEYyVEhWQm9FRHhUMEFHQmF5ai8rdEx6c1J4Vjg4Z28vNQpkZFVZL0llNllNVmVlMVZuQ29CL2VvYStkUDBQZUlhZVl3amU3WTJhdFhpMDBOM3EzZ253Q1AvM3FodUpabDBTClQraTJHMktOQlRvbjYvSGUxRVBva0hlcTZaMU5yYm5aTWROTzBWM1VaTExzMXdhS2ZESDJHRStlang1QzU4VEQKSnVGdjN5QkFPWW5CblI0YTBObWJpTFJ2RmN3d1BFR24wamlHazZGY2oyK0RWRlVCQjYzbVFOV3puWGVlaDQzVwpodm9GQnZKUVg0OFZTeng0U2tHVURtaUU1Sktncms0T3dJNk9vR0Fsa0kvbU4wQnl2b3o4UjFFbENMY29jZzJWCkhvN1Rrd0lEQVFBQm95Y3dKVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFNSGpQdnNNWDUyMjNzbTZTQTJzYlBzc3NaalJJSUhCSWloUwp6MlBVR0Q2R2NXZ0RRRXBzRWVRRDYzby9vLzVLcndBbHUveGlnVW9VK2dkRTQ0S29PTmM0Z05tdHdZOVhzcnZXCmZSamc3YXh2MGN5czBuSzBCdVJyYjBQVDZ0ZkVqb25yQXUvQ1NuSG9LZERuaVBweUNQSys5amZONGpJR1VobFkKU0Z4Qnh6N3ZGQlUrRlVZbjBYR3BHV3FnQjd6bVRwRllSVXNKOVc5eXJlaWlsZDVJcDdzSGljZG0za0NiYlJWagpmQ1k0eVV5elVSbFV2Q2xrOE8zQktEQkYxeWZIUGErUW1STStabzhEK3V2T2VHVVFqSW92eHdXNVNPM1RkNkE5Clk2WEoxbEpwRmtUWndrMk13N1N0RjhxK3MwMGFnNFB0RGJhKzNoM2FmWG1DWU9FOG5pUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= | |||
| client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBdTBWVHp6Mi8rVWpsS1VEeS9tdW1WK20wY3o4NVFEU1I1NWlzeUJjQ01lc2xCbEhGCjJUSFZCb0VEeFQwQUdCYXlqLyt0THpzUnhWODhnby81ZGRVWS9JZTZZTVZlZTFWbkNvQi9lb2ErZFAwUGVJYWUKWXdqZTdZMmF0WGkwME4zcTNnbndDUC8zcWh1SlpsMFNUK2kyRzJLTkJUb242L0hlMUVQb2tIZXE2WjFOcmJuWgpNZE5PMFYzVVpMTHMxd2FLZkRIMkdFK2VqeDVDNThUREp1RnYzeUJBT1luQm5SNGEwTm1iaUxSdkZjd3dQRUduCjBqaUdrNkZjajIrRFZGVUJCNjNtUU5Xem5YZWVoNDNXaHZvRkJ2SlFYNDhWU3p4NFNrR1VEbWlFNUpLZ3JrNE8Kd0k2T29HQWxrSS9tTjBCeXZvejhSMUVsQ0xjb2NnMlZIbzdUa3dJREFRQUJBb0lCQUVYR0pOM1lZZ2lkY2xTVwprSExlNVJGb1VBV0lqdW92TEJXZ092QXFNblVxNlphYkxSNHBoUGR4WmxnOHpDWXRmc1pNT3RpWUo1emtTUVZVClkxdlYxQU56QnF3N25XSlNoWnZTR0swc094WVhtNFlLa2tUUDcwK1BMUTlrTStxR1pKWHFHZmNnZDhSM2toQUQKcVdrQWlhbFdaTGlIM0l2NmlFMktKOEo3ODhBcWFrM1liemJFR0xvUkxKbzZONjZzSm9CcHRUS3BOOENpcjF0bQozR1MvRllZK2ZzcVFudU8vWkNjOUl1ck5scVJkU0ZNdThRT2pRMFp6TkJqMVVEZFBNa24vWEhWN3BIQWF1NkVrCm5lLzlrSUNWMWxMZ2FuK0lLYW1kVElvZk5aVUhsL3k5QksvZ1U0SFRVMGo1Sit5WkV0bXI2VktmeGloQks5aWcKelZRM1R0RUNnWUVBNnh0b0RRd2dFRmNSdEJ3WXZQZWR5L0FZTjlwc0ZjaDhGRFJJUXlxUlhUWUVURlRjaXFNQwpwMHYyaXY2dHdoWUo1QmZVcHBJUU1kK2c3NjFiZHdqTHpweEJKZHpzakwySE5HMzhaeWxZTXc1LzBIT1FOTHFoCmt2VW9rMVJHQkxhOGFuOFA2eGdvNXptMHY3SW11MGs4RVQ0bjI5aDJJclVVSm1pWkZMM3dBMThDZ1lFQXkrbXEKUUR3NktJc1lDTU44NnBzSXAvQU5zTWErVlJ5cFJRMWYzQStSSjdnNkhYRGxqOVlLQWIxSEdobnMwKy80ZzRrRQpoTUczZmVNM2hoc281aVhCNjRPS3RkQkFodVA1UkF0RDU0eDY2MHhtYnZqY3YyVFJFS0pLMGs5SXBSU1ppa2pGCmVVTG1rbzZnUmU1aVI5NU5NQ0o5NFRBQW80SXNEZjJxQ0pqRU1FMENnWUJFRjZMeUxISFk2YTdKOEYxRjFaMlIKSkUrUFZhWjZSSitUSm5WTFpyZkZQRkRRWHIrbE00TWdPd01EekxFOGhpK0ZMVlc4akk4K01wdWs3eHVQaFMrcAovbDFyL3VsUDlkQ0Q0ZHI1Y2VNR25vdHNMeHd6K1YyMGQyYXlEUFZlaGlKWjRjVVZmT0RUMzBXM1EzeXVQNDZ6Ckc4SmxqUExpS0huV2lmTFVMQktvbHdLQmdBeU45Mmg3RE0yZ09ydVhaYUtBSnhsSDQxL2w3S1FLM3JVY3JMRTgKMkNBTTdLOFJXMkR1dWJEL3VWZjNEcWpCMXBncW9IZVlBYmNqZlRDcGpXd1dHUWxxRU9rK3lDcEY4UHZxZ2FUSQo5bXgwU0w0K1hrRCtjUXpJSVRrdm5uWmpmVXlSVEc4NTJqNWR2NnB1a2VpQTNGbkJWZVMrY3R1ZVVSNFBaeCtlCllEM2xBb0dBRWRId3VVa2ZBYWZJMFdkOXdlYXNDb1daTUlDTm1MK1ZDcXEzMEZyamVFMXg0cElTNjdFODJkU2UKKy9TbDNkWXpucHkxODJVdGJQNzlSYThoNXloOUVCTzVYMXlweGlCeCt3MmdwNWVJWG00aStOUWZxbjNOUm42awo2VW1RY1hCMXV4djNKWENuYWxVUk5tVWdudEFzaEQxaGd0Y1VvSzArS0NXT3VhUnFqSTQ9Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg== | |||
| @@ -1,8 +1,8 @@ | |||
| apiVersion: v1 | |||
| clusters: | |||
| - cluster: | |||
| certificate-authority-data: | |||
| server: https://127.0.0.1:6443 | |||
| certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeE1USXdPREE0TWpnd00xb1hEVE14TVRJd05qQTRNamd3TTFvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTWVKCkRjTThQUHFlV0tHazE3S2JtN3kwbzkzTGtxb2w5dG1QbVN0YTVyUXZSWU9rOFJYK2QvVEpVaXE2S2c4NXFyMGUKZFZ3SG5vTjg3Q0VFbXhOK2o4OUhlcnY1dDFaRFBHMVRHS3U5N1l1WnV4RCt2R1hGQkhDZ2ViT0s0Zmc0am1iSgpwUmlJeCtUZmlyUjM4TlVhZTBkR1g5c1o1TWF2NkhiSVVEK2hNTm9VU2pyWUZ2bTcxbGtYdlhVWW9wd1FSR3FvCkZiWG5KTFFVakd3UFFRclRCQ0wycFE2c1dGbkpkQ0VBSHhXU0grTUN4cXV0L25SUHhORlFOWGFMZmU3clB3a3MKd3NrVlFlTzgyL205aFZkWnNnNUFnRDJtTS9jS2VybE9acVBGcWFEaFBoYnpkRzF4QjRtcVZmTGJVUUppa3I1SQpYQ1FhTWR2c2FRTnhPcmNPOHQwQ0F3RUFBYU5DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZFek92OGhVUGtRYS90bGNhQTE0OERmcmF5TXRNQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFBMTFqcDR4V1hyZkRPNDJlblBpdm9HNXZxY3hqbysxaktZV1YxR1NIdHNVdlBNU1UzVAptdVFCQWU2VVRzM0JtSTgzMUQ4aFd4cDlka3BkMlhWbCt6OTZabFIvQ2Qrb3NSWWE1MUpZd2RvMUp4Z29hbUk2CmszOS9sNTRBQVpWMkFPWWNQU0pKNkNzdVcxZ2NTMDlaTlA0djlhK0NIKzY5OVpQMGlhUStEc0FPRFJzUnhRcVMKK08zNUU4K0RzRjBSOWZCYlhvbkxiK05VSHlTQ2pQSnVVT21lS0RYMFpQQm81blNscmh5cUIxbHVNZnhEaUltdgpIU3BscXB4M1duMzJnNEZYOCs3clZBNUZjWkIvNDg3bUZmdG1CTXc3aENidlFJeWY2Ymd6VTUycUdaeFZGTTVjCnUxeEZyRXlXaFA1eElJY09lY1M1RCtJa29ZOHUyT3ozQldEeQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== | |||
| server: https://test-master:6443 | |||
| name: kubernetes | |||
| contexts: | |||
| - context: | |||
| @@ -15,5 +15,5 @@ preferences: {} | |||
| users: | |||
| - name: kubernetes-admin | |||
| user: | |||
| client-certificate-data: | |||
| client-key-data: | |||
| client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURFekNDQWZ1Z0F3SUJBZ0lJQjUxN3hkT3V2cnd3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TVRFeU1EZ3dPREk0TUROYUZ3MHlNakV5TURnd09ESTRNRFZhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXlFaURrYVJ1WmVUbVJ4WmsKRkxUbkRPMUxIM1k5dE80WXpXREt4QVA2bFphTUJwZXJWRWpiU1VMOGIzdG9WWFppVnVnaHhvMzRHdjF4dlJKLwpDN3NhWGVaU3EzcTVMcEFhQjBrelRDNFRtbGtrdE03YkJTZFNhMG9SeGJXTUdvVEM0WUVBckJCNS9FRmdUYjRCCnE4aG1USUlmdUcwa05sNmd5a2M4UnhSL3N5Q1lSVjZCTTZTYWFzODR1Tmx3ZU9vV2RaQkQ0UVZQbzJueUI4NGQKUnc0d0w2VEQ5MlUwMG5KcjY3bUtpTjhBNGtBampFbWNrNm1JbHdsUTB2MHR5Uk8zTFBXZFdNazZ5QVIyVEZ6RgpBZCs4dUd5L3VDQlB6UDlVcDFERkI5TDF0Y25sd1lTeTYycGdFWC9wMzl6ZjZ0RFpZRVJwK0Jpd21Eb3RmVmFaClNLam9md0lEQVFBQm8wZ3dSakFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0h3WURWUjBqQkJnd0ZvQVVUTTYveUZRK1JCcisyVnhvRFhqd04rdHJJeTB3RFFZSktvWklodmNOQVFFTApCUUFEZ2dFQkFCQ01US2VEV1dHa0VFZWp6dlN3TTFKZit0QUJaYklrd0FoZEt1MjFnUkxyQktzbHQ4Y0NHMG1KCmc3eDhndFJYcW0xRGlEU01DMnlWMW9OWTFSdGlLZVhZT29RbVY2SFh2bEQybWZyY2VzS3VSNHlIbCtlWHcyL1AKb2FLZVFEM21yVm9ZZ1ZMMVNqOWpzcDRBa1hEM1ErUzdKYXN4Y3MvVkR3SmlRQzhGamkzaWZMVFFKQkxCdm1WVwpCZ3QvM0xPZ1lCdWxYRWg3cFlQUzduTVFqNFpxQ0QwWTNJOENicUM0VGlZQjB1aTZlbVRDd3cvRnBNSzNIRFZ4CnZOd3FPRHBaWW5DK0IxSzR5RUk4NGIvM1o3ZXA0MUE1NGk3QkpxTklORUVtRjdGcmpQQy91V1RuYlpzVUNFQjAKWTFUR1Y3czNBUTZMZXNCRFF6UVRzVnBENWFRRk9VYz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= | |||
| client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBeUVpRGthUnVaZVRtUnhaa0ZMVG5ETzFMSDNZOXRPNFl6V0RLeEFQNmxaYU1CcGVyClZFamJTVUw4YjN0b1ZYWmlWdWdoeG8zNEd2MXh2UkovQzdzYVhlWlNxM3E1THBBYUIwa3pUQzRUbWxra3RNN2IKQlNkU2Ewb1J4YldNR29UQzRZRUFyQkI1L0VGZ1RiNEJxOGhtVElJZnVHMGtObDZneWtjOFJ4Ui9zeUNZUlY2QgpNNlNhYXM4NHVObHdlT29XZFpCRDRRVlBvMm55Qjg0ZFJ3NHdMNlREOTJVMDBuSnI2N21LaU44QTRrQWpqRW1jCms2bUlsd2xRMHYwdHlSTzNMUFdkV01rNnlBUjJURnpGQWQrOHVHeS91Q0JQelA5VXAxREZCOUwxdGNubHdZU3kKNjJwZ0VYL3AzOXpmNnREWllFUnArQml3bURvdGZWYVpTS2pvZndJREFRQUJBb0lCQUgrbHY3ME9TSkpHZmdHbQpvcWlUMTRKa3BuRnA0ZEF6dzdqNXpLRjdTN1VWR3krRWNOeXFCcUM5d2JlbnRvcHBoaW1Qang5R0VtL1pRaWxYCjVZTHJmOVdDMndPUmx2NjNOdStYMXNyaHZ2cXJmL3FBc0JTcnlCcTdQWEo5ejhxQy9OWE9hMGcreEJCaTltYjIKQjRpZGs1MkZmWVFFZzRUbmNLRWJINjdKd00yL2dmZ3BXMGNEd0RiNVc2aHIxclUzNkNGc1AyVTlEYytMVkV5cQpvK3FZZ0RFZ0MxSWxucGVIdzROejJmK3RkbFpLVHN5dzV1ZG5xVm1kWGNkLyszR3NvQVM3Q25DTmQ3a1pKQ1BPClNpRktZSDZZUS93ZmJLZjFibC84eERXU1UvKytQUTZyODJGV21mMFBjd3ExbWV5OXIvUW1kaHc5YndiamkxVDQKdURjSzUva0NnWUVBOURIZi8xZnN4czlqVldoaE94UXFzUFN3UzdDbVZYcHV2S2Q3MjlMRGFIV1VQT3E5Y0l4QQpaV01Ibi9EbEN3U2dxaitPL0FNSDdaQVpPbDV5V2RiZFVEM2I0WWVKLzlubXdvN25ReG9ndTlUdTlNZEVnM0pvCm1wTzVqQTYzYTE2Z0sxRWlmTDJkdllRQkJGQzg2aDJzYlV0WHNGRDV6R3QzTU96bVF6SFFQM3NDZ1lFQTBmY3gKMzlUR0YrZFdVb3MzOXRLaE9MZVpFaWtUSmtqckdrTUdldHpYNEVCRE5oRUUvdWNkYUZCWmJoU3ltZHAwMmtKNgpKQkpvaEJRaEN4Zk9nUXhRdFp2dUt3WUMvTEYrMVF1TG1MaERGV2NEa05Ma1E0RWU5WVRFV1VuNE9NNkJJTmVOCldseklzcncyeHRvaUVoMXZFWW92ODdobEZCQ0E4N0xYSElpa1NjMENnWUFnZ1pNajFueDZhcGo2Z1k2UDRydGMKR3ZaczNQTUhaZWpmekJ1OHcyMm50aDhwak1YeStYaUpCb201VE1Qd2w0a2JvS0pVQWNOSWFHb3pUdWRCOWt3Mwpwa1JpM1R3Tmh1QWsvZ2ppOGROeHJZS3hxdVQvNm5icVBNZnlVUE14bzhNR2dTSnFJSU9pK3JOMzg1ZHlRc2oxCk01WlVyakxTZDJ2Q1k0YXpZeW9waVFLQmdBS0RBb1c2OWVPelVNVU1CVTllbGE4b0F4ekVnUVlrT1N2SFFYeVcKeDc1WEJuYlBIVkF2VTVxNzIxWUZ5VjB0ejlnTWs0bDY3dVVsbUgrWmVVN3g1c1ZGYUVQN2ZtMm5jZXo2aG1EOQpVMUFlTzF5d0tTcmxrSWsvWFZuMEdKUVZaRllRUGhDbXEzLzM0Ry9nakNmTFVsalRYbDk4QlRtSU9RS3hVUUYyCllRREJBb0dBRTB5Q0NzcFE3Y1lYaVFyQnF4VVkxU2N5SjViVm1iaFN5cmgyb3FiUmRMRmxzWHFjUnBIK2tORjYKdXdjUzhZalJodmdQazgyZm1QcXlieE5ZWGxTYWoydGdzSFdpcGNETXZSM1dtSlQzTGpjeXZObDh6cUlkZDNBdQpJT1pNeG0vWWVMemNFOUdteDRsQkhmMnU5MkhiRjRiSCtqeVp3d3RWcHpRdmphaFF6dGs9Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg== | |||
| @@ -72,5 +72,9 @@ public class RecycleConfig { | |||
| * 用户删除tadl算法版本文件后,文件最大有效时长,以天为单位 | |||
| */ | |||
| private Integer tadlValid; | |||
| /** | |||
| * 用户删除点云数据集文件后,文件最大有效时长,以天为单位 | |||
| */ | |||
| private Integer pointCloudValid; | |||
| } | |||
| @@ -40,7 +40,8 @@ public enum RecycleModuleEnum { | |||
| BIZ_DATAMEDICINE(8, "医学影像",SERVER_DATA_DCM), | |||
| BIZ_MEASURE(9, "度量管理",SERVER_MEASURE), | |||
| BIZ_SERVING(10, "云端部署", SERVER_SERVING), | |||
| BIZ_TADL(11,"自动机器学习",SERVER_TADL); | |||
| BIZ_TADL(11,"自动机器学习",SERVER_TADL), | |||
| BIZ_POINT_CLOUD(12,"3D点云",SERVER_POINT_CLOUD); | |||
| private Integer value; | |||
| @@ -86,8 +86,16 @@ public enum RecycleResourceEnum { | |||
| /** | |||
| * 模型优化文件回收 | |||
| */ | |||
| MODEL_OPT_RECYCLE_FILE("modelOptRecycleFile","模型优化文件回收"), | |||
| ; | |||
| MODEL_OPT_RECYCLE_FILE("modelOptRecycleFile", "模型优化文件回收"), | |||
| /** | |||
| * 点云文件回收 | |||
| */ | |||
| PC_DATASET_RECYCLE_FILE("pcDatasetRecycleFile", "点云数据集文件回收"), | |||
| /** | |||
| * 训练任务文件回收 | |||
| */ | |||
| TRAIN_JOB_RECYCLE_FILE("trainJobRecycleFile", "训练任务文件回收"); | |||
| private String className; | |||
| @@ -72,6 +72,6 @@ public interface PtTrainAlgorithmMapper extends BaseMapper<PtTrainAlgorithm> { | |||
| * 查询可推理预置算法 | |||
| * @return List<PtTrainAlgorithmQueryVO> 返回可推理预置算法集合 | |||
| */ | |||
| @Select("select * from pt_train_algorithm where deleted = 0 and inference=1 and algorithm_source=2 order by id desc") | |||
| @Select("select * from pt_train_algorithm where deleted = 0 and algorithm_source=2 order by id desc") | |||
| List<PtTrainAlgorithm> selectPreAlgorithm(); | |||
| } | |||
| @@ -70,9 +70,6 @@ public class PtTrainAlgorithmCreateDTO implements Serializable { | |||
| @Length(max = MagicNumConstant.ONE_HUNDRED_TWENTY_EIGHT, message = "运行命令-输入长度不能超过128个字符") | |||
| private String runCommand; | |||
| @ApiModelProperty("运行参数(算法来源为我的算法时为调优参数,算法来源为预置算法时为运行参数),管理员使用") | |||
| private JSONObject runParams; | |||
| @ApiModelProperty("算法来源(1为我的算法,2为预置算法),管理员使用") | |||
| private Integer algorithmSource; | |||
| @@ -80,6 +77,7 @@ public class PtTrainAlgorithmCreateDTO implements Serializable { | |||
| @Length(max = MagicNumConstant.ONE_HUNDRED_TWENTY_EIGHT, message = "算法用途-输入长度不能超过128个字符") | |||
| private String algorithmUsage; | |||
| @ApiModelProperty("是否输出训练结果,不填则默认为true") | |||
| private Boolean isTrainModelOut; | |||
| @@ -54,7 +54,4 @@ public class PtTrainAlgorithmQueryDTO extends PageQueryBase implements Serializa | |||
| @ApiModelProperty(value = "算法用途") | |||
| private String algorithmUsage; | |||
| @ApiModelProperty(value = "上传算法是否支持推理(true:可推理,false:不可推理)") | |||
| private Boolean inference; | |||
| } | |||
| @@ -85,18 +85,13 @@ public class PtTrainAlgorithm extends BaseEntity { | |||
| @TableField(value = "run_command") | |||
| private String runCommand; | |||
| /** | |||
| * 运行参数 | |||
| */ | |||
| @TableField(value = "run_params", typeHandler = FastjsonTypeHandler.class) | |||
| private JSONObject runParams; | |||
| /** | |||
| * 算法用途 | |||
| */ | |||
| @TableField(value = "algorithm_usage") | |||
| private String algorithmUsage; | |||
| /** | |||
| * 算法精度 | |||
| */ | |||
| @@ -109,12 +104,6 @@ public class PtTrainAlgorithm extends BaseEntity { | |||
| @TableField(value = "p4_inference_speed") | |||
| private Integer p4InferenceSpeed; | |||
| /** | |||
| * 算法是否支持推理(1可推理,0不可推理) | |||
| */ | |||
| @TableField(value = "inference") | |||
| private Boolean inference; | |||
| /** | |||
| * 训练结果输出(1是,0否) | |||
| */ | |||
| @@ -60,9 +60,6 @@ public class PtTrainAlgorithmQueryVO implements Serializable { | |||
| @ApiModelProperty(value = "运行命令") | |||
| private String runCommand; | |||
| @ApiModelProperty(value = "运行参数") | |||
| private JSONObject runParams; | |||
| @ApiModelProperty(value = "算法用途") | |||
| private String algorithmUsage; | |||
| @@ -81,9 +78,6 @@ public class PtTrainAlgorithmQueryVO implements Serializable { | |||
| @ApiModelProperty(value = "可视化日志(1是,0否)") | |||
| private Boolean isVisualizedLog; | |||
| @ApiModelProperty(value = "算法是否支持推理(1可推理,0不可推理)") | |||
| private Boolean inference; | |||
| @ApiModelProperty(value = "创建人") | |||
| private Long createUserId; | |||
| @@ -23,15 +23,13 @@ import org.dubhe.algorithm.domain.dto.PtTrainAlgorithmCreateDTO; | |||
| import org.dubhe.algorithm.domain.dto.PtTrainAlgorithmDeleteDTO; | |||
| import org.dubhe.algorithm.domain.dto.PtTrainAlgorithmQueryDTO; | |||
| import org.dubhe.algorithm.domain.dto.PtTrainAlgorithmUpdateDTO; | |||
| import org.dubhe.algorithm.domain.vo.PtTrainAlgorithmQueryVO; | |||
| import org.dubhe.algorithm.service.PtTrainAlgorithmService; | |||
| import org.dubhe.biz.base.annotation.ApiVersion; | |||
| import org.dubhe.biz.base.constant.Permissions; | |||
| import org.dubhe.biz.base.dto.ModelOptAlgorithmCreateDTO; | |||
| import org.dubhe.biz.base.dto.TrainAlgorithmSelectAllBatchIdDTO; | |||
| import org.dubhe.biz.base.dto.TrainAlgorithmSelectAllByIdDTO; | |||
| import org.dubhe.biz.base.dto.TrainAlgorithmSelectByIdDTO; | |||
| import org.dubhe.biz.base.dto.*; | |||
| import org.dubhe.biz.base.vo.DataResponseBody; | |||
| import org.dubhe.biz.base.vo.TrainAlgorithmQureyVO; | |||
| import org.dubhe.biz.dataresponse.factory.DataResponseFactory; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.security.access.prepost.PreAuthorize; | |||
| import org.springframework.validation.annotation.Validated; | |||
| @@ -121,4 +119,25 @@ public class PtTrainAlgorithmController { | |||
| public DataResponseBody getInferenceAlgorithm() { | |||
| return new DataResponseBody(ptTrainAlgorithmService.getInferenceAlgorithm()); | |||
| } | |||
| @GetMapping("/listIdByName") | |||
| @ApiOperation("根据名称查询算法") | |||
| @PreAuthorize(Permissions.DEVELOPMENT_ALGORITHM) | |||
| public DataResponseBody listIdByName(@Validated TrainAlgorithmSelectByNameDTO trainAlgorithmSelectByNameDTO) { | |||
| return new DataResponseBody(ptTrainAlgorithmService.listIdByName(trainAlgorithmSelectByNameDTO.getAlgorithmName())); | |||
| } | |||
| @ApiOperation("根据名称获取算法信息") | |||
| @GetMapping("/findAlgorithmByName") | |||
| public DataResponseBody findAlgorithmByName(@RequestParam String name) { | |||
| return DataResponseFactory.success(ptTrainAlgorithmService.findAlgorithmByName(name)); | |||
| } | |||
| @GetMapping("/getAll") | |||
| @ApiOperation("获取所有算法(我的算法和预置算法)") | |||
| @PreAuthorize(Permissions.DEVELOPMENT_ALGORITHM) | |||
| public DataResponseBody getAll(@RequestParam(required = false) String algorithmUsage) { | |||
| return DataResponseFactory.success(ptTrainAlgorithmService.getAll(algorithmUsage)); | |||
| } | |||
| } | |||
| @@ -118,4 +118,29 @@ public interface PtTrainAlgorithmService { | |||
| * @return List<PtTrainAlgorithmQueryVO> 返回可推理算法集合 | |||
| */ | |||
| List<PtTrainAlgorithmQueryVO> getInferenceAlgorithm(); | |||
| /** | |||
| * 根据算法名称获取算法id | |||
| * | |||
| * @param algorithmName 算法名称 | |||
| * @return | |||
| */ | |||
| List<Long> listIdByName(String algorithmName); | |||
| /** | |||
| * 根据算法名称获取算法信息 | |||
| * | |||
| * @param algorithmName 算法名称 | |||
| * @return {@code TrainAlgorithmQureyVO} 算法对象 | |||
| */ | |||
| TrainAlgorithmQureyVO findAlgorithmByName(String algorithmName); | |||
| /** | |||
| * 获取所有算法(预置算法和我的算法) | |||
| * | |||
| * @return | |||
| */ | |||
| List<PtTrainAlgorithmQueryVO> getAll(String algorithmUsage); | |||
| } | |||
| @@ -1,12 +1,12 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * <p> | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * <p> | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * <p> | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| @@ -17,11 +17,15 @@ | |||
| package org.dubhe.algorithm.service.impl; | |||
| import cn.hutool.core.collection.CollUtil; | |||
| import cn.hutool.core.collection.CollectionUtil; | |||
| import cn.hutool.core.util.RandomUtil; | |||
| import cn.hutool.core.util.StrUtil; | |||
| import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |||
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | |||
| import com.baomidou.mybatisplus.core.metadata.IPage; | |||
| import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | |||
| import com.google.common.collect.Lists; | |||
| import org.apache.commons.collections4.CollectionUtils; | |||
| import org.apache.commons.collections4.map.HashedMap; | |||
| import org.dubhe.algorithm.async.TrainAlgorithmUploadAsync; | |||
| @@ -39,9 +43,11 @@ import org.dubhe.algorithm.domain.vo.PtTrainAlgorithmQueryVO; | |||
| import org.dubhe.algorithm.service.PtTrainAlgorithmService; | |||
| import org.dubhe.biz.base.constant.MagicNumConstant; | |||
| import org.dubhe.biz.base.constant.NumberConstant; | |||
| import org.dubhe.biz.base.constant.SymbolConstant; | |||
| import org.dubhe.biz.base.context.UserContext; | |||
| import org.dubhe.biz.base.dto.*; | |||
| import org.dubhe.biz.base.enums.AlgorithmSourceEnum; | |||
| import org.dubhe.biz.base.enums.AlgorithmStatusEnum; | |||
| import org.dubhe.biz.base.enums.DatasetTypeEnum; | |||
| import org.dubhe.biz.base.enums.ImageTypeEnum; | |||
| import org.dubhe.biz.base.exception.BusinessException; | |||
| @@ -149,10 +155,6 @@ public class PtTrainAlgorithmServiceImpl implements PtTrainAlgorithmService { | |||
| if (ptTrainAlgorithmQueryDTO.getAlgorithmUsage() != null) { | |||
| wrapper.like("algorithm_usage", ptTrainAlgorithmQueryDTO.getAlgorithmUsage()); | |||
| } | |||
| //根据算法是否可推理筛选 | |||
| if (ptTrainAlgorithmQueryDTO.getInference() != null) { | |||
| wrapper.eq("inference", ptTrainAlgorithmQueryDTO.getInference()); | |||
| } | |||
| if (!StringUtils.isEmpty(ptTrainAlgorithmQueryDTO.getAlgorithmName())) { | |||
| wrapper.and(qw -> qw.eq("id", ptTrainAlgorithmQueryDTO.getAlgorithmName()).or().like("algorithm_name", | |||
| ptTrainAlgorithmQueryDTO.getAlgorithmName())); | |||
| @@ -197,11 +199,10 @@ public class PtTrainAlgorithmServiceImpl implements PtTrainAlgorithmService { | |||
| public List<Long> create(PtTrainAlgorithmCreateDTO ptTrainAlgorithmCreateDTO) { | |||
| //获取用户信息 | |||
| UserContext user = userContext.getCurUser(); | |||
| //获取镜像url | |||
| BaseImageDTO baseImageDTO = new BaseImageDTO(); | |||
| BeanUtils.copyProperties(ptTrainAlgorithmCreateDTO, baseImageDTO); | |||
| if (StringUtils.isNotBlank(ptTrainAlgorithmCreateDTO.getImageName()) && StringUtils.isNotBlank(ptTrainAlgorithmCreateDTO.getImageTag())) { | |||
| ptTrainAlgorithmCreateDTO.setImageName(getImageUrl(baseImageDTO, user)); | |||
| String imageName = ptTrainAlgorithmCreateDTO.getImageName(); | |||
| String imageTag = ptTrainAlgorithmCreateDTO.getImageTag(); | |||
| if (StringUtils.isNotBlank(imageName) && StringUtils.isNotBlank(imageTag)) { | |||
| ptTrainAlgorithmCreateDTO.setImageName(imageName + SymbolConstant.COLON + imageTag); | |||
| } | |||
| //创建算法校验DTO并设置默认值 | |||
| setAlgorithmDtoDefault(ptTrainAlgorithmCreateDTO); | |||
| @@ -348,8 +349,6 @@ public class PtTrainAlgorithmServiceImpl implements PtTrainAlgorithmService { | |||
| } | |||
| //算法路径 | |||
| ptTrainAlgorithm.setCodeDir(targetPath); | |||
| //算法文件可推理 | |||
| ptTrainAlgorithm.setInference(true); | |||
| } | |||
| /** | |||
| @@ -457,6 +456,7 @@ public class PtTrainAlgorithmServiceImpl implements PtTrainAlgorithmService { | |||
| /** | |||
| * 根据Id查询所有数据(包含已被软删除的数据) | |||
| * | |||
| * @param trainAlgorithmSelectAllByIdDTO 算法id | |||
| * @return TrainAlgorithmQureyVO返回查询数据(包含已被软删除的数据) | |||
| */ | |||
| @@ -471,7 +471,8 @@ public class PtTrainAlgorithmServiceImpl implements PtTrainAlgorithmService { | |||
| /** | |||
| * 根据Id查询 | |||
| * @param trainAlgorithmSelectByIdDTO 算法id | |||
| * | |||
| * @param trainAlgorithmSelectByIdDTO 算法id | |||
| * @return TrainAlgorithmQureyVO 返回查询数据 | |||
| */ | |||
| @Override | |||
| @@ -479,12 +480,15 @@ public class PtTrainAlgorithmServiceImpl implements PtTrainAlgorithmService { | |||
| public TrainAlgorithmQureyVO selectById(TrainAlgorithmSelectByIdDTO trainAlgorithmSelectByIdDTO) { | |||
| PtTrainAlgorithm ptTrainAlgorithm = ptTrainAlgorithmMapper.selectById(trainAlgorithmSelectByIdDTO.getId()); | |||
| TrainAlgorithmQureyVO trainAlgorithmQureyVO = new TrainAlgorithmQureyVO(); | |||
| BeanUtils.copyProperties(ptTrainAlgorithm, trainAlgorithmQureyVO); | |||
| if (ptTrainAlgorithm != null) { | |||
| BeanUtils.copyProperties(ptTrainAlgorithm, trainAlgorithmQureyVO); | |||
| } | |||
| return trainAlgorithmQureyVO; | |||
| } | |||
| /** | |||
| * 根据Id批量查询 | |||
| * | |||
| * @param trainAlgorithmSelectAllBatchIdDTO 算法ids | |||
| * @return List<TrainAlgorithmQureyVO> 返回查询数据 | |||
| */ | |||
| @@ -507,9 +511,9 @@ public class PtTrainAlgorithmServiceImpl implements PtTrainAlgorithmService { | |||
| * @param ptTrainAlgorithmQueryVO 镜像名称与版本 | |||
| */ | |||
| private void getImageNameAndImageTag(PtTrainAlgorithm trainAlgorithm, PtTrainAlgorithmQueryVO ptTrainAlgorithmQueryVO) { | |||
| String image = trainAlgorithm.getImageName(); | |||
| if (StringUtils.isNotBlank(trainAlgorithm.getImageName())) { | |||
| String imageNameSuffix = trainAlgorithm.getImageName().substring(trainAlgorithm.getImageName().lastIndexOf(StrUtil.SLASH) + MagicNumConstant.ONE); | |||
| String[] imageNameSuffixArray = imageNameSuffix.split(StrUtil.COLON); | |||
| String[] imageNameSuffixArray = image.split(StrUtil.COLON); | |||
| ptTrainAlgorithmQueryVO.setImageName(imageNameSuffixArray[0]); | |||
| ptTrainAlgorithmQueryVO.setImageTag(imageNameSuffixArray[1]); | |||
| } | |||
| @@ -556,7 +560,10 @@ public class PtTrainAlgorithmServiceImpl implements PtTrainAlgorithmService { | |||
| PtImageQueryUrlDTO ptImageQueryUrlDTO = new PtImageQueryUrlDTO(); | |||
| ptImageQueryUrlDTO.setImageTag(baseImageDto.getImageTag()); | |||
| ptImageQueryUrlDTO.setImageName(baseImageDto.getImageName()); | |||
| ptImageQueryUrlDTO.setProjectType(ImageTypeEnum.TRAIN.getType()); | |||
| List<Integer> trainImageType = new ArrayList() {{ | |||
| add(ImageTypeEnum.TRAIN.getType()); | |||
| }}; | |||
| ptImageQueryUrlDTO.setImageTypes(trainImageType); | |||
| DataResponseBody<String> dataResponseBody = imageClient.getImageUrl(ptImageQueryUrlDTO); | |||
| if (!dataResponseBody.succeed()) { | |||
| LogUtil.error(LogEnum.BIZ_TRAIN, " User {} gets image ,the imageName is {}, the imageTag is {}, and the result of dubhe-image service call failed", user.getUsername(), baseImageDto.getImageName(), baseImageDto.getImageTag()); | |||
| @@ -572,14 +579,15 @@ public class PtTrainAlgorithmServiceImpl implements PtTrainAlgorithmService { | |||
| } | |||
| /** | |||
| * | |||
| * @param modelOptAlgorithmCreateDTO 模型优化上传算法入参 | |||
| * @return PtTrainAlgorithm 新增算法信息 | |||
| */ | |||
| @Override | |||
| public ModelOptAlgorithmQureyVO modelOptimizationUploadAlgorithm(ModelOptAlgorithmCreateDTO modelOptAlgorithmCreateDTO) { | |||
| PtTrainAlgorithmCreateDTO ptTrainAlgorithmCreateDTO = new PtTrainAlgorithmCreateDTO(); | |||
| ptTrainAlgorithmCreateDTO.setAlgorithmName(modelOptAlgorithmCreateDTO.getName()).setCodeDir(modelOptAlgorithmCreateDTO.getPath()).setAlgorithmUsage("模型优化").setIsTrainModelOut(false).setIsTrainOut(false).setIsVisualizedLog(false); | |||
| ptTrainAlgorithmCreateDTO.setAlgorithmName(modelOptAlgorithmCreateDTO.getName()) | |||
| .setCodeDir(modelOptAlgorithmCreateDTO.getPath()).setAlgorithmUsage("5001") | |||
| .setIsTrainModelOut(false).setIsTrainOut(false).setIsVisualizedLog(false); | |||
| List<Long> ids = create(ptTrainAlgorithmCreateDTO); | |||
| PtTrainAlgorithm ptTrainAlgorithm = ptTrainAlgorithmMapper.selectById(ids.get(NumberConstant.NUMBER_0)); | |||
| ModelOptAlgorithmQureyVO modelOptAlgorithmQureyVO = new ModelOptAlgorithmQureyVO(); | |||
| @@ -589,6 +597,7 @@ public class PtTrainAlgorithmServiceImpl implements PtTrainAlgorithmService { | |||
| /** | |||
| * 算法删除文件还原 | |||
| * | |||
| * @param dto 还原实体 | |||
| */ | |||
| @Override | |||
| @@ -616,6 +625,7 @@ public class PtTrainAlgorithmServiceImpl implements PtTrainAlgorithmService { | |||
| /** | |||
| * 查询可推理算法 | |||
| * | |||
| * @return List<PtTrainAlgorithmQueryVO> 返回可推理算法集合 | |||
| */ | |||
| @Override | |||
| @@ -623,7 +633,6 @@ public class PtTrainAlgorithmServiceImpl implements PtTrainAlgorithmService { | |||
| //获取用户信息 | |||
| UserContext user = userContext.getCurUser(); | |||
| QueryWrapper<PtTrainAlgorithm> wrapper = new QueryWrapper<>(); | |||
| wrapper.eq("inference", true).orderByDesc("id"); | |||
| List<PtTrainAlgorithm> ptTrainAlgorithms = ptTrainAlgorithmMapper.selectList(wrapper); | |||
| List<PtTrainAlgorithmQueryVO> ptTrainAlgorithmQueryResult = new ArrayList<>(); | |||
| if (CollectionUtils.isNotEmpty(ptTrainAlgorithms)) { | |||
| @@ -653,4 +662,80 @@ public class PtTrainAlgorithmServiceImpl implements PtTrainAlgorithmService { | |||
| return ptTrainAlgorithmQueryResult; | |||
| } | |||
| @Override | |||
| public List<Long> listIdByName(String algorithmName) { | |||
| QueryWrapper<PtTrainAlgorithm> wrapper = new QueryWrapper<>(); | |||
| wrapper.lambda() | |||
| .like(PtTrainAlgorithm::getAlgorithmName, algorithmName); | |||
| List<PtTrainAlgorithm> ptTrainAlgorithms = ptTrainAlgorithmMapper.selectList(wrapper); | |||
| List<Long> ids = Lists.newArrayList(); | |||
| if (CollectionUtils.isEmpty(ptTrainAlgorithms)) { | |||
| return ids; | |||
| } | |||
| ids = ptTrainAlgorithms.stream() | |||
| .map(PtTrainAlgorithm::getId) | |||
| .collect(Collectors.toList()); | |||
| return ids; | |||
| } | |||
| @Override | |||
| @DataPermissionMethod(dataType = DatasetTypeEnum.PUBLIC) | |||
| public TrainAlgorithmQureyVO findAlgorithmByName(String algorithmName) { | |||
| TrainAlgorithmQureyVO atlasTrainAlgorithmVO = new TrainAlgorithmQureyVO(); | |||
| List<PtTrainAlgorithm> ptTrainAlgorithms = ptTrainAlgorithmMapper.selectList(new LambdaQueryWrapper<PtTrainAlgorithm>() | |||
| .eq(PtTrainAlgorithm::getAlgorithmName, algorithmName)); | |||
| if (CollUtil.isNotEmpty(ptTrainAlgorithms)) { | |||
| BeanUtils.copyProperties(ptTrainAlgorithms.get(0), atlasTrainAlgorithmVO); | |||
| //获取镜像名称与版本 | |||
| if (StrUtil.isNotBlank(ptTrainAlgorithms.get(0).getImageName())) { | |||
| String imageNameSuffix = ptTrainAlgorithms.get(0).getImageName().substring(ptTrainAlgorithms.get(0).getImageName().lastIndexOf(StrUtil.SLASH) + MagicNumConstant.ONE); | |||
| String[] imageNameSuffixArray = imageNameSuffix.split(StrUtil.COLON); | |||
| atlasTrainAlgorithmVO.setImageName(imageNameSuffixArray[0]); | |||
| atlasTrainAlgorithmVO.setImageTag(imageNameSuffixArray[1]); | |||
| } | |||
| } | |||
| return atlasTrainAlgorithmVO; | |||
| } | |||
| @Override | |||
| @DataPermissionMethod(dataType = DatasetTypeEnum.PUBLIC) | |||
| public List<PtTrainAlgorithmQueryVO> getAll(String algorithmUsage) { | |||
| List<PtTrainAlgorithmQueryVO> all = new ArrayList<>(); | |||
| all.addAll(getAlgorithmListBySource(AlgorithmSourceEnum.MINE.getStatus(), algorithmUsage)); | |||
| all.addAll(getAlgorithmListBySource(AlgorithmSourceEnum.PRE.getStatus(), algorithmUsage)); | |||
| return all; | |||
| } | |||
| public List<PtTrainAlgorithmQueryVO> getAlgorithmListBySource(Integer algorithmSource, String algorithmUsage) { | |||
| List<PtTrainAlgorithmQueryVO> result = new ArrayList<>(); | |||
| //获取用户信息 | |||
| UserContext user = userContext.getCurUser(); | |||
| // 获取我的算法 | |||
| QueryWrapper<PtTrainAlgorithm> ptTrainAlgorithmQueryWrapper = new QueryWrapper<>(); | |||
| //判断算法来源 | |||
| if (AlgorithmSourceEnum.MINE.getStatus().equals(algorithmSource)) { | |||
| if (!BaseService.isAdmin(user)) { | |||
| ptTrainAlgorithmQueryWrapper.lambda().eq(PtTrainAlgorithm::getCreateUserId, userContext.getCurUserId()); | |||
| } | |||
| } | |||
| if (StringUtils.isNotEmpty(algorithmUsage)) { | |||
| ptTrainAlgorithmQueryWrapper.lambda().eq(PtTrainAlgorithm::getAlgorithmUsage, algorithmUsage); | |||
| } | |||
| ptTrainAlgorithmQueryWrapper.lambda().eq(PtTrainAlgorithm::getAlgorithmStatus, AlgorithmStatusEnum.SUCCESS.getCode()); | |||
| ptTrainAlgorithmQueryWrapper.lambda().eq(PtTrainAlgorithm::getAlgorithmSource, algorithmSource); | |||
| List<PtTrainAlgorithm> ptTrainAlgorithmList = ptTrainAlgorithmMapper.selectList(ptTrainAlgorithmQueryWrapper); | |||
| if (CollectionUtil.isNotEmpty(ptTrainAlgorithmList)) { | |||
| result = ptTrainAlgorithmList.stream().map(x -> { | |||
| PtTrainAlgorithmQueryVO ptTrainAlgorithmQueryVO = new PtTrainAlgorithmQueryVO(); | |||
| BeanUtils.copyProperties(x, ptTrainAlgorithmQueryVO); | |||
| //获取镜像名称与版本 | |||
| getImageNameAndImageTag(x, ptTrainAlgorithmQueryVO); | |||
| return ptTrainAlgorithmQueryVO; | |||
| }).collect(Collectors.toList()); | |||
| } | |||
| return result; | |||
| } | |||
| } | |||
| @@ -10,7 +10,7 @@ spring: | |||
| nacos: | |||
| config: | |||
| enabled: true | |||
| namespace: dubhe-server-cloud-prod | |||
| namespace: dubhe-prod | |||
| server-addr: 127.0.0.1:8848 | |||
| shared-configs[0]: | |||
| data-id: common-biz.yaml | |||
| @@ -29,9 +29,13 @@ spring: | |||
| data-id: dubhe-algorithm.yaml | |||
| group: dubhe | |||
| refresh: true | |||
| shared-configs[4]: | |||
| data-id: kubeconfig.yaml | |||
| group: dubhe | |||
| refresh: true | |||
| discovery: | |||
| enabled: true | |||
| namespace: dubhe-server-cloud-dev | |||
| namespace: dubhe-prod | |||
| group: dubhe | |||
| server-addr: 127.0.0.1:8848 | |||
| @@ -78,6 +78,11 @@ public class DcmConstant { | |||
| /** | |||
| * dcm文件上传 | |||
| */ | |||
| public static final String DCM_UPLOAD = "ssh %s@%s \"docker run --rm -v %s:/nfs dcm4che/dcm4che-tools:5.10.5 storescu -c DCM4CHEE@%s:%s %s\""; | |||
| public static final String DCM_UPLOAD = "docker run --rm -v %s:/nfs dcm4che/dcm4che-tools:5.10.5 storescu -c DCM4CHEE@%s:%s %s"; | |||
| /** | |||
| * dcm数据存储路径 | |||
| */ | |||
| public static final String DCM_DATA_URL = "dataset/dcm/%s"; | |||
| } | |||
| @@ -120,4 +120,20 @@ public interface DataMedicineFileMapper extends BaseMapper<DataMedicineFile> { | |||
| */ | |||
| @Delete("DELETE FROM data_medicine_file WHERE medicine_id= #{id} ") | |||
| void deleteByDatasetId(@Param("id") Long id); | |||
| /** | |||
| * 根据医学数据集id删除医学数据集文件数据 | |||
| * | |||
| * @param datasetId 医学数据集ID | |||
| */ | |||
| List<Integer> getFileStatusListByDataset(@Param("datasetId") Long datasetId); | |||
| /** | |||
| * 清理所有已标注信息 | |||
| * | |||
| * @param datasetId | |||
| */ | |||
| @Update("update data_medicine_file set `status` = 101 where medicine_id = #{datasetId}") | |||
| void cleanAnnotation(@Param("datasetId") Long datasetId); | |||
| } | |||
| @@ -23,6 +23,9 @@ import org.apache.ibatis.annotations.Select; | |||
| import org.apache.ibatis.annotations.Update; | |||
| import org.dubhe.biz.base.annotation.DataPermission; | |||
| import org.dubhe.dcm.domain.entity.DataMedicine; | |||
| import org.dubhe.dcm.domain.vo.DataMedicineSmallVO; | |||
| import java.util.List; | |||
| /** | |||
| * @description 医学数据集管理 Mapper 接口 | |||
| @@ -86,4 +89,12 @@ public interface DataMedicineMapper extends BaseMapper<DataMedicine> { | |||
| */ | |||
| @Select("select * from data_medicine where id = #{id} and deleted = 1") | |||
| DataMedicine findDataMedicineByIdAndDeleteIsFalse(@Param("id") Long datasetId); | |||
| /** | |||
| * 获取医学数据集列表 | |||
| * | |||
| * @return | |||
| */ | |||
| List<DataMedicineSmallVO> getList(); | |||
| } | |||
| @@ -21,7 +21,9 @@ import lombok.AllArgsConstructor; | |||
| import lombok.Builder; | |||
| import lombok.Data; | |||
| import lombok.NoArgsConstructor; | |||
| import org.dubhe.biz.base.annotation.EnumValue; | |||
| import org.dubhe.data.constant.Constant; | |||
| import org.dubhe.data.constant.FileTypeEnum; | |||
| import javax.validation.constraints.NotNull; | |||
| import java.io.Serializable; | |||
| @@ -41,4 +43,16 @@ public class MedicineAutoAnnotationDTO implements Serializable { | |||
| @NotNull(message = "自动标注的数据集不能为空") | |||
| private Long medicalId; | |||
| @ApiModelProperty("模型服务ID") | |||
| @NotNull(message = "模型服务不能为空") | |||
| private Long modelServiceId; | |||
| /** | |||
| * 文件状态 400-全部 304-无标注 303-有标注 | |||
| */ | |||
| @NotNull(message = "文件标注信息筛选不能空") | |||
| @EnumValue(enumClass = FileTypeEnum.class, enumMethod = "autoFileStatusIsValid", | |||
| message = Constant.ANNOTATE_FILE_TYPE_RULE) | |||
| private Integer fileStatus; | |||
| } | |||
| @@ -16,10 +16,7 @@ | |||
| */ | |||
| package org.dubhe.dcm.domain.entity; | |||
| import com.baomidou.mybatisplus.annotation.IdType; | |||
| import com.baomidou.mybatisplus.annotation.TableField; | |||
| import com.baomidou.mybatisplus.annotation.TableId; | |||
| import com.baomidou.mybatisplus.annotation.TableName; | |||
| import com.baomidou.mybatisplus.annotation.*; | |||
| import io.swagger.annotations.ApiModel; | |||
| import io.swagger.annotations.ApiModelProperty; | |||
| import lombok.Data; | |||
| @@ -77,6 +74,9 @@ public class DataMedicine extends BaseEntity implements Serializable { | |||
| @ApiModelProperty(value = "标注类型: 1001.器官分割 2001.病灶检测之肺结节检测") | |||
| private Integer annotateType; | |||
| @ApiModelProperty(value = "是否自动标注停止") | |||
| private Boolean stop; | |||
| public DataMedicine() { | |||
| } | |||
| @@ -0,0 +1,32 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.dcm.domain.vo; | |||
| import lombok.Data; | |||
| /** | |||
| * @description 医学数据集完成标注文件VO | |||
| * @date 2022-05-18 | |||
| */ | |||
| @Data | |||
| public class DataMedicineSmallVO { | |||
| private Long id; | |||
| private String name; | |||
| private String url; | |||
| } | |||
| @@ -68,6 +68,11 @@ public class DataMedicineVO implements Serializable { | |||
| @ApiModelProperty(value = "标注类型") | |||
| private Integer annotateType; | |||
| @ApiModelProperty(value = "是否自动标注停止") | |||
| private Boolean stop; | |||
| /** | |||
| * 医学数据集 转化 医学数据集详情VO 方法 | |||
| * | |||
| @@ -88,6 +93,7 @@ public class DataMedicineVO implements Serializable { | |||
| dataMedicineVO.setName(dataMedicine.getName()); | |||
| dataMedicineVO.setRemark(dataMedicine.getRemark()); | |||
| dataMedicineVO.setAnnotateType(dataMedicine.getAnnotateType()); | |||
| dataMedicineVO.setStop(dataMedicine.getStop()); | |||
| return dataMedicineVO; | |||
| } | |||
| } | |||
| @@ -18,6 +18,8 @@ package org.dubhe.dcm.machine.enums; | |||
| import org.dubhe.dcm.machine.constant.DcmDataStateCodeConstant; | |||
| import java.util.Arrays; | |||
| /** | |||
| * @description 数据集状态类 | |||
| * @date 2020-08-28 | |||
| @@ -121,4 +123,13 @@ public enum DcmDataStateEnum { | |||
| return null; | |||
| } | |||
| /** | |||
| * 检查当前状态是否可以自动标注 | |||
| * | |||
| * @return | |||
| */ | |||
| public static boolean checkCurrentStatusWhetherToAutoLabel(Integer status) { | |||
| return !Arrays.asList(AUTOMATIC_LABELING_STATE.getCode()).contains(status); | |||
| } | |||
| } | |||
| @@ -16,11 +16,10 @@ | |||
| */ | |||
| package org.dubhe.dcm.machine.enums; | |||
| import org.dubhe.data.constant.FileTypeEnum; | |||
| import org.dubhe.dcm.machine.constant.DcmFileStateCodeConstant; | |||
| import java.util.HashSet; | |||
| import java.util.Set; | |||
| import java.util.*; | |||
| /** | |||
| @@ -135,4 +134,26 @@ public enum DcmFileStateEnum { | |||
| return null; | |||
| } | |||
| /** | |||
| * 自动标注中筛选条件对应文件状态集 | |||
| * | |||
| * @return | |||
| */ | |||
| public static List<Integer> getFileStatusFromAutoLabelScreen(Integer status) { | |||
| List<Integer> noAnnotation = Arrays.asList(NOT_ANNOTATION_FILE_STATE.getCode()); | |||
| List<Integer> hasAnnotation = Arrays.asList(ANNOTATION_FILE_STATE.getCode(), | |||
| AUTO_ANNOTATION_COMPLETE_FILE_STATE.getCode(), ANNOTATION_COMPLETE_FILE_STATE.getCode()); | |||
| switch (status) { | |||
| case 304: | |||
| return noAnnotation; | |||
| case 303: | |||
| return hasAnnotation; | |||
| default: | |||
| List<Integer> result = new ArrayList<>(); | |||
| result.addAll(noAnnotation); | |||
| result.addAll(hasAnnotation); | |||
| return result; | |||
| } | |||
| } | |||
| } | |||
| @@ -70,4 +70,18 @@ public class AnnotationCompleteDcmState extends AbstractDataMedicineState { | |||
| LogUtil.debug(LogEnum.STATE_MACHINE, " 【标注完成】 执行事件后内存状态机的切换: {}", dcmDataMedicineStateMachine.getMemoryDataMedicineState()); | |||
| } | |||
| /** | |||
| * 数据集 未标注-->自动标注-->自动标注中 | |||
| * | |||
| * @param medical 医学数据集对象 | |||
| */ | |||
| @Override | |||
| public void autoAnnotationSaveEvent(DataMedicine medical) { | |||
| LogUtil.debug(LogEnum.STATE_MACHINE, " 【未标注】 执行事件前内存中状态机的状态 :{} ", dcmDataMedicineStateMachine.getMemoryDataMedicineState()); | |||
| LogUtil.debug(LogEnum.STATE_MACHINE, " 接受参数: {} ", medical); | |||
| dataMedicineMapper.updateStatus(medical.getId(), DcmDataStateEnum.AUTOMATIC_LABELING_STATE.getCode()); | |||
| dcmDataMedicineStateMachine.setMemoryDataMedicineState(dcmDataMedicineStateMachine.getAutomaticLabelingDcmState()); | |||
| LogUtil.debug(LogEnum.STATE_MACHINE, " 【未标注】 执行事件后内存状态机的切换: {}", dcmDataMedicineStateMachine.getMemoryDataMedicineState()); | |||
| } | |||
| } | |||
| @@ -83,4 +83,18 @@ public class AnnotationDataState extends AbstractDataMedicineState { | |||
| LogUtil.debug(LogEnum.STATE_MACHINE, " 【标注中】 执行事件后内存状态机的切换: {}", dcmDataMedicineStateMachine.getMemoryDataMedicineState()); | |||
| } | |||
| /** | |||
| * 数据集 标注中-->自动标注-->自动标注中 | |||
| * | |||
| * @param medical 医学数据集对象 | |||
| */ | |||
| @Override | |||
| public void autoAnnotationSaveEvent(DataMedicine medical) { | |||
| LogUtil.debug(LogEnum.STATE_MACHINE, " 【未标注】 执行事件前内存中状态机的状态 :{} ", dcmDataMedicineStateMachine.getMemoryDataMedicineState()); | |||
| LogUtil.debug(LogEnum.STATE_MACHINE, " 接受参数: {} ", medical); | |||
| dataMedicineMapper.updateStatus(medical.getId(), DcmDataStateEnum.AUTOMATIC_LABELING_STATE.getCode()); | |||
| dcmDataMedicineStateMachine.setMemoryDataMedicineState(dcmDataMedicineStateMachine.getAutomaticLabelingDcmState()); | |||
| LogUtil.debug(LogEnum.STATE_MACHINE, " 【未标注】 执行事件后内存状态机的切换: {}", dcmDataMedicineStateMachine.getMemoryDataMedicineState()); | |||
| } | |||
| } | |||
| @@ -69,4 +69,18 @@ public class AutoAnnotationCompleteDcmState extends AbstractDataMedicineState { | |||
| LogUtil.debug(LogEnum.STATE_MACHINE, " 【自动标注完成】 执行事件后内存状态机的切换: {}", dcmDataMedicineStateMachine.getMemoryDataMedicineState()); | |||
| } | |||
| /** | |||
| * 数据集 未标注-->自动标注-->自动标注中 | |||
| * | |||
| * @param medical 医学数据集对象 | |||
| */ | |||
| @Override | |||
| public void autoAnnotationSaveEvent(DataMedicine medical) { | |||
| LogUtil.debug(LogEnum.STATE_MACHINE, " 【未标注】 执行事件前内存中状态机的状态 :{} ", dcmDataMedicineStateMachine.getMemoryDataMedicineState()); | |||
| LogUtil.debug(LogEnum.STATE_MACHINE, " 接受参数: {} ", medical); | |||
| dataMedicineMapper.updateStatus(medical.getId(), DcmDataStateEnum.AUTOMATIC_LABELING_STATE.getCode()); | |||
| dcmDataMedicineStateMachine.setMemoryDataMedicineState(dcmDataMedicineStateMachine.getAutomaticLabelingDcmState()); | |||
| LogUtil.debug(LogEnum.STATE_MACHINE, " 【未标注】 执行事件后内存状态机的切换: {}", dcmDataMedicineStateMachine.getMemoryDataMedicineState()); | |||
| } | |||
| } | |||
| @@ -139,10 +139,6 @@ public class DcmDataMedicineStateMachine extends AbstractDataMedicineState imple | |||
| @Override | |||
| public void autoAnnotationSaveEvent(DataMedicine medical) { | |||
| initMemoryDataState(medical); | |||
| if (memoryDataMedicineState != notAnnotationDcmState) { | |||
| throw new StateMachineException(ErrorMessageConstant.DATASET_CHANGE_ERR_MESSAGE); | |||
| } | |||
| memoryDataMedicineState.autoAnnotationSaveEvent(medical); | |||
| } | |||
| @@ -0,0 +1,129 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.dcm.machine.utils; | |||
| import org.dubhe.data.domain.entity.Dataset; | |||
| import org.dubhe.data.machine.enums.DataStateEnum; | |||
| import org.dubhe.dcm.machine.enums.DcmDataStateEnum; | |||
| import org.dubhe.dcm.machine.utils.identify.data.DcmDataHub; | |||
| import org.dubhe.dcm.machine.utils.identify.setting.DcmStateIdentifySetting; | |||
| import org.dubhe.dcm.machine.utils.identify.setting.DcmStateSelect; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.stereotype.Component; | |||
| import org.springframework.util.ReflectionUtils; | |||
| import java.lang.reflect.Method; | |||
| import java.util.List; | |||
| import java.util.Set; | |||
| /** | |||
| * @description 状态判断实现类 | |||
| * @date 2020-09-24 | |||
| */ | |||
| @Component | |||
| public class DcmStateIdentifyUtil { | |||
| /** | |||
| * 数据查询处理 | |||
| */ | |||
| @Autowired | |||
| private DcmDataHub dataHub; | |||
| /** | |||
| * 状态判断类 | |||
| */ | |||
| @Autowired | |||
| private DcmStateSelect stateSelect; | |||
| /** | |||
| * 状态判断中所有的自定义方法数组 | |||
| */ | |||
| private final Method[] method = ReflectionUtils.getDeclaredMethods(DcmStateSelect.class); | |||
| /** | |||
| * 获取数据集状态(指定版本) | |||
| * | |||
| * @param datasetId 数据集id | |||
| * @param needFileStateDoIdentify 是否需要查询文件状态判断 | |||
| * @return DatasetStatusEnum 数据集状态(指定版本) | |||
| */ | |||
| public DcmDataStateEnum getStatus(Long datasetId, boolean needFileStateDoIdentify) { | |||
| return needFileStateDoIdentify ? | |||
| new IdentifyDatasetStateByFileState(datasetId, DcmStateIdentifySetting.NEED_FILE_STATE_DO_IDENTIFY).getStatus() | |||
| : dataHub.getDatasetStatus(datasetId); | |||
| } | |||
| /** | |||
| * 获取数据集状态(未指定版本) | |||
| * | |||
| * @param dataset 数据集 | |||
| * @param needFileStateDoIdentify 是否需要查询文件状态判断 | |||
| * @return DatasetStatusEnum 数据集状态(指定版本) | |||
| */ | |||
| public DcmDataStateEnum getStatus(Dataset dataset, boolean needFileStateDoIdentify) { | |||
| return needFileStateDoIdentify ? | |||
| new IdentifyDatasetStateByFileState(dataset.getId(), DcmStateIdentifySetting.NEED_FILE_STATE_DO_IDENTIFY).getStatus() | |||
| : dataHub.getDatasetStatus(dataset.getId()); | |||
| } | |||
| /** | |||
| * 获取数据集状态(自动标注/目标跟踪回滚使用) | |||
| * | |||
| * @param datasetId 数据集id | |||
| * @return DatasetStatusEnum 数据集状态(指定版本) | |||
| */ | |||
| public DcmDataStateEnum getStatusForRollback(Long datasetId) { | |||
| return new IdentifyDatasetStateByFileState(datasetId, DcmStateIdentifySetting.ROLL_BACK_FOR_STATE).getStatus(); | |||
| } | |||
| class IdentifyDatasetStateByFileState { | |||
| /** | |||
| * 判断得到的数据集状态 | |||
| */ | |||
| public DcmDataStateEnum state; | |||
| /** | |||
| * 会查询文件的状态去对数据集的状态做判断 | |||
| * | |||
| * @param datasetId 数据集ID | |||
| */ | |||
| public IdentifyDatasetStateByFileState(Long datasetId, Set<DcmDataStateEnum> dataStateEnums) { | |||
| state = dataHub.getDatasetStatus(datasetId); | |||
| if (dataStateEnums.contains(state)) { | |||
| List<Integer> stateList = dataHub.getFileStatusListByDataset(datasetId); | |||
| if (stateList == null || stateList.isEmpty()) { | |||
| state = DcmDataStateEnum.NOT_ANNOTATION_STATE; | |||
| return; | |||
| } | |||
| for (Method stateSelectMethod : method) { | |||
| state = (DcmDataStateEnum) ReflectionUtils.invokeMethod(stateSelectMethod, stateSelect, new Object[]{stateList}); | |||
| if (state != null) { | |||
| return; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| DcmDataStateEnum getStatus() { | |||
| return this.state; | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,67 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.dcm.machine.utils.identify.data; | |||
| import org.dubhe.data.machine.enums.DataStateEnum; | |||
| import org.dubhe.dcm.machine.enums.DcmDataStateEnum; | |||
| import org.dubhe.dcm.service.DataMedicineFileService; | |||
| import org.dubhe.dcm.service.DataMedicineService; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.context.annotation.Lazy; | |||
| import org.springframework.stereotype.Component; | |||
| import java.util.List; | |||
| /** | |||
| * @description 数据查询/加工 | |||
| * @date 2020-09-24 | |||
| */ | |||
| @Component | |||
| public class DcmDataHub { | |||
| /** | |||
| * 数据集版本文件关系服务类 | |||
| */ | |||
| @Autowired | |||
| private DataMedicineFileService medicineFileService; | |||
| /** | |||
| * 数据集服务类 | |||
| */ | |||
| @Autowired | |||
| @Lazy | |||
| private DataMedicineService medicineService; | |||
| /** | |||
| * 获取数据集的状态 | |||
| * @param datasetId 数据集ID | |||
| * @return 数据集状态枚举 | |||
| */ | |||
| public DcmDataStateEnum getDatasetStatus(Long datasetId){ | |||
| return DcmDataStateEnum.getState(medicineService.getOneById(datasetId).getStatus()); | |||
| } | |||
| /** | |||
| * 获取数据集下文件的状态(数据经过去重处理) | |||
| * @param datasetId 数据集ID | |||
| * @return 数据集下文件状态的并集 | |||
| */ | |||
| public List<Integer> getFileStatusListByDataset(Long datasetId) { | |||
| return medicineFileService.getFileStatusListByDataset(datasetId); | |||
| } | |||
| } | |||
| @@ -0,0 +1,56 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.dcm.machine.utils.identify.setting; | |||
| import org.dubhe.dcm.machine.enums.DcmDataStateEnum; | |||
| import org.springframework.stereotype.Component; | |||
| import java.util.HashSet; | |||
| import java.util.Set; | |||
| /** | |||
| * @description 状态判断设置类 | |||
| * @date 2020-09-24 | |||
| */ | |||
| @Component | |||
| public class DcmStateIdentifySetting { | |||
| /** | |||
| * 回退状态(自动标注失败/目标跟踪失败)使用 | |||
| */ | |||
| public static final Set<DcmDataStateEnum> ROLL_BACK_FOR_STATE = new HashSet<DcmDataStateEnum>() {{ | |||
| //自动标注中 | |||
| add(DcmDataStateEnum.AUTOMATIC_LABELING_STATE); | |||
| }}; | |||
| /** | |||
| * 数据集状态需要使用文件状态去判断的 | |||
| */ | |||
| public static final Set<DcmDataStateEnum> NEED_FILE_STATE_DO_IDENTIFY = new HashSet<DcmDataStateEnum>() {{ | |||
| //未标注 | |||
| add(DcmDataStateEnum.NOT_ANNOTATION_STATE); | |||
| //手动标注中 | |||
| add(DcmDataStateEnum.ANNOTATION_DATA_STATE); | |||
| //自动标注完成 | |||
| add(DcmDataStateEnum.AUTO_ANNOTATION_COMPLETE_STATE); | |||
| //标注完成 | |||
| add(DcmDataStateEnum.ANNOTATION_COMPLETE_STATE); | |||
| }}; | |||
| } | |||
| @@ -0,0 +1,106 @@ | |||
| /** | |||
| * Copyright 2020 Tianshu AI Platform. All Rights Reserved. | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * ============================================================= | |||
| */ | |||
| package org.dubhe.dcm.machine.utils.identify.setting; | |||
| import org.dubhe.biz.base.constant.NumberConstant; | |||
| import org.dubhe.data.machine.constant.FileStateCodeConstant; | |||
| import org.dubhe.data.machine.enums.DataStateEnum; | |||
| import org.dubhe.dcm.machine.constant.DcmFileStateCodeConstant; | |||
| import org.dubhe.dcm.machine.enums.DcmDataStateEnum; | |||
| import org.springframework.stereotype.Component; | |||
| import java.util.HashSet; | |||
| import java.util.List; | |||
| /** | |||
| * @description 状态判断类 | |||
| * @date 2020-09-24 | |||
| */ | |||
| @Component | |||
| public class DcmStateSelect { | |||
| /** | |||
| * 手动标注中 | |||
| * | |||
| * @param stateList 数据集下文件状态的并集 | |||
| * @return 数据集状态枚举 | |||
| */ | |||
| public DcmDataStateEnum isManualAnnotating(List<Integer> stateList) { | |||
| if (stateList.size() > 1 && stateList.contains(DcmFileStateCodeConstant.NOT_ANNOTATION_FILE_STATE)) { | |||
| return DcmDataStateEnum.ANNOTATION_DATA_STATE; | |||
| } | |||
| return stateList.contains(DcmFileStateCodeConstant.ANNOTATION_FILE_STATE) ? DcmDataStateEnum.ANNOTATION_DATA_STATE : null; | |||
| } | |||
| /** | |||
| * 自动标注完成 | |||
| * | |||
| * @param stateList 数据集下文件状态的并集 | |||
| * @return 数据集状态枚举 | |||
| */ | |||
| public DcmDataStateEnum isAutoFinished(List<Integer> stateList) { | |||
| HashSet<Integer> states = new HashSet<Integer>() {{ | |||
| add(DcmFileStateCodeConstant.AUTO_ANNOTATION_COMPLETE_FILE_STATE); | |||
| add(DcmFileStateCodeConstant.ANNOTATION_COMPLETE_FILE_STATE); | |||
| }}; | |||
| switch (stateList.size()) { | |||
| case NumberConstant.NUMBER_1: | |||
| if (stateList.contains(DcmFileStateCodeConstant.AUTO_ANNOTATION_COMPLETE_FILE_STATE)){ | |||
| return DcmDataStateEnum.AUTO_ANNOTATION_COMPLETE_STATE; | |||
| } | |||
| return null; | |||
| case NumberConstant.NUMBER_2: | |||
| case NumberConstant.NUMBER_3: | |||
| case NumberConstant.NUMBER_4: | |||
| for (Integer fileState : stateList) { | |||
| if (!states.contains(fileState)) { | |||
| return null; | |||
| }; | |||
| } | |||
| return DcmDataStateEnum.AUTO_ANNOTATION_COMPLETE_STATE; | |||
| default: | |||
| return null; | |||
| } | |||
| } | |||
| /** | |||
| * 标注完成 | |||
| * | |||
| * @param stateList 数据集下文件状态的并集 | |||
| * @return 数据集状态枚举 | |||
| */ | |||
| public DcmDataStateEnum isFinished(List<Integer> stateList) { | |||
| return stateList.contains(DcmFileStateCodeConstant.ANNOTATION_COMPLETE_FILE_STATE)&&stateList.size()==NumberConstant.NUMBER_1 ? | |||
| DcmDataStateEnum.ANNOTATION_COMPLETE_STATE : null; | |||
| } | |||
| /** | |||
| * 未标注 | |||
| * | |||
| * @param stateList 数据集下文件状态的并集 | |||
| * @return 数据集状态枚举 | |||
| */ | |||
| public DcmDataStateEnum isInit(List<Integer> stateList) { | |||
| if (stateList.size() == NumberConstant.NUMBER_1 && stateList.contains(DcmFileStateCodeConstant.NOT_ANNOTATION_FILE_STATE)){ | |||
| return DcmDataStateEnum.NOT_ANNOTATION_STATE; | |||
| } | |||
| return null; | |||
| } | |||
| } | |||
| @@ -96,4 +96,20 @@ public class DataMedicineController { | |||
| public DataResponseBody getAuto(@PathVariable(name = "medicalId") Long medicalId) { | |||
| return new DataResponseBody(dataMedicineService.getAuto(medicalId)); | |||
| } | |||
| @ApiOperation(value = "获取数据集列表") | |||
| @GetMapping("/list") | |||
| @PreAuthorize(Permissions.DATA) | |||
| public DataResponseBody list() { | |||
| return new DataResponseBody(dataMedicineService.getList()); | |||
| } | |||
| @ApiOperation(value = "任务停止") | |||
| @PutMapping(value = "/task/{medicalId}/stop") | |||
| @PreAuthorize(Permissions.DATA) | |||
| public DataResponseBody taskStop(@PathVariable(name = "medicalId") Long medicalId) { | |||
| dataMedicineService.taskStop(medicalId); | |||
| return new DataResponseBody(); | |||
| } | |||
| } | |||