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);
+  }
 }

Reply via email to