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/06/24 03:01:01 UTC

[inlong] branch master updated: [INLONG-4742][Manager] Support Reset when inlong group is pending on Configuring status (#4743)

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/inlong.git


The following commit(s) were added to refs/heads/master by this push:
     new 74f8cc8d6 [INLONG-4742][Manager] Support Reset when inlong group is pending on Configuring status (#4743)
74f8cc8d6 is described below

commit 74f8cc8d6b9f8e21adfe1063809d8272dc1526dd
Author: kipshi <48...@users.noreply.github.com>
AuthorDate: Fri Jun 24 11:00:57 2022 +0800

    [INLONG-4742][Manager] Support Reset when inlong group is pending on Configuring status (#4743)
---
 .../inlong/manager/client/api/InlongGroup.java     |  17 ++-
 .../manager/client/api/impl/BlankInlongGroup.java  |   5 +
 .../manager/client/api/impl/InlongGroupImpl.java   |  10 ++
 .../client/api/inner/InnerInlongManagerClient.java |  10 ++
 .../manager/client/api/service/InlongGroupApi.java |   3 +
 .../client/api/service/InlongStreamApi.java        |   1 -
 .../api/inner/InnerInlongManagerClientTest.java    |  16 +++
 .../common/pojo/group/InlongGroupResetRequest.java |  52 +++++++++
 .../operation/InlongGroupProcessOperation.java     | 117 ++++++++++++++++++++-
 .../web/controller/InlongGroupController.java      |  21 ++--
 10 files changed, 242 insertions(+), 10 deletions(-)

diff --git a/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/InlongGroup.java b/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/InlongGroup.java
index e4fcc7564..7285f2302 100644
--- a/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/InlongGroup.java
+++ b/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/InlongGroup.java
@@ -106,14 +106,14 @@ public interface InlongGroup {
     InlongGroupContext restart(boolean async) throws Exception;
 
     /**
-     * delete the stream group and return group info
+     * Delete the stream group and return group info
      *
      * @return group info
      */
     InlongGroupContext delete() throws Exception;
 
     /**
-     * delete the stream group and return group info
+     * Delete the stream group and return group info
      *
      * @return group info
      */
@@ -125,4 +125,17 @@ public interface InlongGroup {
      * @return inlong stream contained in this group
      */
     List<InlongStream> listStreams() throws Exception;
+
+    /**
+     * Reset group status when group is in INITIALIZING or OPERATING status for a long time.
+     * You can choose to rerun process, or reset to final status directly, both can push the group to next status.
+     * This method has side effect on group you create, use carefully
+     *
+     * @param rerun 1: rerun the process; 0: not rerun the process
+     * @param resetFinalStatus 1: reset to success status;  0: reset to failed status, this params will work
+     *         when rerun = 0
+     * @return group info
+     * @throws Exception
+     */
+    InlongGroupContext reset(int rerun, int resetFinalStatus) throws Exception;
 }
diff --git a/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/impl/BlankInlongGroup.java b/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/impl/BlankInlongGroup.java
index c3c4e84a2..3a0e2ce59 100644
--- a/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/impl/BlankInlongGroup.java
+++ b/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/impl/BlankInlongGroup.java
@@ -96,4 +96,9 @@ public class BlankInlongGroup implements InlongGroup {
     public List<InlongStream> listStreams() throws Exception {
         throw new UnsupportedOperationException("Inlong group is not exists");
     }
+
+    @Override
+    public InlongGroupContext reset(int rerun, int resetFinalStatus) throws Exception {
+        throw new UnsupportedOperationException("Inlong group is not exists");
+    }
 }
diff --git a/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/impl/InlongGroupImpl.java b/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/impl/InlongGroupImpl.java
index 214f95df6..3e7447f2c 100644
--- a/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/impl/InlongGroupImpl.java
+++ b/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/impl/InlongGroupImpl.java
@@ -34,6 +34,7 @@ import org.apache.inlong.manager.common.enums.GroupStatus;
 import org.apache.inlong.manager.common.enums.ProcessStatus;
 import org.apache.inlong.manager.common.pojo.group.InlongGroupInfo;
 import org.apache.inlong.manager.common.pojo.group.InlongGroupRequest;
+import org.apache.inlong.manager.common.pojo.group.InlongGroupResetRequest;
 import org.apache.inlong.manager.common.pojo.sort.BaseSortConf;
 import org.apache.inlong.manager.common.pojo.stream.FullStreamResponse;
 import org.apache.inlong.manager.common.pojo.stream.InlongStreamConfigLogListResponse;
@@ -243,6 +244,15 @@ public class InlongGroupImpl implements InlongGroup {
         return fetchInlongStreams(inlongGroupId);
     }
 
+    @Override
+    public InlongGroupContext reset(int rerun, int resetFinalStatus) throws Exception {
+        InlongGroupInfo groupInfo = groupContext.getGroupInfo();
+        InlongGroupResetRequest request = new InlongGroupResetRequest(groupInfo.getInlongGroupId(),
+                rerun, resetFinalStatus);
+        managerClient.resetGroup(request);
+        return generateSnapshot();
+    }
+
     private InlongGroupContext generateSnapshot() {
         // fetch current group
         InlongGroupInfo groupInfo = managerClient.getGroupInfo(groupContext.getGroupId());
diff --git a/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/inner/InnerInlongManagerClient.java b/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/inner/InnerInlongManagerClient.java
index 7a2391e39..e0f4eeb66 100644
--- a/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/inner/InnerInlongManagerClient.java
+++ b/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/inner/InnerInlongManagerClient.java
@@ -44,6 +44,7 @@ import org.apache.inlong.manager.common.pojo.group.InlongGroupInfo;
 import org.apache.inlong.manager.common.pojo.group.InlongGroupListResponse;
 import org.apache.inlong.manager.common.pojo.group.InlongGroupPageRequest;
 import org.apache.inlong.manager.common.pojo.group.InlongGroupRequest;
+import org.apache.inlong.manager.common.pojo.group.InlongGroupResetRequest;
 import org.apache.inlong.manager.common.pojo.sink.SinkListResponse;
 import org.apache.inlong.manager.common.pojo.sink.SinkRequest;
 import org.apache.inlong.manager.common.pojo.source.SourceListResponse;
@@ -229,6 +230,15 @@ public class InnerInlongManagerClient {
         return Pair.of(response.getData(), response.getErrMsg());
     }
 
+    /**
+     * Reset inlong group info
+     */
+    public boolean resetGroup(InlongGroupResetRequest resetRequest) {
+        Response<Boolean> response = executeHttpCall(inlongGroupApi.resetGroup(resetRequest));
+        assertRespSuccess(response);
+        return response.getData();
+    }
+
     /**
      * Create information of stream.
      */
diff --git a/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/service/InlongGroupApi.java b/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/service/InlongGroupApi.java
index 202c2f7c7..e7a1658bf 100644
--- a/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/service/InlongGroupApi.java
+++ b/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/service/InlongGroupApi.java
@@ -22,6 +22,7 @@ import org.apache.inlong.manager.common.beans.Response;
 import org.apache.inlong.manager.common.pojo.group.InlongGroupListResponse;
 import org.apache.inlong.manager.common.pojo.group.InlongGroupPageRequest;
 import org.apache.inlong.manager.common.pojo.group.InlongGroupRequest;
+import org.apache.inlong.manager.common.pojo.group.InlongGroupResetRequest;
 import org.apache.inlong.manager.common.pojo.workflow.WorkflowResult;
 import retrofit2.Call;
 import retrofit2.http.Body;
@@ -68,4 +69,6 @@ public interface InlongGroupApi {
     @DELETE("group/delete/{id}")
     Call<Response<Boolean>> deleteGroup(@Path("id") String id);
 
+    @POST("group/reset")
+    Call<Response<Boolean>> resetGroup(@Body InlongGroupResetRequest request);
 }
diff --git a/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/service/InlongStreamApi.java b/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/service/InlongStreamApi.java
index c8af43598..237ecfd4a 100644
--- a/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/service/InlongStreamApi.java
+++ b/inlong-manager/manager-client/src/main/java/org/apache/inlong/manager/client/api/service/InlongStreamApi.java
@@ -51,5 +51,4 @@ public interface InlongStreamApi {
     @GET("stream/config/log/list")
     Call<Response<PageInfo<InlongStreamConfigLogListResponse>>> getStreamLogs(@Query("inlongGroupId") String groupId,
             @Query("inlongStreamId") String streamId);
-
 }
diff --git a/inlong-manager/manager-client/src/test/java/org/apache/inlong/manager/client/api/inner/InnerInlongManagerClientTest.java b/inlong-manager/manager-client/src/test/java/org/apache/inlong/manager/client/api/inner/InnerInlongManagerClientTest.java
index 6ce15d909..915167b8c 100644
--- a/inlong-manager/manager-client/src/test/java/org/apache/inlong/manager/client/api/inner/InnerInlongManagerClientTest.java
+++ b/inlong-manager/manager-client/src/test/java/org/apache/inlong/manager/client/api/inner/InnerInlongManagerClientTest.java
@@ -32,6 +32,7 @@ import org.apache.inlong.manager.common.pojo.group.InlongGroupExtInfo;
 import org.apache.inlong.manager.common.pojo.group.InlongGroupInfo;
 import org.apache.inlong.manager.common.pojo.group.InlongGroupListResponse;
 import org.apache.inlong.manager.common.pojo.group.InlongGroupRequest;
+import org.apache.inlong.manager.common.pojo.group.InlongGroupResetRequest;
 import org.apache.inlong.manager.common.pojo.group.pulsar.InlongPulsarInfo;
 import org.apache.inlong.manager.common.pojo.sink.SinkListResponse;
 import org.apache.inlong.manager.common.pojo.sink.ck.ClickHouseSink;
@@ -652,4 +653,19 @@ class InnerInlongManagerClientTest {
 
         Assertions.assertTrue(exception.getMessage().contains("groupId should not empty"));
     }
+
+    @Test
+    void testResetGroup() {
+        stubFor(
+                post(urlMatching("/api/inlong/manager/group/reset.*"))
+                        .willReturn(
+                                okJson(JsonUtils.toJsonString(
+                                        Response.success(true))
+                                )
+                        )
+        );
+
+        boolean isReset = innerInlongManagerClient.resetGroup(new InlongGroupResetRequest());
+        Assertions.assertTrue(isReset);
+    }
 }
diff --git a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/group/InlongGroupResetRequest.java b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/group/InlongGroupResetRequest.java
new file mode 100644
index 000000000..133460b59
--- /dev/null
+++ b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/group/InlongGroupResetRequest.java
@@ -0,0 +1,52 @@
+/*
+ * 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.common.pojo.group;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.Pattern;
+
+/**
+ * Inlong group reset request
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel("Inlong group reset request")
+public class InlongGroupResetRequest {
+
+    @ApiModelProperty(value = "Inlong group id", required = true)
+    @Length(min = 4, max = 200)
+    @Pattern(regexp = "^(?![0-9]+$)[a-z][a-z0-9_-]{1,200}$",
+            message = "inlongGroupId must starts with a lowercase letter "
+                    + "and contains only lowercase letters, digits, `-` or `_`")
+    private String inlongGroupId;
+
+    @ApiModelProperty(value = "If rerun process when group is in operating, 0: false 1: true")
+    private Integer rerunProcess = 0;
+
+    @ApiModelProperty(value = "This params will work when rerunProcess = 0, 0: reset to fail, 1: reset to success")
+    private Integer resetFinalStatus = 1;
+}
diff --git a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/core/operation/InlongGroupProcessOperation.java b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/core/operation/InlongGroupProcessOperation.java
index 3900b6c15..a15b38f22 100644
--- a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/core/operation/InlongGroupProcessOperation.java
+++ b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/core/operation/InlongGroupProcessOperation.java
@@ -24,12 +24,14 @@ import org.apache.inlong.manager.common.enums.GroupOperateType;
 import org.apache.inlong.manager.common.enums.GroupStatus;
 import org.apache.inlong.manager.common.exceptions.WorkflowListenerException;
 import org.apache.inlong.manager.common.pojo.group.InlongGroupInfo;
-import org.apache.inlong.manager.common.pojo.stream.InlongStreamInfo;
+import org.apache.inlong.manager.common.pojo.group.InlongGroupResetRequest;
 import org.apache.inlong.manager.common.pojo.stream.InlongStreamBriefInfo;
+import org.apache.inlong.manager.common.pojo.stream.InlongStreamInfo;
 import org.apache.inlong.manager.common.pojo.workflow.WorkflowResult;
 import org.apache.inlong.manager.common.pojo.workflow.form.GroupResourceProcessForm;
 import org.apache.inlong.manager.common.pojo.workflow.form.LightGroupResourceProcessForm;
 import org.apache.inlong.manager.common.pojo.workflow.form.NewGroupProcessForm;
+import org.apache.inlong.manager.common.util.Preconditions;
 import org.apache.inlong.manager.service.core.InlongStreamService;
 import org.apache.inlong.manager.service.group.InlongGroupService;
 import org.apache.inlong.manager.service.workflow.ProcessName;
@@ -226,6 +228,119 @@ public class InlongGroupProcessOperation {
         return groupService.delete(groupId, operator);
     }
 
+    /**
+     * Reset group status when group is staying CONFIG_ING|SUSPENDING|RESTARTING|DELETING for a long time
+     * This api is side effect, must be used carefully.
+     *
+     * @param request
+     * @param operator
+     * @return
+     */
+    public boolean resetGroupStatus(InlongGroupResetRequest request, String operator) {
+        LOGGER.info("begin to reset group status, request = {}, operator = {}", request, operator);
+        final String groupId = request.getInlongGroupId();
+        InlongGroupInfo groupInfo = groupService.get(groupId);
+        Preconditions.checkNotNull(groupInfo, ErrorCodeEnum.GROUP_NOT_FOUND.getMessage());
+        GroupStatus status = GroupStatus.forCode(groupInfo.getStatus());
+        final int rerunProcess = request.getRerunProcess();
+        final int resetFinalStatus = request.getResetFinalStatus();
+        switch (status) {
+            case CONFIG_ING:
+                return dealWithConfigingGroup(groupInfo, operator, rerunProcess, resetFinalStatus);
+            case SUSPENDING:
+                return dealWithSuspendingGroup(groupInfo, operator, rerunProcess, resetFinalStatus);
+            case RESTARTING:
+                return dealWithRestartingGroup(groupInfo, operator, rerunProcess, resetFinalStatus);
+            case DELETING:
+                return dealWithDeletingGroup(groupInfo, operator, rerunProcess, resetFinalStatus);
+            default:
+                throw new IllegalStateException(
+                        String.format("Unsupported status to reset for group = %s and status = %s",
+                                request.getInlongGroupId(), status));
+        }
+    }
+
+    private boolean dealWithConfigingGroup(InlongGroupInfo groupInfo, String operator, int rerunProcess,
+            int resetFinalStatus) {
+        if (rerunProcess == 1) {
+            initProcessAsync(groupInfo, operator);
+            return true;
+        }
+        final String groupId = groupInfo.getInlongGroupId();
+        if (resetFinalStatus == 1) {
+            groupService.updateStatus(groupId, GroupStatus.CONFIG_SUCCESSFUL.getCode(), operator);
+        } else {
+            groupService.updateStatus(groupId, GroupStatus.CONFIG_FAILED.getCode(), operator);
+        }
+        return true;
+    }
+
+    private boolean dealWithSuspendingGroup(InlongGroupInfo groupInfo, String operator, int rerunProcess,
+            int resetFinalStatus) {
+        final String groupId = groupInfo.getInlongGroupId();
+        if (rerunProcess == 1) {
+            suspendProcessAsync(groupId, operator);
+            return true;
+        }
+        if (resetFinalStatus == 1) {
+            groupService.updateStatus(groupId, GroupStatus.SUSPENDED.getCode(), operator);
+        } else {
+            groupService.updateStatus(groupId, GroupStatus.CONFIG_FAILED.getCode(), operator);
+        }
+        return true;
+    }
+
+    private boolean dealWithRestartingGroup(InlongGroupInfo groupInfo, String operator, int rerunProcess,
+            int resetFinalStatus) {
+        final String groupId = groupInfo.getInlongGroupId();
+        if (rerunProcess == 1) {
+            restartProcessAsync(groupId, operator);
+            return true;
+        }
+        if (resetFinalStatus == 1) {
+            groupService.updateStatus(groupId, GroupStatus.RESTARTED.getCode(), operator);
+        } else {
+            groupService.updateStatus(groupId, GroupStatus.CONFIG_FAILED.getCode(), operator);
+        }
+        return true;
+    }
+
+    private boolean dealWithDeletingGroup(InlongGroupInfo groupInfo, String operator, int rerunProcess,
+            int resetFinalStatus) {
+        final String groupId = groupInfo.getInlongGroupId();
+        if (rerunProcess == 1) {
+            deleteProcessAsync(groupId, operator);
+            return true;
+        }
+        if (resetFinalStatus == 1) {
+            groupService.delete(groupId, operator);
+        } else {
+            groupService.updateStatus(groupId, GroupStatus.CONFIG_FAILED.getCode(), operator);
+        }
+        return true;
+    }
+
+    private String initProcessAsync(InlongGroupInfo groupInfo, String operator) {
+        LOGGER.info("begin to init process, groupId = {}, operator = {}", groupInfo.getInlongGroupId(), operator);
+        final String groupId = groupInfo.getInlongGroupId();
+        groupService.updateStatus(groupId, GroupStatus.CONFIG_ING.getCode(), operator);
+        GroupMode mode = GroupMode.parseGroupMode(groupInfo);
+        switch (mode) {
+            case NORMAL:
+                GroupResourceProcessForm form = genGroupProcessForm(groupInfo, GroupOperateType.INIT);
+                executorService.execute(() -> workflowService.start(ProcessName.SUSPEND_GROUP_PROCESS, operator, form));
+                break;
+            case LIGHT:
+                LightGroupResourceProcessForm lightForm = genLightGroupProcessForm(groupInfo, GroupOperateType.INIT);
+                executorService.execute(
+                        () -> workflowService.start(ProcessName.SUSPEND_LIGHT_GROUP_PROCESS, operator, lightForm));
+                break;
+            default:
+                throw new WorkflowListenerException(ErrorCodeEnum.GROUP_MODE_UNSUPPORTED.getMessage());
+        }
+        return groupId;
+    }
+
     private void invokeDeleteProcess(String groupId, String operator) {
         InlongGroupInfo groupInfo = groupService.get(groupId);
         GroupMode mode = GroupMode.parseGroupMode(groupInfo);
diff --git a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongGroupController.java b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongGroupController.java
index 2f992a9b8..8310aaa51 100644
--- a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongGroupController.java
+++ b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongGroupController.java
@@ -29,6 +29,7 @@ import org.apache.inlong.manager.common.pojo.group.InlongGroupInfo;
 import org.apache.inlong.manager.common.pojo.group.InlongGroupListResponse;
 import org.apache.inlong.manager.common.pojo.group.InlongGroupPageRequest;
 import org.apache.inlong.manager.common.pojo.group.InlongGroupRequest;
+import org.apache.inlong.manager.common.pojo.group.InlongGroupResetRequest;
 import org.apache.inlong.manager.common.pojo.group.InlongGroupTopicInfo;
 import org.apache.inlong.manager.common.pojo.workflow.WorkflowResult;
 import org.apache.inlong.manager.common.util.LoginUserUtils;
@@ -36,7 +37,9 @@ import org.apache.inlong.manager.service.core.operation.InlongGroupProcessOperat
 import org.apache.inlong.manager.service.core.operationlog.OperationLog;
 import org.apache.inlong.manager.service.group.InlongGroupService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 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;
@@ -102,7 +105,7 @@ public class InlongGroupController {
         return Response.success(groupService.countGroupByUser(operator));
     }
 
-    @RequestMapping(value = "startProcess/{groupId}", method = RequestMethod.POST)
+    @RequestMapping(value = "/startProcess/{groupId}", method = RequestMethod.POST)
     @ApiOperation(value = "Start inlong approval process")
     @ApiImplicitParam(name = "groupId", value = "Inlong group id", dataTypeClass = String.class)
     public Response<WorkflowResult> startProcess(@PathVariable String groupId) {
@@ -110,7 +113,7 @@ public class InlongGroupController {
         return Response.success(groupProcessOperation.startProcess(groupId, operator));
     }
 
-    @RequestMapping(value = "suspendProcess/{groupId}", method = RequestMethod.POST)
+    @RequestMapping(value = "/suspendProcess/{groupId}", method = RequestMethod.POST)
     @ApiOperation(value = "Suspend inlong group process")
     @ApiImplicitParam(name = "groupId", value = "Inlong group id", dataTypeClass = String.class)
     public Response<WorkflowResult> suspendProcess(@PathVariable String groupId) {
@@ -118,7 +121,7 @@ public class InlongGroupController {
         return Response.success(groupProcessOperation.suspendProcess(groupId, operator));
     }
 
-    @RequestMapping(value = "restartProcess/{groupId}", method = RequestMethod.POST)
+    @RequestMapping(value = "/restartProcess/{groupId}", method = RequestMethod.POST)
     @ApiOperation(value = "Restart inlong group process")
     @ApiImplicitParam(name = "groupId", value = "Inlong group id", dataTypeClass = String.class)
     public Response<WorkflowResult> restartProcess(@PathVariable String groupId) {
@@ -135,7 +138,7 @@ public class InlongGroupController {
         return Response.success(groupProcessOperation.deleteProcess(groupId, operator));
     }
 
-    @RequestMapping(value = "suspendProcessAsync/{groupId}", method = RequestMethod.POST)
+    @RequestMapping(value = "/suspendProcessAsync/{groupId}", method = RequestMethod.POST)
     @ApiOperation(value = "Suspend inlong group process")
     @ApiImplicitParam(name = "groupId", value = "Inlong group id", dataTypeClass = String.class)
     public Response<String> suspendProcessAsync(@PathVariable String groupId) {
@@ -143,7 +146,7 @@ public class InlongGroupController {
         return Response.success(groupProcessOperation.suspendProcessAsync(groupId, operator));
     }
 
-    @RequestMapping(value = "restartProcessAsync/{groupId}", method = RequestMethod.POST)
+    @RequestMapping(value = "/restartProcessAsync/{groupId}", method = RequestMethod.POST)
     @ApiOperation(value = "Restart inlong group process")
     @ApiImplicitParam(name = "groupId", value = "Inlong group id", dataTypeClass = String.class)
     public Response<String> restartProcessAsync(@PathVariable String groupId) {
@@ -160,10 +163,16 @@ public class InlongGroupController {
         return Response.success(groupProcessOperation.deleteProcessAsync(groupId, operator));
     }
 
-    @RequestMapping(value = "getTopic/{groupId}", method = RequestMethod.GET)
+    @RequestMapping(value = "/getTopic/{groupId}", method = RequestMethod.GET)
     @ApiOperation(value = "Get topic info")
     public Response<InlongGroupTopicInfo> getTopic(@PathVariable String groupId) {
         return Response.success(groupService.getTopic(groupId));
     }
 
+    @PostMapping(value = "/reset")
+    @ApiOperation(value = "Reset group status when group is in CONFIG_ING|SUSPENDING|RESTARTING|DELETING")
+    public Response<Boolean> reset(@RequestBody @Validated InlongGroupResetRequest request) {
+        String operator = LoginUserUtils.getLoginUserDetail().getUserName();
+        return Response.success(groupProcessOperation.resetGroupStatus(request, operator));
+    }
 }
\ No newline at end of file