diff --git a/dsms-engine-application/src/main/java/com/dsms/modules/cluster/service/impl/ClusterServiceImpl.java b/dsms-engine-application/src/main/java/com/dsms/modules/cluster/service/impl/ClusterServiceImpl.java index d38f3dcab7e7ba5ecc662a10c63546e93029d896..961b3f264ba76a0dc8e3d5b45b87452a4f222303 100644 --- a/dsms-engine-application/src/main/java/com/dsms/modules/cluster/service/impl/ClusterServiceImpl.java +++ b/dsms-engine-application/src/main/java/com/dsms/modules/cluster/service/impl/ClusterServiceImpl.java @@ -116,4 +116,15 @@ public class ClusterServiceImpl extends ServiceImpl impl return isRemove; } + @Override + public Cluster getCurrentBindCluster() { + LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda().eq(Cluster::getBindStatus, ClusterStatusEnum.BIND.getStatus()); + //获取集群关联信息 + List list = this.list(queryWrapper); + if (list.isEmpty()) { + throw new DsmsEngineException(ResultCode.CLUSTER_NOTBIND); + } + return list.get(0); + } + } diff --git a/dsms-engine-application/src/main/java/com/dsms/modules/node/controller/NodeController.java b/dsms-engine-application/src/main/java/com/dsms/modules/node/controller/NodeController.java new file mode 100644 index 0000000000000000000000000000000000000000..110d8eb99d4e736943276e671a45a0fec6c3b5bc --- /dev/null +++ b/dsms-engine-application/src/main/java/com/dsms/modules/node/controller/NodeController.java @@ -0,0 +1,48 @@ +/* + * Copyright 2022 The DSMS Authors. + * + * 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 com.dsms.modules.node.controller; + +import com.dsms.common.model.Result; +import com.dsms.dfsbroker.node.model.Node; +import com.dsms.dfsbroker.node.service.INodeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + + +@RestController +@RequestMapping("/api/node") +@Api(tags = "节点池模块") +public class NodeController { + + @Autowired + private INodeService nodeService; + + @ApiOperation("节点池模块-获取节点池信息") + @PostMapping("/list") + public Result> list() { + List about = nodeService.list(); + + return Result.OK(about); + } + +} diff --git a/dsms-engine-application/src/main/java/com/dsms/modules/node/service/impl/NodeServiceImpl.java b/dsms-engine-application/src/main/java/com/dsms/modules/node/service/impl/NodeServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..3aca9b47946c0e5cead55e2c609039a58597b764 --- /dev/null +++ b/dsms-engine-application/src/main/java/com/dsms/modules/node/service/impl/NodeServiceImpl.java @@ -0,0 +1,100 @@ +/* + * Copyright 2022 The DSMS Authors. + * + * 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 com.dsms.modules.node.service.impl; + +import com.dsms.common.constant.NodeStatusEnum; +import com.dsms.common.constant.ResultCode; +import com.dsms.common.exception.DsmsEngineException; +import com.dsms.dfsbroker.node.api.NodeApi; +import com.dsms.dfsbroker.node.model.Device; +import com.dsms.dfsbroker.node.model.Node; +import com.dsms.dfsbroker.node.model.remote.OrchDeviceLsResult; +import com.dsms.dfsbroker.node.model.remote.ResponseMon; +import com.dsms.dfsbroker.node.service.INodeService; +import com.dsms.modules.util.RemoteCallUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.ObjectUtils; + +import java.io.IOException; +import java.net.Socket; +import java.util.ArrayList; +import java.util.List; + +@Service +@Slf4j +public class NodeServiceImpl implements INodeService { + + @Autowired + private NodeApi nodeApi; + + + @Override + public List list() { + List nodeList = new ArrayList<>(); + List monList = null; + try { + monList = nodeApi.getNodeList(RemoteCallUtil.generateRemoteRequest()); + } catch (Throwable e) { + throw new DsmsEngineException(e, ResultCode.NODE_LISTNODE_ERROR); + } + if (ObjectUtils.isEmpty(monList)) { + return nodeList; + } + for (ResponseMon responseMon : monList) { + Node node = new Node(); + String name = responseMon.getName(); + node.setNodeName(name); + String addr = responseMon.getAddr(); + if (ObjectUtils.isEmpty(addr)) { + continue; + } + //1. 校验节点服务状态 + String nodeIp = addr.substring(0, addr.indexOf(":")); + String nodePort = addr.substring(addr.indexOf(":") + 1, addr.indexOf("/")); + boolean connected; + try (Socket socket = new Socket(nodeIp, Integer.parseInt(nodePort))) { + connected = socket.isConnected(); + } catch (Exception e) { + connected = false; + } + node.setNodeIp(nodeIp); + node.setNodeStatus(connected ? NodeStatusEnum.UP.getStatus() : NodeStatusEnum.DOWN.getStatus()); + //2. 解析节点磁盘数 + try { + OrchDeviceLsResult orchDeviceLs = nodeApi.getOrchDeviceLs(RemoteCallUtil.generateRemoteRequest(), name); + List devices = Device.orchDeviceLsResultParseDevice(orchDeviceLs); + log.info(devices.toString()); + long count = devices.stream().filter(device -> device.getOsdId() != null).count(); + node.setNodeUsedDevice((int) count); + node.setNodeAllDevice(devices.size()); + } catch (Throwable e) { + log.warn("get device count from dsms-storage fail", e); + } + nodeList.add(node); + } + + return nodeList; + } + + @Override + public Node getNodeInfo(String nodeIp, String nodeName) { + + return null; + } +} diff --git a/dsms-engine-application/src/main/java/com/dsms/modules/util/RemoteCallUtil.java b/dsms-engine-application/src/main/java/com/dsms/modules/util/RemoteCallUtil.java index c07945089e4c8144a7cdcd4b31dc4a51b8492236..5fed2a30154f42e538a304323b5e4744b1e5644d 100644 --- a/dsms-engine-application/src/main/java/com/dsms/modules/util/RemoteCallUtil.java +++ b/dsms-engine-application/src/main/java/com/dsms/modules/util/RemoteCallUtil.java @@ -16,16 +16,31 @@ package com.dsms.modules.util; import com.dsms.common.constant.SystemConst; +import com.dsms.common.exception.DsmsEngineException; import com.dsms.common.model.LoginUser; import com.dsms.common.remotecall.model.RemoteFixedParam; import com.dsms.common.remotecall.model.RemoteRequest; import com.dsms.dfsbroker.cluster.model.Cluster; +import com.dsms.dfsbroker.cluster.service.IClusterService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import javax.annotation.PostConstruct; + +@Component public class RemoteCallUtil { + @Autowired + private IClusterService iClusterService; + + public static RemoteFixedParam remoteFixedParam = null; - public static RemoteFixedParam remoteFixedParam = new RemoteFixedParam(); + @PostConstruct + public void init() { + Cluster initCluster = iClusterService.getCurrentBindCluster(); + updateRemoteFixedParam(initCluster); + } public static RemoteRequest generateRemoteRequest() { return new RemoteRequest(remoteFixedParam); @@ -33,12 +48,10 @@ public class RemoteCallUtil { public static void updateRemoteFixedParam(Cluster cluster) { remoteFixedParam = new RemoteFixedParam(); - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - LoginUser loginUser = (LoginUser) authentication.getPrincipal(); remoteFixedParam.setScheme(SystemConst.HTTPS_SCHEME); remoteFixedParam.setHost(cluster.getClusterVip()); remoteFixedParam.setPort(cluster.getClusterPort()); - remoteFixedParam.setUsername(loginUser.getUsername()); + remoteFixedParam.setUsername(SystemConst.DSMS_STORAGE_USER); remoteFixedParam.setPassword(cluster.getAuthKey()); } } diff --git a/dsms-engine-common/src/main/java/com/dsms/common/constant/SystemConst.java b/dsms-engine-common/src/main/java/com/dsms/common/constant/SystemConst.java index 3e424ff025b2150891c45c4af21738f08b3e7a62..924abcfa11b5949607d0f4e9c7b47c653afb914d 100644 --- a/dsms-engine-common/src/main/java/com/dsms/common/constant/SystemConst.java +++ b/dsms-engine-common/src/main/java/com/dsms/common/constant/SystemConst.java @@ -53,5 +53,11 @@ public class SystemConst { */ public static final int CONNECT_TIMEOUT = 10000; + /** + * dsms storage 接口用户 + * TODO: 默认使用admin用户,后续新增多用户模块后优化 + */ + public static final String DSMS_STORAGE_USER = "admin"; + } diff --git a/dsms-engine-common/src/main/java/com/dsms/common/remotecall/service/impl/RemoteCallImpl.java b/dsms-engine-common/src/main/java/com/dsms/common/remotecall/service/impl/RemoteCallImpl.java index d75764f2cdeed2476e84f8b1c77306caeb920041..e57c75180dab97777f60bcb1f9ae41320fd94396 100644 --- a/dsms-engine-common/src/main/java/com/dsms/common/remotecall/service/impl/RemoteCallImpl.java +++ b/dsms-engine-common/src/main/java/com/dsms/common/remotecall/service/impl/RemoteCallImpl.java @@ -78,6 +78,9 @@ public class RemoteCallImpl implements IRemoteCall { numAttempts++; try { httpResponse = httpRequest.execute(); + if (httpResponse != null) { + break; + } } catch (IORuntimeException ex) { log.error("remotecall fail! fail time:{},fail reason:{}", numAttempts, ex.getMessage(), ex); } diff --git a/dsms-engine-dfsbroker/src/main/java/com/dsms/dfsbroker/cluster/service/IClusterService.java b/dsms-engine-dfsbroker/src/main/java/com/dsms/dfsbroker/cluster/service/IClusterService.java index 2098f7ead76b6fc6bcba107281b90f21917d1185..bd1e58e025664b4dc67c727c98ffebed86d13b17 100644 --- a/dsms-engine-dfsbroker/src/main/java/com/dsms/dfsbroker/cluster/service/IClusterService.java +++ b/dsms-engine-dfsbroker/src/main/java/com/dsms/dfsbroker/cluster/service/IClusterService.java @@ -40,4 +40,6 @@ public interface IClusterService extends IService { */ boolean unbind(); + Cluster getCurrentBindCluster(); + } diff --git a/dsms-engine-dfsbroker/src/main/java/com/dsms/dfsbroker/node/model/Node.java b/dsms-engine-dfsbroker/src/main/java/com/dsms/dfsbroker/node/model/Node.java index 08a9ddadefc31c1874a7ea28d2c9bf94e809ee4a..f1bc88599afe406b1d72f986aa4ce51ba995d540 100644 --- a/dsms-engine-dfsbroker/src/main/java/com/dsms/dfsbroker/node/model/Node.java +++ b/dsms-engine-dfsbroker/src/main/java/com/dsms/dfsbroker/node/model/Node.java @@ -53,6 +53,12 @@ public class Node implements Serializable { @ApiModelProperty("节点磁盘") private List devices; + @ApiModelProperty("节点已用磁盘数") + private Integer nodeUsedDevice; + + @ApiModelProperty("节点总磁盘数") + private Integer nodeAllDevice; + public static List monParseNode(List responseMons) { List nodes = new ArrayList<>();