You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@inlong.apache.org by he...@apache.org on 2022/05/08 03:24:24 UTC

[incubator-inlong] branch master updated: [INLONG-4077][Manager] Implement the APIs of data node management (#4104)

This is an automated email from the ASF dual-hosted git repository.

healchow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-inlong.git


The following commit(s) were added to refs/heads/master by this push:
     new 53740aebc [INLONG-4077][Manager] Implement the APIs of data node management (#4104)
53740aebc is described below

commit 53740aebcd6f86b8fc6de0878e21b4c719440759
Author: fuweng11 <76...@users.noreply.github.com>
AuthorDate: Sun May 8 11:24:20 2022 +0800

    [INLONG-4077][Manager] Implement the APIs of data node management (#4104)
    
    * [INLONG-4077][Manager] Implement the APIs of data node management
    
    * [INLONG-3946][Manager] Add license in DataNodeServiceTest
    
    * [INLONG-4077][Manager] Delete getByUniqueKey in DataNodeEntityMapper
    
    * Change the log info
    
    * Change the unit test
    
    * Fix unit test error
    
    Co-authored-by: healchow <he...@gmail.com>
---
 .../manager/dao/mapper/DataNodeEntityMapper.java   |  10 +-
 .../resources/mappers/DataNodeEntityMapper.xml     |  32 +++++-
 .../service/core/impl/DataNodeServiceImpl.java     |  93 +++++++++++++++-
 .../service/core/impl/DataNodeServiceTest.java     | 118 +++++++++++++++++++++
 .../manager/web/controller/DataNodeController.java |  83 ++++-----------
 5 files changed, 264 insertions(+), 72 deletions(-)

diff --git a/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/mapper/DataNodeEntityMapper.java b/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/mapper/DataNodeEntityMapper.java
index 1fd8809f4..583a34125 100644
--- a/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/mapper/DataNodeEntityMapper.java
+++ b/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/mapper/DataNodeEntityMapper.java
@@ -17,9 +17,13 @@
 
 package org.apache.inlong.manager.dao.mapper;
 
+import org.apache.ibatis.annotations.Param;
+import org.apache.inlong.manager.common.pojo.node.DataNodePageRequest;
 import org.apache.inlong.manager.dao.entity.DataNodeEntity;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 @Repository
 public interface DataNodeEntityMapper {
 
@@ -27,7 +31,9 @@ public interface DataNodeEntityMapper {
 
     DataNodeEntity selectById(Integer id);
 
-    DataNodeEntity selectByNameAndType(String name, String type);
+    DataNodeEntity selectByNameAndType(@Param("name") String name, @Param("type") String type);
+
+    List<DataNodeEntity> selectByCondition(DataNodePageRequest request);
 
     int updateById(DataNodeEntity record);
 
@@ -35,4 +41,4 @@ public interface DataNodeEntityMapper {
 
     int deleteById(Integer id);
 
-}
\ No newline at end of file
+}
diff --git a/inlong-manager/manager-dao/src/main/resources/mappers/DataNodeEntityMapper.xml b/inlong-manager/manager-dao/src/main/resources/mappers/DataNodeEntityMapper.xml
index 1d22af864..5d7a521c9 100644
--- a/inlong-manager/manager-dao/src/main/resources/mappers/DataNodeEntityMapper.xml
+++ b/inlong-manager/manager-dao/src/main/resources/mappers/DataNodeEntityMapper.xml
@@ -41,7 +41,8 @@
         creator, modifier, create_time, modify_time
     </sql>
 
-    <insert id="insert" parameterType="org.apache.inlong.manager.dao.entity.DataNodeEntity">
+    <insert id="insert" useGeneratedKeys="true" keyProperty="id"
+        parameterType="org.apache.inlong.manager.dao.entity.DataNodeEntity">
         insert into data_node (id, name, type,
                                url, username, password,
                                in_charges, status, is_deleted,
@@ -68,7 +69,32 @@
         and name = #{name, jdbcType=VARCHAR}
         and type = #{type, jdbcType=VARCHAR}
     </select>
-
+    <select id="selectByCondition"
+            parameterType="org.apache.inlong.manager.common.pojo.node.DataNodePageRequest"
+            resultType="org.apache.inlong.manager.dao.entity.DataNodeEntity">
+        select
+        <include refid="Base_Column_List"/>
+        from data_node
+        <where>
+            is_deleted = 0
+            <if test="name != null and name != ''">
+                and name = #{name, jdbcType=VARCHAR}
+            </if>
+            <if test="type != null and type != ''">
+                and type = #{type, jdbcType=VARCHAR}
+            </if>
+            <if test="keyword != null and keyword != ''">
+                name like CONCAT('%', #{keyword}, '%')
+                or type like CONCAT('%', #{keyword}, '%')
+                or url like CONCAT('%', #{keyword}, '%')
+                )
+            </if>
+            <if test="status != null and status != ''">
+                and status = #{status, jdbcType=INTEGER}
+            </if>
+        </where>
+        order by modify_time desc
+    </select>
     <update id="updateById" parameterType="org.apache.inlong.manager.dao.entity.DataNodeEntity">
         update data_node
         set name        = #{name,jdbcType=VARCHAR},
@@ -137,4 +163,4 @@
         from data_node
         where id = #{id,jdbcType=INTEGER}
     </delete>
-</mapper>
\ No newline at end of file
+</mapper>
diff --git a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/core/impl/DataNodeServiceImpl.java b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/core/impl/DataNodeServiceImpl.java
index 81cd77938..438433493 100644
--- a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/core/impl/DataNodeServiceImpl.java
+++ b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/core/impl/DataNodeServiceImpl.java
@@ -17,10 +17,17 @@
 
 package org.apache.inlong.manager.service.core.impl;
 
+import com.github.pagehelper.Page;
+import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import org.apache.inlong.manager.common.enums.GlobalConstants;
+import org.apache.inlong.manager.common.exceptions.BusinessException;
 import org.apache.inlong.manager.common.pojo.node.DataNodePageRequest;
 import org.apache.inlong.manager.common.pojo.node.DataNodeRequest;
 import org.apache.inlong.manager.common.pojo.node.DataNodeResponse;
+import org.apache.inlong.manager.common.util.CommonBeanUtils;
+import org.apache.inlong.manager.common.util.Preconditions;
+import org.apache.inlong.manager.dao.entity.DataNodeEntity;
 import org.apache.inlong.manager.dao.mapper.DataNodeEntityMapper;
 import org.apache.inlong.manager.service.core.DataNodeService;
 import org.slf4j.Logger;
@@ -28,6 +35,10 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
 /**
  * Data node service layer implementation
  */
@@ -41,27 +52,99 @@ public class DataNodeServiceImpl implements DataNodeService {
 
     @Override
     public Integer save(DataNodeRequest request, String operator) {
-        return null;
+        // check request
+        Preconditions.checkNotNull(request, "data node info cannot be empty");
+        String name = request.getName();
+        String type = request.getType();
+        Preconditions.checkNotEmpty(name, "data node name cannot be empty");
+        Preconditions.checkNotEmpty(type, "data node type cannot be empty");
+
+        // check if data node already exist
+        DataNodeEntity exist = dataNodeMapper.selectByNameAndType(name, type);
+        if (exist != null) {
+            String errMsg = String.format("data node already exist for name=%s type=%s)", name, type);
+            LOGGER.error(errMsg);
+            throw new BusinessException(errMsg);
+        }
+        DataNodeEntity entity = CommonBeanUtils.copyProperties(request, DataNodeEntity::new);
+        entity.setCreator(operator);
+        entity.setCreateTime(new Date());
+        entity.setIsDeleted(GlobalConstants.UN_DELETED);
+        dataNodeMapper.insert(entity);
+
+        LOGGER.debug("success to save data node={}", request);
+        return entity.getId();
     }
 
     @Override
     public DataNodeResponse get(Integer id) {
-        return null;
+        Preconditions.checkNotNull(id, "data node id cannot be empty");
+        DataNodeEntity entity = dataNodeMapper.selectById(id);
+        if (entity == null) {
+            LOGGER.error("data node not found by id={}", id);
+            throw new BusinessException("data node not found");
+        }
+        DataNodeResponse response = CommonBeanUtils.copyProperties(entity, DataNodeResponse::new);
+        LOGGER.debug("success to get data node info by id={}", id);
+        return response;
     }
 
     @Override
     public PageInfo<DataNodeResponse> list(DataNodePageRequest request) {
-        return null;
+        PageHelper.startPage(request.getPageNum(), request.getPageSize());
+        Page<DataNodeEntity> entityPage = (Page<DataNodeEntity>) dataNodeMapper.selectByCondition(request);
+        List<DataNodeResponse> responseList = CommonBeanUtils.copyListProperties(entityPage, DataNodeResponse::new);
+        PageInfo<DataNodeResponse> page = new PageInfo<>(responseList);
+        page.setTotal(responseList.size());
+        LOGGER.debug("success to list data node by {}", request);
+        return page;
     }
 
     @Override
     public Boolean update(DataNodeRequest request, String operator) {
-        return null;
+        // check request
+        Preconditions.checkNotNull(request, "data node info cannot be empty");
+        String name = request.getName();
+        String type = request.getType();
+        Preconditions.checkNotEmpty(name, "data node name cannot be empty");
+        Preconditions.checkNotEmpty(type, "data node type cannot be empty");
+
+        Integer id = request.getId();
+        Preconditions.checkNotNull(id, "data node id is empty");
+        DataNodeEntity exist = dataNodeMapper.selectByNameAndType(name, type);
+        if (exist != null && !Objects.equals(id, exist.getId())) {
+            String errMsg = String.format("data node already exist for name=%s type=%s", name, type);
+            LOGGER.error(errMsg);
+            throw new BusinessException(errMsg);
+        }
+
+        DataNodeEntity entity = dataNodeMapper.selectById(id);
+        if (entity == null) {
+            LOGGER.error("data node not found by id={}", id);
+            throw new BusinessException(String.format("data node not found by id=%s", id));
+        }
+        CommonBeanUtils.copyProperties(request, entity, true);
+        entity.setModifier(operator);
+        dataNodeMapper.updateById(entity);
+
+        LOGGER.info("success to update data node={}", request);
+        return true;
     }
 
     @Override
     public Boolean delete(Integer id, String operator) {
-        return null;
+        Preconditions.checkNotNull(id, "data node id cannot be empty");
+        DataNodeEntity entity = dataNodeMapper.selectById(id);
+        if (entity == null || entity.getIsDeleted() > GlobalConstants.UN_DELETED) {
+            LOGGER.error("data node not found or was already deleted for id={}", id);
+            return false;
+        }
+
+        entity.setIsDeleted(entity.getId());
+        entity.setModifier(operator);
+        dataNodeMapper.updateById(entity);
+        LOGGER.info("success to delete data node by id={}", id);
+        return true;
     }
 
 }
diff --git a/inlong-manager/manager-service/src/test/java/org/apache/inlong/manager/service/core/impl/DataNodeServiceTest.java b/inlong-manager/manager-service/src/test/java/org/apache/inlong/manager/service/core/impl/DataNodeServiceTest.java
new file mode 100644
index 000000000..49ffccc07
--- /dev/null
+++ b/inlong-manager/manager-service/src/test/java/org/apache/inlong/manager/service/core/impl/DataNodeServiceTest.java
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.inlong.manager.service.core.impl;
+
+import com.github.pagehelper.PageInfo;
+import org.apache.inlong.manager.common.pojo.node.DataNodePageRequest;
+import org.apache.inlong.manager.common.pojo.node.DataNodeRequest;
+import org.apache.inlong.manager.common.pojo.node.DataNodeResponse;
+import org.apache.inlong.manager.service.ServiceBaseTest;
+import org.apache.inlong.manager.service.core.DataNodeService;
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * Data node service test for {@link DataNodeService}
+ */
+public class DataNodeServiceTest extends ServiceBaseTest {
+
+    @Autowired
+    private DataNodeService dataNodeService;
+
+    /**
+     * Save data node info.
+     */
+    public Integer saveOpt(String nodeName, String type, String url, String username, String password) {
+        DataNodeRequest request = new DataNodeRequest();
+        request.setName(nodeName);
+        request.setType(type);
+        request.setUrl(url);
+        request.setUsername(username);
+        request.setPassword(password);
+        request.setInCharges(GLOBAL_OPERATOR);
+        return dataNodeService.save(request, GLOBAL_OPERATOR);
+    }
+
+    /**
+     * Get data node list info.
+     */
+    public PageInfo<DataNodeResponse> listOpt(String type, String name) {
+        DataNodePageRequest request = new DataNodePageRequest();
+        request.setType(type);
+        request.setName(name);
+        return dataNodeService.list(request);
+    }
+
+    /**
+     * update data node info.
+     */
+    public Boolean updateOpt(Integer id, String nodeName, String type, String url, String username, String password) {
+        DataNodeRequest request = new DataNodeRequest();
+        request.setId(id);
+        request.setName(nodeName);
+        request.setType(type);
+        request.setUrl(url);
+        request.setUsername(username);
+        request.setPassword(password);
+        return dataNodeService.update(request, GLOBAL_OPERATOR);
+    }
+
+    /**
+     * Delete data node info.
+     */
+    public Boolean deleteOpt(Integer id) {
+        return dataNodeService.delete(id, GLOBAL_OPERATOR);
+    }
+
+    @Test
+    public void testDataService() {
+        String nodeName = "hiveNode1";
+        String type = "HIVE";
+        String url = "127.0.0.1:8080";
+        String usename = "admin";
+        String password = "123";
+
+        // test save data node
+        Integer id = this.saveOpt(nodeName, type, url, usename, password);
+        Assert.assertNotNull(id);
+
+        // test get data node
+        DataNodeResponse nodeResponse = dataNodeService.get(id);
+        Assert.assertNotNull(nodeResponse);
+        Assert.assertEquals(type, nodeResponse.getType());
+
+        // test get data node list
+        PageInfo<DataNodeResponse> listDataNode = this.listOpt(type, nodeName);
+        Assert.assertEquals(listDataNode.getTotal(), 1);
+
+        // test update data node
+        String newNodeName = "kafkaNode1";
+        String newType = "KAFKA";
+        String newUrl = "127.0.0.1:8083";
+        String newUsername = "admin2";
+        String newPassword = "456";
+        Boolean updateSuccess = this.updateOpt(id, newNodeName, newType, newUrl, newUsername, newPassword);
+        Assert.assertTrue(updateSuccess);
+
+        // test delete data node
+        Boolean deleteSuccess = this.deleteOpt(id);
+        Assert.assertTrue(deleteSuccess);
+    }
+
+}
diff --git a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/DataNodeController.java b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/DataNodeController.java
index 248afd0e2..107318911 100644
--- a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/DataNodeController.java
+++ b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/DataNodeController.java
@@ -23,14 +23,12 @@ import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
 import org.apache.inlong.manager.common.beans.Response;
 import org.apache.inlong.manager.common.enums.OperationType;
-import org.apache.inlong.manager.common.pojo.cluster.ClusterNodeRequest;
-import org.apache.inlong.manager.common.pojo.cluster.ClusterNodeResponse;
-import org.apache.inlong.manager.common.pojo.cluster.InlongClusterPageRequest;
-import org.apache.inlong.manager.common.pojo.cluster.InlongClusterRequest;
-import org.apache.inlong.manager.common.pojo.cluster.InlongClusterResponse;
+import org.apache.inlong.manager.common.pojo.node.DataNodePageRequest;
+import org.apache.inlong.manager.common.pojo.node.DataNodeRequest;
+import org.apache.inlong.manager.common.pojo.node.DataNodeResponse;
 import org.apache.inlong.manager.common.pojo.user.UserRoleCode;
 import org.apache.inlong.manager.common.util.LoginUserUtils;
-import org.apache.inlong.manager.service.core.InlongClusterService;
+import org.apache.inlong.manager.service.core.DataNodeService;
 import org.apache.inlong.manager.service.core.operationlog.OperationLog;
 import org.apache.shiro.authz.annotation.RequiresRoles;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -40,7 +38,6 @@ import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
 /**
@@ -52,82 +49,44 @@ import org.springframework.web.bind.annotation.RestController;
 public class DataNodeController {
 
     @Autowired
-    private InlongClusterService clusterService;
+    private DataNodeService dataNodeService;
 
     @PostMapping(value = "/save")
-    @ApiOperation(value = "Save cluster")
+    @ApiOperation(value = "Save node")
     @OperationLog(operation = OperationType.CREATE)
     @RequiresRoles(value = UserRoleCode.ADMIN)
-    public Response<Integer> save(@RequestBody InlongClusterRequest request) {
+    public Response<Integer> save(@RequestBody DataNodeRequest request) {
         String currentUser = LoginUserUtils.getLoginUserDetail().getUserName();
-        return Response.success(clusterService.save(request, currentUser));
+        return Response.success(dataNodeService.save(request, currentUser));
     }
 
     @GetMapping(value = "/get/{id}")
-    @ApiOperation(value = "Get cluster by id")
-    @ApiImplicitParam(name = "id", value = "Cluster ID", dataTypeClass = Integer.class, required = true)
-    public Response<InlongClusterResponse> get(@PathVariable Integer id) {
-        return Response.success(clusterService.get(id));
+    @ApiOperation(value = "Get node by id")
+    @ApiImplicitParam(name = "id", value = "data node ID", dataTypeClass = Integer.class, required = true)
+    public Response<DataNodeResponse> get(@PathVariable Integer id) {
+        return Response.success(dataNodeService.get(id));
     }
 
     @PostMapping(value = "/list")
-    @ApiOperation(value = "List clusters")
-    public Response<PageInfo<InlongClusterResponse>> list(@RequestBody InlongClusterPageRequest request) {
-        return Response.success(clusterService.list(request));
+    @ApiOperation(value = "List data node")
+    public Response<PageInfo<DataNodeResponse>> list(@RequestBody DataNodePageRequest request) {
+        return Response.success(dataNodeService.list(request));
     }
 
     @PostMapping(value = "/update")
     @OperationLog(operation = OperationType.UPDATE)
-    @ApiOperation(value = "Update cluster")
-    public Response<Boolean> update(@RequestBody InlongClusterRequest request) {
+    @ApiOperation(value = "Update data node")
+    public Response<Boolean> update(@RequestBody DataNodeRequest request) {
         String username = LoginUserUtils.getLoginUserDetail().getUserName();
-        return Response.success(clusterService.update(request, username));
+        return Response.success(dataNodeService.update(request, username));
     }
 
     @DeleteMapping(value = "/delete/{id}")
-    @ApiOperation(value = "Delete cluster by id")
+    @ApiOperation(value = "Delete data node by id")
     @OperationLog(operation = OperationType.DELETE)
-    @ApiImplicitParam(name = "id", value = "Cluster ID", dataTypeClass = Integer.class, required = true)
+    @ApiImplicitParam(name = "id", value = "Data node ID", dataTypeClass = Integer.class, required = true)
     @RequiresRoles(value = UserRoleCode.ADMIN)
     public Response<Boolean> delete(@PathVariable Integer id) {
-        return Response.success(clusterService.delete(id, LoginUserUtils.getLoginUserDetail().getUserName()));
+        return Response.success(dataNodeService.delete(id, LoginUserUtils.getLoginUserDetail().getUserName()));
     }
-
-    @PostMapping(value = "/node/save")
-    @ApiOperation(value = "Save cluster node")
-    @OperationLog(operation = OperationType.CREATE)
-    public Response<Integer> saveNode(@RequestBody ClusterNodeRequest request) {
-        String currentUser = LoginUserUtils.getLoginUserDetail().getUserName();
-        return Response.success(clusterService.saveNode(request, currentUser));
-    }
-
-    @GetMapping(value = "/node/get/{id}")
-    @ApiOperation(value = "Get cluster node by id")
-    @ApiImplicitParam(name = "id", value = "Cluster node ID", dataTypeClass = Integer.class, required = true)
-    public Response<ClusterNodeResponse> getNode(@PathVariable Integer id) {
-        return Response.success(clusterService.getNode(id));
-    }
-
-    @PostMapping(value = "/node/list")
-    @ApiOperation(value = "List cluster nodes")
-    public Response<PageInfo<ClusterNodeResponse>> listNode(@RequestBody InlongClusterPageRequest request) {
-        return Response.success(clusterService.listNode(request));
-    }
-
-    @RequestMapping(value = "/node/update", method = RequestMethod.POST)
-    @OperationLog(operation = OperationType.UPDATE)
-    @ApiOperation(value = "Update cluster node")
-    public Response<Boolean> updateNode(@RequestBody ClusterNodeRequest request) {
-        String username = LoginUserUtils.getLoginUserDetail().getUserName();
-        return Response.success(clusterService.updateNode(request, username));
-    }
-
-    @RequestMapping(value = "/node/delete/{id}", method = RequestMethod.DELETE)
-    @ApiOperation(value = "Delete cluster node")
-    @OperationLog(operation = OperationType.DELETE)
-    @ApiImplicitParam(name = "id", value = "DataProxy cluster id", dataTypeClass = Integer.class, required = true)
-    public Response<Boolean> deleteNode(@PathVariable Integer id) {
-        return Response.success(clusterService.deleteNode(id, LoginUserUtils.getLoginUserDetail().getUserName()));
-    }
-
 }