From 6943f38d1ba3ee027159f99bd0056b54bd60c73f Mon Sep 17 00:00:00 2001 From: dc Date: Wed, 14 May 2025 21:38:41 +0800 Subject: [PATCH] =?UTF-8?q?GPU=E6=A8=A1=E5=9D=97=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 48 ++++++++++++++++++- .../gpu/config/DataSourceConfig.java | 5 ++ .../gpu/config/MQConfig.java | 4 ++ .../gpu/controller/GpuResourceController.java | 15 ++++++ .../gpu/dao/GpuResourceDao.java | 19 ++++++++ .../gpu/event/CacheUpdateEvent.java | 31 ++++++++++++ .../gpu/exception/GlobalExceptionHandler.java | 26 ++++++++++ .../exception/PermissionDeniedException.java | 23 +++++++++ .../gpu/mapper/GpuMapper.java | 14 ++++++ .../gpu/model/dto/GpuCreateDTO.java | 27 +++++++++++ .../gpu/model/dto/GpuResponseDTO.java | 18 +++++++ .../gpu/model/dto/GpuUpdateDTO.java | 25 ++++++++++ .../gpu/model/entity/GpuResource.java | 43 +++++++++++++++++ .../gpu/model/enums/ErrorCodeEnum.java | 36 ++++++++++++++ .../gpu/model/vo/ResponseVO.java | 38 +++++++++++++++ .../gpu/mq/listener/ResourceSyncListener.java | 4 ++ .../gpu/mq/producer/CacheUpdateProducer.java | 31 ++++++++++++ .../gpu/service/GpuManageService.java | 8 ++++ .../service/impl/GpuManageServiceImpl.java | 31 ++++++++++++ .../gpu/utils/PermissionCheckUtil.java | 20 ++++++++ .../gpu/utils/ValidatorUtil.java | 27 +++++++++++ src/main/resources/application.properties | 9 ++++ 22 files changed, 501 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/config/DataSourceConfig.java create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/config/MQConfig.java create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/controller/GpuResourceController.java create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/dao/GpuResourceDao.java create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/event/CacheUpdateEvent.java create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/exception/GlobalExceptionHandler.java create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/exception/PermissionDeniedException.java create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/mapper/GpuMapper.java create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/model/dto/GpuCreateDTO.java create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/model/dto/GpuResponseDTO.java create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/model/dto/GpuUpdateDTO.java create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/model/entity/GpuResource.java create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/model/enums/ErrorCodeEnum.java create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/model/vo/ResponseVO.java create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/mq/listener/ResourceSyncListener.java create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/mq/producer/CacheUpdateProducer.java create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/service/GpuManageService.java create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/service/impl/GpuManageServiceImpl.java create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/utils/PermissionCheckUtil.java create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/utils/ValidatorUtil.java diff --git a/pom.xml b/pom.xml index f469829..43327cf 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ - 24 + 17 @@ -54,6 +54,39 @@ spring-boot-starter-test test + + org.springframework.boot + spring-boot-starter-data-jpa + 3.4.5 + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springframework.kafka + spring-kafka + 3.2.4 + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 3.0.4 + + + org.apache.commons + commons-lang3 + 3.12.0 + + + org.mapstruct + mapstruct + 1.5.5.Final + @@ -82,6 +115,19 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.mapstruct + mapstruct-processor + 1.5.5.Final + + + + diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/config/DataSourceConfig.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/config/DataSourceConfig.java new file mode 100644 index 0000000..1220c1d --- /dev/null +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/config/DataSourceConfig.java @@ -0,0 +1,5 @@ +package com.bipt.intelligentapplicationorchestrationservice.gpu.config; + +public class DataSourceConfig { + +} diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/config/MQConfig.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/config/MQConfig.java new file mode 100644 index 0000000..0148e78 --- /dev/null +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/config/MQConfig.java @@ -0,0 +1,4 @@ +package com.bipt.intelligentapplicationorchestrationservice.gpu.config; + +public class MQConfig { +} diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/controller/GpuResourceController.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/controller/GpuResourceController.java new file mode 100644 index 0000000..d00a6f5 --- /dev/null +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/controller/GpuResourceController.java @@ -0,0 +1,15 @@ +package com.bipt.intelligentapplicationorchestrationservice.gpu.controller; + +import com.bipt.intelligentapplicationorchestrationservice.gpu.service.GpuManageService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping +public class GpuResourceController { + @Autowired + private GpuManageService gpuManageService; + + +} diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/dao/GpuResourceDao.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/dao/GpuResourceDao.java new file mode 100644 index 0000000..92a93d7 --- /dev/null +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/dao/GpuResourceDao.java @@ -0,0 +1,19 @@ +package com.bipt.intelligentapplicationorchestrationservice.gpu.dao; + +import com.bipt.intelligentapplicationorchestrationservice.gpu.model.entity.GpuResource; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Options; +import org.apache.ibatis.annotations.Select; + +@Mapper +public interface GpuResourceDao { + @Insert("INSERT INTO gpu_resource (GPUModel, GPUMemorySize, Ip)"+ + "VALUES (#{model}, #{memory}, #{ip})") + @Options(useGeneratedKeys = true, keyProperty = "GPUId") + Integer insert(GpuResource entity); + + @Select("SELECT * FROM Ipz.public.gpu_resource WHERE GPUId = #{gpuId}") + GpuResource selectById(Long gpuId); + +} diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/event/CacheUpdateEvent.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/event/CacheUpdateEvent.java new file mode 100644 index 0000000..5cc9d5e --- /dev/null +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/event/CacheUpdateEvent.java @@ -0,0 +1,31 @@ +package com.bipt.intelligentapplicationorchestrationservice.gpu.event; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.springframework.context.ApplicationEvent; + +import java.time.Clock; + +@Getter +@Setter +public class CacheUpdateEvent extends ApplicationEvent { + private final String eventType; + private final Long resourceId; + private final Long timestamp; + + // 基础构造函数 + public CacheUpdateEvent(Object source, String eventType, Long resourceId) { + super(source); // 必须调用父类构造方法 + this.eventType = eventType; + this.resourceId = resourceId; + this.timestamp = System.currentTimeMillis(); + } + public CacheUpdateEvent(Object source, String eventType, Long resourceId, Clock clock) { + super(source); + this.eventType = eventType; + this.resourceId = resourceId; + this.timestamp = clock.millis(); // 允许外部控制时间戳 + } + +} diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/exception/GlobalExceptionHandler.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..397b7d1 --- /dev/null +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/exception/GlobalExceptionHandler.java @@ -0,0 +1,26 @@ +package com.bipt.intelligentapplicationorchestrationservice.gpu.exception; + +import com.bipt.intelligentapplicationorchestrationservice.gpu.model.enums.ErrorCodeEnum; +import com.bipt.intelligentapplicationorchestrationservice.gpu.model.vo.ResponseVO; +import org.springframework.dao.DataAccessResourceFailureException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class GlobalExceptionHandler { + @ExceptionHandler(DataAccessResourceFailureException.class) + public ResponseVO handleDBConnectionError() { + return ResponseVO.error(ErrorCodeEnum.DB_CONNECTION_FAILED); + } + + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseVO handleValidationError(MethodArgumentNotValidException e) { + return ResponseVO.error(ErrorCodeEnum.VALIDATION_ERROR); + } + + @ExceptionHandler(PermissionDeniedException.class) + public ResponseVO handlePermissionDenied(PermissionDeniedException ex) { + return ResponseVO.error(ex.getCode(), ex.getMessage()); + } +} diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/exception/PermissionDeniedException.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/exception/PermissionDeniedException.java new file mode 100644 index 0000000..5b77fa7 --- /dev/null +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/exception/PermissionDeniedException.java @@ -0,0 +1,23 @@ +package com.bipt.intelligentapplicationorchestrationservice.gpu.exception; + +import com.bipt.intelligentapplicationorchestrationservice.gpu.model.enums.ErrorCodeEnum; +import lombok.Getter; + +@Getter +public class PermissionDeniedException extends RuntimeException { + private final Integer code; + private final String message; + + public PermissionDeniedException(ErrorCodeEnum errorCode) { + super(errorCode.getMessage()); + this.code = errorCode.getCode(); + this.message = errorCode.getMessage(); + } + + public PermissionDeniedException(ErrorCodeEnum errorCode, String appendMessage) { + super(errorCode.getMessage()+": "+appendMessage); + this.code = errorCode.getCode(); + this.message = errorCode.getMessage()+": "+appendMessage; + } + +} diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/mapper/GpuMapper.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/mapper/GpuMapper.java new file mode 100644 index 0000000..e11c3f4 --- /dev/null +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/mapper/GpuMapper.java @@ -0,0 +1,14 @@ +package com.bipt.intelligentapplicationorchestrationservice.gpu.mapper; + +import ch.qos.logback.core.model.ComponentModel; +import com.bipt.intelligentapplicationorchestrationservice.gpu.model.dto.GpuCreateDTO; +import com.bipt.intelligentapplicationorchestrationservice.gpu.model.dto.GpuResponseDTO; +import com.bipt.intelligentapplicationorchestrationservice.gpu.model.entity.GpuResource; +import org.apache.ibatis.annotations.Mapper; +import org.mapstruct.MappingConstants; + +@Mapper +public interface GpuMapper { + GpuResource toEntity(GpuCreateDTO dto); + GpuResponseDTO toResponseDTO(GpuResource entity); +} diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/model/dto/GpuCreateDTO.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/model/dto/GpuCreateDTO.java new file mode 100644 index 0000000..8f4e6ca --- /dev/null +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/model/dto/GpuCreateDTO.java @@ -0,0 +1,27 @@ +package com.bipt.intelligentapplicationorchestrationservice.gpu.model.dto; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import lombok.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Setter +@Getter +public class GpuCreateDTO { + @NotBlank(message = "GPU型号不能为空") + @Pattern(regexp = "^([A-Z][A-Z0-9-]+)-\\w+", + message = "型号格式应为 [厂商(大写字母开头)]-[型号],如 Intel-Xe_GPU") + private String GPUModel; + + @NotNull(message = "显存容量不能为空") + private Integer GPUMemorySize; + + @NotBlank(message = "IP地址不能为空") + @Pattern(regexp = "^\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}$", + message = "IP地址格式无效") + private String Ip; + +} diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/model/dto/GpuResponseDTO.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/model/dto/GpuResponseDTO.java new file mode 100644 index 0000000..31b6f58 --- /dev/null +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/model/dto/GpuResponseDTO.java @@ -0,0 +1,18 @@ +package com.bipt.intelligentapplicationorchestrationservice.gpu.model.dto; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class GpuResponseDTO { + private Long id; + private String GPUModel; + private Integer GPUMemorySize; + private String Ip; + private LocalDateTime createTime; + + public String getCreateTimeStr(){ + return "GPU创建时间:" + createTime.toString(); + } +} diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/model/dto/GpuUpdateDTO.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/model/dto/GpuUpdateDTO.java new file mode 100644 index 0000000..03561d0 --- /dev/null +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/model/dto/GpuUpdateDTO.java @@ -0,0 +1,25 @@ +package com.bipt.intelligentapplicationorchestrationservice.gpu.model.dto; + +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import lombok.*; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Setter +@Getter +public class GpuUpdateDTO { + @NotNull(message = "GPU ID cannot be null") + private Long GPUId; + + @Pattern(regexp = "^([A-Z][A-Z0-9-]+)-\\w+", + message = "型号格式应为 [厂商(大写字母开头)]-[型号],如 Intel-Xe_GPU") + private String GPUModel; + + private Integer GPUMemorySize; + + @Pattern(regexp = "^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$", + message = "IP地址格式无效") + private String Ip; +} diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/model/entity/GpuResource.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/model/entity/GpuResource.java new file mode 100644 index 0000000..be31796 --- /dev/null +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/model/entity/GpuResource.java @@ -0,0 +1,43 @@ +package com.bipt.intelligentapplicationorchestrationservice.gpu.model.entity; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.CreationTimestamp; +import jakarta.validation.constraints.Pattern; + +import java.util.Date; + +@Setter +@Getter +@Entity +@Table(name = "Gpu_Resource") +public class GpuResource { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long GPUId; + + @Column(nullable = false, length = 64) + private String GPUModel; + + @Column(nullable = false) + private Integer GPUMemorySize; + + @Column(nullable = false, length = 15) + @Pattern(regexp = "^((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$") + private String Ip; + + @Column(updatable = false) + @CreationTimestamp + private Date CreateTime; + + public GpuResource(Long Id, String Model, Integer MemorySize, String ip, Date create_time) { + this.GPUId = Id; + this.GPUModel = Model; + this.GPUMemorySize = MemorySize; + this.Ip = ip; + this.CreateTime = create_time; + } + +} diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/model/enums/ErrorCodeEnum.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/model/enums/ErrorCodeEnum.java new file mode 100644 index 0000000..73b0fa2 --- /dev/null +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/model/enums/ErrorCodeEnum.java @@ -0,0 +1,36 @@ +package com.bipt.intelligentapplicationorchestrationservice.gpu.model.enums; + +import lombok.Getter; +import org.hibernate.dialect.aggregate.DB2AggregateSupport; + +@Getter +public enum ErrorCodeEnum { + SUCCESS(200, "操作成功"), + SYSTEM_ERROR(500, "系统错误"), + + PARAM_INVALID(400, "参数无效"), + PARAM_MISSING(401, "缺少参数"), + IP_FORMAT_ERROR(402, "IP地址格式错误"), + GPU_MODEL_ERROR(403, "GPU型号格式应为[厂商]-[型号]"), + + PERMISSION_DENIED(501, "无操作权限"), + + GPU_NOT_FOUND(601, "GPU资源不存在"), + + DB_CONNECTION_FAILED(701, "数据库连接错误"), + VALIDATION_ERROR(801,"参数校验异常" ); + + private final int code; + private final String message; + ErrorCodeEnum(int code, String message) { + this.code = code; + this.message = message; + } + + public String toString() { + return "ErrorCodeEnum{" + + "code=" + code + + ", message='" + message + '\''+ + '}'; + } +} diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/model/vo/ResponseVO.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/model/vo/ResponseVO.java new file mode 100644 index 0000000..5bd2e8e --- /dev/null +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/model/vo/ResponseVO.java @@ -0,0 +1,38 @@ +package com.bipt.intelligentapplicationorchestrationservice.gpu.model.vo; + +import com.bipt.intelligentapplicationorchestrationservice.gpu.model.enums.ErrorCodeEnum; +import jakarta.validation.constraints.Null; + +import java.io.Serializable; + +public class ResponseVO implements Serializable { + private Integer code; //状态码 + private String message; //描述信息 + private T data; //业务数据 + + + //私有构造方法 + private ResponseVO(Integer code, String message, T data) { + this.code = code; + this.message = message; + this.data = data; + } + + //静态工厂方法 + //成功响应(无数据) + public static ResponseVO success() { + return new ResponseVO<>(200, "OK", null); + } + //成功响应(有数据) + public static ResponseVO success(T data) { + return new ResponseVO<>(200, "OK", data); + } + //失败响应(自定义错误码和消息) + public static ResponseVO error(Integer code, String message) { + return new ResponseVO<>(code, message, null); + } + //失败响应(基于预定义错误枚举) + public static ResponseVO error(ErrorCodeEnum errorCode) { + return new ResponseVO<>(errorCode.getCode(), errorCode.getMessage(), null); + } +} diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/mq/listener/ResourceSyncListener.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/mq/listener/ResourceSyncListener.java new file mode 100644 index 0000000..6726fd4 --- /dev/null +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/mq/listener/ResourceSyncListener.java @@ -0,0 +1,4 @@ +package com.bipt.intelligentapplicationorchestrationservice.gpu.mq.listener; + +public class ResourceSyncListener { +} diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/mq/producer/CacheUpdateProducer.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/mq/producer/CacheUpdateProducer.java new file mode 100644 index 0000000..5afb0c5 --- /dev/null +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/mq/producer/CacheUpdateProducer.java @@ -0,0 +1,31 @@ +package com.bipt.intelligentapplicationorchestrationservice.gpu.mq.producer; + +import com.bipt.intelligentapplicationorchestrationservice.gpu.event.CacheUpdateEvent; +import org.springframework.amqp.core.MessageDeliveryMode; +import org.springframework.amqp.core.MessagePostProcessor; +import org.springframework.amqp.core.MessageProperties; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.UUID; + +@Component +public class CacheUpdateProducer { + @Autowired + private RabbitTemplate rabbitTemplate; + + public void sendCacheUpdateMessage(String eventType, Long gpuId) { + + CacheUpdateEvent event = new CacheUpdateEvent(this, eventType, gpuId); + + MessagePostProcessor processor = message -> { + MessageProperties props = message.getMessageProperties(); + props.setMessageId(UUID.randomUUID().toString()); + props.setDeliveryMode(MessageDeliveryMode.PERSISTENT); + props.setExpiration("60000"); // 60秒TTL + return message; + }; + rabbitTemplate.convertAndSend("GPU_CACHE_QUEUE", event, processor); + } +} diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/service/GpuManageService.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/service/GpuManageService.java new file mode 100644 index 0000000..2aa5dfa --- /dev/null +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/service/GpuManageService.java @@ -0,0 +1,8 @@ +package com.bipt.intelligentapplicationorchestrationservice.gpu.service; + +import com.bipt.intelligentapplicationorchestrationservice.gpu.model.dto.GpuCreateDTO; +import com.bipt.intelligentapplicationorchestrationservice.gpu.model.vo.ResponseVO; + +public interface GpuManageService { + public ResponseVO createGpuResource(GpuCreateDTO dto); +} diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/service/impl/GpuManageServiceImpl.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/service/impl/GpuManageServiceImpl.java new file mode 100644 index 0000000..e48f0c6 --- /dev/null +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/service/impl/GpuManageServiceImpl.java @@ -0,0 +1,31 @@ +package com.bipt.intelligentapplicationorchestrationservice.gpu.service.impl; + +import com.bipt.intelligentapplicationorchestrationservice.gpu.dao.GpuResourceDao; +import com.bipt.intelligentapplicationorchestrationservice.gpu.mapper.GpuMapper; +import com.bipt.intelligentapplicationorchestrationservice.gpu.model.dto.GpuCreateDTO; +import com.bipt.intelligentapplicationorchestrationservice.gpu.model.entity.GpuResource; +import com.bipt.intelligentapplicationorchestrationservice.gpu.model.vo.ResponseVO; +import com.bipt.intelligentapplicationorchestrationservice.gpu.mq.producer.CacheUpdateProducer; +import com.bipt.intelligentapplicationorchestrationservice.gpu.service.GpuManageService; +import com.bipt.intelligentapplicationorchestrationservice.gpu.utils.ValidatorUtil; +import jakarta.transaction.Transactional; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class GpuManageServiceImpl implements GpuManageService { + @Autowired + private GpuResourceDao gpuDao; + + @Autowired + private CacheUpdateProducer mqProducer; + @Autowired + private GpuMapper gpuMapper; + + @Transactional + public ResponseVO createGpuResource(GpuCreateDTO dto) { + GpuResource entity = gpuMapper.toEntity(dto); + gpuDao.insert(entity); + return ResponseVO.success(entity); + } +} diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/utils/PermissionCheckUtil.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/utils/PermissionCheckUtil.java new file mode 100644 index 0000000..170340f --- /dev/null +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/utils/PermissionCheckUtil.java @@ -0,0 +1,20 @@ +package com.bipt.intelligentapplicationorchestrationservice.gpu.utils; + +import com.bipt.intelligentapplicationorchestrationservice.gpu.exception.PermissionDeniedException; +import com.bipt.intelligentapplicationorchestrationservice.gpu.model.enums.ErrorCodeEnum; +import org.springframework.dao.PermissionDeniedDataAccessException; +import org.springframework.stereotype.Component; + +@Component +public class PermissionCheckUtil { + public boolean hasGpuManagePermission(String userId) { + // 这里可以根据用户ID查询数据库或其他方式来判断用户是否有GPU管理权限 + // 这里只是一个示例,实际应用中需要根据具体情况进行实现 + if("admin".equals(userId)){ + return true; + } + else { + throw new PermissionDeniedException(ErrorCodeEnum.PERMISSION_DENIED, "用户" + userId + "无GPU管理权限"); + } + } +} diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/utils/ValidatorUtil.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/utils/ValidatorUtil.java new file mode 100644 index 0000000..a5bd26e --- /dev/null +++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/gpu/utils/ValidatorUtil.java @@ -0,0 +1,27 @@ +package com.bipt.intelligentapplicationorchestrationservice.gpu.utils; + + + +import org.apache.commons.lang3.StringUtils; + +import java.security.InvalidParameterException; +import java.util.regex.Pattern; + +public final class ValidatorUtil { + private static final Pattern IP_PATTERN = Pattern.compile("^((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$"); + private static final Pattern MODEL_PATTERN = Pattern.compile("^([A-Z][A-Z0-9-]+)-\\w+"); + + private ValidatorUtil(){} + + public static void validateGpuModel(String model){ + if(StringUtils.isBlank(model)||!MODEL_PATTERN.matcher(model).matches()){ + throw new InvalidParameterException("GPU型号格式应为[厂商]-[型号],如NVIDIA-A100"); + } + } + + public static void validateIp(String ip){ + if(StringUtils.isBlank(ip)||!IP_PATTERN.matcher(ip).matches()){ + throw new InvalidParameterException(); + } + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d53e06e..bf600fa 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,10 @@ spring.application.name=intelligent-application-orchestration-service + +# ????? +spring.datasource.url=jdbc:kingbase8://116.205.121.200:54321/Ipz +spring.datasource.username=system +spring.datasource.password=root +spring.datasource.driver-class-name=com.kingbase8.Driver +spring.datasource.hikari.maximum-pool-size=10 +spring.datasource.hikari.minimum-idle=5 +spring.datasource.hikari.connection-timeout=30000 \ No newline at end of file