From eee741266e6469cbdfa1ff551253764421d3b0a8 Mon Sep 17 00:00:00 2001 From: HÃ¥kon Hallingstad Date: Mon, 23 Oct 2017 12:19:14 +0200 Subject: Make SlobrokMonitorManager a component To get insights into the Slobrok data used by the service monitor, it would be useful to expose SlobrokMonitorManager. For instance it could provide a list of name/spec pairs of services that are up (added as ServiceMonitorManager::lookup in this PR). The first step towards this is making SlobrokMonitorManager a component. --- .../vespa/service/monitor/ServiceMonitor.java | 2 +- .../vespa/service/monitor/ServiceMonitorImpl.java | 5 +- .../vespa/service/monitor/SlobrokMonitor.java | 81 +++++++++++++ .../vespa/service/monitor/SlobrokMonitor2.java | 77 ------------ .../service/monitor/SlobrokMonitorManager.java | 114 ++---------------- .../service/monitor/SlobrokMonitorManagerImpl.java | 130 +++++++++++++++++++++ .../service/monitor/SuperModelListenerImpl.java | 4 +- .../yahoo/vespa/service/monitor/ExampleModel.java | 4 +- .../vespa/service/monitor/ModelGeneratorTest.java | 4 +- .../vespa/service/monitor/SlobrokMonitor2Test.java | 36 ------ .../monitor/SlobrokMonitorManagerImplImplTest.java | 93 +++++++++++++++ .../service/monitor/SlobrokMonitorManagerTest.java | 93 --------------- .../vespa/service/monitor/SlobrokMonitorTest.java | 36 ++++++ .../monitor/SuperModelListenerImplTest.java | 2 +- 14 files changed, 362 insertions(+), 319 deletions(-) create mode 100644 service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SlobrokMonitor.java delete mode 100644 service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SlobrokMonitor2.java create mode 100644 service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SlobrokMonitorManagerImpl.java delete mode 100644 service-monitor/src/test/java/com/yahoo/vespa/service/monitor/SlobrokMonitor2Test.java create mode 100644 service-monitor/src/test/java/com/yahoo/vespa/service/monitor/SlobrokMonitorManagerImplImplTest.java delete mode 100644 service-monitor/src/test/java/com/yahoo/vespa/service/monitor/SlobrokMonitorManagerTest.java create mode 100644 service-monitor/src/test/java/com/yahoo/vespa/service/monitor/SlobrokMonitorTest.java (limited to 'service-monitor/src') diff --git a/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/ServiceMonitor.java b/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/ServiceMonitor.java index e99d34fc15e..435bcd19032 100644 --- a/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/ServiceMonitor.java +++ b/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/ServiceMonitor.java @@ -18,6 +18,6 @@ public interface ServiceMonitor { * Returns the current liveness status (up, down or unknown) of all instances * of all services of all clusters of all applications in a zone. */ - Map queryStatusOfAllApplicationInstances(); + Map getAllApplicationInstances(); } diff --git a/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/ServiceMonitorImpl.java b/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/ServiceMonitorImpl.java index 20cc66a6c30..798ccb4476c 100644 --- a/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/ServiceMonitorImpl.java +++ b/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/ServiceMonitorImpl.java @@ -23,12 +23,12 @@ public class ServiceMonitorImpl implements ServiceMonitor { private final Zone zone; private final List configServerHosts; - private final SlobrokMonitorManager slobrokMonitorManager = new SlobrokMonitorManager(); private final ServiceModelCache serviceModelCache; @Inject public ServiceMonitorImpl(SuperModelProvider superModelProvider, ConfigserverConfig configserverConfig, + SlobrokMonitorManagerImpl slobrokMonitorManager, Metric metric, Timer timer) { this.zone = superModelProvider.getZone(); @@ -58,8 +58,7 @@ public class ServiceMonitorImpl implements ServiceMonitor { } @Override - public Map queryStatusOfAllApplicationInstances() { + public Map getAllApplicationInstances() { return serviceModelCache.get().getAllApplicationInstances(); } } diff --git a/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SlobrokMonitor.java b/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SlobrokMonitor.java new file mode 100644 index 00000000000..4da7b7c0e68 --- /dev/null +++ b/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SlobrokMonitor.java @@ -0,0 +1,81 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.service.monitor; + +import com.yahoo.config.model.api.ApplicationInfo; +import com.yahoo.config.model.api.HostInfo; +import com.yahoo.config.model.api.PortInfo; +import com.yahoo.config.model.api.ServiceInfo; +import com.yahoo.jrt.Spec; +import com.yahoo.jrt.Supervisor; +import com.yahoo.jrt.Transport; +import com.yahoo.jrt.slobrok.api.Mirror; +import com.yahoo.jrt.slobrok.api.SlobrokList; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +/** + * Class to manage Slobrok + */ +public class SlobrokMonitor implements AutoCloseable { + public static final String SLOBROK_SERVICE_TYPE = "slobrok"; + public static final String SLOBROK_RPC_PORT_TAG = "rpc"; + + private final SlobrokList slobrokList; + private final Mirror mirror; + + SlobrokMonitor() { + this(new SlobrokList()); + } + + // Package-private for testing. + SlobrokMonitor(SlobrokList slobrokList, Mirror mirror) { + this.slobrokList = slobrokList; + this.mirror = mirror; + } + + private SlobrokMonitor(SlobrokList slobrokList) { + this(slobrokList, new Mirror(new Supervisor(new Transport()), slobrokList)); + } + + void updateSlobrokList(ApplicationInfo application) { + List slobrokSpecs = getSlobrokSpecs(application); + slobrokList.setup(slobrokSpecs.toArray(new String[0])); + } + + List getSlobrokSpecs(ApplicationInfo applicationInfo) { + List slobrokSpecs = new ArrayList<>(); + + for (HostInfo host : applicationInfo.getModel().getHosts()) { + for (ServiceInfo service : host.getServices()) { + if (!Objects.equals(service.getServiceType(), SLOBROK_SERVICE_TYPE)) { + continue; + } + + for (PortInfo port : service.getPorts()) { + if (port.getTags().contains(SLOBROK_RPC_PORT_TAG)) { + Spec spec = new Spec(host.getHostname(), port.getPort()); + slobrokSpecs.add(spec.toString()); + } + } + } + } + + return slobrokSpecs; + } + + List lookup(String pattern) { + return Arrays.asList(mirror.lookup(pattern)); + } + + @Override + public void close() { + mirror.shutdown(); + } + + boolean registeredInSlobrok(String slobrokServiceName) { + return mirror.lookup(slobrokServiceName).length > 0; + } +} diff --git a/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SlobrokMonitor2.java b/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SlobrokMonitor2.java deleted file mode 100644 index 8737d915bcf..00000000000 --- a/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SlobrokMonitor2.java +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.service.monitor; - -import com.yahoo.config.model.api.ApplicationInfo; -import com.yahoo.config.model.api.HostInfo; -import com.yahoo.config.model.api.PortInfo; -import com.yahoo.config.model.api.ServiceInfo; -import com.yahoo.jrt.Spec; -import com.yahoo.jrt.Supervisor; -import com.yahoo.jrt.Transport; -import com.yahoo.jrt.slobrok.api.Mirror; -import com.yahoo.jrt.slobrok.api.SlobrokList; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -/** - * Class to manage Slobrok - */ -public class SlobrokMonitor2 implements AutoCloseable { - public static final String SLOBROK_SERVICE_TYPE = "slobrok"; - public static final String SLOBROK_RPC_PORT_TAG = "rpc"; - - private final SlobrokList slobrokList; - private final Mirror mirror; - - SlobrokMonitor2() { - this(new SlobrokList()); - } - - // Package-private for testing. - SlobrokMonitor2(SlobrokList slobrokList, Mirror mirror) { - this.slobrokList = slobrokList; - this.mirror = mirror; - } - - private SlobrokMonitor2(SlobrokList slobrokList) { - this(slobrokList, new Mirror(new Supervisor(new Transport()), slobrokList)); - } - - void updateSlobrokList(ApplicationInfo application) { - List slobrokSpecs = getSlobrokSpecs(application); - slobrokList.setup(slobrokSpecs.toArray(new String[0])); - } - - List getSlobrokSpecs(ApplicationInfo applicationInfo) { - List slobrokSpecs = new ArrayList<>(); - - for (HostInfo host : applicationInfo.getModel().getHosts()) { - for (ServiceInfo service : host.getServices()) { - if (!Objects.equals(service.getServiceType(), SLOBROK_SERVICE_TYPE)) { - continue; - } - - for (PortInfo port : service.getPorts()) { - if (port.getTags().contains(SLOBROK_RPC_PORT_TAG)) { - Spec spec = new Spec(host.getHostname(), port.getPort()); - slobrokSpecs.add(spec.toString()); - } - } - } - } - - return slobrokSpecs; - } - - @Override - public void close() { - // TODO: Make sure registeredInSlobrok returns DOWN from now on (concurrently) - mirror.shutdown(); - } - - boolean registeredInSlobrok(String slobrokServiceName) { - return mirror.lookup(slobrokServiceName).length > 0; - } -} diff --git a/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SlobrokMonitorManager.java b/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SlobrokMonitorManager.java index 41d379624cb..9cffa1192be 100644 --- a/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SlobrokMonitorManager.java +++ b/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SlobrokMonitorManager.java @@ -1,115 +1,25 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.service.monitor; -import com.yahoo.config.model.api.ApplicationInfo; -import com.yahoo.config.model.api.SuperModel; -import com.yahoo.config.model.api.SuperModelListener; import com.yahoo.config.provision.ApplicationId; -import com.yahoo.log.LogLevel; +import com.yahoo.jrt.slobrok.api.Mirror; import com.yahoo.vespa.applicationmodel.ConfigId; import com.yahoo.vespa.applicationmodel.ServiceStatus; import com.yahoo.vespa.applicationmodel.ServiceType; -import java.util.HashMap; -import java.util.Optional; -import java.util.function.Supplier; -import java.util.logging.Logger; - -public class SlobrokMonitorManager implements SuperModelListener { - private static final Logger logger = - Logger.getLogger(SlobrokMonitorManager.class.getName()); - - private final Supplier slobrokMonitorFactory; - - private final Object monitor = new Object(); - private final HashMap slobrokMonitors = new HashMap<>(); - - SlobrokMonitorManager() { - this(() -> new SlobrokMonitor2()); - } - - SlobrokMonitorManager(Supplier slobrokMonitorFactory) { - this.slobrokMonitorFactory = slobrokMonitorFactory; - } - - @Override - public void applicationActivated(SuperModel superModel, ApplicationInfo application) { - synchronized (monitor) { - SlobrokMonitor2 slobrokMonitor = slobrokMonitors.computeIfAbsent( - application.getApplicationId(), - id -> slobrokMonitorFactory.get()); - slobrokMonitor.updateSlobrokList(application); - } - } - - @Override - public void applicationRemoved(SuperModel superModel, ApplicationId id) { - synchronized (monitor) { - SlobrokMonitor2 slobrokMonitor = slobrokMonitors.remove(id); - if (slobrokMonitor == null) { - logger.log(LogLevel.WARNING, "Removed application " + id + - ", but it was never registered"); - } else { - slobrokMonitor.close(); - } - } - } - - ServiceStatus getStatus(ApplicationId applicationId, - ServiceType serviceType, - ConfigId configId) { - Optional slobrokServiceName = findSlobrokServiceName(serviceType, configId); - if (slobrokServiceName.isPresent()) { - synchronized (monitor) { - SlobrokMonitor2 slobrokMonitor = slobrokMonitors.get(applicationId); - if (slobrokMonitor != null && - slobrokMonitor.registeredInSlobrok(slobrokServiceName.get())) { - return ServiceStatus.UP; - } else { - return ServiceStatus.DOWN; - } - } - } else { - return ServiceStatus.NOT_CHECKED; - } - } +import java.util.List; +public interface SlobrokMonitorManager { /** - * Get the Slobrok service name of the service, or empty if the service - * is not registered with Slobrok. + * Get all Slobrok entries that has a name matching pattern as described in + * Mirror::lookup. */ - Optional findSlobrokServiceName(ServiceType serviceType, ConfigId configId) { - switch (serviceType.s()) { - case "adminserver": - case "config-sentinel": - case "configproxy": - case "configserver": - case "filedistributorservice": - case "logd": - case "logserver": - case "metricsproxy": - case "slobrok": - case "transactionlogserver": - return Optional.empty(); - - case "topleveldispatch": - return Optional.of(configId.s()); - - case "qrserver": - case "container": - case "docprocservice": - case "container-clustercontroller": - return Optional.of("vespa/service/" + configId.s()); + List lookup(ApplicationId application, String pattern); - case "searchnode": //TODO: handle only as storagenode instead of both as searchnode/storagenode - return Optional.of(configId.s() + "/realtimecontroller"); - case "distributor": - case "storagenode": - return Optional.of("storage/cluster." + configId.s()); - default: - logger.log(LogLevel.DEBUG, "Unknown service type " + serviceType.s() + - " with config id " + configId.s()); - return Optional.empty(); - } - } + /** + * Query the ServiceMonitorStatus of a particular service. + */ + ServiceStatus getStatus(ApplicationId applicationId, + ServiceType serviceType, + ConfigId configId); } diff --git a/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SlobrokMonitorManagerImpl.java b/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SlobrokMonitorManagerImpl.java new file mode 100644 index 00000000000..6a6aef2bb9c --- /dev/null +++ b/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SlobrokMonitorManagerImpl.java @@ -0,0 +1,130 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.service.monitor; + +import com.yahoo.config.model.api.ApplicationInfo; +import com.yahoo.config.model.api.SuperModel; +import com.yahoo.config.model.api.SuperModelListener; +import com.yahoo.config.provision.ApplicationId; +import com.yahoo.jrt.slobrok.api.Mirror; +import com.yahoo.log.LogLevel; +import com.yahoo.vespa.applicationmodel.ConfigId; +import com.yahoo.vespa.applicationmodel.ServiceStatus; +import com.yahoo.vespa.applicationmodel.ServiceType; + +import java.util.HashMap; +import java.util.List; +import java.util.Optional; +import java.util.function.Supplier; +import java.util.logging.Logger; + +public class SlobrokMonitorManagerImpl implements SuperModelListener, SlobrokMonitorManager { + private static final Logger logger = + Logger.getLogger(SlobrokMonitorManagerImpl.class.getName()); + + private final Supplier slobrokMonitorFactory; + + private final Object monitor = new Object(); + private final HashMap slobrokMonitors = new HashMap<>(); + + SlobrokMonitorManagerImpl() { + this(() -> new SlobrokMonitor()); + } + + SlobrokMonitorManagerImpl(Supplier slobrokMonitorFactory) { + this.slobrokMonitorFactory = slobrokMonitorFactory; + } + + @Override + public void applicationActivated(SuperModel superModel, ApplicationInfo application) { + synchronized (monitor) { + SlobrokMonitor slobrokMonitor = slobrokMonitors.computeIfAbsent( + application.getApplicationId(), + id -> slobrokMonitorFactory.get()); + slobrokMonitor.updateSlobrokList(application); + } + } + + @Override + public void applicationRemoved(SuperModel superModel, ApplicationId id) { + synchronized (monitor) { + SlobrokMonitor slobrokMonitor = slobrokMonitors.remove(id); + if (slobrokMonitor == null) { + logger.log(LogLevel.WARNING, "Removed application " + id + + ", but it was never registered"); + } else { + slobrokMonitor.close(); + } + } + } + + @Override + public List lookup(ApplicationId id, String pattern) { + synchronized (monitor) { + SlobrokMonitor slobrokMonitor = slobrokMonitors.get(id); + if (slobrokMonitor == null) { + throw new IllegalArgumentException("Slobrok manager has no knowledge of application " + id); + } else { + return slobrokMonitor.lookup(pattern); + } + } + } + + @Override + public ServiceStatus getStatus(ApplicationId applicationId, + ServiceType serviceType, + ConfigId configId) { + Optional slobrokServiceName = findSlobrokServiceName(serviceType, configId); + if (slobrokServiceName.isPresent()) { + synchronized (monitor) { + SlobrokMonitor slobrokMonitor = slobrokMonitors.get(applicationId); + if (slobrokMonitor != null && + slobrokMonitor.registeredInSlobrok(slobrokServiceName.get())) { + return ServiceStatus.UP; + } else { + return ServiceStatus.DOWN; + } + } + } else { + return ServiceStatus.NOT_CHECKED; + } + } + + /** + * Get the Slobrok service name of the service, or empty if the service + * is not registered with Slobrok. + */ + Optional findSlobrokServiceName(ServiceType serviceType, ConfigId configId) { + switch (serviceType.s()) { + case "adminserver": + case "config-sentinel": + case "configproxy": + case "configserver": + case "filedistributorservice": + case "logd": + case "logserver": + case "metricsproxy": + case "slobrok": + case "transactionlogserver": + return Optional.empty(); + + case "topleveldispatch": + return Optional.of(configId.s()); + + case "qrserver": + case "container": + case "docprocservice": + case "container-clustercontroller": + return Optional.of("vespa/service/" + configId.s()); + + case "searchnode": //TODO: handle only as storagenode instead of both as searchnode/storagenode + return Optional.of(configId.s() + "/realtimecontroller"); + case "distributor": + case "storagenode": + return Optional.of("storage/cluster." + configId.s()); + default: + logger.log(LogLevel.DEBUG, "Unknown service type " + serviceType.s() + + " with config id " + configId.s()); + return Optional.empty(); + } + } +} diff --git a/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SuperModelListenerImpl.java b/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SuperModelListenerImpl.java index 077cb75ac2c..506a2f7d649 100644 --- a/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SuperModelListenerImpl.java +++ b/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SuperModelListenerImpl.java @@ -25,10 +25,10 @@ public class SuperModelListenerImpl implements SuperModelListener, Supplier configServerHosts = Stream.of("cfg1", "cfg2", "cfg3") .collect(Collectors.toList()); - SlobrokMonitorManager slobrokMonitorManager = mock(SlobrokMonitorManager.class); + SlobrokMonitorManagerImpl slobrokMonitorManager = mock(SlobrokMonitorManagerImpl.class); when(slobrokMonitorManager.getStatus(any(), any(), any())) .thenReturn(ServiceStatus.UP); @@ -86,7 +86,7 @@ public class ModelGeneratorTest { List configServerHosts = Collections.emptyList(); - SlobrokMonitorManager slobrokMonitorManager = mock(SlobrokMonitorManager.class); + SlobrokMonitorManagerImpl slobrokMonitorManager = mock(SlobrokMonitorManagerImpl.class); when(slobrokMonitorManager.getStatus(any(), any(), any())) .thenReturn(ServiceStatus.UP); diff --git a/service-monitor/src/test/java/com/yahoo/vespa/service/monitor/SlobrokMonitor2Test.java b/service-monitor/src/test/java/com/yahoo/vespa/service/monitor/SlobrokMonitor2Test.java deleted file mode 100644 index 8ef21c21c4c..00000000000 --- a/service-monitor/src/test/java/com/yahoo/vespa/service/monitor/SlobrokMonitor2Test.java +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.service.monitor; - -import com.yahoo.config.model.api.ApplicationInfo; -import com.yahoo.jrt.slobrok.api.Mirror; -import com.yahoo.jrt.slobrok.api.SlobrokList; -import org.junit.Test; - -import static org.mockito.Mockito.mock; - -public class SlobrokMonitor2Test { - private final SlobrokList slobrokList = mock(SlobrokList.class); - private final Mirror mirror = mock(Mirror.class); - private SlobrokMonitor2 slobrokMonitor = new SlobrokMonitor2(slobrokList, mirror); - - @Test - public void testUpdateSlobrokList() { - ApplicationInfo applicationInfo = ExampleModel.createApplication( - "tenant", - "application-name") - .build(); - } - - @Test - public void testUpdateSlobrokList2() { - /* - final String hostname = "hostname"; - final int port = 1; - - SuperModel superModel = ExampleModel.createExampleSuperModelWithOneRpcPort(hostname, port); - slobrokMonitor.updateSlobrokList(superModel.getApplicationInfo()); - - String[] expectedSpecs = new String[] {"tcp/" + hostname + ":" + port}; - verify(slobrokList).setup(expectedSpecs); */ - } -} diff --git a/service-monitor/src/test/java/com/yahoo/vespa/service/monitor/SlobrokMonitorManagerImplImplTest.java b/service-monitor/src/test/java/com/yahoo/vespa/service/monitor/SlobrokMonitorManagerImplImplTest.java new file mode 100644 index 00000000000..d21088ccbf4 --- /dev/null +++ b/service-monitor/src/test/java/com/yahoo/vespa/service/monitor/SlobrokMonitorManagerImplImplTest.java @@ -0,0 +1,93 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.service.monitor; + +import com.yahoo.config.model.api.ApplicationInfo; +import com.yahoo.config.model.api.SuperModel; +import com.yahoo.vespa.applicationmodel.ConfigId; +import com.yahoo.vespa.applicationmodel.ServiceStatus; +import com.yahoo.vespa.applicationmodel.ServiceType; +import org.junit.Before; +import org.junit.Test; + +import java.util.Optional; +import java.util.function.Supplier; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class SlobrokMonitorManagerImplImplTest { + // IntelliJ complains if parametrized type is specified, Maven complains if not specified. + @SuppressWarnings("unchecked") + private final Supplier slobrokMonitorFactory = mock(Supplier.class); + + private final SlobrokMonitorManagerImpl slobrokMonitorManager = + new SlobrokMonitorManagerImpl(slobrokMonitorFactory); + private final SlobrokMonitor slobrokMonitor = mock(SlobrokMonitor.class); + private final SuperModel superModel = mock(SuperModel.class); + private final ApplicationInfo application = mock(ApplicationInfo.class); + + @Before + public void setup() { + when(slobrokMonitorFactory.get()).thenReturn(slobrokMonitor); + } + + @Test + public void testActivationOfApplication() { + slobrokMonitorManager.applicationActivated(superModel, application); + verify(slobrokMonitorFactory, times(1)).get(); + } + + @Test + public void testGetStatus_ApplicationNotInSlobrok() { + when(slobrokMonitor.registeredInSlobrok("config.id")).thenReturn(true); + assertEquals(ServiceStatus.DOWN, getStatus("topleveldispatch")); + } + + @Test + public void testGetStatus_ApplicationInSlobrok() { + slobrokMonitorManager.applicationActivated(superModel, application); + when(slobrokMonitor.registeredInSlobrok("config.id")).thenReturn(true); + assertEquals(ServiceStatus.UP, getStatus("topleveldispatch")); + } + + @Test + public void testGetStatus_ServiceNotInSlobrok() { + slobrokMonitorManager.applicationActivated(superModel, application); + when(slobrokMonitor.registeredInSlobrok("config.id")).thenReturn(false); + assertEquals(ServiceStatus.DOWN, getStatus("topleveldispatch")); + } + + @Test + public void testGetStatus_NotChecked() { + assertEquals(ServiceStatus.NOT_CHECKED, getStatus("slobrok")); + verify(slobrokMonitor, times(0)).registeredInSlobrok(any()); + } + + private ServiceStatus getStatus(String serviceType) { + return slobrokMonitorManager.getStatus( + application.getApplicationId(), + new ServiceType(serviceType), + new ConfigId("config.id")); + } + + @Test + public void testLookup() { + assertEquals( + Optional.of("config.id"), + findSlobrokServiceName("topleveldispatch", "config.id")); + + assertEquals( + Optional.empty(), + findSlobrokServiceName("adminserver", "config.id")); + } + + private Optional findSlobrokServiceName(String serviceType, String configId) { + return slobrokMonitorManager.findSlobrokServiceName( + new ServiceType(serviceType), + new ConfigId(configId)); + } +} diff --git a/service-monitor/src/test/java/com/yahoo/vespa/service/monitor/SlobrokMonitorManagerTest.java b/service-monitor/src/test/java/com/yahoo/vespa/service/monitor/SlobrokMonitorManagerTest.java deleted file mode 100644 index 9c101694244..00000000000 --- a/service-monitor/src/test/java/com/yahoo/vespa/service/monitor/SlobrokMonitorManagerTest.java +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.service.monitor; - -import com.yahoo.config.model.api.ApplicationInfo; -import com.yahoo.config.model.api.SuperModel; -import com.yahoo.vespa.applicationmodel.ConfigId; -import com.yahoo.vespa.applicationmodel.ServiceStatus; -import com.yahoo.vespa.applicationmodel.ServiceType; -import org.junit.Before; -import org.junit.Test; - -import java.util.Optional; -import java.util.function.Supplier; - -import static org.junit.Assert.assertEquals; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -public class SlobrokMonitorManagerTest { - // IntelliJ complains if parametrized type is specified, Maven complains if not specified. - @SuppressWarnings("unchecked") - private final Supplier slobrokMonitorFactory = mock(Supplier.class); - - private final SlobrokMonitorManager slobrokMonitorManager = - new SlobrokMonitorManager(slobrokMonitorFactory); - private final SlobrokMonitor2 slobrokMonitor = mock(SlobrokMonitor2.class); - private final SuperModel superModel = mock(SuperModel.class); - private final ApplicationInfo application = mock(ApplicationInfo.class); - - @Before - public void setup() { - when(slobrokMonitorFactory.get()).thenReturn(slobrokMonitor); - } - - @Test - public void testActivationOfApplication() { - slobrokMonitorManager.applicationActivated(superModel, application); - verify(slobrokMonitorFactory, times(1)).get(); - } - - @Test - public void testGetStatus_ApplicationNotInSlobrok() { - when(slobrokMonitor.registeredInSlobrok("config.id")).thenReturn(true); - assertEquals(ServiceStatus.DOWN, getStatus("topleveldispatch")); - } - - @Test - public void testGetStatus_ApplicationInSlobrok() { - slobrokMonitorManager.applicationActivated(superModel, application); - when(slobrokMonitor.registeredInSlobrok("config.id")).thenReturn(true); - assertEquals(ServiceStatus.UP, getStatus("topleveldispatch")); - } - - @Test - public void testGetStatus_ServiceNotInSlobrok() { - slobrokMonitorManager.applicationActivated(superModel, application); - when(slobrokMonitor.registeredInSlobrok("config.id")).thenReturn(false); - assertEquals(ServiceStatus.DOWN, getStatus("topleveldispatch")); - } - - @Test - public void testGetStatus_NotChecked() { - assertEquals(ServiceStatus.NOT_CHECKED, getStatus("slobrok")); - verify(slobrokMonitor, times(0)).registeredInSlobrok(any()); - } - - private ServiceStatus getStatus(String serviceType) { - return slobrokMonitorManager.getStatus( - application.getApplicationId(), - new ServiceType(serviceType), - new ConfigId("config.id")); - } - - @Test - public void testLookup() { - assertEquals( - Optional.of("config.id"), - findSlobrokServiceName("topleveldispatch", "config.id")); - - assertEquals( - Optional.empty(), - findSlobrokServiceName("adminserver", "config.id")); - } - - private Optional findSlobrokServiceName(String serviceType, String configId) { - return slobrokMonitorManager.findSlobrokServiceName( - new ServiceType(serviceType), - new ConfigId(configId)); - } -} diff --git a/service-monitor/src/test/java/com/yahoo/vespa/service/monitor/SlobrokMonitorTest.java b/service-monitor/src/test/java/com/yahoo/vespa/service/monitor/SlobrokMonitorTest.java new file mode 100644 index 00000000000..2cbe48c7be5 --- /dev/null +++ b/service-monitor/src/test/java/com/yahoo/vespa/service/monitor/SlobrokMonitorTest.java @@ -0,0 +1,36 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.service.monitor; + +import com.yahoo.config.model.api.ApplicationInfo; +import com.yahoo.jrt.slobrok.api.Mirror; +import com.yahoo.jrt.slobrok.api.SlobrokList; +import org.junit.Test; + +import static org.mockito.Mockito.mock; + +public class SlobrokMonitorTest { + private final SlobrokList slobrokList = mock(SlobrokList.class); + private final Mirror mirror = mock(Mirror.class); + private SlobrokMonitor slobrokMonitor = new SlobrokMonitor(slobrokList, mirror); + + @Test + public void testUpdateSlobrokList() { + ApplicationInfo applicationInfo = ExampleModel.createApplication( + "tenant", + "application-name") + .build(); + } + + @Test + public void testUpdateSlobrokList2() { + /* + final String hostname = "hostname"; + final int port = 1; + + SuperModel superModel = ExampleModel.createExampleSuperModelWithOneRpcPort(hostname, port); + slobrokMonitor.updateSlobrokList(superModel.getApplicationInfo()); + + String[] expectedSpecs = new String[] {"tcp/" + hostname + ":" + port}; + verify(slobrokList).setup(expectedSpecs); */ + } +} diff --git a/service-monitor/src/test/java/com/yahoo/vespa/service/monitor/SuperModelListenerImplTest.java b/service-monitor/src/test/java/com/yahoo/vespa/service/monitor/SuperModelListenerImplTest.java index e5608e92255..e2aaf1c9838 100644 --- a/service-monitor/src/test/java/com/yahoo/vespa/service/monitor/SuperModelListenerImplTest.java +++ b/service-monitor/src/test/java/com/yahoo/vespa/service/monitor/SuperModelListenerImplTest.java @@ -20,7 +20,7 @@ import static org.mockito.Mockito.when; public class SuperModelListenerImplTest { @Test public void sanityCheck() { - SlobrokMonitorManager slobrokMonitorManager = mock(SlobrokMonitorManager.class); + SlobrokMonitorManagerImpl slobrokMonitorManager = mock(SlobrokMonitorManagerImpl.class); ServiceMonitorMetrics metrics = mock(ServiceMonitorMetrics.class); ModelGenerator modelGenerator = mock(ModelGenerator.class); Zone zone = mock(Zone.class); -- cgit v1.2.3