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

apkhmv 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 2013940f1e IGNITE-18926 Open API spec validation fails (#1744)
2013940f1e is described below

commit 2013940f1e8fc89553648ab09b156613c6eb3483
Author: Vadim Pakhnushev <[email protected]>
AuthorDate: Mon Mar 6 11:47:31 2023 +0300

    IGNITE-18926 Open API spec validation fails (#1744)
---
 docs/_docs/rest/rest-api.adoc                      |  6 ++--
 modules/cli/build.gradle                           |  2 +-
 modules/rest-api/build.gradle                      | 10 ++++++-
 .../{rest => rest-api}/openapi/openapi.properties  |  0
 modules/{rest => rest-api}/openapi/openapi.yaml    | 29 ++++++++++++++++--
 .../ignite/internal/rest/api/Definition.java       | 34 ++++++++++++++++++++++
 .../internal/rest/api/cluster/ClusterNodeDto.java  |  5 ----
 .../internal/rest/api/cluster/InitCommand.java     |  1 +
 .../api/configuration/ClusterConfigurationApi.java |  5 +++-
 .../api/configuration/NodeConfigurationApi.java    |  5 +++-
 modules/rest/build.gradle                          | 13 ++-------
 .../apache/ignite/internal/rest/RestComponent.java | 24 ---------------
 12 files changed, 85 insertions(+), 49 deletions(-)

diff --git a/docs/_docs/rest/rest-api.adoc b/docs/_docs/rest/rest-api.adoc
index bd690c70a6..5901089958 100644
--- a/docs/_docs/rest/rest-api.adoc
+++ b/docs/_docs/rest/rest-api.adoc
@@ -15,7 +15,7 @@
 
 = Ignite REST API
 
-The Apache Ignite 3 clusters provide an 
link:https://www.openapis.org/[OpenAPI] specification that can be used to work 
with Ignite 3 by standard REST methods. The 
link:https://github.com/apache/ignite-3/tree/main/modules/rest/openapi/openapi.yaml[openapi.yaml,window=_blank]
 specification file for the version is included with its release.
+The Apache Ignite 3 clusters provide an 
link:https://www.openapis.org/[OpenAPI] specification that can be used to work 
with Ignite 3 by standard REST methods. The 
link:https://github.com/apache/ignite-3/tree/main/modules/rest-api/openapi/openapi.yaml[openapi.yaml,window=_blank]
 specification file for the version is included with its release.
 
 We recommend that you generate client code in your project language by using 
an link:https://github.com/OpenAPITools/openapi-generator[OpenAPI code 
generator,window=_blank]. Below is the example of how you can do this for a 
Java project.
 
@@ -35,7 +35,7 @@ We recommend that you generate client code in your project 
language by using an
         <goal>generate</goal>
       </goals>
       <configuration>
-        
<inputSpec>https://github.com/apache/ignite-3/tree/main/modules/rest/openapi/openapi.yaml</inputSpec>
+        
<inputSpec>https://github.com/apache/ignite-3/tree/main/modules/rest-api/openapi/openapi.yaml</inputSpec>
         <generatorName>java</generatorName>
         <apiPackage>org.apache.ignite.rest.client.api</apiPackage>
         <invokerPackage>org.apache.ignite.rest.client.invoker</invokerPackage>
@@ -65,4 +65,4 @@ client.setBasePath("http://localhost:10300";);
 // Get cluster configuration.
 clusterConfigurationApi = new ClusterConfigurationApi(client);
 String configuration = clusterConfigurationApi.getClusterConfiguration();
-----
\ No newline at end of file
+----
diff --git a/modules/cli/build.gradle b/modules/cli/build.gradle
index aa408e17f9..59d5ee5d85 100644
--- a/modules/cli/build.gradle
+++ b/modules/cli/build.gradle
@@ -111,7 +111,7 @@ dependencies {
 ext.generatedClientDir = layout.buildDirectory.dir("swagger/client")
 
 task copyOpenapiDefinition(type: Copy) {
-    from("$rootDir/modules/rest/openapi")
+    from("$rootDir/modules/rest-api/openapi")
     into("$buildDir/customOpenapiDefinition/")
 }
 
diff --git a/modules/rest-api/build.gradle b/modules/rest-api/build.gradle
index 2cb8b518aa..989ffd9b7a 100644
--- a/modules/rest-api/build.gradle
+++ b/modules/rest-api/build.gradle
@@ -19,8 +19,12 @@ apply from: "$rootDir/buildscripts/java-core.gradle"
 apply from: "$rootDir/buildscripts/publishing.gradle"
 apply from: "$rootDir/buildscripts/java-junit5.gradle"
 
+description = 'ignite-rest-api'
+
 dependencies {
     annotationProcessor libs.micronaut.inject.annotation.processor
+    annotationProcessor libs.micronaut.openapi
+
     implementation project(':ignite-api')
     implementation project(':ignite-core')
     implementation project(':ignite-configuration-api')
@@ -34,9 +38,13 @@ dependencies {
     implementation libs.micronaut.http.server.core
     implementation libs.micronaut.security
     implementation libs.micronaut.security.annotations
+
     testImplementation libs.junit5.api
     testImplementation libs.mockito.core
     testImplementation libs.junit5.params
 }
 
-description = 'ignite-rest-api'
+compileJava {
+    options.fork = true
+    options.forkOptions.jvmArgs += 
'-Dmicronaut.openapi.config.file=openapi/openapi.properties'
+}
diff --git a/modules/rest/openapi/openapi.properties 
b/modules/rest-api/openapi/openapi.properties
similarity index 100%
rename from modules/rest/openapi/openapi.properties
rename to modules/rest-api/openapi/openapi.properties
diff --git a/modules/rest/openapi/openapi.yaml 
b/modules/rest-api/openapi/openapi.yaml
similarity index 95%
rename from modules/rest/openapi/openapi.yaml
rename to modules/rest-api/openapi/openapi.yaml
index 7f5c20c005..cb57668eea 100644
--- a/modules/rest/openapi/openapi.yaml
+++ b/modules/rest-api/openapi/openapi.yaml
@@ -157,7 +157,7 @@ paths:
       operationId: updateClusterConfiguration
       parameters: []
       requestBody:
-        description: the cluster configuration to update
+        description: The cluster configuration to update.
         content:
           text/plain:
             schema:
@@ -261,8 +261,7 @@ paths:
       operationId: updateNodeConfiguration
       parameters: []
       requestBody:
-        description: the node configuration to update. This is represented as 
a plain
-          text
+        description: The node configuration to update.
         content:
           text/plain:
             schema:
@@ -450,8 +449,31 @@ components:
           description: A list of authentication providers.
           items:
             $ref: '#/components/schemas/AuthenticationProviderConfigDto'
+      description: REST representation of AuthenticationConfig.
     AuthenticationProviderConfigDto:
       type: object
+      description: REST representation of AuthenticationProviderConfig.
+      discriminator:
+        propertyName: type
+        mapping:
+          basic: '#/components/schemas/BasicAuthenticationProviderConfig'
+      oneOf:
+      - $ref: '#/components/schemas/BasicAuthenticationProviderConfig'
+    BasicAuthenticationProviderConfig:
+      type: object
+      properties:
+        login:
+          type: string
+          description: Login.
+        password:
+          type: string
+          description: Password.
+        name:
+          type: string
+          description: Provider name.
+        type:
+          type: string
+      description: REST representation of BasicAuthenticationProviderConfig.
     ClusterNode:
       type: object
       properties:
@@ -516,6 +538,7 @@ components:
           description: The name of the cluster.
         authenticationConfig:
           $ref: '#/components/schemas/AuthenticationConfig'
+      description: Cluster initialization data.
     InvalidParam:
       type: object
       properties:
diff --git 
a/modules/rest-api/src/main/java/org/apache/ignite/internal/rest/api/Definition.java
 
b/modules/rest-api/src/main/java/org/apache/ignite/internal/rest/api/Definition.java
new file mode 100644
index 0000000000..aae05ac595
--- /dev/null
+++ 
b/modules/rest-api/src/main/java/org/apache/ignite/internal/rest/api/Definition.java
@@ -0,0 +1,34 @@
+/*
+ * 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.rest.api;
+
+import io.swagger.v3.oas.annotations.OpenAPIDefinition;
+import io.swagger.v3.oas.annotations.info.Contact;
+import io.swagger.v3.oas.annotations.info.Info;
+import io.swagger.v3.oas.annotations.info.License;
+
+/**
+ * Dummy class used to generate OpenAPI specification.
+ */
+@OpenAPIDefinition(info = @Info(
+        title = "Ignite REST module",
+        version = "3.0.0-SNAPSHOT",
+        license = @License(name = "Apache 2.0", url = 
"https://ignite.apache.org";),
+        contact = @Contact(email = "[email protected]")))
+public class Definition {
+}
diff --git 
a/modules/rest-api/src/main/java/org/apache/ignite/internal/rest/api/cluster/ClusterNodeDto.java
 
b/modules/rest-api/src/main/java/org/apache/ignite/internal/rest/api/cluster/ClusterNodeDto.java
index c2147d7147..af310fe94b 100644
--- 
a/modules/rest-api/src/main/java/org/apache/ignite/internal/rest/api/cluster/ClusterNodeDto.java
+++ 
b/modules/rest-api/src/main/java/org/apache/ignite/internal/rest/api/cluster/ClusterNodeDto.java
@@ -83,11 +83,6 @@ public class ClusterNodeDto {
         return name;
     }
 
-    /**
-     * Returns the network address of this node.
-     *
-     * @return Network address of this node.
-     */
     @JsonGetter("address")
     public NetworkAddressDto address() {
         return address;
diff --git 
a/modules/rest-api/src/main/java/org/apache/ignite/internal/rest/api/cluster/InitCommand.java
 
b/modules/rest-api/src/main/java/org/apache/ignite/internal/rest/api/cluster/InitCommand.java
index 6e26ec81c8..15e4ed422c 100644
--- 
a/modules/rest-api/src/main/java/org/apache/ignite/internal/rest/api/cluster/InitCommand.java
+++ 
b/modules/rest-api/src/main/java/org/apache/ignite/internal/rest/api/cluster/InitCommand.java
@@ -32,6 +32,7 @@ import org.jetbrains.annotations.Nullable;
 /**
  * REST command for initializing a cluster.
  */
+@Schema(description = "Cluster initialization data.")
 public class InitCommand {
     @Schema(description = "A list of RAFT metastorage nodes.")
     private final Collection<String> metaStorageNodes;
diff --git 
a/modules/rest-api/src/main/java/org/apache/ignite/internal/rest/api/configuration/ClusterConfigurationApi.java
 
b/modules/rest-api/src/main/java/org/apache/ignite/internal/rest/api/configuration/ClusterConfigurationApi.java
index c163371827..689dd38754 100644
--- 
a/modules/rest-api/src/main/java/org/apache/ignite/internal/rest/api/configuration/ClusterConfigurationApi.java
+++ 
b/modules/rest-api/src/main/java/org/apache/ignite/internal/rest/api/configuration/ClusterConfigurationApi.java
@@ -30,6 +30,7 @@ import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.media.Content;
 import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.parameters.RequestBody;
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import java.util.concurrent.CompletableFuture;
@@ -83,7 +84,9 @@ public interface ClusterConfigurationApi {
     @Consumes(MediaType.TEXT_PLAIN)
     @Produces(MediaType.PROBLEM_JSON)
     @Patch
-    CompletableFuture<Void> updateConfiguration(@Body String 
updatedConfiguration);
+    CompletableFuture<Void> updateConfiguration(
+            @Body @RequestBody(description = "The cluster configuration to 
update.") String updatedConfiguration
+    );
 
     /**
      * Returns configuration in HOCON format represented by path. This is 
represented as a plain text.
diff --git 
a/modules/rest-api/src/main/java/org/apache/ignite/internal/rest/api/configuration/NodeConfigurationApi.java
 
b/modules/rest-api/src/main/java/org/apache/ignite/internal/rest/api/configuration/NodeConfigurationApi.java
index 7acd0d9aa5..dcc64075e3 100644
--- 
a/modules/rest-api/src/main/java/org/apache/ignite/internal/rest/api/configuration/NodeConfigurationApi.java
+++ 
b/modules/rest-api/src/main/java/org/apache/ignite/internal/rest/api/configuration/NodeConfigurationApi.java
@@ -30,6 +30,7 @@ import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.media.Content;
 import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.parameters.RequestBody;
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import java.util.concurrent.CompletableFuture;
@@ -104,5 +105,7 @@ public interface NodeConfigurationApi {
     @Consumes(MediaType.TEXT_PLAIN)
     @Produces(MediaType.PROBLEM_JSON)
     @Patch
-    CompletableFuture<Void> updateConfiguration(@Body String 
updatedConfiguration);
+    CompletableFuture<Void> updateConfiguration(
+            @Body @RequestBody(description = "The node configuration to 
update.") String updatedConfiguration
+    );
 }
diff --git a/modules/rest/build.gradle b/modules/rest/build.gradle
index 54e9131a43..d2ab0ff9dd 100644
--- a/modules/rest/build.gradle
+++ b/modules/rest/build.gradle
@@ -26,7 +26,7 @@ description = 'ignite-rest'
 dependencies {
     annotationProcessor project(':ignite-configuration-annotation-processor')
     annotationProcessor libs.micronaut.inject.annotation.processor
-    annotationProcessor libs.micronaut.openapi
+    annotationProcessor libs.auto.service
 
     implementation project(':ignite-api')
     implementation project(':ignite-configuration')
@@ -49,14 +49,12 @@ dependencies {
     implementation libs.auto.service.annotations
     implementation libs.typesafe.config
 
-    annotationProcessor libs.auto.service
-
     testAnnotationProcessor 
project(':ignite-configuration-annotation-processor')
     testAnnotationProcessor libs.micronaut.inject.annotation.processor
 
     testImplementation project(':ignite-configuration')
-    testImplementation(testFixtures(project(':ignite-core')))
-    testImplementation(testFixtures(project(':ignite-configuration')))
+    testImplementation testFixtures(project(':ignite-core'))
+    testImplementation testFixtures(project(':ignite-configuration'))
     testImplementation libs.slf4j.jdk14
     testImplementation libs.micronaut.junit5
     testImplementation libs.micronaut.http.client
@@ -81,8 +79,3 @@ dependencies {
     integrationTestImplementation libs.micronaut.http.server.netty
     integrationTestImplementation libs.typesafe.config
 }
-
-compileJava {
-    options.fork = true
-    options.forkOptions.jvmArgs += 
'-Dmicronaut.openapi.config.file=openapi/openapi.properties'
-}
diff --git 
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/RestComponent.java 
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/RestComponent.java
index 0a994b1645..15e32a5dce 100644
--- 
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/RestComponent.java
+++ 
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/RestComponent.java
@@ -22,14 +22,9 @@ import static 
io.micronaut.context.env.Environment.BARE_METAL;
 import io.micronaut.context.ApplicationContext;
 import io.micronaut.http.server.exceptions.ServerStartupException;
 import io.micronaut.http.ssl.ClientAuthentication;
-import io.micronaut.openapi.annotation.OpenAPIInclude;
 import io.micronaut.runtime.Micronaut;
 import io.micronaut.runtime.exceptions.ApplicationStartupException;
 import io.netty.handler.ssl.ClientAuth;
-import io.swagger.v3.oas.annotations.OpenAPIDefinition;
-import io.swagger.v3.oas.annotations.info.Contact;
-import io.swagger.v3.oas.annotations.info.Info;
-import io.swagger.v3.oas.annotations.info.License;
 import java.net.BindException;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
@@ -41,12 +36,6 @@ import java.util.Map;
 import org.apache.ignite.internal.logger.IgniteLogger;
 import org.apache.ignite.internal.logger.Loggers;
 import org.apache.ignite.internal.manager.IgniteComponent;
-import org.apache.ignite.internal.rest.api.cluster.ClusterManagementApi;
-import org.apache.ignite.internal.rest.api.cluster.TopologyApi;
-import 
org.apache.ignite.internal.rest.api.configuration.ClusterConfigurationApi;
-import org.apache.ignite.internal.rest.api.configuration.NodeConfigurationApi;
-import org.apache.ignite.internal.rest.api.metric.NodeMetricApi;
-import org.apache.ignite.internal.rest.api.node.NodeManagementApi;
 import org.apache.ignite.internal.rest.configuration.RestConfiguration;
 import org.apache.ignite.internal.rest.configuration.RestSslConfiguration;
 import org.apache.ignite.internal.rest.configuration.RestSslView;
@@ -62,19 +51,6 @@ import org.jetbrains.annotations.Nullable;
  * <p>It is started on port 10300 by default but it is possible to change this 
in configuration itself. Refer to default config file in
  * resources for the example.
  */
-@OpenAPIDefinition(info = @Info(
-        title = "Ignite REST module",
-        version = "3.0.0-SNAPSHOT",
-        license = @License(name = "Apache 2.0", url = 
"https://ignite.apache.org";),
-        contact = @Contact(email = "[email protected]")))
-@OpenAPIInclude(classes = {
-        ClusterConfigurationApi.class,
-        NodeConfigurationApi.class,
-        ClusterManagementApi.class,
-        NodeManagementApi.class,
-        NodeMetricApi.class,
-        TopologyApi.class
-})
 public class RestComponent implements IgniteComponent {
 
     /** Unavailable port. */

Reply via email to