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

liubao pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git

commit 92bf20b43da023d378f116bab0f66197b7177a3a
Author: yaohaishi <[email protected]>
AuthorDate: Wed Sep 19 16:38:14 2018 +0800

    [SCB-926] implement StaticMicroserviceVersions
---
 .../registry/StaticMicroservice.java}              |  26 +---
 .../serviceregistry/consumer/AppManager.java       |  10 ++
 .../consumer/MicroserviceVersions.java             |   8 +-
 ....java => StaticMicroserviceVersionFactory.java} |  26 +---
 .../consumer/StaticMicroserviceVersions.java       |  57 +++++++-
 .../consumer/StaticMicroserviceVersionsTest.java   | 155 +++++++++++++++++++++
 6 files changed, 234 insertions(+), 48 deletions(-)

diff --git 
a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java
 
b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/StaticMicroservice.java
similarity index 58%
copy from 
service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java
copy to 
service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/StaticMicroservice.java
index 692a5a2..60d5900 100644
--- 
a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java
+++ 
b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/StaticMicroservice.java
@@ -15,30 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.serviceregistry.consumer;
-
-import java.util.List;
-
-import 
org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
-
-public class StaticMicroserviceVersions extends MicroserviceVersions {
+package org.apache.servicecomb.serviceregistry.api.registry;
 
+public class StaticMicroservice extends Microservice {
   private Class<?> schemaIntfCls;
 
-  public StaticMicroserviceVersions(AppManager appManager, String appId, 
String microserviceName,
-      Class<?> schemaIntfCls) {
-    super(appManager, appId, microserviceName);
-
-    validated = true;
-    this.schemaIntfCls = schemaIntfCls;
+  public Class<?> getSchemaIntfCls() {
+    return schemaIntfCls;
   }
 
-  @Override
-  public void pullInstances() {
-    // instance information is stored locally, do not pull from sc
-  }
-
-  public void addInstances(String version, List<MicroserviceInstance> 
instances) {
-
+  public void setSchemaIntfCls(Class<?> schemaIntfCls) {
+    this.schemaIntfCls = schemaIntfCls;
   }
 }
diff --git 
a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/AppManager.java
 
b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/AppManager.java
index 7cc45e2..0e0fb6a 100644
--- 
a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/AppManager.java
+++ 
b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/AppManager.java
@@ -31,6 +31,8 @@ public class AppManager {
   // key: appId
   private Map<String, MicroserviceManager> apps = new ConcurrentHashMapEx<>();
 
+  private StaticMicroserviceVersionFactory staticMicroserviceVersionFactory;
+
   public AppManager(EventBus eventBus) {
     this.eventBus = eventBus;
   }
@@ -67,4 +69,12 @@ public class AppManager {
     MicroserviceManager microserviceManager = 
getOrCreateMicroserviceManager(appId);
     return 
microserviceManager.getOrCreateMicroserviceVersions(microserviceName);
   }
+
+  public StaticMicroserviceVersionFactory 
getStaticMicroserviceVersionFactory() {
+    return staticMicroserviceVersionFactory;
+  }
+
+  public void 
setStaticMicroserviceVersionFactory(StaticMicroserviceVersionFactory 
staticMicroserviceVersionFactory) {
+    this.staticMicroserviceVersionFactory = staticMicroserviceVersionFactory;
+  }
 }
diff --git 
a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
 
b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
index 4e4ae38..e85c513 100644
--- 
a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
+++ 
b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
@@ -43,7 +43,7 @@ import com.google.common.eventbus.Subscribe;
 public class MicroserviceVersions {
   private static final Logger LOGGER = 
LoggerFactory.getLogger(MicroserviceVersions.class);
 
-  private AppManager appManager;
+  AppManager appManager;
 
   private String appId;
 
@@ -58,13 +58,13 @@ public class MicroserviceVersions {
   // in the future:
   //  pulledInstances means all instance
   //  instances means available instance
-  private List<MicroserviceInstance> instances;
+  List<MicroserviceInstance> instances;
 
   // key is service id
-  private Map<String, MicroserviceVersion> versions = new 
ConcurrentHashMapEx<>();
+  Map<String, MicroserviceVersion> versions = new ConcurrentHashMapEx<>();
 
   // key is version rule
-  private Map<String, MicroserviceVersionRule> versionRules = new 
ConcurrentHashMapEx<>();
+  Map<String, MicroserviceVersionRule> versionRules = new 
ConcurrentHashMapEx<>();
 
   // process pulled instances and create versionRule must be protected by lock
   // otherwise maybe lost instance or version in versionRule
diff --git 
a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java
 
b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersionFactory.java
similarity index 56%
copy from 
service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java
copy to 
service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersionFactory.java
index 692a5a2..d2fb60d 100644
--- 
a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java
+++ 
b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersionFactory.java
@@ -17,28 +17,8 @@
 
 package org.apache.servicecomb.serviceregistry.consumer;
 
-import java.util.List;
+import org.apache.servicecomb.serviceregistry.api.registry.StaticMicroservice;
 
-import 
org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
-
-public class StaticMicroserviceVersions extends MicroserviceVersions {
-
-  private Class<?> schemaIntfCls;
-
-  public StaticMicroserviceVersions(AppManager appManager, String appId, 
String microserviceName,
-      Class<?> schemaIntfCls) {
-    super(appManager, appId, microserviceName);
-
-    validated = true;
-    this.schemaIntfCls = schemaIntfCls;
-  }
-
-  @Override
-  public void pullInstances() {
-    // instance information is stored locally, do not pull from sc
-  }
-
-  public void addInstances(String version, List<MicroserviceInstance> 
instances) {
-
-  }
+public interface StaticMicroserviceVersionFactory {
+  MicroserviceVersion create(StaticMicroservice microservice);
 }
diff --git 
a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java
 
b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java
index 692a5a2..286ff95 100644
--- 
a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java
+++ 
b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java
@@ -17,20 +17,28 @@
 
 package org.apache.servicecomb.serviceregistry.consumer;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.UUID;
 
+import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import 
org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
+import org.apache.servicecomb.serviceregistry.api.registry.StaticMicroservice;
+import org.apache.servicecomb.serviceregistry.version.Version;
 
 public class StaticMicroserviceVersions extends MicroserviceVersions {
 
   private Class<?> schemaIntfCls;
 
+  private String environment;
+
   public StaticMicroserviceVersions(AppManager appManager, String appId, 
String microserviceName,
       Class<?> schemaIntfCls) {
     super(appManager, appId, microserviceName);
 
     validated = true;
     this.schemaIntfCls = schemaIntfCls;
+    this.environment = RegistryUtils.getMicroservice().getEnvironment();
   }
 
   @Override
@@ -38,7 +46,54 @@ public class StaticMicroserviceVersions extends 
MicroserviceVersions {
     // instance information is stored locally, do not pull from sc
   }
 
-  public void addInstances(String version, List<MicroserviceInstance> 
instances) {
+  public void addInstances(String version, List<MicroserviceInstance> 
addedInstances) {
+    Version parsedVersion = new Version(version);
+    String serviceId = computeServiceId(parsedVersion);
+
+    for (MicroserviceInstance instance : addedInstances) {
+      instance.setServiceId(serviceId);
+      instance.setInstanceId(serviceId + "-" + UUID.randomUUID());
+    }
+
+    mergeInstances(addedInstances);
+
+    // ensure microserviceVersion exists
+    versions.computeIfAbsent(serviceId, microserviceId -> {
+      StaticMicroservice microservice = createMicroservice(parsedVersion, 
serviceId);
+      MicroserviceVersion microserviceVersion = 
appManager.getStaticMicroserviceVersionFactory().create(microservice);
+      for (MicroserviceVersionRule microserviceVersionRule : 
versionRules.values()) {
+        microserviceVersionRule.addMicroserviceVersion(microserviceVersion);
+      }
+      return microserviceVersion;
+    });
+
+    for (MicroserviceVersionRule microserviceVersionRule : 
versionRules.values()) {
+      microserviceVersionRule.setInstances(this.instances);
+    }
+  }
+
+  private void mergeInstances(List<MicroserviceInstance> instances) {
+    if (null == this.instances) {
+      this.instances = new ArrayList<>(instances.size());
+    }
+    this.instances.addAll(instances);
+  }
+
+  private StaticMicroservice createMicroservice(Version parsedVersion, String 
serviceId) {
+    StaticMicroservice microservice = new StaticMicroservice();
+    microservice.setAppId(this.getAppId());
+    microservice.setServiceId(serviceId);
+    microservice.setServiceName(this.getMicroserviceName());
+    microservice.setVersion(parsedVersion.getVersion());
+    
microservice.setEnvironment(RegistryUtils.getMicroservice().getEnvironment());
+    microservice.setSchemaIntfCls(this.schemaIntfCls);
+    return microservice;
+  }
 
+  private String computeServiceId(Version parsedVersion) {
+    return this.getAppId() + "-"
+        + this.environment + "-"
+        + this.getMicroserviceName() + "-"
+        + parsedVersion.getVersion();
   }
 }
diff --git 
a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersionsTest.java
 
b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersionsTest.java
new file mode 100644
index 0000000..ca3c3b3
--- /dev/null
+++ 
b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersionsTest.java
@@ -0,0 +1,155 @@
+/*
+ * 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.servicecomb.serviceregistry.consumer;
+
+import java.util.Collections;
+
+import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
+import 
org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
+import org.apache.servicecomb.serviceregistry.api.registry.StaticMicroservice;
+import org.apache.servicecomb.serviceregistry.client.ServiceRegistryClient;
+import 
org.apache.servicecomb.serviceregistry.definition.MicroserviceDefinition;
+import org.apache.servicecomb.serviceregistry.registry.AbstractServiceRegistry;
+import org.apache.servicecomb.serviceregistry.version.Version;
+import org.apache.servicecomb.serviceregistry.version.VersionUtils;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.google.common.eventbus.EventBus;
+
+import mockit.Mock;
+import mockit.MockUp;
+
+public class StaticMicroserviceVersionsTest {
+
+  private static final String APP_ID = "testAppId";
+
+  private static final String THIS_SERVICE = "thisService";
+
+  private static final String MICROSERVICE_NAME = "3rdPartyService";
+
+  private static final String ENVIRONMENT = "production";
+
+  private static final String SERVICE_ID_PREFIX = APP_ID + "-" + ENVIRONMENT + 
"-" + MICROSERVICE_NAME + "-";
+
+  @BeforeClass
+  public static void beforeClass() {
+    RegistryUtils.setServiceRegistry(new AbstractServiceRegistry(null, null,
+        MicroserviceDefinition.create(APP_ID, THIS_SERVICE)) {
+      @Override
+      protected ServiceRegistryClient createServiceRegistryClient() {
+        return null;
+      }
+    });
+    RegistryUtils.getMicroservice().setEnvironment(ENVIRONMENT);
+  }
+
+  @Test
+  public void addInstanceBasic() {
+    StaticMicroserviceVersions staticMicroserviceVersions = 
createStaticMicroserviceVersions();
+
+    MicroserviceInstance instance = new MicroserviceInstance();
+    String serviceVersion = "1.2.1";
+    staticMicroserviceVersions.addInstances(serviceVersion, 
Collections.singletonList(instance));
+
+    MicroserviceVersionRule versionRule = 
staticMicroserviceVersions.getOrCreateMicroserviceVersionRule(serviceVersion);
+    MicroserviceVersion latestMicroserviceVersion = 
versionRule.getLatestMicroserviceVersion();
+    Assert.assertEquals(new Version(serviceVersion), 
latestMicroserviceVersion.getVersion());
+    Microservice latestMicroservice = 
latestMicroserviceVersion.getMicroservice();
+    Assert.assertEquals(APP_ID, latestMicroservice.getAppId());
+    Assert.assertEquals(SERVICE_ID_PREFIX + serviceVersion, 
latestMicroservice.getServiceId());
+    Assert.assertEquals(MICROSERVICE_NAME, 
latestMicroservice.getServiceName());
+    Assert.assertEquals(serviceVersion, latestMicroservice.getVersion());
+    Assert.assertEquals(ENVIRONMENT, latestMicroservice.getEnvironment());
+    Assert.assertEquals(TestServiceIntf.class, ((StaticMicroservice) 
latestMicroservice).getSchemaIntfCls());
+    Assert.assertEquals(1, versionRule.getInstances().size());
+    Assert.assertSame(instance, 
versionRule.getInstances().get(instance.getInstanceId()));
+    Assert.assertEquals(SERVICE_ID_PREFIX + serviceVersion, 
instance.getServiceId());
+    Assert.assertTrue(instance.getInstanceId().startsWith(SERVICE_ID_PREFIX + 
serviceVersion + "-"));
+  }
+
+  @Test
+  public void addInstancesAndGetVersionRuleMultiTimes() {
+    StaticMicroserviceVersions staticMicroserviceVersions = 
createStaticMicroserviceVersions();
+
+    // add instance1 with version 1.1.0
+    MicroserviceInstance instance1 = new MicroserviceInstance();
+    staticMicroserviceVersions.addInstances("1.1.0", 
Collections.singletonList(instance1));
+
+    MicroserviceVersionRule versionRule = 
staticMicroserviceVersions.getOrCreateMicroserviceVersionRule("0.0.0+");
+    MicroserviceVersion latestMicroserviceVersion = 
versionRule.getLatestMicroserviceVersion();
+    Assert.assertEquals(new Version("1.1.0"), 
latestMicroserviceVersion.getVersion());
+    Assert.assertEquals(1, versionRule.getInstances().size());
+    Assert.assertSame(instance1, 
versionRule.getInstances().get(instance1.getInstanceId()));
+
+    // add instance2 with version 1.1.1
+    MicroserviceInstance instance2 = new MicroserviceInstance();
+    staticMicroserviceVersions.addInstances("1.1.1", 
Collections.singletonList(instance2));
+
+    versionRule = 
staticMicroserviceVersions.getOrCreateMicroserviceVersionRule("0.0.0+");
+    latestMicroserviceVersion = versionRule.getLatestMicroserviceVersion();
+    Assert.assertEquals(new Version("1.1.1"), 
latestMicroserviceVersion.getVersion());
+    Assert.assertEquals(2, versionRule.getInstances().size());
+    Assert.assertSame(instance1, 
versionRule.getInstances().get(instance1.getInstanceId()));
+    Assert.assertSame(instance2, 
versionRule.getInstances().get(instance2.getInstanceId()));
+
+    // add instance3 with version 0.1.0
+    MicroserviceInstance instance3 = new MicroserviceInstance();
+    staticMicroserviceVersions.addInstances("0.1.0", 
Collections.singletonList(instance3));
+
+    versionRule = 
staticMicroserviceVersions.getOrCreateMicroserviceVersionRule("0.0.0+");
+    latestMicroserviceVersion = versionRule.getLatestMicroserviceVersion();
+    Assert.assertEquals(new Version("1.1.1"), 
latestMicroserviceVersion.getVersion());
+    Assert.assertEquals(3, versionRule.getInstances().size());
+    Assert.assertSame(instance1, 
versionRule.getInstances().get(instance1.getInstanceId()));
+    Assert.assertSame(instance2, 
versionRule.getInstances().get(instance2.getInstanceId()));
+    Assert.assertSame(instance3, 
versionRule.getInstances().get(instance3.getInstanceId()));
+
+    // instance3 should be filtered out
+    versionRule = 
staticMicroserviceVersions.getOrCreateMicroserviceVersionRule("1.0.0+");
+    latestMicroserviceVersion = versionRule.getLatestMicroserviceVersion();
+    Assert.assertEquals(new Version("1.1.1"), 
latestMicroserviceVersion.getVersion());
+    Assert.assertEquals(2, versionRule.getInstances().size());
+    Assert.assertSame(instance1, 
versionRule.getInstances().get(instance1.getInstanceId()));
+    Assert.assertSame(instance2, 
versionRule.getInstances().get(instance2.getInstanceId()));
+    
Assert.assertNull(versionRule.getInstances().get(instance3.getInstanceId()));
+  }
+
+  private StaticMicroserviceVersions createStaticMicroserviceVersions() {
+    EventBus eventBus = new EventBus();
+    AppManager appManager = new AppManager(eventBus);
+    appManager.setStaticMicroserviceVersionFactory(microservice -> new 
MockUp<MicroserviceVersion>() {
+      @Mock
+      public Version getVersion() {
+        return VersionUtils.getOrCreate(microservice.getVersion());
+      }
+
+      @Mock
+      public Microservice getMicroservice() {
+        return microservice;
+      }
+    }.getMockInstance());
+    return new StaticMicroserviceVersions(
+        appManager, APP_ID, MICROSERVICE_NAME, TestServiceIntf.class);
+  }
+
+  private interface TestServiceIntf {
+  }
+}
\ No newline at end of file

Reply via email to