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. */