diff --git a/regression-test/framework/pom.xml b/regression-test/framework/pom.xml
index a306b3b8fd..a39c15abfb 100644
--- a/regression-test/framework/pom.xml
+++ b/regression-test/framework/pom.xml
@@ -245,6 +245,11 @@ under the License.
commons-csv
1.9.0
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
com.google.guava
guava
diff --git a/regression-test/framework/src/main/groovy/org/apache/doris/regression/action/RestoreAction.groovy b/regression-test/framework/src/main/groovy/org/apache/doris/regression/action/RestoreAction.groovy
new file mode 100644
index 0000000000..6b21a3ce2a
--- /dev/null
+++ b/regression-test/framework/src/main/groovy/org/apache/doris/regression/action/RestoreAction.groovy
@@ -0,0 +1,213 @@
+// 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.doris.regression.action
+
+import groovy.util.logging.Slf4j
+import org.apache.commons.collections.CollectionUtils
+import org.apache.commons.lang3.StringUtils
+import org.apache.doris.regression.suite.SuiteContext
+import org.apache.doris.regression.util.JdbcUtils
+
+import java.sql.ResultSetMetaData
+
+@Slf4j
+class RestoreAction implements SuiteAction {
+ public final InetSocketAddress address
+ public final String user
+ public final String password
+
+ String db
+ List tables
+ String location
+ String region
+ String ak
+ String sk
+ String endpoint
+ String repository
+ String snapshot
+ String timestamp
+ int replicationNum
+ long timeout
+
+ SuiteContext context
+
+ RestoreAction(SuiteContext context) {
+ this.address = context.config.feHttpInetSocketAddress
+ this.user = context.config.feHttpUser
+ this.password = context.config.feHttpPassword
+ this.db = context.config.defaultDb
+ this.context = context
+ }
+
+ void db(String db) {
+ this.db = db
+ }
+
+ void location(String location) {
+ this.location = location
+ }
+
+ void region(String region) {
+ this.region = region
+ }
+
+ void ak(String ak) {
+ this.ak = ak
+ }
+
+ void sk(String sk) {
+ this.sk = sk
+ }
+
+ void endpoint(String endpoint) {
+ this.endpoint = endpoint
+ }
+
+ void repository(String repo) {
+ this.repository = repo
+ }
+
+ void snapshot(String snapshot) {
+ this.snapshot = snapshot
+ }
+
+ void timestamp(String timestamp) {
+ this.timestamp = timestamp
+ }
+
+ void replicationNum(int replicaNum) {
+ this.replicationNum = replicaNum
+ }
+
+ void timeout(long timeout) {
+ this.timeout = timeout
+ }
+
+ void tables(String tables) {
+ if (StringUtils.isNotEmpty(tables))
+ this.tables = tables.split(",")
+ }
+
+ @Override
+ void run() {
+ // create repo
+ createRepository()
+ // restore
+ restore()
+ // check result
+ checkRestore()
+ }
+
+ private void createRepository() {
+ String showRepoSql = """
+SHOW REPOSITORIES
+"""
+ String dropRepoSql = """
+DROP REPOSITORY ${repository}
+"""
+ List> showRepoRes = null
+ ResultSetMetaData meta = null
+ (showRepoRes, meta) = JdbcUtils.executeToList(context.conn, showRepoSql)
+ for (List