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()));
- }
-
}