This is an automated email from the ASF dual-hosted git repository.
liubao pushed a commit to branch 1.3.x
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git
The following commit(s) were added to refs/heads/1.3.x by this push:
new 5b8c612 SCB-2017 Fixed the issue of inconsistent false positives
after re-ser… (#2014)
5b8c612 is described below
commit 5b8c612ed3ce4cfe593a9622753a682987621a05
Author: develpoerX <[email protected]>
AuthorDate: Tue Oct 27 18:45:34 2020 +0800
SCB-2017 Fixed the issue of inconsistent false positives after re-ser…
(#2014)
* SCB-2017 Fixed the issue of inconsistent false positives after
re-serialization using swagger to parse different JDK versions.
* SCB-2017 Fixed the issue of inconsistent false positives after re-ser…
* SCB-2017 Fixed the issue of inconsistent false positives after re-ser
* SCB-2017 Fixed the issue of inconsistent false positives after re-ser…
* SCB-2017 Fixed the issue of inconsistent false positives after re-ser…
---
service-registry/pom.xml | 4 +
.../config/ServiceRegistryConfig.java | 8 +
.../task/MicroserviceRegisterTask.java | 23 ++
.../task/TestMicroserviceRegisterTask.java | 241 ++++++++++++++++++++-
4 files changed, 275 insertions(+), 1 deletion(-)
diff --git a/service-registry/pom.xml b/service-registry/pom.xml
index ee8475f..a17eed7 100644
--- a/service-registry/pom.xml
+++ b/service-registry/pom.xml
@@ -71,5 +71,9 @@
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.apache.servicecomb</groupId>
+ <artifactId>swagger-generator-core</artifactId>
+ </dependency>
</dependencies>
</project>
diff --git
a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfig.java
b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfig.java
index 673a26a..935e809 100644
---
a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfig.java
+++
b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfig.java
@@ -257,6 +257,14 @@ public final class ServiceRegistryConfig {
return property.get();
}
+ public boolean isIgnoreSwaggerDifference() {
+ DynamicBooleanProperty property =
+ DynamicPropertyFactory.getInstance()
+
.getBooleanProperty("servicecomb.service.registry.instance.ignoreSwaggerDifference",
+ false);
+ return property.get();
+ }
+
public boolean isPreferIpAddress() {
DynamicBooleanProperty property =
DynamicPropertyFactory.getInstance()
diff --git
a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/MicroserviceRegisterTask.java
b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/MicroserviceRegisterTask.java
index c27a13b..625bdab 100644
---
a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/MicroserviceRegisterTask.java
+++
b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/MicroserviceRegisterTask.java
@@ -25,6 +25,7 @@ import java.util.Set;
import javax.ws.rs.core.Response.Status;
+import io.swagger.models.Swagger;
import org.apache.servicecomb.foundation.common.base.ServiceCombConstants;
import org.apache.servicecomb.serviceregistry.RegistryUtils;
import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
@@ -32,6 +33,7 @@ import
org.apache.servicecomb.serviceregistry.api.response.GetSchemaResponse;
import org.apache.servicecomb.serviceregistry.client.ServiceRegistryClient;
import org.apache.servicecomb.serviceregistry.client.http.Holder;
import org.apache.servicecomb.serviceregistry.config.ServiceRegistryConfig;
+import org.apache.servicecomb.swagger.SwaggerUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -261,6 +263,27 @@ public class MicroserviceRegisterTask extends
AbstractRegisterTask {
String scSchemaContent = srClient.getSchema(microservice.getServiceId(),
scSchema.getSchemaId());
String localSchemaContent = localSchemaEntry.getValue();
+ //if content of local schema and service center schema is equal then
return true.
+ if (!StringUtils.isEmpty(scSchemaContent) &&
!StringUtils.isEmpty(localSchemaContent)) {
+ Swagger scSwagger = SwaggerUtils.parseSwagger(scSchemaContent);
+ Swagger localSwagger = SwaggerUtils.parseSwagger(localSchemaContent);
+ if (scSwagger.equals(localSwagger)) {
+ return true;
+ }
+ }
+
+ //if the content of local schema and service center schema is different.
But the value of isIgnoreSwaggerDifference is true.
+ if (ServiceRegistryConfig.INSTANCE.isIgnoreSwaggerDifference()) {
+ LOGGER.warn(
+ "service center schema and local schema both are different:\n
service center "
+ + "schema:\n[{}]\n local schema:\n[{}]\nYou have configured to
ignore difference "
+ + "check. It's recommended to increment microservice version
before deploying when "
+ + "schema change.",
+ scSchemaContent,
+ localSchemaContent);
+ return true;
+ }
+
LOGGER.warn(
"service center schema and local schema both are different:\n
service center schema:\n[{}\n local schema:\n[{}]",
scSchemaContent,
diff --git
a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/task/TestMicroserviceRegisterTask.java
b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/task/TestMicroserviceRegisterTask.java
index 5c44312..89419ea 100644
---
a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/task/TestMicroserviceRegisterTask.java
+++
b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/task/TestMicroserviceRegisterTask.java
@@ -28,6 +28,7 @@ import
org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
import org.apache.servicecomb.serviceregistry.api.response.GetSchemaResponse;
import org.apache.servicecomb.serviceregistry.client.ServiceRegistryClient;
import org.apache.servicecomb.serviceregistry.client.http.Holder;
+import org.apache.servicecomb.serviceregistry.config.ServiceRegistryConfig;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
@@ -702,7 +703,245 @@ public class TestMicroserviceRegisterTask {
" x-java-class:
\"org.apache.servicecomb.demo.validator.Student\"]",
events.get(5).getMessage());
}
-
Assert.assertEquals(true, isIlleagalException);
}
+
+ @Test
+ public void testLocalSchemaAndServiceCenterSchemaIgnoreDiff(@Mocked
ServiceRegistryClient srClient,
+ @Mocked ServiceRegistryConfig serviceRegistryConfig) {
+
+ Microservice otherMicroservice = new Microservice();
+ otherMicroservice.setAppId(microservice.getAppId());
+ otherMicroservice.setServiceName("ms1");
+ otherMicroservice.addSchema("s1", "abcd");
+
+ List<GetSchemaResponse> list = new ArrayList<>();
+ GetSchemaResponse resp = new GetSchemaResponse();
+ resp.setSchemaId("s1");
+ resp.setSummary("c1188d709631a9038874f9efc6eb894f");
+ list.add(resp);
+ Holder<List<GetSchemaResponse>> onlineSchemasHolder = new Holder<>();
+ onlineSchemasHolder.setValue(list).setStatusCode(200);
+
+ new Expectations() {
+ {
+ serviceRegistryConfig.isIgnoreSwaggerDifference();
+ result = true;
+ srClient.getMicroserviceId(anyString, anyString, anyString, anyString);
+ result = "serviceId";
+ srClient.getMicroservice(anyString);
+ result = otherMicroservice;
+ srClient.getSchemas(anyString);
+ result = onlineSchemasHolder;
+ srClient.getSchema(anyString, anyString);
+ result = "swagger: \"2.0\"\n" +
+ "info:\n" +
+ " version: \"1.0.0\"\n" +
+ " title: \"swagger definition for
org.apache.servicecomb.demo.jaxrs.server.RequestClientTimeOut\"\n" +
+ " x-java-interface:
\"cse.gen.jaxrstest.jaxrs.clientreqtimeout.RequestClientTimeOutIntf\"\n" +
+ "basePath: \"/clientreqtimeout\"\n" +
+ "consumes:\n" +
+ "- \"application/json\"\n" +
+ "produces:\n" +
+ "- \"application/json\"\n" +
+ "paths:\n" +
+ " /sayhello:\n" +
+ " post:\n" +
+ " operationId: \"sayHello\"\n" +
+ " parameters:\n" +
+ " - in: \"body\"\n" +
+ " name: \"student\"\n" +
+ " required: false\n" +
+ " schema:\n" +
+ " $ref: \"#/definitions/Student\"\n" +
+ " responses:\n" +
+ " 200:\n" +
+ " description: \"response of 200\"\n" +
+ " schema:\n" +
+ " $ref: \"#/definitions/Student\"\n" +
+ "definitions:\n" +
+ " Student:\n" +
+ " type: \"object\"\n" +
+ " required:\n" +
+ " - \"name\"\n" +
+ " properties:\n" +
+ " name:\n" +
+ " type: \"string\"\n" +
+ " age:\n" +
+ " type: \"integer\"\n" +
+ " format: \"int32\"\n" +
+ " maximum: 20\n" +
+ " x-java-class:
\"org.apache.servicecomb.demo.validator.Student\"";
+ }
+ };
+
+ microservice.addSchema("s1",
+ "swagger: \"2.0\"\n" +
+ "info:\n" +
+ " version: \"1.0.0\"\n" +
+ " title: \"swagger definition for
org.apache.servicecomb.demo.jaxrs.server.RequestClientTimeOut\"\n" +
+ " x-java-interface:
\"cse.gen.jaxrstest.jaxrs.clientreqtimeout.RequestClientTimeOutIntf\"\n" +
+ "basePath: \"/clientreqtimeout\"\n" +
+ "consumes:\n" +
+ "- \"application/json\"\n" +
+ "produces:\n" +
+ "- \"application/json\"\n" +
+ "paths:\n" +
+ " /sayhello:\n" +
+ " post:\n" +
+ " operationId: \"sayHello\"\n" +
+ " parameters:\n" +
+ " - in: \"body\"\n" +
+ " name: \"student\"\n" +
+ " required: false\n" +
+ " schema:\n" +
+ " $ref: \"#/definitions/Student\"\n" +
+ " responses:\n" +
+ " 200:\n" +
+ " description: \"response of 200\"\n" +
+ " schema:\n" +
+ " type: \"string\"\n" +
+ "definitions:\n" +
+ " Student:\n" +
+ " type: \"object\"\n" +
+ " required:\n" +
+ " - \"name\"\n" +
+ " properties:\n" +
+ " name:\n" +
+ " type: \"string\"\n" +
+ " age:\n" +
+ " type: \"integer\"\n" +
+ " format: \"int32\"\n" +
+ " maximum: 20\n" +
+ " x-java-class:
\"org.apache.servicecomb.demo.validator.Student\"");
+ microservice.setEnvironment("prod");
+ MicroserviceRegisterTask registerTask = new
MicroserviceRegisterTask(eventBus, srClient, microservice);
+
+ Boolean isIlleagalException = false;
+
+ try {
+ registerTask.run();
+ } catch (IllegalStateException exception) {
+ isIlleagalException = true;
+ }
+
+ Assert.assertEquals(false, isIlleagalException);
+ }
+
+ @Test
+ public void testLocalSchemaAndServiceCenterSchemaNoDiff(@Mocked
ServiceRegistryClient srClient) {
+
+ Microservice otherMicroservice = new Microservice();
+ otherMicroservice.setAppId(microservice.getAppId());
+ otherMicroservice.setServiceName("ms1");
+ otherMicroservice.addSchema("s1", "abcd");
+
+ List<GetSchemaResponse> list = new ArrayList<>();
+ GetSchemaResponse resp = new GetSchemaResponse();
+ resp.setSchemaId("s1");
+ resp.setSummary("c1188d709631a9038874f9efc6eb894f");
+ list.add(resp);
+ Holder<List<GetSchemaResponse>> onlineSchemasHolder = new Holder<>();
+ onlineSchemasHolder.setValue(list).setStatusCode(200);
+
+ new Expectations() {
+ {
+ srClient.getMicroserviceId(anyString, anyString, anyString, anyString);
+ result = "serviceId";
+ srClient.getMicroservice(anyString);
+ result = otherMicroservice;
+ srClient.getSchemas(anyString);
+ result = onlineSchemasHolder;
+ srClient.getSchema(anyString, anyString);
+ result = "swagger: \"2.0\"\n" +
+ "info:\n" +
+ " version: \"1.0.0\"\n" +
+ " title: \"swagger definition for
org.apache.servicecomb.demo.jaxrs.server.RequestClientTimeOut\"\n" +
+ " x-java-interface:
\"cse.gen.jaxrstest.jaxrs.clientreqtimeout.RequestClientTimeOutIntf\"\n" +
+ "basePath: \"/clientreqtimeout\"\n" +
+ "consumes:\n" +
+ "- \"application/json\"\n" +
+ "produces:\n" +
+ "- \"application/json\"\n" +
+ "paths:\n" +
+ " /sayhello:\n" +
+ " post:\n" +
+ " operationId: \"sayHello\"\n" +
+ " parameters:\n" +
+ " - in: \"body\"\n" +
+ " name: \"student\"\n" +
+ " required: false\n" +
+ " schema:\n" +
+ " $ref: \"#/definitions/Student\"\n" +
+ " responses:\n" +
+ " 200:\n" +
+ " description: \"response of 200\"\n" +
+ " schema:\n" +
+ " type: \"string\"\n" +
+ "definitions:\n" +
+ " Student:\n" +
+ " type: \"object\"\n" +
+ " required:\n" +
+ " - \"name\"\n" +
+ " properties:\n" +
+ " name:\n" +
+ " type: \"string\"\n" +
+ " age:\n" +
+ " type: \"integer\"\n" +
+ " format: \"int32\"\n" +
+ " maximum: 20\n" +
+ " x-java-class:
\"org.apache.servicecomb.demo.validator.Student\"";
+ }
+ };
+
+ microservice.addSchema("s1",
+ "swagger: \"2.0\"\n" +
+ "info:\n" +
+ " version: \"1.0.0\"\n" +
+ " title: \"swagger definition for
org.apache.servicecomb.demo.jaxrs.server.RequestClientTimeOut\"\n" +
+ " x-java-interface:
\"cse.gen.jaxrstest.jaxrs.clientreqtimeout.RequestClientTimeOutIntf\"\n" +
+ "basePath: \"/clientreqtimeout\"\n" +
+ "consumes:\n" +
+ "- \"application/json\"\n" +
+ "produces:\n" +
+ "- \"application/json\"\n" +
+ "paths:\n" +
+ " /sayhello:\n" +
+ " post:\n" +
+ " operationId: \"sayHello\"\n" +
+ " parameters:\n" +
+ " - in: \"body\"\n" +
+ " name: \"student\"\n" +
+ " required: false\n" +
+ " schema:\n" +
+ " $ref: \"#/definitions/Student\"\n" +
+ " responses:\n" +
+ " 200:\n" +
+ " description: \"response of 200\"\n" +
+ " schema:\n" +
+ " type: \"string\"\n" +
+ "definitions:\n" +
+ " Student:\n" +
+ " properties:\n" +
+ " name:\n" +
+ " type: \"string\"\n" +
+ " age:\n" +
+ " type: \"integer\"\n" +
+ " format: \"int32\"\n" +
+ " maximum: 20\n" +
+ " type: \"object\"\n" +
+ " required:\n" +
+ " - \"name\"\n" +
+ " x-java-class:
\"org.apache.servicecomb.demo.validator.Student\"");
+ microservice.setEnvironment("prod");
+ MicroserviceRegisterTask registerTask = new
MicroserviceRegisterTask(eventBus, srClient, microservice);
+ Boolean isIlleagalException = false;
+
+ try {
+ registerTask.run();
+ } catch (IllegalStateException exception) {
+ isIlleagalException = true;
+ }
+ Assert.assertEquals(false, isIlleagalException);
+ }
}