[ https://issues.apache.org/jira/browse/SCB-727?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16541778#comment-16541778 ]
ASF GitHub Bot commented on SCB-727: ------------------------------------ wujimin closed pull request #801: [SCB-727] Local generated schema and service center schema are different then print the diff content to the user URL: https://github.com/apache/incubator-servicecomb-java-chassis/pull/801 This is a PR merged from a forked repository. As GitHub hides the original diff on merge, it is displayed below for the sake of provenance: As this is a foreign pull request (from a fork), the diff is supplied below (as it won't show otherwise due to GitHub magic): diff --git a/service-registry/pom.xml b/service-registry/pom.xml index b2fbcdd16..72e26f48d 100644 --- a/service-registry/pom.xml +++ b/service-registry/pom.xml @@ -56,5 +56,9 @@ <groupId>org.apache.servicecomb</groupId> <artifactId>foundation-test-scaffolding</artifactId> </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-lang3</artifactId> + </dependency> </dependencies> </project> 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 363668286..35ee1e636 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 @@ -33,10 +33,10 @@ import org.apache.servicecomb.serviceregistry.client.http.Holder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.util.StringUtils; import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; +import org.apache.commons.lang3.StringUtils; public class MicroserviceRegisterTask extends AbstractRegisterTask { private static final Logger LOGGER = LoggerFactory.getLogger(MicroserviceRegisterTask.class); @@ -191,7 +191,9 @@ private boolean registerSchema(Map<String, GetSchemaResponse> scSchemaMap, GetSchemaResponse scSchema = scSchemaMap.get(localSchemaEntry.getKey()); boolean onlineSchemaExists = scSchema != null; - LOGGER.info("schemaId [{}] exists [{}], summary exists [{}]", localSchemaEntry.getKey(), onlineSchemaExists, + LOGGER.info("schemaId [{}] exists [{}], summary exists [{}]", + localSchemaEntry.getKey(), + onlineSchemaExists, scSchema != null && scSchema.getSummary() != null); if (!onlineSchemaExists) { // local > sc @@ -250,10 +252,26 @@ private boolean compareAndReRegisterSchema(Entry<String, String> localSchemaEntr if (onlineSchemaIsModifiable()) { LOGGER.info( "schema[{}]'s content is changed and the current environment is [{}], so re-register it!", - localSchemaEntry.getKey(), ServiceCombConstants.DEVELOPMENT_SERVICECOMB_ENV); + localSchemaEntry.getKey(), + ServiceCombConstants.DEVELOPMENT_SERVICECOMB_ENV); return registerSingleSchema(localSchemaEntry.getKey(), localSchemaEntry.getValue()); } + //if local schema and service center schema is different then print the both schemas and print difference in local schema. + String scSchemaContent = srClient.getSchema(microservice.getServiceId(), scSchema.getSchemaId()); + String localSchemaContent = localSchemaEntry.getValue(); + + LOGGER.warn( + "service center schema and local schema both are different:\n service center schema:\n[{}\n local schema:\n[{}]", + scSchemaContent, + localSchemaContent); + String diffStringLocal = StringUtils.difference(scSchemaContent, localSchemaContent); + if (diffStringLocal.equals("")) { + LOGGER.warn("Some APIs are deleted in local schema which are present in service center schema \n"); + } else { + LOGGER.warn("The difference in local schema:\n[{}]", diffStringLocal); + } + // env is not development, throw an exception and break the init procedure throw new IllegalStateException( "The schema(id=[" + localSchemaEntry.getKey() @@ -307,7 +325,7 @@ private void checkRemainingSchema(Map<String, GetSchemaResponse> scSchemaMap) { // Currently nothing to do but print a warning LOGGER.warn("There are schemas only existing in service center: {}, which means there are interfaces changed. " - + "It's recommended to increment microservice version before deploying.", + + "It's recommended to increment microservice version before deploying.", scSchemaMap.keySet()); LOGGER.warn("ATTENTION: The schemas in new version are less than the old version, " + "which may cause compatibility problems."); 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 a7944c83a..5c44312c9 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 @@ -18,13 +18,17 @@ import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; +import org.apache.log4j.spi.LoggingEvent; import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils; +import org.apache.servicecomb.foundation.test.scaffolding.log.LogCollector; import org.apache.servicecomb.serviceregistry.api.registry.Microservice; 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.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -42,8 +46,11 @@ private List<MicroserviceRegisterTask> taskList; + LogCollector collector; + @Before public void setup() { + collector = new LogCollector(); eventBus = new EventBus(); taskList = new ArrayList<>(); @@ -61,6 +68,11 @@ public void onEvent(MicroserviceRegisterTask task) { microservice.setInstance(new MicroserviceInstance()); } + @After + public void teardown() { + collector.teardown(); + } + @Test public void testNewRegisterFailed(@Mocked ServiceRegistryClient srClient) { new Expectations() { @@ -471,4 +483,226 @@ public void testReRegisterForDevAndLocalSchemasAreLess(@Mocked ServiceRegistryCl Assert.assertEquals("serviceId", microservice.getServiceId()); Assert.assertEquals(1, taskList.size()); } + + /** + * There is schema in service center which is different from local schema. + */ + @Test + public void testLocalSchemaAndServiceCenterSchemaDiff(@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" + + " $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; + List<LoggingEvent> events = collector.getEvents().stream().filter(e -> { + return MicroserviceRegisterTask.class.getName().equals(e.getLoggerName()); + }).collect(Collectors.toList()); + + Assert.assertEquals("service center schema and local schema both are different:\n" + + " service center schema:\n" + + "[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\"\n" + + " local schema:\n" + + "[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\"]", events.get(4).getMessage()); + + Assert.assertEquals("The difference in local 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\"]", events.get(5).getMessage()); + + } + + Assert.assertEquals(true, isIlleagalException); + } } ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org > Java Chassis-Local generated schema and service center schema are different > while registering the service then print the difference content > ------------------------------------------------------------------------------------------------------------------------------------------- > > Key: SCB-727 > URL: https://issues.apache.org/jira/browse/SCB-727 > Project: Apache ServiceComb > Issue Type: Improvement > Affects Versions: java-chassis-1.0.0 > Reporter: Mahesh Raju Somalaraju > Assignee: Mahesh Raju Somalaraju > Priority: Major > Fix For: java-chassis-1.0.0 > > > Java Chassis- Local generated schema and service center schema are different > while registering the service then print the difference content. -- This message was sent by Atlassian JIRA (v7.6.3#76005)