diff --git a/services/venice-controller/src/main/java/com/linkedin/venice/controller/server/ListAllStoresStatusesRequest.java b/services/venice-controller/src/main/java/com/linkedin/venice/controller/server/ListAllStoresStatusesRequest.java new file mode 100644 index 0000000000..5d9a0e5fa9 --- /dev/null +++ b/services/venice-controller/src/main/java/com/linkedin/venice/controller/server/ListAllStoresStatusesRequest.java @@ -0,0 +1,68 @@ +package com.linkedin.venice.controller.server; + +import java.util.Optional; + + +public class ListAllStoresStatusesRequest { + private String cluster; + private String storeName; + private String includeSystemStores; + private Optional storeConfigNameFilter; + private Optional storeConfigValueFilter; + + public ListAllStoresStatusesRequest( + String cluster, + String storeName, + String includeSystemStores, + Optional storeConfigNameFilter, + Optional storeConfigValueFilter) { + this.cluster = cluster; + this.storeName = storeName; + this.includeSystemStores = includeSystemStores; + this.storeConfigNameFilter = storeConfigNameFilter; + this.storeConfigValueFilter = storeConfigValueFilter; + } + + public ListAllStoresStatusesRequest() { + } + + public String getCluster() { + return cluster; + } + + public String getStoreName() { + return storeName; + } + + public void setCluster(String cluster) { + this.cluster = cluster; + } + + public void setStoreName(String storeName) { + this.storeName = storeName; + } + + public String getIncludeSystemStores() { + return includeSystemStores; + } + + public void setIncludeSystemStores(String includeSystemStores) { + this.includeSystemStores = includeSystemStores; + } + + public Optional getStoreConfigNameFilter() { + return storeConfigNameFilter; + } + + public void setStoreConfigNameFilter(Optional storeConfigNameFilter) { + this.storeConfigNameFilter = storeConfigNameFilter; + } + + public Optional getStoreConfigValueFilter() { + return storeConfigValueFilter; + } + + public void setStoreConfigValueFilter(Optional storeConfigValueFilter) { + this.storeConfigValueFilter = storeConfigValueFilter; + } +} diff --git a/services/venice-controller/src/main/java/com/linkedin/venice/controller/server/StoresRoutes.java b/services/venice-controller/src/main/java/com/linkedin/venice/controller/server/StoresRoutes.java index 6bfa7f51b3..a1ed48816a 100644 --- a/services/venice-controller/src/main/java/com/linkedin/venice/controller/server/StoresRoutes.java +++ b/services/venice-controller/src/main/java/com/linkedin/venice/controller/server/StoresRoutes.java @@ -258,14 +258,24 @@ public Route getAllStoresStatuses(Admin admin) { @Override public void internalHandle(Request request, MultiStoreStatusResponse veniceResponse) { AdminSparkServer.validateParams(request, CLUSTER_HEALTH_STORES.getParams(), admin); - String clusterName = request.queryParams(CLUSTER); - veniceResponse.setCluster(clusterName); - Map storeStatusMap = admin.getAllStoreStatuses(clusterName); - veniceResponse.setStoreStatusMap(storeStatusMap); + ListAllStoresStatusesRequest listAllStoresStatusesRequest = new ListAllStoresStatusesRequest(); + listAllStoresStatusesRequest.setCluster(request.queryParams(CLUSTER)); + + MultiStoreStatusResponse multiStoreStatusResponse = listAllStoresStatuses(listAllStoresStatusesRequest, admin); + veniceResponse.setCluster(multiStoreStatusResponse.getCluster()); + veniceResponse.setStoreStatusMap(multiStoreStatusResponse.getStoreStatusMap()); } }; } + private MultiStoreStatusResponse listAllStoresStatuses(ListAllStoresStatusesRequest request, Admin admin) { + MultiStoreStatusResponse veniceResponse = new MultiStoreStatusResponse(); + veniceResponse.setCluster(request.getCluster()); + Map storeStatusMap = admin.getAllStoreStatuses(request.getCluster()); + veniceResponse.setStoreStatusMap(storeStatusMap); + return veniceResponse; + } + public Route getInUseSchemaIds(Admin admin) { return new VeniceRouteHandler(SchemaUsageResponse.class) { @Override @@ -276,7 +286,6 @@ public void internalHandle(Request request, SchemaUsageResponse response) { String storeName = request.queryParams(NAME); Set schemaIds = admin.getInUseValueSchemaIds(clusterName, storeName); response.setInUseValueSchemaIds(schemaIds); - } }; } diff --git a/services/venice-controller/src/test/java/com/linkedin/venice/controller/server/ListAllStoresStatusesRequestTest.java b/services/venice-controller/src/test/java/com/linkedin/venice/controller/server/ListAllStoresStatusesRequestTest.java new file mode 100644 index 0000000000..4439cfa0ad --- /dev/null +++ b/services/venice-controller/src/test/java/com/linkedin/venice/controller/server/ListAllStoresStatusesRequestTest.java @@ -0,0 +1,88 @@ +package com.linkedin.venice.controller.server; + +import static org.testng.Assert.*; + +import java.util.Optional; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + + +public class ListAllStoresStatusesRequestTest { + private ListAllStoresStatusesRequest mockListAllStoresStatusesRequest; + + private final String TEST_CLUSTER = "testCluster"; + private final String TEST_STORE_NAME = "testStoreName"; + private final String TEST_INCLUDE_SYSTEM_STORES = "testIncludeSystemStores"; + private final String TEST_STORE_CONFIG_NAME_FILTER = "testStoreConfigNameFilter"; + private final String TEST_STORE_CONFIG_VALUE_FILTER = "testStoreConfigValueFilter"; + + @BeforeMethod + public void setUp() { + // Create a mock ListStoresRequestTest with mock data for each of it's private fields: + mockListAllStoresStatusesRequest = new ListAllStoresStatusesRequest( + "cluster", + "storeName", + "includeSystemStores", + Optional.of("storeConfigNameFilter"), + Optional.of("storeConfigValueFilter")); + } + + @Test + public void testGetCluster() { + assertEquals(mockListAllStoresStatusesRequest.getCluster(), "cluster"); + } + + @Test + public void testGetStoreName() { + assertEquals(mockListAllStoresStatusesRequest.getStoreName(), "storeName"); + } + + @Test + public void testSetCluster() { + mockListAllStoresStatusesRequest.setCluster(TEST_CLUSTER); + assertEquals(mockListAllStoresStatusesRequest.getCluster(), TEST_CLUSTER); + } + + @Test + public void testSetStoreName() { + mockListAllStoresStatusesRequest.setStoreName(TEST_STORE_NAME); + assertEquals(mockListAllStoresStatusesRequest.getStoreName(), TEST_STORE_NAME); + } + + @Test + public void testGetIncludeSystemStores() { + assertEquals(mockListAllStoresStatusesRequest.getIncludeSystemStores(), "includeSystemStores"); + } + + @Test + public void testSetIncludeSystemStores() { + mockListAllStoresStatusesRequest.setIncludeSystemStores(TEST_INCLUDE_SYSTEM_STORES); + assertEquals(mockListAllStoresStatusesRequest.getIncludeSystemStores(), TEST_INCLUDE_SYSTEM_STORES); + } + + @Test + public void testGetStoreConfigNameFilter() { + assertEquals(mockListAllStoresStatusesRequest.getStoreConfigNameFilter(), Optional.of("storeConfigNameFilter")); + } + + @Test + public void testSetStoreConfigNameFilter() { + mockListAllStoresStatusesRequest.setStoreConfigNameFilter(Optional.of(TEST_STORE_CONFIG_NAME_FILTER)); + assertEquals( + mockListAllStoresStatusesRequest.getStoreConfigNameFilter(), + Optional.of(TEST_STORE_CONFIG_NAME_FILTER)); + } + + @Test + public void testGetStoreConfigValueFilter() { + assertEquals(mockListAllStoresStatusesRequest.getStoreConfigValueFilter(), Optional.of("storeConfigValueFilter")); + } + + @Test + public void testSetStoreConfigValueFilter() { + mockListAllStoresStatusesRequest.setStoreConfigValueFilter(Optional.of(TEST_STORE_CONFIG_VALUE_FILTER)); + assertEquals( + mockListAllStoresStatusesRequest.getStoreConfigValueFilter(), + Optional.of(TEST_STORE_CONFIG_VALUE_FILTER)); + } +} diff --git a/services/venice-controller/src/test/java/com/linkedin/venice/controller/server/StoreRoutesTest.java b/services/venice-controller/src/test/java/com/linkedin/venice/controller/server/StoreRoutesTest.java index c434110706..cf5458752a 100644 --- a/services/venice-controller/src/test/java/com/linkedin/venice/controller/server/StoreRoutesTest.java +++ b/services/venice-controller/src/test/java/com/linkedin/venice/controller/server/StoreRoutesTest.java @@ -64,6 +64,31 @@ public void testGetFutureVersion() throws Exception { Assert.assertEquals(multiStoreStatusResponse.getStoreStatusMap(), storeStatusMap); } + @Test + public void testGetAllStoresStatuses() throws Exception { + Admin mockAdmin = mock(VeniceParentHelixAdmin.class); + doReturn(true).when(mockAdmin).isLeaderControllerFor(TEST_CLUSTER); + + Store mockStore = mock(Store.class); + doReturn(mockStore).when(mockAdmin).getStore(TEST_CLUSTER, TEST_STORE_NAME); + + Map storeStatusMap = Collections.singletonMap("dc-0", "1"); + doReturn(storeStatusMap).when(mockAdmin).getAllStoreStatuses(TEST_CLUSTER); + + Request request = mock(Request.class); + doReturn(TEST_CLUSTER).when(request).queryParams(eq(ControllerApiConstants.CLUSTER)); + doReturn(TEST_STORE_NAME).when(request).queryParams(eq(ControllerApiConstants.NAME)); + + Route getAllStoresStatusesRoute = + new StoresRoutes(false, Optional.empty(), pubSubTopicRepository).getAllStoresStatuses(mockAdmin); + MultiStoreStatusResponse multiStoreStatusResponse = ObjectMapperFactory.getInstance() + .readValue( + getAllStoresStatusesRoute.handle(request, mock(Response.class)).toString(), + MultiStoreStatusResponse.class); + Assert.assertEquals(multiStoreStatusResponse.getCluster(), TEST_CLUSTER); + Assert.assertEquals(multiStoreStatusResponse.getStoreStatusMap(), storeStatusMap); + } + @Test public void testRollForwardToFutureVersion() throws Exception { Admin mockAdmin = mock(VeniceParentHelixAdmin.class);