This is an automated email from the ASF dual-hosted git repository. ycycse pushed a commit to branch ainodeIT1.3.3 in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 28e9f82d7fcee48ee25b51dce4041c17885d6203 Author: YangCaiyin <[email protected]> AuthorDate: Wed Sep 4 14:33:01 2024 +0800 AINode: Introduce IT framework (#13387) (cherry picked from commit 51ee13be2da7fefbfff7afb1289fe39ecfa9ce6c) --- .github/workflows/cluster-it-1c1d1a.yml | 62 +++++++ integration-test/pom.xml | 14 ++ integration-test/src/assembly/mpp-test.xml | 19 +++ .../java/org/apache/iotdb/it/env/EnvFactory.java | 4 + .../main/java/org/apache/iotdb/it/env/EnvType.java | 1 + .../iotdb/it/env/cluster/ClusterConstant.java | 3 + .../env/{EnvType.java => cluster/env/AIEnv.java} | 25 +-- .../iotdb/it/env/cluster/env/AbstractEnv.java | 53 +++++- .../iotdb/it/env/cluster/node/AINodeWrapper.java | 179 +++++++++++++++++++++ .../it/env/cluster/node/AbstractNodeWrapper.java | 12 +- .../category/AIClusterIT.java} | 15 +- .../java/org/apache/iotdb/ainode/it/AIEnvIT.java | 80 +++++++++ iotdb-core/ainode/pyproject.toml | 2 +- .../ainode/resources/conf/iotdb-ainode.properties | 8 +- .../confignode1conf/iotdb-system.properties | 4 +- pom.xml | 7 +- 16 files changed, 445 insertions(+), 43 deletions(-) diff --git a/.github/workflows/cluster-it-1c1d1a.yml b/.github/workflows/cluster-it-1c1d1a.yml new file mode 100644 index 00000000000..a92d9d23811 --- /dev/null +++ b/.github/workflows/cluster-it-1c1d1a.yml @@ -0,0 +1,62 @@ +name: Cluster IT - 1C1D1A + +on: + push: + branches: + - master + - 'rel/1.*' + - 'rc/1.*' + paths-ignore: + - 'docs/**' + - 'site/**' + pull_request: + branches: + - master + - 'rel/1.*' + - 'rc/1.*' + paths-ignore: + - 'docs/**' + - 'site/**' + # allow manually run the action: + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + MAVEN_OPTS: -Dhttp.keepAlive=false -Dmaven.wagon.http.pool=false -Dmaven.wagon.http.retryHandler.class=standard -Dmaven.wagon.http.retryHandler.count=3 + MAVEN_ARGS: --batch-mode --no-transfer-progress + DEVELOCITY_ACCESS_KEY: ${{ secrets.GE_ACCESS_TOKEN }} + +jobs: + AINode: + strategy: + fail-fast: false + max-parallel: 15 + matrix: + os: [ ubuntu-latest ] + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v4 + - name: Build AINode + shell: bash + run: mvn clean package -DskipTests -P with-ainode + - name: IT Test + shell: bash + run: | + mvn clean verify \ + -P with-integration-tests \ + -DskipUTs \ + -DintegrationTest.forkCount=2 \ + -pl integration-test \ + -am \ + -PAIClusterIT + - name: Upload Artifact + if: failure() + uses: actions/upload-artifact@v4 + with: + name: cluster-log-ainode-${{ matrix.os }} + path: integration-test/target/ainode-logs + retention-days: 30 diff --git a/integration-test/pom.xml b/integration-test/pom.xml index 78564e06209..5678e59869a 100644 --- a/integration-test/pom.xml +++ b/integration-test/pom.xml @@ -534,6 +534,20 @@ <integrationTest.testEnv>Cluster1</integrationTest.testEnv> </properties> </profile> + <profile> + <id>AIClusterIT</id> + <activation> + <activeByDefault>false</activeByDefault> + </activation> + <properties> + <integrationTest.excludedGroups/> + <integrationTest.includedGroups>org.apache.iotdb.itbase.category.AIClusterIT</integrationTest.includedGroups> + <integrationTest.launchNodeInSameJVM>false</integrationTest.launchNodeInSameJVM> + <integrationTest.randomSelectWriteNode>false</integrationTest.randomSelectWriteNode> + <integrationTest.readAndVerifyWithMultiNode>false</integrationTest.readAndVerifyWithMultiNode> + <integrationTest.testEnv>AI</integrationTest.testEnv> + </properties> + </profile> <profile> <id>DailyIT</id> <activation> diff --git a/integration-test/src/assembly/mpp-test.xml b/integration-test/src/assembly/mpp-test.xml index 3dc443c8d03..9a4a8727ea2 100644 --- a/integration-test/src/assembly/mpp-test.xml +++ b/integration-test/src/assembly/mpp-test.xml @@ -42,6 +42,10 @@ <outputDirectory>conf</outputDirectory> <directory>${project.basedir}/../iotdb-core/metrics/interface/src/main/assembly/resources/conf</directory> </fileSet> + <fileSet> + <outputDirectory>conf</outputDirectory> + <directory>${project.basedir}/../iotdb-core/ainode/resources/conf</directory> + </fileSet> <fileSet> <outputDirectory>sbin</outputDirectory> <directory>${project.basedir}/../iotdb-core/datanode/src/assembly/resources/sbin</directory> @@ -52,6 +56,16 @@ <directory>${project.basedir}/../iotdb-core/confignode/src/assembly/resources/sbin</directory> <fileMode>0755</fileMode> </fileSet> + <fileSet> + <outputDirectory>sbin</outputDirectory> + <directory>${project.basedir}/../iotdb-core/ainode/resources/sbin</directory> + <fileMode>0755</fileMode> + </fileSet> + <fileSet> + <outputDirectory>venv</outputDirectory> + <directory>${project.basedir}/../iotdb-core/ainode/venv</directory> + <fileMode>0755</fileMode> + </fileSet> <fileSet> <outputDirectory>tools</outputDirectory> <directory>${project.basedir}/../iotdb-core/datanode/src/assembly/resources/tools</directory> @@ -67,6 +81,11 @@ <directory>${project.basedir}/../iotdb-client/cli/src/assembly/resources/tools</directory> <fileMode>0755</fileMode> </fileSet> + <fileSet> + <outputDirectory>lib</outputDirectory> + <directory>${project.basedir}/../iotdb-core/ainode/dist/</directory> + <fileMode>0755</fileMode> + </fileSet> </fileSets> <files> <file> diff --git a/integration-test/src/main/java/org/apache/iotdb/it/env/EnvFactory.java b/integration-test/src/main/java/org/apache/iotdb/it/env/EnvFactory.java index 8ea62903e1f..695b545e541 100644 --- a/integration-test/src/main/java/org/apache/iotdb/it/env/EnvFactory.java +++ b/integration-test/src/main/java/org/apache/iotdb/it/env/EnvFactory.java @@ -19,6 +19,7 @@ package org.apache.iotdb.it.env; +import org.apache.iotdb.it.env.cluster.env.AIEnv; import org.apache.iotdb.it.env.cluster.env.Cluster1Env; import org.apache.iotdb.it.env.cluster.env.SimpleEnv; import org.apache.iotdb.it.env.remote.env.RemoteServerEnv; @@ -52,6 +53,9 @@ public class EnvFactory { case Remote: env = new RemoteServerEnv(); break; + case AI: + env = new AIEnv(); + break; case MultiCluster: logger.warn( "EnvFactory only supports EnvType Simple, Cluster1 and Remote, please use MultiEnvFactory instead."); diff --git a/integration-test/src/main/java/org/apache/iotdb/it/env/EnvType.java b/integration-test/src/main/java/org/apache/iotdb/it/env/EnvType.java index 5be5da287c7..f475dcc9ba6 100644 --- a/integration-test/src/main/java/org/apache/iotdb/it/env/EnvType.java +++ b/integration-test/src/main/java/org/apache/iotdb/it/env/EnvType.java @@ -24,6 +24,7 @@ public enum EnvType { Simple, Cluster1, MultiCluster, + AI ; public static EnvType getSystemEnvType() { diff --git a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/ClusterConstant.java b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/ClusterConstant.java index e685dd74ed2..b3802f3ea8d 100644 --- a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/ClusterConstant.java +++ b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/ClusterConstant.java @@ -182,9 +182,12 @@ public class ClusterConstant { // Paths public static final String USER_DIR = "user.dir"; public static final String TARGET = "target"; + public static final String PYTHON_PATH = "venv/bin/python3"; public static final String DATA_NODE_NAME = "DataNode"; + public static final String AI_NODE_NAME = "AINode"; + public static final String LOCK_FILE_PATH = System.getProperty(USER_DIR) + File.separator + TARGET + File.separator + "lock-"; public static final String TEMPLATE_NODE_PATH = diff --git a/integration-test/src/main/java/org/apache/iotdb/it/env/EnvType.java b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/env/AIEnv.java similarity index 59% copy from integration-test/src/main/java/org/apache/iotdb/it/env/EnvType.java copy to integration-test/src/main/java/org/apache/iotdb/it/env/cluster/env/AIEnv.java index 5be5da287c7..a037e121509 100644 --- a/integration-test/src/main/java/org/apache/iotdb/it/env/EnvType.java +++ b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/env/AIEnv.java @@ -17,17 +17,22 @@ * under the License. */ -package org.apache.iotdb.it.env; +package org.apache.iotdb.it.env.cluster.env; -public enum EnvType { - Remote, - Simple, - Cluster1, - MultiCluster, - ; +public class AIEnv extends AbstractEnv { + @Override + public void initClusterEnvironment() { + initClusterEnvironment(1, 1); + } + + @Override + public void initClusterEnvironment(int configNodesNum, int dataNodesNum) { + super.initEnvironment(configNodesNum, dataNodesNum, 10000, true); + } - public static EnvType getSystemEnvType() { - String envValue = System.getProperty("TestEnv", Simple.name()); - return EnvType.valueOf(envValue); + @Override + public void initClusterEnvironment( + int configNodesNum, int dataNodesNum, int testWorkingRetryCount) { + super.initEnvironment(configNodesNum, dataNodesNum, testWorkingRetryCount, true); } } diff --git a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/env/AbstractEnv.java b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/env/AbstractEnv.java index 54fedec8de0..7deb7620974 100644 --- a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/env/AbstractEnv.java +++ b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/env/AbstractEnv.java @@ -41,6 +41,7 @@ import org.apache.iotdb.isession.pool.ISessionPool; import org.apache.iotdb.it.env.EnvFactory; import org.apache.iotdb.it.env.cluster.EnvUtils; import org.apache.iotdb.it.env.cluster.config.*; +import org.apache.iotdb.it.env.cluster.node.AINodeWrapper; import org.apache.iotdb.it.env.cluster.node.AbstractNodeWrapper; import org.apache.iotdb.it.env.cluster.node.ConfigNodeWrapper; import org.apache.iotdb.it.env.cluster.node.DataNodeWrapper; @@ -80,6 +81,7 @@ public abstract class AbstractEnv implements BaseEnv { private final Random rand = new Random(); protected List<ConfigNodeWrapper> configNodeWrapperList = Collections.emptyList(); protected List<DataNodeWrapper> dataNodeWrapperList = Collections.emptyList(); + protected List<AINodeWrapper> aiNodeWrapperList = Collections.emptyList(); protected String testMethodName = null; protected int index = 0; protected long startTime; @@ -143,7 +145,12 @@ public abstract class AbstractEnv implements BaseEnv { initEnvironment(configNodesNum, dataNodesNum, retryCount); } - protected void initEnvironment(int configNodesNum, int dataNodesNum, int retryCount) { + protected void initEnvironment(int configNodesNum, int dataNodesNum, int testWorkingRetryCount) { + initEnvironment(configNodesNum, dataNodesNum, testWorkingRetryCount, false); + } + + protected void initEnvironment( + int configNodesNum, int dataNodesNum, int retryCount, boolean addAINode) { this.retryCount = retryCount; this.configNodeWrapperList = new ArrayList<>(); this.dataNodeWrapperList = new ArrayList<>(); @@ -255,9 +262,45 @@ public abstract class AbstractEnv implements BaseEnv { throw new AssertionError(); } + if (addAINode) { + this.aiNodeWrapperList = new ArrayList<>(); + startAINode(seedConfigNode, testClassName); + } + checkClusterStatusWithoutUnknown(); } + private void startAINode(String seedConfigNode, String testClassName) { + String aiNodeEndPoint; + AINodeWrapper aiNodeWrapper = + new AINodeWrapper( + seedConfigNode, + testClassName, + testMethodName, + index, + EnvUtils.searchAvailablePorts(), + startTime); + aiNodeWrapperList.add(aiNodeWrapper); + aiNodeEndPoint = aiNodeWrapper.getIpAndPortString(); + aiNodeWrapper.createNodeDir(); + aiNodeWrapper.createLogDir(); + RequestDelegate<Void> AINodesDelegate = + new ParallelRequestDelegate<>( + Collections.singletonList(aiNodeEndPoint), NODE_START_TIMEOUT); + + AINodesDelegate.addRequest( + () -> { + aiNodeWrapper.start(); + return null; + }); + + try { + AINodesDelegate.requestAll(); + } catch (SQLException e) { + logger.error("Start aiNodes failed", e); + } + } + public String getTestClassName() { StackTraceElement[] stack = Thread.currentThread().getStackTrace(); for (StackTraceElement stackTraceElement : stack) { @@ -318,7 +361,9 @@ public abstract class AbstractEnv implements BaseEnv { // Check the number of nodes if (showClusterResp.getNodeStatus().size() - != configNodeWrapperList.size() + dataNodeWrapperList.size()) { + != configNodeWrapperList.size() + + dataNodeWrapperList.size() + + aiNodeWrapperList.size()) { flag = false; } @@ -355,7 +400,9 @@ public abstract class AbstractEnv implements BaseEnv { @Override public void cleanClusterEnvironment() { List<AbstractNodeWrapper> allNodeWrappers = - Stream.concat(this.dataNodeWrapperList.stream(), this.configNodeWrapperList.stream()) + Stream.concat( + dataNodeWrapperList.stream(), + Stream.concat(configNodeWrapperList.stream(), aiNodeWrapperList.stream())) .collect(Collectors.toList()); allNodeWrappers.stream() .findAny() diff --git a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/node/AINodeWrapper.java b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/node/AINodeWrapper.java new file mode 100644 index 00000000000..c503dfc00e7 --- /dev/null +++ b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/node/AINodeWrapper.java @@ -0,0 +1,179 @@ +/* + * 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.iotdb.it.env.cluster.node; + +import org.apache.iotdb.it.env.cluster.config.MppJVMConfig; +import org.apache.iotdb.it.framework.IoTDBTestLogger; + +import org.slf4j.Logger; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; + +import static org.apache.iotdb.it.env.cluster.ClusterConstant.AI_NODE_NAME; +import static org.apache.iotdb.it.env.cluster.ClusterConstant.PYTHON_PATH; +import static org.apache.iotdb.it.env.cluster.ClusterConstant.TARGET; +import static org.apache.iotdb.it.env.cluster.ClusterConstant.USER_DIR; +import static org.apache.iotdb.it.env.cluster.EnvUtils.getTimeForLogDirectory; + +public class AINodeWrapper extends AbstractNodeWrapper { + + private static final Logger logger = IoTDBTestLogger.logger; + private final long startTime; + private final String seedConfigNode; + + private static final String SCRIPT_FILE = "start-ainode.sh"; + + private static final String SHELL_COMMAND = "bash"; + + private static final String PROPERTIES_FILE = "iotdb-ainode.properties"; + public static final String CONFIG_PATH = "conf"; + public static final String SCRIPT_PATH = "sbin"; + + private void replaceAttribute(String[] keys, String[] values, String filePath) { + try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath, true))) { + for (int i = 0; i < keys.length; i++) { + String line = keys[i] + "=" + values[i]; + writer.newLine(); + writer.write(line); + } + } catch (IOException e) { + logger.error( + "Failed to set attribute for AINode in file: {} because {}", filePath, e.getMessage()); + } + } + + public AINodeWrapper( + String seedConfigNode, + String testClassName, + String testMethodName, + int clusterIndex, + int[] port, + long startTime) { + super(testClassName, testMethodName, port, clusterIndex, false, startTime); + this.seedConfigNode = seedConfigNode; + this.startTime = startTime; + } + + @Override + public String getLogDirPath() { + return System.getProperty(USER_DIR) + + File.separator + + TARGET + + File.separator + + "ainode-logs" + + File.separator + + getTestLogDirName() + + File.separator + + getTimeForLogDirectory(startTime); + } + + @Override + public void start() { + try { + File stdoutFile = new File(getLogPath()); + String filePrefix = + System.getProperty(USER_DIR) + + File.separator + + TARGET + + File.separator + + AI_NODE_NAME + + getPort(); + String propertiesFile = + filePrefix + File.separator + CONFIG_PATH + File.separator + PROPERTIES_FILE; + + // set attribute + replaceAttribute( + new String[] {"ain_seed_config_node", "ain_inference_rpc_port"}, + new String[] {this.seedConfigNode, Integer.toString(getPort())}, + propertiesFile); + + // start AINode + List<String> startCommand = new ArrayList<>(); + startCommand.add(SHELL_COMMAND); + startCommand.add(filePrefix + File.separator + SCRIPT_PATH + File.separator + SCRIPT_FILE); + startCommand.add("-i"); + startCommand.add(filePrefix + File.separator + PYTHON_PATH); + startCommand.add("-r"); + + ProcessBuilder processBuilder = + new ProcessBuilder(startCommand) + .redirectOutput(ProcessBuilder.Redirect.appendTo(stdoutFile)) + .redirectError(ProcessBuilder.Redirect.appendTo(stdoutFile)); + this.instance = processBuilder.start(); + logger.info("In test {} {} started.", getTestLogDirName(), getId()); + } catch (Exception e) { + throw new AssertionError("Start AI Node failed. " + e + Paths.get("")); + } + } + + @Override + public int getMetricPort() { + // no metric currently + return -1; + } + + @Override + public String getId() { + return AI_NODE_NAME + getPort(); + } + + /* Abstract methods, which must be implemented in ConfigNode and DataNode. */ + public void reloadMutableFields() {} + ; + + public void renameFile() {} + ; + + public String getSystemConfigPath() { + return ""; + } + ; + + /** Return the node config file path specified through system variable */ + public String getDefaultNodeConfigPath() { + return ""; + } + ; + + /** Return the common config file path specified through system variable */ + public String getDefaultCommonConfigPath() { + return ""; + } + ; + + public void addStartCmdParams(List<String> params) {} + ; + + public String getSystemPropertiesPath() { + return ""; + } + ; + + public MppJVMConfig initVMConfig() { + return null; + } + ; +} diff --git a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/node/AbstractNodeWrapper.java b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/node/AbstractNodeWrapper.java index 942b6a9e012..bf28c407f72 100644 --- a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/node/AbstractNodeWrapper.java +++ b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/node/AbstractNodeWrapper.java @@ -125,11 +125,11 @@ public abstract class AbstractNodeWrapper implements BaseNodeWrapper { protected final MppJVMConfig jvmConfig; protected final int clusterIndex; protected final boolean isMultiCluster; - private Process instance; + protected Process instance; private final String nodeAddress; private int nodePort; - private int metricPort; - private long startTime; + private final int metricPort; + private final long startTime; private List<String> killPoints = new ArrayList<>(); /** @@ -523,7 +523,7 @@ public abstract class AbstractNodeWrapper implements BaseNodeWrapper { } @Override - public final int getMetricPort() { + public int getMetricPort() { return this.metricPort; } @@ -540,7 +540,7 @@ public abstract class AbstractNodeWrapper implements BaseNodeWrapper { return getNodePath() + File.separator + dirName + File.separator + fileName; } - private String getLogPath() { + protected String getLogPath() { return getLogDirPath() + File.separator + getId() + ".log"; } @@ -645,7 +645,7 @@ public abstract class AbstractNodeWrapper implements BaseNodeWrapper { output.print(sb); } - private String getTestLogDirName() { + protected String getTestLogDirName() { if (testMethodName == null) { return testClassName; } diff --git a/integration-test/src/main/java/org/apache/iotdb/it/env/EnvType.java b/integration-test/src/main/java/org/apache/iotdb/itbase/category/AIClusterIT.java similarity index 75% copy from integration-test/src/main/java/org/apache/iotdb/it/env/EnvType.java copy to integration-test/src/main/java/org/apache/iotdb/itbase/category/AIClusterIT.java index 5be5da287c7..ab3c458cd79 100644 --- a/integration-test/src/main/java/org/apache/iotdb/it/env/EnvType.java +++ b/integration-test/src/main/java/org/apache/iotdb/itbase/category/AIClusterIT.java @@ -17,17 +17,6 @@ * under the License. */ -package org.apache.iotdb.it.env; +package org.apache.iotdb.itbase.category; -public enum EnvType { - Remote, - Simple, - Cluster1, - MultiCluster, - ; - - public static EnvType getSystemEnvType() { - String envValue = System.getProperty("TestEnv", Simple.name()); - return EnvType.valueOf(envValue); - } -} +public interface AIClusterIT {} diff --git a/integration-test/src/test/java/org/apache/iotdb/ainode/it/AIEnvIT.java b/integration-test/src/test/java/org/apache/iotdb/ainode/it/AIEnvIT.java new file mode 100644 index 00000000000..3f1aad95a32 --- /dev/null +++ b/integration-test/src/test/java/org/apache/iotdb/ainode/it/AIEnvIT.java @@ -0,0 +1,80 @@ +/* + * 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.iotdb.ainode.it; + +import org.apache.iotdb.it.env.EnvFactory; +import org.apache.iotdb.it.framework.IoTDBTestRunner; +import org.apache.iotdb.itbase.category.AIClusterIT; + +import org.junit.*; +import org.junit.experimental.categories.Category; +import org.junit.runner.RunWith; + +import java.sql.*; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +@RunWith(IoTDBTestRunner.class) +@Category({AIClusterIT.class}) +public class AIEnvIT { + @Before + public void setUp() throws Exception { + // Init 1C1D1M cluster environment + EnvFactory.getEnv().initClusterEnvironment(1, 1); + } + + @After + public void tearDown() { + EnvFactory.getEnv().cleanClusterEnvironment(); + } + + private static void checkHeader(ResultSetMetaData resultSetMetaData, String title) + throws SQLException { + String[] headers = title.split(","); + for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) { + assertEquals(headers[i - 1], resultSetMetaData.getColumnName(i)); + } + } + + @Test + public void aiNodeConnectionTest() { + String sql = "SHOW AINODES"; + String title = "NodeID,Status,RpcAddress,RpcPort"; + try (Connection connection = EnvFactory.getEnv().getConnection(); + Statement statement = connection.createStatement()) { + + try (ResultSet resultSet = statement.executeQuery(sql)) { + ResultSetMetaData resultSetMetaData = resultSet.getMetaData(); + checkHeader(resultSetMetaData, title); + int count = 0; + while (resultSet.next()) { + assertEquals("2", resultSet.getString(1)); + assertEquals("Running", resultSet.getString(2)); + count++; + } + assertEquals(1, count); + } + } catch (SQLException e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } +} diff --git a/iotdb-core/ainode/pyproject.toml b/iotdb-core/ainode/pyproject.toml index 51e86bbce09..9e9c13b895c 100644 --- a/iotdb-core/ainode/pyproject.toml +++ b/iotdb-core/ainode/pyproject.toml @@ -50,7 +50,7 @@ python = ">=3.8, <3.13" numpy = "^1.21.4" pandas = "^1.3.5" -torch = "2.1.0" +torch = "2.2.0" pylru = "^1.2.1" thrift = "^0.13.0" diff --git a/iotdb-core/ainode/resources/conf/iotdb-ainode.properties b/iotdb-core/ainode/resources/conf/iotdb-ainode.properties index 52b3dbb1bb0..2b208e72125 100644 --- a/iotdb-core/ainode/resources/conf/iotdb-ainode.properties +++ b/iotdb-core/ainode/resources/conf/iotdb-ainode.properties @@ -19,22 +19,22 @@ # Used for indicate cluster name and distinguish different cluster. # Datatype: string -cluster_name=defaultCluster +# cluster_name=defaultCluster # ConfigNode address registered at AINode startup # Allow modifications only before starting the service for the first time # Datatype: String -ain_seed_config_node=127.0.0.1:10710 +# ain_seed_config_node=127.0.0.1:10710 # Used for connection of DataNode/ConfigNode clients # Could set 127.0.0.1(for local test) or ipv4 address # Datatype: String -ain_inference_rpc_address=127.0.0.1 +# ain_inference_rpc_address=127.0.0.1 # Used for connection of DataNode/ConfigNode clients # Bind with MN_RPC_ADDRESS # Datatype: String -ain_inference_rpc_port=10810 +# ain_inference_rpc_port=10810 # The AINode metadata storage path. # The starting directory of the relative path is related to the operating system. diff --git a/iotdb-core/confignode/src/test/resources/confignode1conf/iotdb-system.properties b/iotdb-core/confignode/src/test/resources/confignode1conf/iotdb-system.properties index b396e373f86..508ab394aa3 100644 --- a/iotdb-core/confignode/src/test/resources/confignode1conf/iotdb-system.properties +++ b/iotdb-core/confignode/src/test/resources/confignode1conf/iotdb-system.properties @@ -33,8 +33,8 @@ cn_metric_prometheus_reporter_port=9091 timestamp_precision=ms data_region_consensus_protocol_class=org.apache.iotdb.consensus.iot.IoTConsensus schema_region_consensus_protocol_class=org.apache.iotdb.consensus.ratis.RatisConsensus -schema_replication_factor=3 -data_replication_factor=3 +schema_replication_factor=1 +data_replication_factor=1 udf_lib_dir=target/confignode1/ext/udf trigger_lib_dir=target/confignode1/ext/trigger pipe_lib_dir=target/confignode1/ext/pipe diff --git a/pom.xml b/pom.xml index 2f796c7233d..68a7a9830de 100644 --- a/pom.xml +++ b/pom.xml @@ -779,6 +779,7 @@ <exclude>**/.gitignore</exclude> <exclude>**/.gitmodules</exclude> <exclude>**/.git-blame-ignore-revs</exclude> + <exclude>**/git.properties</exclude> <!-- Maven related files --> <exclude>**/target/**</exclude> <!-- Eclipse related files --> @@ -821,11 +822,9 @@ <exclude>client-go/rpc/*</exclude> <!-- python --> <exclude>.pytest_cache/**</exclude> - <exclude>venv/**</exclude> + <exclude>**/venv/**</exclude> <exclude>apache_iotdb.egg-info/**</exclude> - <exclude>**/iotdb/thrift/__init__.py</exclude> - <exclude>**/iotdb/thrift/rpc/__init__.py</exclude> - <exclude>**/iotdb/thrift/common/__init__.py</exclude> + <exclude>**/thrift/**/__init__.py</exclude> <!-- Java SPI uses files in resources/META-INF/services--> <exclude>**/resources/META-INF/services/**</exclude> <!-- site-->
