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

liujun pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.0 by this push:
     new db15513071 [3.0] Enhance ls command (#10126)
db15513071 is described below

commit db1551307100be928dc09c5ea28df8ca6b3b8bed
Author: Albumen Kevin <[email protected]>
AuthorDate: Fri Jun 10 10:26:07 2022 +0800

    [3.0] Enhance ls command (#10126)
---
 .../java/org/apache/dubbo/qos/command/impl/Ls.java |   6 +-
 .../dubbo/qos/command/util/ServiceCheckUtils.java  |  90 +++++++++++------
 .../qos/command/util/ServiceCheckUtilsTest.java    | 107 +++++++++++++++------
 3 files changed, 144 insertions(+), 59 deletions(-)

diff --git 
a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/Ls.java
 
b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/Ls.java
index 37221962c8..962a036a38 100644
--- 
a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/Ls.java
+++ 
b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/Ls.java
@@ -61,7 +61,11 @@ public class Ls implements BaseCommand {
 
         //Content
         for (ProviderModel providerModel : providerModelList) {
-            tTable.addRow(providerModel.getServiceKey(), 
ServiceCheckUtils.isRegistered(providerModel) ? "Y" : "N");
+            if (providerModel.getModuleModel().isInternal()) {
+                tTable.addRow("DubboInternal - " + 
providerModel.getServiceKey(), 
ServiceCheckUtils.getRegisterStatus(providerModel));
+            } else {
+                tTable.addRow(providerModel.getServiceKey(), 
ServiceCheckUtils.getRegisterStatus(providerModel));
+            }
         }
         stringBuilder.append(tTable.rendering());
 
diff --git 
a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/util/ServiceCheckUtils.java
 
b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/util/ServiceCheckUtils.java
index 6a40e57ed9..c876c0ccdb 100644
--- 
a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/util/ServiceCheckUtils.java
+++ 
b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/util/ServiceCheckUtils.java
@@ -17,50 +17,86 @@
 package org.apache.dubbo.qos.command.util;
 
 import org.apache.dubbo.common.URL;
-import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.constants.CommonConstants;
+import org.apache.dubbo.common.constants.RegistryConstants;
+import org.apache.dubbo.common.utils.UrlUtils;
 import org.apache.dubbo.registry.Registry;
-import org.apache.dubbo.registry.support.AbstractRegistry;
-import org.apache.dubbo.registry.support.RegistryManager;
+import org.apache.dubbo.registry.client.migration.MigrationInvoker;
+import org.apache.dubbo.registry.client.migration.model.MigrationStep;
+import org.apache.dubbo.rpc.cluster.ClusterInvoker;
+import org.apache.dubbo.rpc.cluster.Directory;
 import org.apache.dubbo.rpc.model.ConsumerModel;
 import org.apache.dubbo.rpc.model.ProviderModel;
 
-import java.util.Collection;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 
 public class ServiceCheckUtils {
 
-    public static boolean isRegistered(ProviderModel providerModel) {
+    public static String getRegisterStatus(ProviderModel providerModel) {
         // check all registries status
+        List<String> statuses = new LinkedList<>();
         for (ProviderModel.RegisterStatedURL registerStatedURL : 
providerModel.getStatedUrl()) {
-            if (registerStatedURL.isRegistered()) {
-                return true;
-            }
+            URL registryUrl = registerStatedURL.getRegistryUrl();
+            boolean isServiceDiscovery = 
UrlUtils.isServiceDiscoveryURL(registryUrl);
+            String protocol = isServiceDiscovery ? 
registryUrl.getParameter(RegistryConstants.REGISTRY_KEY) : 
registryUrl.getProtocol();
+            // e.g. zookeeper-A(Y)
+            statuses.add(protocol + "-" + (isServiceDiscovery ? "A" : "I") + 
"(" + (registerStatedURL.isRegistered() ? "Y" : "N") + ")");
         }
-        return false;
+        // e.g. zookeeper-A(Y)/zookeeper-I(Y)
+        return String.join("/", statuses.toArray(new String[0]));
     }
 
-    public static int getConsumerAddressNum(ConsumerModel consumerModel) {
-        // TODO, only check one registry by default.
+    public static String getConsumerAddressNum(ConsumerModel consumerModel) {
         int num = 0;
-        RegistryManager registryManager = 
consumerModel.getModuleModel().getApplicationModel().getBeanFactory().getBean(RegistryManager.class);
-
-        Collection<Registry> registries = registryManager.getRegistries();
-        if (CollectionUtils.isNotEmpty(registries)) {
-            for (Registry registry : registries) {
-                if (!(registry instanceof AbstractRegistry)) {
-                    continue;
-                }
-                AbstractRegistry abstractRegistry = (AbstractRegistry) 
registry;
-                for (Map.Entry<URL, Map<String, List<URL>>> entry : 
abstractRegistry.getNotified().entrySet()) {
-                    if 
(entry.getKey().getServiceKey().equals(consumerModel.getServiceKey())) {
-                        if (CollectionUtils.isNotEmptyMap(entry.getValue())) {
-                            num = entry.getValue().size();
-                        }
-                    }
+        Object object = 
consumerModel.getServiceMetadata().getAttribute(CommonConstants.CURRENT_CLUSTER_INVOKER_KEY);
+        Map<Registry, MigrationInvoker<?>> invokerMap;
+        List<String> nums = new LinkedList<>();
+        if (object instanceof Map) {
+            invokerMap = (Map<Registry, MigrationInvoker<?>>) object;
+            for (Map.Entry<Registry, MigrationInvoker<?>> entry : 
invokerMap.entrySet()) {
+                URL registryUrl = entry.getKey().getUrl();
+                boolean isServiceDiscovery = 
UrlUtils.isServiceDiscoveryURL(registryUrl);
+                String protocol = isServiceDiscovery ? 
registryUrl.getParameter(RegistryConstants.REGISTRY_KEY) : 
registryUrl.getProtocol();
+                MigrationInvoker<?> migrationInvoker = entry.getValue();
+                MigrationStep migrationStep = 
migrationInvoker.getMigrationStep();
+                String interfaceSize = 
Optional.ofNullable(migrationInvoker.getInvoker())
+                    .map(ClusterInvoker::getDirectory)
+                    .map(Directory::getAllInvokers)
+                    .map(List::size)
+                    .map(String::valueOf)
+                    .orElse("-");
+                String applicationSize = 
Optional.ofNullable(migrationInvoker.getServiceDiscoveryInvoker())
+                    .map(ClusterInvoker::getDirectory)
+                    .map(Directory::getAllInvokers)
+                    .map(List::size)
+                    .map(String::valueOf)
+                    .orElse("-");
+                String step;
+                String size;
+                switch (migrationStep) {
+                    case APPLICATION_FIRST:
+                        step = "AF";
+                        size = "I-" + interfaceSize + ",A-" + applicationSize;
+                        break;
+                    case FORCE_INTERFACE:
+                        step = "I";
+                        size = interfaceSize;
+                        break;
+                    default:
+                        step = "A";
+                        size = applicationSize;
+                        break;
                 }
+                // zookeeper-AF(I-10,A-0)
+                // zookeeper-I(10)
+                // zookeeper-A(10)
+                nums.add(protocol + "-" + step + "(" + size + ")");
             }
         }
-        return num;
+        // zookeeper-AF(I-10,A-0)/nacos-I(10)
+        return String.join("/", nums.toArray(new String[0]));
     }
 }
diff --git 
a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/util/ServiceCheckUtilsTest.java
 
b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/util/ServiceCheckUtilsTest.java
index 41c0ada3f5..ab1509e06d 100644
--- 
a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/util/ServiceCheckUtilsTest.java
+++ 
b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/util/ServiceCheckUtilsTest.java
@@ -17,32 +17,31 @@
 package org.apache.dubbo.qos.command.util;
 
 
-import com.google.common.collect.Lists;
 import org.apache.dubbo.common.URL;
-import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
 import org.apache.dubbo.common.utils.NetUtils;
 import org.apache.dubbo.qos.DemoService;
 import org.apache.dubbo.qos.DemoServiceImpl;
 import org.apache.dubbo.registry.Registry;
-import org.apache.dubbo.registry.client.ServiceDiscoveryRegistry;
-import org.apache.dubbo.registry.support.RegistryManager;
-
+import org.apache.dubbo.registry.client.migration.MigrationInvoker;
+import org.apache.dubbo.registry.client.migration.model.MigrationStep;
+import org.apache.dubbo.rpc.cluster.ClusterInvoker;
+import org.apache.dubbo.rpc.cluster.Directory;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ConsumerModel;
-import org.apache.dubbo.rpc.model.ModuleModel;
 import org.apache.dubbo.rpc.model.ModuleServiceRepository;
 import org.apache.dubbo.rpc.model.ProviderModel;
 import org.apache.dubbo.rpc.model.ServiceDescriptor;
 import org.apache.dubbo.rpc.model.ServiceMetadata;
 
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 
-import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.mockito.Mockito.when;
 
 /**
  * Test for ServiceCheckUtils
@@ -69,33 +68,79 @@ public class ServiceCheckUtilsTest {
             new ServiceMetadata());
         repository.registerProvider(providerModel);
 
-        boolean registered = ServiceCheckUtils.isRegistered(providerModel);
-        assertFalse(registered);
-    }
-
-    private static final ConsumerModel consumerModel;
-
-    static {
-        consumerModel = Mockito.mock(ConsumerModel.class);
-        ServiceDiscoveryRegistry serviceDiscoveryRegistry = 
Mockito.mock(ServiceDiscoveryRegistry.class);
-        Collection<Registry> registries = 
Lists.newArrayList(serviceDiscoveryRegistry);
-
-        ModuleModel moduleModel = Mockito.mock(ModuleModel.class);
-        ApplicationModel applicationModel = 
Mockito.mock(ApplicationModel.class);
-        ScopeBeanFactory scopeBeanFactory = 
Mockito.mock(ScopeBeanFactory.class);
-        RegistryManager registryManager = Mockito.mock(RegistryManager.class);
-        when(applicationModel.getBeanFactory()).thenReturn(scopeBeanFactory);
-        
when(scopeBeanFactory.getBean(RegistryManager.class)).thenReturn(registryManager);
-        when(moduleModel.getApplicationModel()).thenReturn(applicationModel);
-        when(consumerModel.getModuleModel()).thenReturn(moduleModel);
+        String url1 = 
"service-discovery-registry://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=dubbo-demo-api-provider&dubbo=2.0.2&pid=66099&registry=zookeeper&timestamp=1654588337653";
+        String url2 = 
"zookeeper://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=dubbo-demo-api-provider&dubbo=2.0.2&pid=66099&timestamp=1654588337653";
+        providerModel.getStatedUrl().add(new 
ProviderModel.RegisterStatedURL(url, URL.valueOf(url1), true));
+        providerModel.getStatedUrl().add(new 
ProviderModel.RegisterStatedURL(url, URL.valueOf(url2), false));
 
-        when(registryManager.getRegistries()).thenReturn(registries);
+        Assertions.assertEquals("zookeeper-A(Y)/zookeeper-I(N)", 
ServiceCheckUtils.getRegisterStatus(providerModel));
     }
 
     @Test
     public void testGetConsumerAddressNum() {
-        int consumerAddressNum = 
ServiceCheckUtils.getConsumerAddressNum(consumerModel);
-        assertEquals(0, consumerAddressNum);
+        ConsumerModel consumerModel = Mockito.mock(ConsumerModel.class);
+        ServiceMetadata serviceMetadata = Mockito.mock(ServiceMetadata.class);
+        
Mockito.when(consumerModel.getServiceMetadata()).thenReturn(serviceMetadata);
+        String registry1 = 
"service-discovery-registry://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=dubbo-demo-api-provider&dubbo=2.0.2&pid=66099&registry=zookeeper&timestamp=1654588337653";
+        String registry2 = 
"zookeeper://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=dubbo-demo-api-provider&dubbo=2.0.2&pid=66099&timestamp=1654588337653";
+        String registry3 = 
"nacos://127.0.0.1:8848/org.apache.dubbo.registry.RegistryService?application=dubbo-demo-api-provider&dubbo=2.0.2&pid=66099&timestamp=1654588337653";
+        Map<Registry, MigrationInvoker<?>> invokerMap = new LinkedHashMap<>();
+        {
+            Registry registry = Mockito.mock(Registry.class);
+            Mockito.when(registry.getUrl()).thenReturn(URL.valueOf(registry1));
+            MigrationInvoker<?> migrationInvoker = 
Mockito.mock(MigrationInvoker.class);
+            
Mockito.when(migrationInvoker.getMigrationStep()).thenReturn(MigrationStep.FORCE_APPLICATION);
+            ClusterInvoker serviceDiscoveryInvoker = 
Mockito.mock(ClusterInvoker.class);
+            
Mockito.when(migrationInvoker.getServiceDiscoveryInvoker()).thenReturn(serviceDiscoveryInvoker);
+            Directory<?> sdDirectory = Mockito.mock(Directory.class);
+            
Mockito.when(serviceDiscoveryInvoker.getDirectory()).thenReturn(sdDirectory);
+            List sdInvokers = Mockito.mock(List.class);
+            Mockito.when(sdDirectory.getAllInvokers()).thenReturn(sdInvokers);
+            Mockito.when(sdInvokers.size()).thenReturn(5);
+            invokerMap.put(registry, migrationInvoker);
+        }
+
+        {
+            Registry registry = Mockito.mock(Registry.class);
+            Mockito.when(registry.getUrl()).thenReturn(URL.valueOf(registry2));
+            MigrationInvoker<?> migrationInvoker = 
Mockito.mock(MigrationInvoker.class);
+            
Mockito.when(migrationInvoker.getMigrationStep()).thenReturn(MigrationStep.APPLICATION_FIRST);
+            ClusterInvoker serviceDiscoveryInvoker = 
Mockito.mock(ClusterInvoker.class);
+            
Mockito.when(migrationInvoker.getServiceDiscoveryInvoker()).thenReturn(serviceDiscoveryInvoker);
+            Directory<?> sdDirectory = Mockito.mock(Directory.class);
+            
Mockito.when(serviceDiscoveryInvoker.getDirectory()).thenReturn(sdDirectory);
+            List sdInvokers = Mockito.mock(List.class);
+            Mockito.when(sdDirectory.getAllInvokers()).thenReturn(sdInvokers);
+            Mockito.when(sdInvokers.size()).thenReturn(0);
+
+            ClusterInvoker invoker = Mockito.mock(ClusterInvoker.class);
+            Mockito.when(migrationInvoker.getInvoker()).thenReturn(invoker);
+            Directory<?> directory = Mockito.mock(Directory.class);
+            Mockito.when(invoker.getDirectory()).thenReturn(directory);
+            List invokers = Mockito.mock(List.class);
+            Mockito.when(directory.getAllInvokers()).thenReturn(invokers);
+            Mockito.when(invokers.size()).thenReturn(10);
+            invokerMap.put(registry, migrationInvoker);
+        }
+
+        {
+            Registry registry = Mockito.mock(Registry.class);
+            Mockito.when(registry.getUrl()).thenReturn(URL.valueOf(registry3));
+            MigrationInvoker<?> migrationInvoker = 
Mockito.mock(MigrationInvoker.class);
+            
Mockito.when(migrationInvoker.getMigrationStep()).thenReturn(MigrationStep.FORCE_INTERFACE);
+            ClusterInvoker invoker = Mockito.mock(ClusterInvoker.class);
+            Mockito.when(migrationInvoker.getInvoker()).thenReturn(invoker);
+            Directory<?> directory = Mockito.mock(Directory.class);
+            Mockito.when(invoker.getDirectory()).thenReturn(directory);
+            List invokers = Mockito.mock(List.class);
+            Mockito.when(directory.getAllInvokers()).thenReturn(invokers);
+            Mockito.when(invokers.size()).thenReturn(10);
+            invokerMap.put(registry, migrationInvoker);
+        }
+
+        
Mockito.when(serviceMetadata.getAttribute("currentClusterInvoker")).thenReturn(invokerMap);
+
+        assertEquals("zookeeper-A(5)/zookeeper-AF(I-10,A-0)/nacos-I(10)", 
ServiceCheckUtils.getConsumerAddressNum(consumerModel));
     }
 
 

Reply via email to