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

tkalkirill pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new c24e6e0497 IGNITE-20146 Add improvements to the catalog associated 
with the DistributionZone (#2403)
c24e6e0497 is described below

commit c24e6e0497f054fbedbc7e474dadddd3a4210260
Author: Kirill Tkalenko <[email protected]>
AuthorDate: Fri Aug 4 11:54:21 2023 +0300

    IGNITE-20146 Add improvements to the catalog associated with the 
DistributionZone (#2403)
---
 modules/catalog/build.gradle                       |   6 +
 .../ignite/internal/catalog/CatalogManager.java    |   8 +-
 .../internal/catalog/CatalogManagerImpl.java       |  82 ++--
 .../catalog/CatalogParamsValidationUtils.java      | 181 +++++++
 .../catalog/CatalogValidationException.java        |  53 ++
 .../internal/catalog/commands/AlterZoneParams.java |  20 +
 .../internal/catalog/commands/CatalogUtils.java    |  29 ++
 .../catalog/commands/CreateZoneParams.java         |  49 +-
 ...{DropZoneParams.java => DataStorageParams.java} |  56 ++-
 .../internal/catalog/commands/DropZoneParams.java  |  41 +-
 .../descriptors/CatalogDataStorageDescriptor.java  |   1 +
 .../internal/catalog/BaseCatalogManagerTest.java   |  84 ++++
 .../internal/catalog/CatalogManagerSelfTest.java   | 104 ++--
 .../catalog/CatalogManagerValidationTest.java      | 541 +++++++++++++++++++++
 .../ignite/lang/IgniteInternalException.java       |  13 +
 .../engine/exec/ddl/DdlCommandHandlerWrapper.java  |   8 +-
 16 files changed, 1077 insertions(+), 199 deletions(-)

diff --git a/modules/catalog/build.gradle b/modules/catalog/build.gradle
index 5fb5e02c74..0b6576cff0 100644
--- a/modules/catalog/build.gradle
+++ b/modules/catalog/build.gradle
@@ -28,8 +28,14 @@ dependencies {
     implementation project(':ignite-configuration')
     implementation project(':ignite-metastorage-api')
     implementation project(':ignite-vault')
+
     implementation libs.jetbrains.annotations
     implementation libs.auto.service.annotations
+    implementation(libs.jsonpath.core) {
+        //IDEA test runner doesn't apply Gradle dependency resolve strategy, 
this is just not implemented
+        //So, exclude asm-core transitive dependency to protect of jar-hell.
+        exclude group: 'org.ow2.asm', module: 'asm'
+    }
 
     testImplementation(testFixtures(project(':ignite-core')))
     testImplementation(testFixtures(project(':ignite-metastorage')))
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManager.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManager.java
index 1d91cc35de..b80885e49e 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManager.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManager.java
@@ -106,7 +106,7 @@ public interface CatalogManager extends IgniteComponent, 
CatalogService {
      * @param params Parameters.
      * @return Operation future.
      */
-    CompletableFuture<Void> createDistributionZone(CreateZoneParams params);
+    CompletableFuture<Void> createZone(CreateZoneParams params);
 
     /**
      * Drops distribution zone.
@@ -114,7 +114,7 @@ public interface CatalogManager extends IgniteComponent, 
CatalogService {
      * @param params Parameters.
      * @return Operation future.
      */
-    CompletableFuture<Void> dropDistributionZone(DropZoneParams params);
+    CompletableFuture<Void> dropZone(DropZoneParams params);
 
     /**
      * Alter distribution zone.
@@ -122,7 +122,7 @@ public interface CatalogManager extends IgniteComponent, 
CatalogService {
      * @param params Parameters.
      * @return Operation future.
      */
-    CompletableFuture<Void> alterDistributionZone(AlterZoneParams params);
+    CompletableFuture<Void> alterZone(AlterZoneParams params);
 
     /**
      * Rename distribution zone.
@@ -130,5 +130,5 @@ public interface CatalogManager extends IgniteComponent, 
CatalogService {
      * @param params Parameters.
      * @return Operation future.
      */
-    CompletableFuture<Void> renameDistributionZone(RenameZoneParams params);
+    CompletableFuture<Void> renameZone(RenameZoneParams params);
 }
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
index a6b29af3cb..67cff40275 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
@@ -20,7 +20,13 @@ package org.apache.ignite.internal.catalog;
 import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static java.util.stream.Collectors.joining;
-import static 
org.apache.ignite.internal.catalog.commands.CreateZoneParams.INFINITE_TIMER_VALUE;
+import static 
org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateAlterZoneParams;
+import static 
org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateCreateZoneParams;
+import static 
org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateDropZoneParams;
+import static 
org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateRenameZoneParams;
+import static 
org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateZoneDataNodesAutoAdjustParametersCompatibility;
+import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_FILTER;
+import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.INFINITE_TIMER_VALUE;
 import static org.apache.ignite.lang.ErrorGroups.Sql.STMT_VALIDATION_ERR;
 
 import java.util.ArrayList;
@@ -168,7 +174,7 @@ public class CatalogManagerImpl extends 
Producer<CatalogEvent, CatalogEventParam
                 INFINITE_TIMER_VALUE,
                 INFINITE_TIMER_VALUE,
                 INFINITE_TIMER_VALUE,
-                CreateZoneParams.DEFAULT_FILTER
+                DEFAULT_FILTER
         );
 
         registerCatalog(new Catalog(0, 0L, objectIdGen, List.of(defaultZone), 
List.of(schemaPublic)));
@@ -467,14 +473,12 @@ public class CatalogManagerImpl extends 
Producer<CatalogEvent, CatalogEventParam
     }
 
     @Override
-    public CompletableFuture<Void> createDistributionZone(CreateZoneParams 
params) {
+    public CompletableFuture<Void> createZone(CreateZoneParams params) {
         return saveUpdateAndWaitForActivation(catalog -> {
             validateCreateZoneParams(params);
 
-            String zoneName = Objects.requireNonNull(params.zoneName(), 
"zone");
-
             if (catalog.zone(params.zoneName()) != null) {
-                throw new DistributionZoneAlreadyExistsException(zoneName);
+                throw new 
DistributionZoneAlreadyExistsException(params.zoneName());
             }
 
             CatalogZoneDescriptor zone = 
CatalogUtils.fromParams(catalog.objectIdGenState(), params);
@@ -487,8 +491,10 @@ public class CatalogManagerImpl extends 
Producer<CatalogEvent, CatalogEventParam
     }
 
     @Override
-    public CompletableFuture<Void> dropDistributionZone(DropZoneParams params) 
{
+    public CompletableFuture<Void> dropZone(DropZoneParams params) {
         return saveUpdateAndWaitForActivation(catalog -> {
+            validateDropZoneParams(params);
+
             CatalogZoneDescriptor zone = getZone(catalog, params.zoneName());
 
             if (zone.name().equals(DEFAULT_ZONE_NAME)) {
@@ -506,15 +512,15 @@ public class CatalogManagerImpl extends 
Producer<CatalogEvent, CatalogEventParam
                         throw new 
DistributionZoneBindTableException(zone.name(), t.name());
                     });
 
-            return List.of(
-                    new DropZoneEntry(zone.id())
-            );
+            return List.of(new DropZoneEntry(zone.id()));
         });
     }
 
     @Override
-    public CompletableFuture<Void> renameDistributionZone(RenameZoneParams 
params) {
+    public CompletableFuture<Void> renameZone(RenameZoneParams params) {
         return saveUpdateAndWaitForActivation(catalog -> {
+            validateRenameZoneParams(params);
+
             CatalogZoneDescriptor zone = getZone(catalog, params.zoneName());
 
             if (catalog.zone(params.newZoneName()) != null) {
@@ -544,31 +550,32 @@ public class CatalogManagerImpl extends 
Producer<CatalogEvent, CatalogEventParam
     }
 
     @Override
-    public CompletableFuture<Void> alterDistributionZone(AlterZoneParams 
params) {
+    public CompletableFuture<Void> alterZone(AlterZoneParams params) {
         return saveUpdateAndWaitForActivation(catalog -> {
+            validateAlterZoneParams(params);
+
             CatalogZoneDescriptor zone = getZone(catalog, params.zoneName());
 
-            Integer dataNodesAutoAdjust = params.dataNodesAutoAdjust();
-            Integer dataNodesAutoAdjustScaleUp = 
params.dataNodesAutoAdjustScaleUp();
-            Integer dataNodesAutoAdjustScaleDown = 
params.dataNodesAutoAdjustScaleDown();
+            Integer dataNodesAutoAdjust = Objects.requireNonNullElse(
+                    params.dataNodesAutoAdjust(),
+                    zone.dataNodesAutoAdjust()
+            );
 
-            if (dataNodesAutoAdjust == null && dataNodesAutoAdjustScaleUp == 
null && dataNodesAutoAdjustScaleDown == null) {
-                dataNodesAutoAdjust = zone.dataNodesAutoAdjust();
-                dataNodesAutoAdjustScaleUp = zone.dataNodesAutoAdjustScaleUp();
-                dataNodesAutoAdjustScaleDown = 
zone.dataNodesAutoAdjustScaleDown();
-            } else {
-                if (dataNodesAutoAdjust != null && (dataNodesAutoAdjustScaleUp 
!= null || dataNodesAutoAdjustScaleDown != null)) {
-                    throw new IgniteInternalException(
-                            DistributionZones.ZONE_DEFINITION_ERR,
-                            "Not compatible dataNodes parameters 
[autoAdjust={}, autoAdjustScaleUp={}, autoAdjustScaleDown={}]",
-                            params.dataNodesAutoAdjust(), 
params.dataNodesAutoAdjustScaleUp(), params.dataNodesAutoAdjustScaleDown()
-                    );
-                }
+            Integer dataNodesAutoAdjustScaleUp = Objects.requireNonNullElse(
+                    params.dataNodesAutoAdjustScaleUp(),
+                    zone.dataNodesAutoAdjustScaleUp()
+            );
 
-                dataNodesAutoAdjust = 
Objects.requireNonNullElse(params.dataNodesAutoAdjust(), INFINITE_TIMER_VALUE);
-                dataNodesAutoAdjustScaleUp = 
Objects.requireNonNullElse(params.dataNodesAutoAdjustScaleUp(), 
INFINITE_TIMER_VALUE);
-                dataNodesAutoAdjustScaleDown = 
Objects.requireNonNullElse(params.dataNodesAutoAdjustScaleDown(), 
INFINITE_TIMER_VALUE);
-            }
+            Integer dataNodesAutoAdjustScaleDown = Objects.requireNonNullElse(
+                    params.dataNodesAutoAdjustScaleDown(),
+                    zone.dataNodesAutoAdjustScaleDown()
+            );
+
+            validateZoneDataNodesAutoAdjustParametersCompatibility(
+                    dataNodesAutoAdjust,
+                    dataNodesAutoAdjustScaleUp,
+                    dataNodesAutoAdjustScaleDown
+            );
 
             CatalogZoneDescriptor descriptor = new CatalogZoneDescriptor(
                     zone.id(),
@@ -885,19 +892,6 @@ public class CatalogManagerImpl extends 
Producer<CatalogEvent, CatalogEventParam
         }
     }
 
-    private static void validateCreateZoneParams(CreateZoneParams params) {
-        if (params.dataNodesAutoAdjust() != INFINITE_TIMER_VALUE
-                && (params.dataNodesAutoAdjustScaleUp() != INFINITE_TIMER_VALUE
-                || params.dataNodesAutoAdjustScaleDown() != 
INFINITE_TIMER_VALUE)
-        ) {
-            throw new IgniteInternalException(
-                    DistributionZones.ZONE_DEFINITION_ERR,
-                    "Not compatible parameters [dataNodesAutoAdjust={}, 
dataNodesAutoAdjustScaleUp={}, dataNodesAutoAdjustScaleDown={}]",
-                    params.dataNodesAutoAdjust(), 
params.dataNodesAutoAdjustScaleUp(), params.dataNodesAutoAdjustScaleDown()
-            );
-        }
-    }
-
     private static void validateIndexColumns(List<String> indexColumns, 
CatalogTableDescriptor table) {
         if (indexColumns.isEmpty()) {
             throw new IgniteInternalException(
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogParamsValidationUtils.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogParamsValidationUtils.java
new file mode 100644
index 0000000000..2e472b3856
--- /dev/null
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogParamsValidationUtils.java
@@ -0,0 +1,181 @@
+/*
+ * 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.ignite.internal.catalog;
+
+import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.INFINITE_TIMER_VALUE;
+import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.MAX_PARTITION_COUNT;
+
+import com.jayway.jsonpath.InvalidPathException;
+import com.jayway.jsonpath.JsonPath;
+import org.apache.ignite.internal.catalog.commands.AlterZoneParams;
+import org.apache.ignite.internal.catalog.commands.CreateZoneParams;
+import org.apache.ignite.internal.catalog.commands.DropZoneParams;
+import org.apache.ignite.internal.catalog.commands.RenameZoneParams;
+import org.apache.ignite.internal.util.StringUtils;
+import org.apache.ignite.lang.ErrorGroups.DistributionZones;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Utility class for validating catalog commands parameters.
+ */
+class CatalogParamsValidationUtils {
+    static void validateCreateZoneParams(CreateZoneParams params) {
+        validateUpdateZoneFieldsParameters(
+                params.zoneName(),
+                params.partitions(),
+                params.replicas(),
+                params.dataNodesAutoAdjust(),
+                params.dataNodesAutoAdjustScaleUp(),
+                params.dataNodesAutoAdjustScaleDown(),
+                params.filter()
+        );
+    }
+
+    static void validateAlterZoneParams(AlterZoneParams params) {
+        validateUpdateZoneFieldsParameters(
+                params.zoneName(),
+                params.partitions(),
+                params.replicas(),
+                params.dataNodesAutoAdjust(),
+                params.dataNodesAutoAdjustScaleUp(),
+                params.dataNodesAutoAdjustScaleDown(),
+                params.filter()
+        );
+    }
+
+    static void validateDropZoneParams(DropZoneParams params) {
+        validateZoneName(params.zoneName());
+    }
+
+    static void validateRenameZoneParams(RenameZoneParams params) {
+        validateZoneName(params.zoneName());
+        validateZoneName(params.newZoneName(), "Missing new zone name");
+    }
+
+    private static void validateUpdateZoneFieldsParameters(
+            String zoneName,
+            @Nullable Integer partitions,
+            @Nullable Integer replicas,
+            @Nullable Integer dataNodesAutoAdjust,
+            @Nullable Integer dataNodesAutoAdjustScaleUp,
+            @Nullable Integer dataNodesAutoAdjustScaleDown,
+            @Nullable String filter
+    ) {
+        validateZoneName(zoneName);
+
+        validateZonePartitions(partitions);
+        validateZoneReplicas(replicas);
+
+        validateZoneDataNodesAutoAdjust(dataNodesAutoAdjust);
+        validateZoneDataNodesAutoAdjustScaleUp(dataNodesAutoAdjustScaleUp);
+        validateZoneDataNodesAutoAdjustScaleDown(dataNodesAutoAdjustScaleDown);
+
+        validateZoneDataNodesAutoAdjustParametersCompatibility(
+                dataNodesAutoAdjust,
+                dataNodesAutoAdjustScaleUp,
+                dataNodesAutoAdjustScaleDown
+        );
+
+        validateZoneFilter(filter);
+    }
+
+    private static void validateZoneName(String zoneName) {
+        validateZoneName(zoneName, "Missing zone name");
+    }
+
+    private static void validateZoneName(String zoneName, String errorMessage) 
{
+        if (StringUtils.nullOrBlank(zoneName)) {
+            throw new CatalogValidationException(
+                    DistributionZones.ZONE_DEFINITION_ERR,
+                    errorMessage
+            );
+        }
+    }
+
+    private static void validateZonePartitions(@Nullable Integer partitions) {
+        validateZoneField(partitions, 1, MAX_PARTITION_COUNT, "Invalid number 
of partitions");
+    }
+
+    private static void validateZoneReplicas(@Nullable Integer replicas) {
+        validateZoneField(replicas, 1, null, "Invalid number of replicas");
+    }
+
+    private static void validateZoneDataNodesAutoAdjust(@Nullable Integer 
dataNodesAutoAdjust) {
+        validateZoneField(dataNodesAutoAdjust, 0, null, "Invalid data nodes 
auto adjust");
+    }
+
+    private static void validateZoneDataNodesAutoAdjustScaleUp(@Nullable 
Integer dataNodesAutoAdjustScaleUp) {
+        validateZoneField(dataNodesAutoAdjustScaleUp, 0, null, "Invalid data 
nodes auto adjust scale up");
+    }
+
+    private static void validateZoneDataNodesAutoAdjustScaleDown(@Nullable 
Integer dataNodesAutoAdjustScaleDown) {
+        validateZoneField(dataNodesAutoAdjustScaleDown, 0, null, "Invalid data 
nodes auto adjust scale down");
+    }
+
+    static void validateZoneDataNodesAutoAdjustParametersCompatibility(
+            @Nullable Integer dataNodesAutoAdjust,
+            @Nullable Integer dataNodesAutoAdjustScaleUp,
+            @Nullable Integer dataNodesAutoAdjustScaleDown
+    ) {
+        if (dataNodesAutoAdjust == null || dataNodesAutoAdjust == 
INFINITE_TIMER_VALUE) {
+            return;
+        }
+
+        if ((dataNodesAutoAdjustScaleUp != null && dataNodesAutoAdjustScaleUp 
!= INFINITE_TIMER_VALUE)
+                || (dataNodesAutoAdjustScaleDown != null && 
dataNodesAutoAdjustScaleDown != INFINITE_TIMER_VALUE)) {
+            throw new CatalogValidationException(
+                    DistributionZones.ZONE_DEFINITION_ERR,
+                    "Not compatible parameters [dataNodesAutoAdjust={}, 
dataNodesAutoAdjustScaleUp={}, dataNodesAutoAdjustScaleDown={}]",
+                    dataNodesAutoAdjust, dataNodesAutoAdjustScaleUp, 
dataNodesAutoAdjustScaleDown
+            );
+        }
+    }
+
+    private static void validateZoneFilter(@Nullable String filter) {
+        if (filter == null) {
+            return;
+        }
+
+        try {
+            JsonPath.compile(filter);
+        } catch (InvalidPathException e) {
+            String error = e.getMessage() == null ? "Unknown JsonPath 
compilation error." : e.getMessage();
+
+            throw new CatalogValidationException(
+                    DistributionZones.ZONE_DEFINITION_ERR,
+                    "Invalid filter: [value={}, error={}]",
+                    e,
+                    filter, error
+            );
+        }
+    }
+
+    private static void validateZoneField(@Nullable Integer value, int min, 
@Nullable Integer max, String errorPrefix) {
+        if (value == null) {
+            return;
+        }
+
+        if (value < min || (max != null && value > max)) {
+            throw new CatalogValidationException(
+                    DistributionZones.ZONE_DEFINITION_ERR,
+                    "{}: [value={}, min={}" + (max == null ? ']' : ", 
max={}]"),
+                    errorPrefix, value, min, max
+            );
+        }
+    }
+}
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogValidationException.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogValidationException.java
new file mode 100644
index 0000000000..430b70912e
--- /dev/null
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogValidationException.java
@@ -0,0 +1,53 @@
+/*
+ * 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.ignite.internal.catalog;
+
+import org.apache.ignite.lang.IgniteInternalException;
+import org.apache.ignite.lang.IgniteStringFormatter;
+
+/**
+ * Catalog validation exception.
+ */
+public class CatalogValidationException extends IgniteInternalException {
+    private static final long serialVersionUID = 2692301541251354006L;
+
+    /**
+     * Constructor.
+     *
+     * @param code Full error code.
+     * @param messagePattern Error message pattern.
+     * @param params Error message params.
+     * @see IgniteStringFormatter#format(String, Object...)
+     */
+    CatalogValidationException(int code, String messagePattern, Object... 
params) {
+        super(code, messagePattern, params);
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param code Full error code.
+     * @param messagePattern Error message pattern.
+     * @param cause Non-null throwable cause.
+     * @param params Error message params.
+     * @see IgniteStringFormatter#format(String, Object...)
+     */
+    CatalogValidationException(int code, String messagePattern, Throwable 
cause, Object... params) {
+        super(code, messagePattern, cause, params);
+    }
+}
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AlterZoneParams.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AlterZoneParams.java
index d44a26f3f9..85388020c2 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AlterZoneParams.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AlterZoneParams.java
@@ -46,6 +46,9 @@ public class AlterZoneParams extends 
AbstractZoneCommandParams {
     /* Nodes' filter. */
     private @Nullable String filter;
 
+    /** Data storage. */
+    private @Nullable DataStorageParams dataStorage;
+
     /**
      * Gets number of zone replicas.
      *
@@ -100,6 +103,11 @@ public class AlterZoneParams extends 
AbstractZoneCommandParams {
         return dataNodesAutoAdjustScaleDown;
     }
 
+    /** Returns the data storage, {@code null} if not set. */
+    public @Nullable DataStorageParams dataStorage() {
+        return dataStorage;
+    }
+
     /**
      * Parameters builder.
      */
@@ -179,5 +187,17 @@ public class AlterZoneParams extends 
AbstractZoneCommandParams {
 
             return this;
         }
+
+        /**
+         * Sets the data storage.
+         *
+         * @param dataStorage Data storage.
+         * @return This instance.
+         */
+        public Builder dataStorage(@Nullable DataStorageParams dataStorage) {
+            params.dataStorage = dataStorage;
+
+            return this;
+        }
     }
 }
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
index d085f4ca0d..99f31b6f29 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
@@ -38,6 +38,35 @@ import org.apache.ignite.sql.ColumnType;
  * Catalog utils.
  */
 public class CatalogUtils {
+    /** Default number of distribution zone partitions. */
+    public static final int DEFAULT_PARTITION_COUNT = 25;
+
+    /** Default number of distribution zone replicas. */
+    public static final int DEFAULT_REPLICA_COUNT = 1;
+
+    /**
+     * Default filter of distribution zone, which is a {@link 
com.jayway.jsonpath.JsonPath} expression for including all attributes of
+     * nodes.
+     */
+    public static final String DEFAULT_FILTER = "$.+";
+
+    /** Default distribution zone storage engine. */
+    // TODO: IGNITE-19719 Should be defined differently
+    public static final String DEFAULT_STORAGE_ENGINE = "aipersist";
+
+    /** Default distribution zone storage engine data region. */
+    // TODO: IGNITE-19719 Must be storage engine specific
+    public static final String DEFAULT_DATA_REGION = "default";
+
+    /** Infinite value for the distribution zone timers. */
+    public static final int INFINITE_TIMER_VALUE = Integer.MAX_VALUE;
+
+    /** Value for the distribution zone timers which means that data nodes 
changing will be started without waiting. */
+    public static final int IMMEDIATE_TIMER_VALUE = 0;
+
+    /** Max number of distribution zone partitions. */
+    public static final int MAX_PARTITION_COUNT = 65_000;
+
     private static final Map<ColumnType, Set<ColumnType>> 
ALTER_COLUMN_TYPE_TRANSITIONS = new EnumMap<>(ColumnType.class);
 
     static {
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateZoneParams.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateZoneParams.java
index 2ac83df8f3..9177a03d6d 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateZoneParams.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateZoneParams.java
@@ -17,6 +17,13 @@
 
 package org.apache.ignite.internal.catalog.commands;
 
+import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_DATA_REGION;
+import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_FILTER;
+import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_PARTITION_COUNT;
+import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_REPLICA_COUNT;
+import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_STORAGE_ENGINE;
+import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.INFINITE_TIMER_VALUE;
+
 import java.util.Objects;
 import org.jetbrains.annotations.Nullable;
 
@@ -29,13 +36,6 @@ public class CreateZoneParams extends 
AbstractZoneCommandParams {
         return new Builder();
     }
 
-    /** Default number of zone partitions. */
-    public static final int DEFAULT_PARTITION_COUNT = 25;
-    /** Default number of zone replicas. */
-    public static final int DEFAULT_REPLICA_COUNT = 1;
-    /** Default infinite value for the distribution zones' timers. */
-    public static final int INFINITE_TIMER_VALUE = Integer.MAX_VALUE;
-
     /** Amount of zone partitions. */
     private int partitions = DEFAULT_PARTITION_COUNT;
 
@@ -51,13 +51,14 @@ public class CreateZoneParams extends 
AbstractZoneCommandParams {
     /** Data nodes auto adjust scale down timeout. */
     private int dataNodesAutoAdjustScaleDown = INFINITE_TIMER_VALUE;
 
-    /**
-     * Default filter value for a distribution zone, which is a {@link 
com.jayway.jsonpath.JsonPath} expression for including all attributes
-     * of nodes.
-     */
-    public static final String DEFAULT_FILTER = "$.+";
     /** Nodes' filter. */
-    protected String filter = DEFAULT_FILTER;
+    private String filter = DEFAULT_FILTER;
+
+    /** Data storage. */
+    private DataStorageParams dataStorage = DataStorageParams.builder()
+            .engine(DEFAULT_STORAGE_ENGINE)
+            .dataRegion(DEFAULT_DATA_REGION)
+            .build();
 
     /**
      * Returns amount of zone partitions.
@@ -67,7 +68,7 @@ public class CreateZoneParams extends 
AbstractZoneCommandParams {
     }
 
     /**
-     * Return amount of zone replicas.
+     * Returns amount of zone replicas.
      */
     public int replicas() {
         return replicas;
@@ -109,6 +110,11 @@ public class CreateZoneParams extends 
AbstractZoneCommandParams {
         return filter;
     }
 
+    /** Returns the data storage. */
+    public DataStorageParams dataStorage() {
+        return dataStorage;
+    }
+
     /**
      * Parameters builder.
      */
@@ -187,5 +193,20 @@ public class CreateZoneParams extends 
AbstractZoneCommandParams {
 
             return this;
         }
+
+        /**
+         * Sets the data storage.
+         *
+         * @param dataStorage Data storage.
+         * @return This instance.
+         */
+        public Builder dataStorage(@Nullable DataStorageParams dataStorage) {
+            params.dataStorage = Objects.requireNonNullElse(
+                    dataStorage,
+                    
DataStorageParams.builder().engine(DEFAULT_STORAGE_ENGINE).dataRegion(DEFAULT_DATA_REGION).build()
+            );
+
+            return this;
+        }
     }
 }
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropZoneParams.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DataStorageParams.java
similarity index 51%
copy from 
modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropZoneParams.java
copy to 
modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DataStorageParams.java
index 956772f3bd..7b81ead830 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropZoneParams.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DataStorageParams.java
@@ -18,54 +18,72 @@
 package org.apache.ignite.internal.catalog.commands;
 
 /**
- * DROP ZONE statement.
+ * Define a data storage.
  */
-public class DropZoneParams implements DdlCommandParams {
+// TODO: IGNITE-19719 Must be storage engine specific
+// TODO: IGNITE-19719 Implement validation of engines and their parameters
+public class DataStorageParams {
     /** Creates parameters builder. */
     public static Builder builder() {
         return new Builder();
     }
 
-    /** Distribution zone name. */
-    protected String zoneName;
+    private String engine;
+
+    private String dataRegion;
 
     /**
-     * Returns distribution zone name.
+     * Returns the storage engine name.
      */
-    public String zoneName() {
-        return zoneName;
+    public String engine() {
+        return engine;
     }
 
     /**
-     * Parameters builder.
+     * Returns the data region name within the storage engine.
      */
+    public String dataRegion() {
+        return dataRegion;
+    }
+
+    /** Parameters builder. */
     public static class Builder {
-        DropZoneParams params;
+        private DataStorageParams params;
 
-        Builder() {
-            params = new DropZoneParams();
+        private Builder() {
+            params = new DataStorageParams();
         }
 
         /**
-         * Sets distribution zone name.
+         * Sets the storage engine name.
          *
-         * @param zoneName Distribution zone name.
+         * @param engine Storage engine name.
          * @return {@code this}.
          */
-        public Builder zoneName(String zoneName) {
-            params.zoneName = zoneName;
+        public Builder engine(String engine) {
+            params.engine = engine;
 
             return this;
         }
 
         /**
-         * Builds parameters.
+         * Sets the data region name within the storage engine.
          *
-         * @return Parameters.
+         * @param dataRegion Data region name within the storage engine.
+         * @return {@code this}.
          */
-        public DropZoneParams build() {
-            DropZoneParams params0 = params;
+        public Builder dataRegion(String dataRegion) {
+            params.dataRegion = dataRegion;
+
+            return this;
+        }
+
+        /** Builds parameters. */
+        public DataStorageParams build() {
+            DataStorageParams params0 = params;
+
             params = null;
+
             return params0;
         }
     }
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropZoneParams.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropZoneParams.java
index 956772f3bd..2bc0b41b3b 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropZoneParams.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropZoneParams.java
@@ -20,53 +20,18 @@ package org.apache.ignite.internal.catalog.commands;
 /**
  * DROP ZONE statement.
  */
-public class DropZoneParams implements DdlCommandParams {
+public class DropZoneParams extends AbstractZoneCommandParams {
     /** Creates parameters builder. */
     public static Builder builder() {
         return new Builder();
     }
 
-    /** Distribution zone name. */
-    protected String zoneName;
-
-    /**
-     * Returns distribution zone name.
-     */
-    public String zoneName() {
-        return zoneName;
-    }
-
     /**
      * Parameters builder.
      */
-    public static class Builder {
-        DropZoneParams params;
-
+    public static class Builder extends AbstractBuilder<DropZoneParams, 
Builder> {
         Builder() {
-            params = new DropZoneParams();
-        }
-
-        /**
-         * Sets distribution zone name.
-         *
-         * @param zoneName Distribution zone name.
-         * @return {@code this}.
-         */
-        public Builder zoneName(String zoneName) {
-            params.zoneName = zoneName;
-
-            return this;
-        }
-
-        /**
-         * Builds parameters.
-         *
-         * @return Parameters.
-         */
-        public DropZoneParams build() {
-            DropZoneParams params0 = params;
-            params = null;
-            return params0;
+            super(new DropZoneParams());
         }
     }
 }
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogDataStorageDescriptor.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogDataStorageDescriptor.java
index 0b95360f94..b24efdcbee 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogDataStorageDescriptor.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogDataStorageDescriptor.java
@@ -23,6 +23,7 @@ import org.apache.ignite.internal.tostring.S;
 /**
  * Data storage descriptor.
  */
+// TODO: IGNITE-19719 Must be storage engine specific
 public class CatalogDataStorageDescriptor implements Serializable {
     private static final long serialVersionUID = -5268530663660582126L;
     private final String engine;
diff --git 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/BaseCatalogManagerTest.java
 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/BaseCatalogManagerTest.java
new file mode 100644
index 0000000000..05f54b0f1d
--- /dev/null
+++ 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/BaseCatalogManagerTest.java
@@ -0,0 +1,84 @@
+/*
+ * 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.ignite.internal.catalog;
+
+import static 
org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.spy;
+
+import java.util.Objects;
+import java.util.stream.Stream;
+import org.apache.ignite.internal.catalog.storage.UpdateLog;
+import org.apache.ignite.internal.catalog.storage.UpdateLogImpl;
+import org.apache.ignite.internal.hlc.HybridClock;
+import org.apache.ignite.internal.hlc.HybridClockImpl;
+import org.apache.ignite.internal.metastorage.MetaStorageManager;
+import 
org.apache.ignite.internal.metastorage.impl.StandaloneMetaStorageManager;
+import 
org.apache.ignite.internal.metastorage.server.SimpleInMemoryKeyValueStorage;
+import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
+import org.apache.ignite.internal.util.IgniteUtils;
+import org.apache.ignite.internal.vault.VaultManager;
+import org.apache.ignite.internal.vault.inmemory.InMemoryVaultService;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+/**
+ * Base class for testing the {@link CatalogManager}.
+ */
+public abstract class BaseCatalogManagerTest extends BaseIgniteAbstractTest {
+    private static final String NODE_NAME = "test";
+
+    final HybridClock clock = new HybridClockImpl();
+
+    private VaultManager vault;
+
+    private MetaStorageManager metastore;
+
+    UpdateLog updateLog;
+
+    ClockWaiter clockWaiter;
+
+    CatalogManagerImpl manager;
+
+    @BeforeEach
+    void setUp() {
+        vault = new VaultManager(new InMemoryVaultService());
+
+        metastore = StandaloneMetaStorageManager.create(vault, new 
SimpleInMemoryKeyValueStorage(NODE_NAME));
+
+        updateLog = spy(new UpdateLogImpl(metastore));
+        clockWaiter = spy(new ClockWaiter(NODE_NAME, clock));
+
+        manager = new CatalogManagerImpl(updateLog, clockWaiter);
+
+        vault.start();
+        metastore.start();
+        clockWaiter.start();
+        manager.start();
+
+        assertThat("Watches were not deployed", metastore.deployWatches(), 
willCompleteSuccessfully());
+    }
+
+    @AfterEach
+    public void tearDown() throws Exception {
+        IgniteUtils.closeAll(Stream.of(manager, clockWaiter, metastore, vault)
+                .filter(Objects::nonNull)
+                .map(component -> component::stop)
+        );
+    }
+}
diff --git 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
index 1a2c34c4d6..71641b9bf4 100644
--- 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
+++ 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
@@ -21,6 +21,10 @@ import static 
java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static 
org.apache.ignite.internal.catalog.CatalogService.DEFAULT_SCHEMA_NAME;
 import static 
org.apache.ignite.internal.catalog.CatalogService.DEFAULT_ZONE_NAME;
+import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_FILTER;
+import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_PARTITION_COUNT;
+import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_REPLICA_COUNT;
+import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.INFINITE_TIMER_VALUE;
 import static 
org.apache.ignite.internal.testframework.matchers.CompletableFutureExceptionMatcher.willThrow;
 import static 
org.apache.ignite.internal.testframework.matchers.CompletableFutureExceptionMatcher.willThrowFast;
 import static 
org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willBe;
@@ -46,7 +50,6 @@ import static org.mockito.Mockito.clearInvocations;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.timeout;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -99,19 +102,9 @@ import 
org.apache.ignite.internal.catalog.events.DropZoneEventParameters;
 import org.apache.ignite.internal.catalog.storage.ObjectIdGenUpdateEntry;
 import org.apache.ignite.internal.catalog.storage.UpdateLog;
 import org.apache.ignite.internal.catalog.storage.UpdateLog.OnUpdateHandler;
-import org.apache.ignite.internal.catalog.storage.UpdateLogImpl;
 import org.apache.ignite.internal.catalog.storage.VersionedUpdate;
-import org.apache.ignite.internal.hlc.HybridClock;
-import org.apache.ignite.internal.hlc.HybridClockImpl;
 import org.apache.ignite.internal.hlc.HybridTimestamp;
 import org.apache.ignite.internal.manager.EventListener;
-import org.apache.ignite.internal.metastorage.MetaStorageManager;
-import 
org.apache.ignite.internal.metastorage.impl.StandaloneMetaStorageManager;
-import 
org.apache.ignite.internal.metastorage.server.SimpleInMemoryKeyValueStorage;
-import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
-import org.apache.ignite.internal.util.IgniteUtils;
-import org.apache.ignite.internal.vault.VaultManager;
-import org.apache.ignite.internal.vault.inmemory.InMemoryVaultService;
 import org.apache.ignite.lang.ColumnAlreadyExistsException;
 import org.apache.ignite.lang.ColumnNotFoundException;
 import org.apache.ignite.lang.DistributionZoneAlreadyExistsException;
@@ -125,8 +118,6 @@ import org.apache.ignite.sql.ColumnType;
 import org.apache.ignite.sql.SqlException;
 import org.hamcrest.TypeSafeMatcher;
 import org.jetbrains.annotations.Nullable;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.EnumSource;
@@ -134,9 +125,9 @@ import org.junit.jupiter.params.provider.EnumSource.Mode;
 import org.mockito.ArgumentCaptor;
 
 /**
- * Catalog service self test.
+ * Catalog manager self test.
  */
-public class CatalogManagerSelfTest extends BaseIgniteAbstractTest {
+public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
     private static final String SCHEMA_NAME = DEFAULT_SCHEMA_NAME;
     private static final String ZONE_NAME = DEFAULT_ZONE_NAME;
     private static final String TABLE_NAME = "myTable";
@@ -145,46 +136,6 @@ public class CatalogManagerSelfTest extends 
BaseIgniteAbstractTest {
     private static final String NEW_COLUMN_NAME_2 = "NEWCOL2";
     private static final String INDEX_NAME = "myIndex";
 
-    private MetaStorageManager metastore;
-
-    private VaultManager vault;
-
-    private UpdateLog updateLog;
-
-    private CatalogManagerImpl manager;
-
-    private final HybridClock clock = new HybridClockImpl();
-
-    private ClockWaiter clockWaiter;
-
-    @BeforeEach
-    void setUp() {
-        vault = new VaultManager(new InMemoryVaultService());
-
-        metastore = StandaloneMetaStorageManager.create(vault, new 
SimpleInMemoryKeyValueStorage("test"));
-
-        clockWaiter = spy(new ClockWaiter("test", clock));
-        updateLog = spy(new UpdateLogImpl(metastore));
-        manager = new CatalogManagerImpl(updateLog, clockWaiter);
-
-        vault.start();
-        metastore.start();
-        clockWaiter.start();
-        manager.start();
-
-        assertThat("Watches were not deployed", metastore.deployWatches(), 
willCompleteSuccessfully());
-    }
-
-    @AfterEach
-    public void tearDown() throws Exception {
-        IgniteUtils.closeAll(
-                manager == null ? null : manager::stop,
-                clockWaiter == null ? null : clockWaiter::stop,
-                metastore == null ? null : metastore::stop,
-                vault == null ? null : vault::stop
-        );
-    }
-
     @Test
     public void testEmptyCatalog() {
         CatalogSchemaDescriptor schema = manager.schema(DEFAULT_SCHEMA_NAME, 
0);
@@ -206,12 +157,12 @@ public class CatalogManagerSelfTest extends 
BaseIgniteAbstractTest {
         // Default distribution zone must exists.
         CatalogZoneDescriptor zone = manager.zone(DEFAULT_ZONE_NAME, 
clock.nowLong());
         assertEquals(DEFAULT_ZONE_NAME, zone.name());
-        assertEquals(CreateZoneParams.DEFAULT_PARTITION_COUNT, 
zone.partitions());
-        assertEquals(CreateZoneParams.DEFAULT_REPLICA_COUNT, zone.replicas());
-        assertEquals(CreateZoneParams.DEFAULT_FILTER, zone.filter());
-        assertEquals(CreateZoneParams.INFINITE_TIMER_VALUE, 
zone.dataNodesAutoAdjust());
-        assertEquals(CreateZoneParams.INFINITE_TIMER_VALUE, 
zone.dataNodesAutoAdjustScaleUp());
-        assertEquals(CreateZoneParams.INFINITE_TIMER_VALUE, 
zone.dataNodesAutoAdjustScaleDown());
+        assertEquals(DEFAULT_PARTITION_COUNT, zone.partitions());
+        assertEquals(DEFAULT_REPLICA_COUNT, zone.replicas());
+        assertEquals(DEFAULT_FILTER, zone.filter());
+        assertEquals(INFINITE_TIMER_VALUE, zone.dataNodesAutoAdjust());
+        assertEquals(INFINITE_TIMER_VALUE, zone.dataNodesAutoAdjustScaleUp());
+        assertEquals(INFINITE_TIMER_VALUE, 
zone.dataNodesAutoAdjustScaleDown());
     }
 
     @Test
@@ -1311,7 +1262,7 @@ public class CatalogManagerSelfTest extends 
BaseIgniteAbstractTest {
                 .filter("expression")
                 .build();
 
-        assertThat(manager.createDistributionZone(params), 
willCompleteSuccessfully());
+        assertThat(manager.createZone(params), willCompleteSuccessfully());
 
         // Validate catalog version from the past.
         assertNull(manager.zone(zoneName, 0));
@@ -1343,7 +1294,7 @@ public class CatalogManagerSelfTest extends 
BaseIgniteAbstractTest {
                 .zoneName(zoneName)
                 .build();
 
-        assertThat(manager.createDistributionZone(createZoneParams), 
willCompleteSuccessfully());
+        assertThat(manager.createZone(createZoneParams), 
willCompleteSuccessfully());
 
         long beforeDropTimestamp = clock.nowLong();
 
@@ -1351,7 +1302,7 @@ public class CatalogManagerSelfTest extends 
BaseIgniteAbstractTest {
                 .zoneName(zoneName)
                 .build();
 
-        CompletableFuture<Void> fut = manager.dropDistributionZone(params);
+        CompletableFuture<Void> fut = manager.dropZone(params);
 
         assertThat(fut, willCompleteSuccessfully());
 
@@ -1368,7 +1319,7 @@ public class CatalogManagerSelfTest extends 
BaseIgniteAbstractTest {
         assertNull(manager.zone(zone.id(), clock.nowLong()));
 
         // Try to drop non-existing zone.
-        assertThat(manager.dropDistributionZone(params), 
willThrow(DistributionZoneNotFoundException.class));
+        assertThat(manager.dropZone(params), 
willThrow(DistributionZoneNotFoundException.class));
     }
 
     @Test
@@ -1381,7 +1332,7 @@ public class CatalogManagerSelfTest extends 
BaseIgniteAbstractTest {
                 .replicas(15)
                 .build();
 
-        assertThat(manager.createDistributionZone(createParams), 
willCompleteSuccessfully());
+        assertThat(manager.createZone(createParams), 
willCompleteSuccessfully());
 
         long beforeDropTimestamp = clock.nowLong();
 
@@ -1394,7 +1345,7 @@ public class CatalogManagerSelfTest extends 
BaseIgniteAbstractTest {
                 .newZoneName(newZoneName)
                 .build();
 
-        assertThat(manager.renameDistributionZone(renameZoneParams), 
willCompleteSuccessfully());
+        assertThat(manager.renameZone(renameZoneParams), 
willCompleteSuccessfully());
 
         // Validate catalog version from the past.
         CatalogZoneDescriptor zone = manager.zone(zoneName, 
beforeDropTimestamp);
@@ -1424,7 +1375,7 @@ public class CatalogManagerSelfTest extends 
BaseIgniteAbstractTest {
                 .partitions(42)
                 .replicas(15)
                 .build();
-        assertThat(manager.createDistributionZone(createParams), 
willThrow(IgniteInternalException.class));
+        assertThat(manager.createZone(createParams), 
willThrow(IgniteInternalException.class));
 
         // Validate default zone wasn't changed.
         assertSame(defaultZone, manager.zone(DEFAULT_ZONE_NAME, 
clock.nowLong()));
@@ -1436,7 +1387,7 @@ public class CatalogManagerSelfTest extends 
BaseIgniteAbstractTest {
                 .zoneName(DEFAULT_ZONE_NAME)
                 .newZoneName(newDefaultZoneName)
                 .build();
-        assertThat(manager.renameDistributionZone(renameZoneParams), 
willThrow(IgniteInternalException.class));
+        assertThat(manager.renameZone(renameZoneParams), 
willThrow(IgniteInternalException.class));
 
         // Validate default zone wasn't changed.
         assertNull(manager.zone(newDefaultZoneName, clock.nowLong()));
@@ -1446,7 +1397,7 @@ public class CatalogManagerSelfTest extends 
BaseIgniteAbstractTest {
         DropZoneParams dropZoneParams = DropZoneParams.builder()
                 .zoneName(DEFAULT_ZONE_NAME)
                 .build();
-        assertThat(manager.dropDistributionZone(dropZoneParams), 
willThrow(IgniteInternalException.class));
+        assertThat(manager.dropZone(dropZoneParams), 
willThrow(IgniteInternalException.class));
 
         // Validate default zone wasn't changed.
         assertSame(defaultZone, manager.zone(DEFAULT_ZONE_NAME, 
clock.nowLong()));
@@ -1468,13 +1419,14 @@ public class CatalogManagerSelfTest extends 
BaseIgniteAbstractTest {
                 .zoneName(zoneName)
                 .partitions(10)
                 .replicas(2)
+                .dataNodesAutoAdjust(INFINITE_TIMER_VALUE)
                 .dataNodesAutoAdjustScaleUp(3)
                 .dataNodesAutoAdjustScaleDown(4)
                 .filter("newExpression")
                 .build();
 
-        assertThat(manager.createDistributionZone(createParams), 
willCompleteSuccessfully());
-        assertThat(manager.alterDistributionZone(alterZoneParams), 
willCompleteSuccessfully());
+        assertThat(manager.createZone(createParams), 
willCompleteSuccessfully());
+        assertThat(manager.alterZone(alterZoneParams), 
willCompleteSuccessfully());
 
         // Validate actual catalog
         CatalogZoneDescriptor zone = manager.zone(zoneName, clock.nowLong());
@@ -1500,7 +1452,7 @@ public class CatalogManagerSelfTest extends 
BaseIgniteAbstractTest {
                 .replicas(15)
                 .build();
 
-        assertThat(manager.createDistributionZone(params), 
willCompleteSuccessfully());
+        assertThat(manager.createZone(params), willCompleteSuccessfully());
 
         // Try to create zone with same name.
         params = CreateZoneParams.builder()
@@ -1509,7 +1461,7 @@ public class CatalogManagerSelfTest extends 
BaseIgniteAbstractTest {
                 .replicas(1)
                 .build();
 
-        assertThat(manager.createDistributionZone(params), 
willThrowFast(DistributionZoneAlreadyExistsException.class));
+        assertThat(manager.createZone(params), 
willThrowFast(DistributionZoneAlreadyExistsException.class));
 
         // Validate zone was NOT changed
         CatalogZoneDescriptor zone = manager.zone(zoneName, clock.nowLong());
@@ -1541,13 +1493,13 @@ public class CatalogManagerSelfTest extends 
BaseIgniteAbstractTest {
         manager.listen(CatalogEvent.ZONE_CREATE, eventListener);
         manager.listen(CatalogEvent.ZONE_DROP, eventListener);
 
-        CompletableFuture<Void> fut = 
manager.createDistributionZone(createZoneParams);
+        CompletableFuture<Void> fut = manager.createZone(createZoneParams);
 
         assertThat(fut, willCompleteSuccessfully());
 
         verify(eventListener).notify(any(CreateZoneEventParameters.class), 
isNull());
 
-        fut = manager.dropDistributionZone(dropZoneParams);
+        fut = manager.dropZone(dropZoneParams);
 
         assertThat(fut, willCompleteSuccessfully());
 
diff --git 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerValidationTest.java
 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerValidationTest.java
new file mode 100644
index 0000000000..9988886802
--- /dev/null
+++ 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerValidationTest.java
@@ -0,0 +1,541 @@
+/*
+ * 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.ignite.internal.catalog;
+
+import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_FILTER;
+import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_PARTITION_COUNT;
+import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_REPLICA_COUNT;
+import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.IMMEDIATE_TIMER_VALUE;
+import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.INFINITE_TIMER_VALUE;
+import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.MAX_PARTITION_COUNT;
+import static 
org.apache.ignite.internal.testframework.matchers.CompletableFutureExceptionMatcher.willThrowFast;
+import static 
org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willBe;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.nullValue;
+
+import org.apache.ignite.internal.catalog.commands.AlterZoneParams;
+import org.apache.ignite.internal.catalog.commands.CreateZoneParams;
+import org.apache.ignite.internal.catalog.commands.DropZoneParams;
+import org.apache.ignite.internal.catalog.commands.RenameZoneParams;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Catalog manager validation test.
+ */
+public class CatalogManagerValidationTest extends BaseCatalogManagerTest {
+    private static final String ZONE_NAME = "test_zone";
+
+    @Test
+    void testValidateZoneNameOnCreateZone() {
+        assertThat(
+                manager.createZone(CreateZoneParams.builder().build()),
+                willThrowFast(CatalogValidationException.class, "Missing zone 
name")
+        );
+
+        assertThat(manager.createZone(createZoneBuilder(ZONE_NAME).build()), 
willBe(nullValue()));
+    }
+
+    @Test
+    void testValidateZoneNameOnAlterZone() {
+        assertThat(manager.createZone(createZoneBuilder(ZONE_NAME).build()), 
willBe(nullValue()));
+
+        assertThat(
+                manager.alterZone(AlterZoneParams.builder().build()),
+                willThrowFast(CatalogValidationException.class, "Missing zone 
name")
+        );
+
+        assertThat(manager.alterZone(alterZoneBuilder(ZONE_NAME).build()), 
willBe(nullValue()));
+    }
+
+    @Test
+    void testValidateZonePartitionsOnCreateZone() {
+        assertThat(
+                
manager.createZone(createZoneBuilder(ZONE_NAME).partitions(-1).build()),
+                willThrowFast(CatalogValidationException.class, "Invalid 
number of partitions")
+        );
+
+        assertThat(
+                
manager.createZone(createZoneBuilder(ZONE_NAME).partitions(0).build()),
+                willThrowFast(CatalogValidationException.class, "Invalid 
number of partitions")
+        );
+
+        assertThat(
+                
manager.createZone(createZoneBuilder(ZONE_NAME).partitions(65_001).build()),
+                willThrowFast(CatalogValidationException.class, "Invalid 
number of partitions")
+        );
+
+        // Let's check the success cases.
+        assertThat(manager.createZone(createZoneBuilder(ZONE_NAME + 
0).partitions(1).build()), willBe(nullValue()));
+        assertThat(manager.createZone(createZoneBuilder(ZONE_NAME + 
1).partitions(MAX_PARTITION_COUNT).build()), willBe(nullValue()));
+        assertThat(manager.createZone(createZoneBuilder(ZONE_NAME + 
2).partitions(10).build()), willBe(nullValue()));
+        assertThat(manager.createZone(createZoneBuilder(ZONE_NAME + 
3).partitions(DEFAULT_PARTITION_COUNT).build()), willBe(nullValue()));
+    }
+
+    @Test
+    void testValidateZonePartitionsOnAlterZone() {
+        assertThat(manager.createZone(createZoneBuilder(ZONE_NAME).build()), 
willBe(nullValue()));
+
+        assertThat(
+                
manager.alterZone(alterZoneBuilder(ZONE_NAME).partitions(-1).build()),
+                willThrowFast(CatalogValidationException.class, "Invalid 
number of partitions")
+        );
+
+        assertThat(
+                
manager.alterZone(alterZoneBuilder(ZONE_NAME).partitions(0).build()),
+                willThrowFast(CatalogValidationException.class, "Invalid 
number of partitions")
+        );
+
+        assertThat(
+                
manager.alterZone(alterZoneBuilder(ZONE_NAME).partitions(65_001).build()),
+                willThrowFast(CatalogValidationException.class, "Invalid 
number of partitions")
+        );
+
+        // Let's check the success cases.
+        
assertThat(manager.alterZone(alterZoneBuilder(ZONE_NAME).partitions(1).build()),
 willBe(nullValue()));
+        
assertThat(manager.alterZone(alterZoneBuilder(ZONE_NAME).partitions(MAX_PARTITION_COUNT).build()),
 willBe(nullValue()));
+        
assertThat(manager.alterZone(alterZoneBuilder(ZONE_NAME).partitions(10).build()),
 willBe(nullValue()));
+        
assertThat(manager.alterZone(alterZoneBuilder(ZONE_NAME).partitions(DEFAULT_PARTITION_COUNT).build()),
 willBe(nullValue()));
+    }
+
+    @Test
+    void testValidateZoneReplicasOnCreateZone() {
+        assertThat(
+                
manager.createZone(createZoneBuilder(ZONE_NAME).replicas(-1).build()),
+                willThrowFast(CatalogValidationException.class, "Invalid 
number of replicas")
+        );
+
+        assertThat(
+                
manager.createZone(createZoneBuilder(ZONE_NAME).replicas(0).build()),
+                willThrowFast(CatalogValidationException.class, "Invalid 
number of replicas")
+        );
+
+        // Let's check the success cases.
+        assertThat(manager.createZone(createZoneBuilder(ZONE_NAME + 
0).replicas(1).build()), willBe(nullValue()));
+        assertThat(manager.createZone(createZoneBuilder(ZONE_NAME + 
1).replicas(Integer.MAX_VALUE).build()), willBe(nullValue()));
+        assertThat(manager.createZone(createZoneBuilder(ZONE_NAME + 
2).replicas(DEFAULT_REPLICA_COUNT).build()), willBe(nullValue()));
+    }
+
+    @Test
+    void testValidateZoneReplicasOnAlterZone() {
+        assertThat(manager.createZone(createZoneBuilder(ZONE_NAME).build()), 
willBe(nullValue()));
+
+        assertThat(
+                
manager.alterZone(alterZoneBuilder(ZONE_NAME).replicas(-1).build()),
+                willThrowFast(CatalogValidationException.class, "Invalid 
number of replicas")
+        );
+
+        assertThat(
+                
manager.alterZone(alterZoneBuilder(ZONE_NAME).replicas(0).build()),
+                willThrowFast(CatalogValidationException.class, "Invalid 
number of replicas")
+        );
+
+        // Let's check the success cases.
+        
assertThat(manager.alterZone(alterZoneBuilder(ZONE_NAME).replicas(1).build()), 
willBe(nullValue()));
+        
assertThat(manager.alterZone(alterZoneBuilder(ZONE_NAME).replicas(Integer.MAX_VALUE).build()),
 willBe(nullValue()));
+        
assertThat(manager.alterZone(alterZoneBuilder(ZONE_NAME).replicas(DEFAULT_REPLICA_COUNT).build()),
 willBe(nullValue()));
+    }
+
+    @Test
+    void testValidateDataNodesAutoAdjustOnCreateZone() {
+        assertThat(
+                
manager.createZone(createZoneBuilder(ZONE_NAME).dataNodesAutoAdjust(-1).build()),
+                willThrowFast(CatalogValidationException.class, "Invalid data 
nodes auto adjust")
+        );
+
+        // Let's check the success cases.
+        assertThat(
+                manager.createZone(createZoneBuilder(ZONE_NAME + 
0).dataNodesAutoAdjust(0).build()),
+                willBe(nullValue())
+        );
+
+        assertThat(
+                manager.createZone(createZoneBuilder(ZONE_NAME + 
1).dataNodesAutoAdjust(Integer.MAX_VALUE).build()),
+                willBe(nullValue())
+        );
+
+        assertThat(
+                manager.createZone(createZoneBuilder(ZONE_NAME + 
2).dataNodesAutoAdjust(IMMEDIATE_TIMER_VALUE).build()),
+                willBe(nullValue())
+        );
+
+        assertThat(
+                manager.createZone(createZoneBuilder(ZONE_NAME + 
3).dataNodesAutoAdjust(INFINITE_TIMER_VALUE).build()),
+                willBe(nullValue())
+        );
+    }
+
+    @Test
+    void testValidateDataNodesAutoAdjustOnAlterZone() {
+        assertThat(manager.createZone(createZoneBuilder(ZONE_NAME).build()), 
willBe(nullValue()));
+
+        assertThat(
+                
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjust(-1).build()),
+                willThrowFast(CatalogValidationException.class, "Invalid data 
nodes auto adjust")
+        );
+
+        // Let's check the success cases.
+        
assertThat(manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjust(0).build()),
 willBe(nullValue()));
+        
assertThat(manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjust(Integer.MAX_VALUE).build()),
 willBe(nullValue()));
+        
assertThat(manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjust(INFINITE_TIMER_VALUE).build()),
 willBe(nullValue()));
+        
assertThat(manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjust(IMMEDIATE_TIMER_VALUE).build()),
 willBe(nullValue()));
+    }
+
+    @Test
+    void testValidateDataNodesAutoAdjustScaleUpOnCreateZone() {
+        assertThat(
+                
manager.createZone(createZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleUp(-1).build()),
+                willThrowFast(CatalogValidationException.class, "Invalid data 
nodes auto adjust scale up")
+        );
+
+        // Let's check the success cases.
+        assertThat(
+                manager.createZone(createZoneBuilder(ZONE_NAME + 
0).dataNodesAutoAdjustScaleUp(0).build()),
+                willBe(nullValue())
+        );
+
+        assertThat(
+                manager.createZone(createZoneBuilder(ZONE_NAME + 
1).dataNodesAutoAdjustScaleUp(Integer.MAX_VALUE).build()),
+                willBe(nullValue())
+        );
+
+        assertThat(
+                manager.createZone(createZoneBuilder(ZONE_NAME + 
2).dataNodesAutoAdjustScaleUp(IMMEDIATE_TIMER_VALUE).build()),
+                willBe(nullValue())
+        );
+
+        assertThat(
+                manager.createZone(createZoneBuilder(ZONE_NAME + 
3).dataNodesAutoAdjustScaleUp(INFINITE_TIMER_VALUE).build()),
+                willBe(nullValue())
+        );
+    }
+
+    @Test
+    void testValidateDataNodesAutoAdjustScaleUpOnAlterZone() {
+        assertThat(manager.createZone(createZoneBuilder(ZONE_NAME).build()), 
willBe(nullValue()));
+
+        assertThat(
+                
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleUp(-1).build()),
+                willThrowFast(CatalogValidationException.class, "Invalid data 
nodes auto adjust scale up")
+        );
+
+        // Let's check the success cases.
+        assertThat(
+                
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleUp(0).build()),
+                willBe(nullValue())
+        );
+
+        assertThat(
+                
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleUp(Integer.MAX_VALUE).build()),
+                willBe(nullValue())
+        );
+
+        assertThat(
+                
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleUp(INFINITE_TIMER_VALUE).build()),
+                willBe(nullValue())
+        );
+
+        assertThat(
+                
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleUp(IMMEDIATE_TIMER_VALUE).build()),
+                willBe(nullValue())
+        );
+    }
+
+    @Test
+    void testValidateDataNodesAutoAdjustScaleDownOnCreateZone() {
+        assertThat(
+                
manager.createZone(createZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleDown(-1).build()),
+                willThrowFast(CatalogValidationException.class, "Invalid data 
nodes auto adjust scale down")
+        );
+
+        // Let's check the success cases.
+        assertThat(
+                manager.createZone(createZoneBuilder(ZONE_NAME + 
0).dataNodesAutoAdjustScaleDown(0).build()),
+                willBe(nullValue())
+        );
+
+        assertThat(
+                manager.createZone(createZoneBuilder(ZONE_NAME + 
1).dataNodesAutoAdjustScaleDown(Integer.MAX_VALUE).build()),
+                willBe(nullValue())
+        );
+
+        assertThat(
+                manager.createZone(createZoneBuilder(ZONE_NAME + 
2).dataNodesAutoAdjustScaleDown(IMMEDIATE_TIMER_VALUE).build()),
+                willBe(nullValue())
+        );
+
+        assertThat(
+                manager.createZone(createZoneBuilder(ZONE_NAME + 
3).dataNodesAutoAdjustScaleDown(INFINITE_TIMER_VALUE).build()),
+                willBe(nullValue())
+        );
+    }
+
+    @Test
+    void testValidateDataNodesAutoAdjustScaleDownOnAlterZone() {
+        assertThat(manager.createZone(createZoneBuilder(ZONE_NAME).build()), 
willBe(nullValue()));
+
+        assertThat(
+                
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleDown(-1).build()),
+                willThrowFast(CatalogValidationException.class, "Invalid data 
nodes auto adjust scale down")
+        );
+
+        // Let's check the success cases.
+        assertThat(
+                
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleDown(0).build()),
+                willBe(nullValue())
+        );
+
+        assertThat(
+                
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleDown(Integer.MAX_VALUE).build()),
+                willBe(nullValue())
+        );
+
+        assertThat(
+                
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleDown(INFINITE_TIMER_VALUE).build()),
+                willBe(nullValue())
+        );
+
+        assertThat(
+                
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleDown(IMMEDIATE_TIMER_VALUE).build()),
+                willBe(nullValue())
+        );
+    }
+
+    @Test
+    void testValidateDataNodesAutoAdjustCompatibilityParametersOnCreateZone() {
+        assertThat(
+                
manager.createZone(createZoneBuilder(ZONE_NAME).dataNodesAutoAdjust(666).dataNodesAutoAdjustScaleUp(666).build()),
+                willThrowFast(CatalogValidationException.class, "Not 
compatible parameters")
+        );
+
+        assertThat(
+                
manager.createZone(createZoneBuilder(ZONE_NAME).dataNodesAutoAdjust(666).dataNodesAutoAdjustScaleDown(666).build()),
+                willThrowFast(CatalogValidationException.class, "Not 
compatible parameters")
+        );
+
+        assertThat(
+                manager.createZone(
+                        createZoneBuilder(ZONE_NAME)
+                                .dataNodesAutoAdjust(666)
+                                .dataNodesAutoAdjustScaleUp(666)
+                                .dataNodesAutoAdjustScaleDown(666)
+                                .build()
+                ),
+                willThrowFast(CatalogValidationException.class, "Not 
compatible parameters")
+        );
+
+        // Let's check the success cases.
+        assertThat(
+                manager.createZone(
+                        createZoneBuilder(ZONE_NAME + 0)
+                                .dataNodesAutoAdjust(666)
+                                
.dataNodesAutoAdjustScaleUp(INFINITE_TIMER_VALUE)
+                                .build()
+                ),
+                willBe(nullValue())
+        );
+
+        assertThat(
+                manager.createZone(
+                        createZoneBuilder(ZONE_NAME + 1)
+                                .dataNodesAutoAdjust(666)
+                                
.dataNodesAutoAdjustScaleDown(INFINITE_TIMER_VALUE)
+                                .build()
+                ),
+                willBe(nullValue())
+        );
+
+        assertThat(
+                manager.createZone(
+                        createZoneBuilder(ZONE_NAME + 2)
+                                .dataNodesAutoAdjust(666)
+                                
.dataNodesAutoAdjustScaleUp(INFINITE_TIMER_VALUE)
+                                
.dataNodesAutoAdjustScaleDown(INFINITE_TIMER_VALUE)
+                                .build()
+                ),
+                willBe(nullValue())
+        );
+    }
+
+    @Test
+    void testValidateDataNodesAutoAdjustCompatibilityParametersOnAlterZone() {
+        assertThat(manager.createZone(createZoneBuilder(ZONE_NAME).build()), 
willBe(nullValue()));
+
+        assertThat(
+                
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjust(666).dataNodesAutoAdjustScaleUp(666).build()),
+                willThrowFast(CatalogValidationException.class, "Not 
compatible parameters")
+        );
+
+        assertThat(
+                
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjust(666).dataNodesAutoAdjustScaleDown(666).build()),
+                willThrowFast(CatalogValidationException.class, "Not 
compatible parameters")
+        );
+
+        assertThat(
+                manager.alterZone(
+                        alterZoneBuilder(ZONE_NAME)
+                                .dataNodesAutoAdjust(666)
+                                .dataNodesAutoAdjustScaleUp(666)
+                                .dataNodesAutoAdjustScaleDown(666)
+                                .build()
+                ),
+                willThrowFast(CatalogValidationException.class, "Not 
compatible parameters")
+        );
+
+        // Let's check the success cases.
+        assertThat(
+                manager.alterZone(
+                        alterZoneBuilder(ZONE_NAME)
+                                .dataNodesAutoAdjust(666)
+                                
.dataNodesAutoAdjustScaleUp(INFINITE_TIMER_VALUE)
+                                .build()
+                ),
+                willBe(nullValue())
+        );
+
+        assertThat(
+                manager.alterZone(
+                        alterZoneBuilder(ZONE_NAME)
+                                .dataNodesAutoAdjust(666)
+                                
.dataNodesAutoAdjustScaleDown(INFINITE_TIMER_VALUE)
+                                .build()
+                ),
+                willBe(nullValue())
+        );
+
+        assertThat(
+                manager.alterZone(
+                        alterZoneBuilder(ZONE_NAME)
+                                .dataNodesAutoAdjust(666)
+                                
.dataNodesAutoAdjustScaleUp(INFINITE_TIMER_VALUE)
+                                
.dataNodesAutoAdjustScaleDown(INFINITE_TIMER_VALUE)
+                                .build()
+                ),
+                willBe(nullValue())
+        );
+
+        // Let's check the compatibility of the parameters and what is already 
stored in the catalog.
+        assertThat(
+                
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleUp(666).build()),
+                willThrowFast(CatalogValidationException.class, "Not 
compatible parameters")
+        );
+
+        assertThat(
+                
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleDown(666).build()),
+                willThrowFast(CatalogValidationException.class, "Not 
compatible parameters")
+        );
+
+        assertThat(
+                
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleUp(666).dataNodesAutoAdjustScaleDown(666).build()),
+                willThrowFast(CatalogValidationException.class, "Not 
compatible parameters")
+        );
+    }
+
+    @Test
+    void testValidateFilterOnCreateZone() {
+        assertThat(
+                manager.createZone(createZoneBuilder(ZONE_NAME).filter("not a 
JsonPath").build()),
+                willThrowFast(CatalogValidationException.class, "Invalid 
filter")
+        );
+
+        // Missing ']' after 'nodeAttributes'.
+        assertThat(
+                
manager.createZone(createZoneBuilder(ZONE_NAME).filter("['nodeAttributes'[?(@.['region']
 == 'EU')]").build()),
+                willThrowFast(CatalogValidationException.class, "Invalid 
filter")
+        );
+
+        // Let's check the success cases.
+        assertThat(
+                manager.createZone(createZoneBuilder(ZONE_NAME + 
0).filter("['nodeAttributes'][?(@.['region'] == 'EU')]").build()),
+                willBe(nullValue())
+        );
+
+        assertThat(
+                manager.createZone(createZoneBuilder(ZONE_NAME + 
1).filter(DEFAULT_FILTER).build()),
+                willBe(nullValue())
+        );
+    }
+
+    @Test
+    void testValidateFilterOnAlterZone() {
+        assertThat(manager.createZone(createZoneBuilder(ZONE_NAME).build()), 
willBe(nullValue()));
+
+        assertThat(
+                manager.alterZone(alterZoneBuilder(ZONE_NAME).filter("not a 
JsonPath").build()),
+                willThrowFast(CatalogValidationException.class, "Invalid 
filter")
+        );
+
+        // Missing ']' after 'nodeAttributes'.
+        assertThat(
+                
manager.alterZone(alterZoneBuilder(ZONE_NAME).filter("['nodeAttributes'[?(@.['region']
 == 'EU')]").build()),
+                willThrowFast(CatalogValidationException.class, "Invalid 
filter")
+        );
+
+        // Let's check the success cases.
+        assertThat(
+                
manager.alterZone(alterZoneBuilder(ZONE_NAME).filter("['nodeAttributes'][?(@.['region']
 == 'EU')]").build()),
+                willBe(nullValue())
+        );
+
+        assertThat(
+                
manager.alterZone(alterZoneBuilder(ZONE_NAME).filter(DEFAULT_FILTER).build()),
+                willBe(nullValue())
+        );
+    }
+
+    @Test
+    void testValidateZoneNameOnDropZone() {
+        assertThat(manager.createZone(createZoneBuilder(ZONE_NAME).build()), 
willBe(nullValue()));
+
+        assertThat(
+                manager.dropZone(DropZoneParams.builder().build()),
+                willThrowFast(CatalogValidationException.class, "Missing zone 
name")
+        );
+
+        // Let's check the success cases.
+        
assertThat(manager.dropZone(DropZoneParams.builder().zoneName(ZONE_NAME).build()),
 willBe(nullValue()));
+    }
+
+    @Test
+    void testValidateZoneNamesOnRenameZone() {
+        assertThat(manager.createZone(createZoneBuilder(ZONE_NAME).build()), 
willBe(nullValue()));
+
+        assertThat(
+                manager.renameZone(RenameZoneParams.builder().build()),
+                willThrowFast(CatalogValidationException.class, "Missing zone 
name")
+        );
+
+        assertThat(
+                
manager.renameZone(RenameZoneParams.builder().zoneName(ZONE_NAME).build()),
+                willThrowFast(CatalogValidationException.class, "Missing new 
zone name")
+        );
+
+        // Let's check the success cases.
+        assertThat(
+                
manager.renameZone(RenameZoneParams.builder().zoneName(ZONE_NAME).newZoneName(ZONE_NAME
 + 0).build()),
+                willBe(nullValue())
+        );
+    }
+
+    private static CreateZoneParams.Builder createZoneBuilder(String zoneName) 
{
+        return CreateZoneParams.builder().zoneName(zoneName);
+    }
+
+    private static AlterZoneParams.Builder alterZoneBuilder(String zoneName) {
+        return AlterZoneParams.builder().zoneName(zoneName);
+    }
+}
diff --git 
a/modules/core/src/main/java/org/apache/ignite/lang/IgniteInternalException.java
 
b/modules/core/src/main/java/org/apache/ignite/lang/IgniteInternalException.java
index 73f5b04b6d..7067e634ee 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/lang/IgniteInternalException.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/lang/IgniteInternalException.java
@@ -201,6 +201,19 @@ public class IgniteInternalException extends 
RuntimeException implements Traceab
         this(code, IgniteStringFormatter.format(messagePattern, params));
     }
 
+    /**
+     * Creates a new exception with the given error code and detail message.
+     *
+     * @param code Full error code.
+     * @param messagePattern Error message pattern.
+     * @param cause Non-null throwable cause.
+     * @param params Error message params.
+     * @see IgniteStringFormatter#format(String, Object...)
+     */
+    public IgniteInternalException(int code, String messagePattern, Throwable 
cause, Object... params) {
+        this(code, IgniteStringFormatter.format(messagePattern, params), 
cause);
+    }
+
     /**
      * Returns a group name of this error.
      *
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerWrapper.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerWrapper.java
index 912c66fe3b..eb812d6970 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerWrapper.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerWrapper.java
@@ -124,28 +124,28 @@ public class DdlCommandHandlerWrapper extends 
DdlCommandHandler {
             CreateZoneCommand zoneCommand = (CreateZoneCommand) cmd;
 
             return ddlCommandFuture
-                    .thenCompose(res -> 
catalogManager.createDistributionZone(DdlToCatalogCommandConverter.convert(zoneCommand))
+                    .thenCompose(res -> 
catalogManager.createZone(DdlToCatalogCommandConverter.convert(zoneCommand))
                             
.handle(handleModificationResult(zoneCommand.ifNotExists(), 
DistributionZoneAlreadyExistsException.class))
                     );
         } else if (cmd instanceof DropZoneCommand) {
             DropZoneCommand zoneCommand = (DropZoneCommand) cmd;
 
             return ddlCommandFuture
-                    .thenCompose(res -> 
catalogManager.dropDistributionZone(DdlToCatalogCommandConverter.convert(zoneCommand))
+                    .thenCompose(res -> 
catalogManager.dropZone(DdlToCatalogCommandConverter.convert(zoneCommand))
                             
.handle(handleModificationResult(zoneCommand.ifExists(), 
DistributionZoneNotFoundException.class))
                     );
         } else if (cmd instanceof AlterZoneRenameCommand) {
             AlterZoneRenameCommand zoneCommand = (AlterZoneRenameCommand) cmd;
 
             return ddlCommandFuture
-                    .thenCompose(res -> 
catalogManager.renameDistributionZone(DdlToCatalogCommandConverter.convert(zoneCommand))
+                    .thenCompose(res -> 
catalogManager.renameZone(DdlToCatalogCommandConverter.convert(zoneCommand))
                             
.handle(handleModificationResult(zoneCommand.ifExists(), 
DistributionZoneNotFoundException.class))
                     );
         } else if (cmd instanceof AlterZoneSetCommand) {
             AlterZoneSetCommand zoneCommand = (AlterZoneSetCommand) cmd;
 
             return ddlCommandFuture
-                    .thenCompose(res -> 
catalogManager.alterDistributionZone(DdlToCatalogCommandConverter.convert(zoneCommand))
+                    .thenCompose(res -> 
catalogManager.alterZone(DdlToCatalogCommandConverter.convert(zoneCommand))
                             
.handle(handleModificationResult(zoneCommand.ifExists(), 
DistributionZoneNotFoundException.class))
                     );
         }

Reply via email to